如何使用pyasn1编码具有默认类型的ASN.1对象?

时间:2013-08-02 20:19:14

标签: python asn.1

我正在尝试使用 pyasn1 来编码RSA签名,但我在SEQUENCE中遇到了默认类型的问题。我定义了两个AlgorithmIdentifier类型,一个是'algorithm'组件默认的地方,另一个是在新创建的对象上手动设置的类型。如果我实例化每个对象中的一个,然后调用prettyPrint(),则输出看起来相同。但是,如果我对BER编码(或DER编码),那么具有默认类型的对象似乎缺少算法组件。

一个例子:

from pyasn1.type import univ, namedval, namedtype, tag
from pyasn1.codec.ber import encoder

pkcs1 = univ.ObjectIdentifier('1.2.840.113549.1.1')
md5WithRSAEncryption_id = pkcs1 + univ.ObjectIdentifier((4,))

class AlgorithmIdentifier(univ.Sequence):
    componentType = namedtype.NamedTypes(
            namedtype.NamedType('algorithm', univ.ObjectIdentifier()),
            namedtype.OptionalNamedType('params', univ.Any()))

class AlgorithmIdentifier2(univ.Sequence):
    componentType = namedtype.NamedTypes(
            namedtype.DefaultedNamedType('algorithm', md5WithRSAEncryption_id),
            namedtype.OptionalNamedType('params', univ.Any()))

a = AlgorithmIdentifier()
a.setComponentByName('algorithm', md5WithRSAEncryption_id)
print a.prettyPrint()
print "Encoded: %s" % encoder.encode(a).encode('hex')

a2 = AlgorithmIdentifier2()
a2.setDefaultComponents()
print a2.prettyPrint()
print "Encoded: %s" % encoder.encode(a2).encode('hex')

输出:

$ ./testasn1.py
AlgorithmIdentifier:
 algorithm=1.2.840.113549.1.1.4

Encoded: 300b06092a864886f70d010104

AlgorithmIdentifier2:
 algorithm=1.2.840.113549.1.1.4

Encoded: 3000

我做错了什么?

1 个答案:

答案 0 :(得分:1)

你的代码很好。虽然可以省略setDefaultComponents()调用。

您在编码中看不到默认值的原因是标记为DEFAULT的组件可能未必编码,即使发送应用程序为此组件提供相同的值,因为默认值为(根据X.208,它是发件人的选择)。

实际上,无论您在编码中包含默认值还是省略它,接收端都没有区别。在后一种情况下,接收端将插入其默认值。从好的方面来说,交通量会减少。