ASN.1 BER 编码整数 0x10000000FFFFFFFC 不定长编码

ASN.1 BER Encode Integer 0x‭10000000FFFFFFFC Indefinite Length Encoded

我正在根据 spec 实施 BER,我问自己一个问题:当我使用不定长编码时,如何将整数 0x10000000FFFFFFFC 编码为 BER 整数(标记 0x02)?

到目前为止,我没有在规范中找到任何转义字符,所以我假设,我无法对这样的数字进行编码,因此必须依赖发件人也知道这一点,并发送带有短格式长度编码。但是在BitStrings中,同样的问题出现了。

您担心以下情况:(a) 使用图 2 所示的替代构造编码,以及 (b) 内容八位字节包含八位字节 0x0000,它将(错误地)解释为内容结束标记。

当我第一次读到这个问题时,我的第一直觉是,BER 肯定对此有所说明。也许有一种转义机制可以避免内容中出现 0x0000。也许编码规则是这样的 0x0000 自然不会出现。

但在仔细扫描 X.690 规范几次后,我找不到任何此类内容。

所以,我认为你是对的:我认为发件人不应该在这种情况下使用替代构造编码(这实际上意味着,永远不应该对具有这种潜力的数据类型使用替代构造编码问题,例如整数和位串)。

作为比较,Thrift 在编码结构时仅允许在非常特定的情况下使用 STOP 标记(字节 00)作为 "no more fields" 标记(参见 https://github.com/erikvanoosten/thrift-missing-specification/blob/master/rpc-spec-binary-protocol.asciidoc

据我所知,不定长度编码仅针对 octet/bit 字符串定义,而非数字类型。

此外,我认为BER中没有任何转义机制。

不定长编码始终包含使用定长编码编码的数据块(octet/bit 字符串)。在 BER 的说法中,不确定的长度总是在构造形式中。

使用定长编码,你总是有字节数来按特定位置切割八位字节流,你不需要任何哨兵。

对于不定长编码,您需要那些两个零的标记(实际上是具有零长度值的 TVL 三元组)来指示数据结束。但是你从来没有生的,例如非编码数据(否则可能会干扰哨兵)作为有效载荷。

您永远不要对整数使用不定长度编码...

写在 X.690 (08/2015) chapter 8.3 (Encoding of an integer value):

The encoding of an integer value shall be primitive

不定长度用于构造类型(SEQUENCE、SEQUENCE OF ...)和可包含大值的基本类型(字符串类型、BITSTRING、OCTET STRING ...)。 在这种情况下,规范会说:

The encoding of a bitstring value shall be either primitive or constructed at the option of the sender

CER 编码规则(第 9 章)让您了解大值在撰写本文时的含义:

 Bitstring, octetstring, and restricted character string values shall be encoded with a primitive encoding if they would require no more than 1000 contents octets, and as a constructed encoding otherwise

所以你看到即使是一个巨大的整数在编码时也总是小于 1000 字节:因此选择从不对整数使用不定长度形式