繁体   English   中英

解释具有多个封装八位字节串的ASN.1不定长度编码

[英]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的块
  • 以固定长度模式对每个块进行编码,以使每个块都有自己的TLV(带有长度!)
  • 定长编码的原始OCTET STRING的整个序列必须由具有自己的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM