Более простой способ добавить теговые элементы в 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 без необходимости повторять спецификацию его типа.

Другие вопросы по тегам