我正在尝试在Golang中创建一个DER编码的ASN.1 blob。
我将内部TLV明确定义为struct
,它映射到ASN.1中的SEQUENCE
。此SEQUENCE将嵌入CHOICE类型。请参阅ASN.1架构here。
我认为最简单的方法是使用encoding/asn1.RawValue
类型。
请参阅this amazing book中有关编码的部分并使用此online ASN.1 tool,我了解我的二进制文件(在下面的HEX中描述)应以A0258020...
开头。
但是,我的结果是30258020...
。
我已将问题本地化为在Golang中编码CHOICE
类型。
在预期的情况下,它是Context-Specific, Constructed, Tag:0
标记(根据上面的参考书),但我得到Universal, Primitive, Tag:1
类型,其中Tag:1
映射到ASN.1中的序列。< / p>
我尝试将外部CHOICE
标头设置为:
serializedCondition, err := asn1.Marshal(asn1.RawValue{
Class: 2, // or asn1.ClassContextSpecific
IsCompound: true, // as CHOICE it is a Constructed type and not Primitive type
Tag: 0, // Zero in my case
FullBytes: serialized, // The serialized inner sequence of bytes
})
有人可以解释如何在Golang中使用内置的ASN.1库,使用低级RawValue
或RawContent
类型来序列化标记为CHOICE
的对象,{{1}在ASN.1中,{,SET OF
。