2017-08-03 44 views
0

我有一个BER结构是这样的...解释ASN.1不定lenght编码与多个封装八位字节串

$ 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字段的值。一个INTEGER?

我在问这个问题,因为在CMS标准中,一个字段被定义为单个OCTET STRING,但在大多数BER编码中,我总是看到其中两个。这只是由于无限长编码?我错过了什么吗?

从ITU-T X.690:

8.1.4内容字节

内容八位位组将包括零个,一个或多个字节,如在 指定应编码的数据值后续条款。

注 - 内容字节取决于数据值的类型;后续条款遵循与ASN.1中 类型的定义相同的顺序。

这是否意味着我可以将每个构造类型和应用程序只解释构造的TLV结构的值部分?

回答

2

当编码在不定长度模式下的原始OCTET STRING,编码器必须:

  • 分裂的值成较小的八位组串的块
  • 编码每个块以定长模式,使得每个具有它自己的TLV(长度!)
  • 一定长度的编码原始八位组串必须由编码构建OCTET STRING“容器”具有其自身的TLV(无长度的单一,不定长度被成帧整个序列,但是与最终的-octets sentinel)

在另一端,解码器提取在V部分从内,一定长度的OCTET STRING块(滴加其TL报头)。然后按到达顺序加入/消耗V,放下外部帧的TL部分。

请注意,无限长编码技术背后的思想是编码器和解码器都可以发射/消耗不完整的,可能过大的数据。

块大小由编码器/应用基于数据的可用性,存储器情况和解码器的缓冲能力可能估计选择的。我认为这是在X.280/X.680论文中提到的。

编码器不允许将不同ASN.1类型的块放入任何单个无限长编码容器中。换句话说,所有块必须与外部容器的类型相同。

这应该有希望解释为什么你可能会看到多个(取决于块的大小)在无限长编码的BER/CER流中的OCTET STRING,其中只需要一个单一的OCTET STRING。

DER禁止无限长编码,理由是相同数据的序列化表示可能会因重新编码而改变(由于潜在改变块大小)。

+0

所以,当块是进程时,这些块的头必须被丢弃,对吧?如果组块具有不同的类型,例如这也是定义的。整数?是在任何地方定义生成块的过程? PS:我会将我的问题改为使用BER。我所看到的标准基本上是DER,但有时候允许BER构造... – duesee

+0

更新了答案。 –

+0

太棒了,谢谢! – duesee