0

我有一个扩展名,描述如下:

Extension().setComponentByPosition(0, ObjectIdentifier(2.5.29.19))
           .setComponentByPosition(1, Boolean('False'))
           .setComponentByPosition(2, Any(hexValue='04023000'))

所以基于id,它是一个BasicConstraints扩展。但是,如果我尝试将值解析为扩展本身,则会出现错误:

decoder.decode(decoder.decode(e['extnValue'])[0], rfc2459.BasicConstraints())
# PyAsn1Error: Uninitialized component #0 at BasicConstraints()

该字符串解码为空序列,因此它可以合法地是BasicConstraints-name length可选/缺失并且ca是默认值,因此未在 DER 中编码。

那么我在这里错过了什么?我如何解码这个BasicConstraints类的扩展?

PS。这个问题似乎类似于邮件列表中的问题,但我使用的是 0.1.8,它应该已经包含了提到的修复

4

1 回答 1

1

由于 BasicConstraints 是一个 SEQUENCE 派生类,它的最小可能序列化是 SEQUENCE 标记和零长度。然后它的值可能是一个空字符串,正如你所建议的。事实上是这样的:

>>> derSerialisation, _ = decode(OctetString(hexValue='04023000'))
>>> derSerialisation.prettyPrint()
'0x3000'
>>> constraint, _ = decode(derSerialisation)
>>> constraint.prettyPrint()
'Sequence:\n'

ANY 值是不透明的(无标记),但嵌入式 DER 序列化本身被编码为 OCTET STRING。因此,请确保从 OCTET STRING 序列化中提取 DER 内容,然后再将其传递给解码器以恢复 BasicConstraints。

邮件列表错误是不相关的 - 那是在不确定的编码模式。

更新

原来是 rfc2459.BasicConstraints 规范中的一个错误。在准备正式修复/发布时,我可以向 pyasn1_modules.rfc2459 建议以下猴子补丁:

>>> from pyasn1.type import namedtype
>>> from pyasn1_modules import rfc2459
>>> rfc2459.BasicConstraints.componentType = namedtype.NamedTypes(
...     namedtype.DefaultedNamedType(*rfc2459.BasicConstraints.componentType[0]),
...     rfc2459.BasicConstraints.componentType[1]
... )

这基本上将“cA”组件标记为默认值。应用后,您的序列化可以被解码:

>>> s
Any(hexValue='04023000')
>>> basicConstraints, _ = decoder.decode(decoder.decode(s)[0], rfc2459.BasicConstraints())
>>> print(basicConstraints.prettyPrint())
BasicConstraints:
 cA='False'

再次更新

上述错误已在 pyasn1-modules 0.0.7中修复

于 2015-07-22T06:11:12.017 回答