Более простой способ добавить теговые элементы в pyasn1
Лучший способ, который я нашел, чтобы добавить явно помеченные элементы в pyasn1, это... явно пометить их. Но это выглядит слишком многословно:
cert['tbsCertificate']['extensions'] = rfc2459.Extensions().subtype(explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 3))
Есть ли способ генерировать пустое значение, которое будет вписываться в такое место, как extensions
без указания тега?
1 ответ
Решение
Существует гораздо более простой подход. Соглашение состоит в том, что если вы назначите None компоненту сложного типа [py]ASN.1, этот компонент будет создан, но не будет иметь никакого значения.
>>> cert = rfc2459.Certificate()
>>> print cert.prettyPrint()
Certificate:
>>> cert['tbsCertificate'] = None
>>> print cert.prettyPrint()
Certificate:
tbsCertificate=TBSCertificate:
>>> cert['tbsCertificate']['extensions'] = None
>>> print cert.prettyPrint()
Certificate:
tbsCertificate=TBSCertificate:
extensions=Extensions:
>>> cert['tbsCertificate']['extensions'][0] = None
>>> print cert.prettyPrint()
Certificate:
tbsCertificate=TBSCertificate:
extensions=Extensions:
Extension:
>>> cert['tbsCertificate']['extensions'][0]['extnID'] = '1.3.5.4.3.2'
>>> cert['tbsCertificate']['extensions'][0]['extnValue'] = '\x00\x00'
>>> print cert.prettyPrint()
Certificate:
tbsCertificate=TBSCertificate:
extensions=Extensions:
Extension:
extnID=1.3.5.4.3.2
extnValue=0x0000
>>>
Это позволяет эффективно создавать составной объект pyasn1 из встроенного Python или других объектов pyasn1 без необходимости повторять спецификацию его типа.