0

以下是 RFC 5280 定义 X.509 扩展字段的方式:

Extension  ::=  SEQUENCE  {
     extnID      OBJECT IDENTIFIER,
     critical    BOOLEAN DEFAULT FALSE,
     extnValue   OCTET STRING
                 -- contains the DER encoding of an ASN.1 value
                 -- corresponding to the extension type identified
                 -- by extnID
     }

当我使用 pyasn1 解码器时,我将获得一个可以进一步解码的对象,并使用适合foo于.foo['extnValue'].asOctets()foo['extnID']

问题:假设extnID我的应用程序中有一个特殊的,是否可以在 pyasn1 中定义一个模式,(a)不接受任何 OBJECT IDENTIFIER,只接受特殊的;(b) 通过 OCTET STRING 包装器的步骤以根据适当的特殊“子模式”解码有效负载?

我可以通过代码中的特殊情况逻辑来做到这一点,但如果支持,我更愿意定义一个特殊情况模式。

4

1 回答 1

1

您应该使用OpenType进行extnValue类型定义。当您将extnID->的映射传递给解码器时ASN.1 type,解码器将跳过最外层的extnValue包装器,试图解码其内容。

这是一个简单的例子:

openType = opentype.OpenType(
        'id',
        {1: univ.Integer(),
         2: univ.OctetString()}
    )
    self.s = univ.Sequence(
        componentType=namedtype.NamedTypes(
            namedtype.NamedType('id', univ.Integer()),
            namedtype.NamedType('blob', univ.Any(), openType=openType)
        )
    )

如果您希望解码器解开这些开放类型,请确保将decodeOpenTypes=True参数传递给函数。decode()

顺便说一句,如果您查看pyasn1-modules,该地图已经存在。如果您使用这些定义并且只是将decodeOpenTypes=True关键字参数传递给解码器,您应该解开您的扩展。

没有现成的方法可以使解码器在 unknown 上失败extnID。您可能可以模拟我给它您自己的地图(可能基于dict),这将在不成功的key in my_map操作时失败。

于 2018-05-31T17:29:51.717 回答