在pyasn1中处理嵌套的DER,打包到OCTET STRING中

时间:2018-05-30 19:42:31

标签: pyasn1

以下是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()可以进一步解码,另一个调用解码器,使用适合{{1}的模式}。

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

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

1 个答案:

答案 0 :(得分: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关键字参数传递给解码器,则应该展开您的扩展程序。

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