我查看了许多链接,但没有找到如何识别构造octetstring / bitstring。我将其解析为TLV,V包含octetstring / bitstring的值。 V中是否有位于标签中的位?
答案 0 :(得分:1)
原语/构造位是基本编码规则的属性,而不是ASN.1项的属性。所以octetstring / bitstring没有这个属性。
它表示值的编码方式。原始数据作为原始数据或构造为与实际数据组合的TLV项目列表。
如果您可以将输入限制为使用“可分辨编码规则”,则它只允许使用octectstring / bitstring的基本形式。
答案 1 :(得分:1)
根据ITU-T X.690,这是针对BER定义的:
octetstring值的编码应该是原始的,或者根据发送者的选择构造。
DER仅将编码限制为原始。这同样适用于bitstring。
要对构造的ASN.1对象进行编码,您需要将TLV中TAG八位字节的第6位设置为1,如here所述。整个TAG元素应为二进制00(< -tag class universal)1(构造)00100(< -tag number)= 00100100 = 24 hex = 36 dec。
Bitstring将类似 - 在二进制00100011 = 23 hex = 35 dec。
修改强>
经过与@CryptoGuy的长时间讨论,我意识到我没有正确回答你的问题。 Value中没有任何关于结构的信息。如果您知道要解析的对象包含具有在Value中编码的结构的Octet字符串,那么您将相应地实现您的应用程序。如果您不知道正在解析的对象,那么您将不得不尝试解析任何可以构造的类型,即sequence,set,octet string等。 据我所知,没有别的办法可以做到。