[英]Interpreting ASN.1 indefinite-lenght encoding with multiple encapsulated octet-strings
我有这样的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结构的值部分?
在不定长度模式下编码原始OCTET STRING时,编码器必须:
在另一端,解码器从内部确定长度的OCTET STRING块中提取V部分(删除其TL标头)。 然后,按照到达顺序将外部框架的TL部分删除的方式将V合并/合并在一起。
注意,无限长编码技术背后的思想是编码器和解码器都可以发出/使用不完整的,可能超大的数据。
编码器/应用程序根据数据可用性,内存状况以及可能的解码器缓冲能力估计来选择块大小。 我认为X.280 / X.680文件中提到了这一点。
不允许编码器将不同ASN.1类型的块放入任何单个不确定长度编码的容器中。 换句话说,所有块都必须与外部容器具有相同的类型。
这有望说明为什么您会在不定长编码的BER / CER流中看到多个(取决于块大小)OCTET STRING,而预期中只有一个OCTET STRING。
DER禁止无限长编码,原因是相同数据的序列化表示可能会在重新编码时发生变化(由于块大小可能会发生变化)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.