我有这样的BER结构......
$ openssl asn1parse -inform der -in test.der -i -dump
????:d=4 hl=2 l=inf cons: cont [ 0 ]
????:d=5 hl=3 l= 240 prim: OCTET STRING
0000 - AABBCCDD
????:d=5 hl=2 l= 8 prim: OCTET STRING
0000 - EEFF
????:d=5 hl=2 l= 0 prim: EOC
...或以der2ascii风格...
[0] `80`
OCTET_STRING { `AABBCCDD` }
OCTET_STRING { `EEFF` }
`0000`
我所知道的:不定长度编码必须包含构造类型,因为原始类型可能会引入歧义,例如在包含 0x0000 时。我想知道的是:解码器在解析这个 BER 结构时必须如何表现?两个 OCTET STRING 的标头字节是否包含在编码中?如果是,不定长字节数据是如何编码的?当第二个 OCTET STRING 是例如 INTEGER 时,应用程序如何解释标记为 [0] 的 TLV 字段的值?
我在问这个问题,因为在 CMS 标准中,一个字段被定义为单个 OCTET STRING,但在大多数 BER 编码中,我总是看到其中两个。这仅仅是由于不确定长度编码吗?我错过了什么吗?
来自 ITU-T X.690:
8.1.4 内容八位字节
内容八位字节应由零个、一个或多个八位字节组成,并应按照后续条款中的规定对数据值进行编码。
注 — 内容八位字节取决于数据值的类型;后续子句遵循与 ASN.1 中类型定义相同的顺序。
这是否意味着,我可以放置每个构造的类型,而应用程序必须只解释构造的 TLV 结构的值部分?