【发布时间】:2018-01-10 19:08:21
【问题描述】:
我有这样的 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 是例如,应用程序如何解释标记为 [0] 的 TLV 字段的值一个整数?
我问这个问题,因为在 CMS 标准中,一个字段被定义为单个 OCTET STRING,但在大多数 BER 编码中,我总是看到其中两个。这仅仅是由于不确定长度编码吗?我错过了什么吗?
来自 ITU-T X.690:
8.1.4 内容八位字节
内容八位位组应由零个、一个或多个八位位组组成,并应编码数据值,如 后续分句。
注意——内容字节取决于数据值的类型; 后续子句遵循与类型定义相同的顺序 在 ASN.1 中。
这是否意味着,我可以放置每个构造的类型,而应用程序必须只解释构造的 TLV 结构的值部分?
【问题讨论】:
标签: encoding asn.1 variable-length der ber