gpt4 book ai didi

encoding - 使用多个封装的八位字节串解释 ASN.1 无限长度编码

转载 作者:行者123 更新时间:2023-12-05 03:08:16 27 4
gpt4 key购买 nike

我有一个像这样的 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 的 header 字节?如果是,不定长字节数据是如何编码的?例如,当第二个 OCTET STRING 是一个整数?

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

来自 ITU-T X.690:

8.1.4 Contents octets

The contents octets shall consist of zero, one or more octets, and shall encode the data value as specified in subsequent clauses.

NOTE – The contents octets depend on the type of the data value; subsequent clauses follow the same sequence as the definition of types in ASN.1.

这是否意味着我可以放置每个构造类型,而应用程序必须只解释构造 TLV 结构的值部分?

最佳答案

当您以不定长模式对原始 OCTET STRING 进行编码时,编码器必须:

  • 将值拆分为更小的 OCTET STRING block
  • 以定长模式对每个 block 进行编码,以便每个 block 都有自己的 TLV(有长度!)
  • 一定长度编码的原始 OCTET STRING 的整个序列必须由一个单一的、不定长度编码的构造 OCTET STRING“容器”构成,该容器具有自己的 TLV(没有长度,但带有八位字节结尾标记)

在另一端,解码器从内部确定长度的 OCTET STRING block 中提取 V 部分(丢弃它们的 TL header )。然后按照到达的顺序将 V 连接/消耗在一起,丢弃外部框架的 TL 部分。

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

block 大小由编码器/应用程序根据数据可用性、内存情况以及可能对解码器缓冲能力的估计来选择。我认为 X.280/X.680 论文中某处提到了这一点。

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

这应该可以解释为什么您可能会在不定长编码的 BER/CER 流中看到多个(取决于 block 大小)OCTET STRING,而预期只有一个 OCTET STRING。

DER 禁止无限长度编码,因为相同数据的序列化表示可能会在重新编码时发生变化(由于可能改变 block 大小)。

关于encoding - 使用多个封装的八位字节串解释 ASN.1 无限长度编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45479783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com