【问题标题】:Handling nested DER, packed into OCTET STRINGs, in pyasn1在 pyasn1 中处理嵌套的 DER,打包到八位字节字符串中
【发布时间】:2018-05-30 19:42:31
【问题描述】:

以下是 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 包装器的步骤以根据适当的特殊“子模式”解码有效负载?

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

【问题讨论】:

    标签: pyasn1


    【解决方案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 操作不成功,它会失败。

    【讨论】:

    • 这看起来很有希望,谢谢。但是,我对pyasn1 的了解还不够,无法真正理解pyasn1-modules 中的ExtensionAttribute 类。您是否介意提供该类定义的详细分类,包括有关子类型和标记操作的一些细节,以用于说明目的? (如果您愿意,我可以将其作为一个新问题发布。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多