以下是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包装器的步骤,根据适当的特殊"子模式"解码有效载荷。 ?
我可以通过代码中的特殊情况逻辑来做到这一点,但如果支持,我更喜欢定义特殊情况模式。
答案 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
操作时失败。