【问题标题】:ASN.1 BER Encode Integer 0x‭10000000FFFFFFFC Indefinite Length EncodedASN.1 BER Encode Integer 0x10000000FFFFFFFC 不定长度编码
【发布时间】:2018-10-10 15:41:00
【问题描述】:

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

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

【问题讨论】:

    标签: asn.1 ber


    【解决方案1】:

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

    它写在 X.690 (08/2015) 第 8.3 章(整数值的编码)中:

    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 字节:因此选择从不使用不定长度形式的整数

    【讨论】:

    • 我想我误解了“应该”他们。在 RFC 中,这通常会提供选择。
    • @Andreas RFC:SHALL 是 RFC:MUST 的同义词:1. MUST This word, or the terms "REQUIRED" or "SHALL", mean that the definition is an absolute requirement of the specification. (tools.ietf.org/html/rfc2119#section-1)
    【解决方案2】:

    AFAIK,不定长编码仅适用于八位字节/位字符串,而不适用于数字类型。

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

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

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

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

    【讨论】:

    • 我没有看到关于将整数编码为基元并使用不定长度编码的限制。也许有人可以这样解释“应该使用最短的方法”,但没有任何说明,我不允许这样做。
    【解决方案3】:

    您担心 (a) 使用图 2 中所示的替代构造编码和 (b) 内容八位字节包含八位字节 0x0000 将(错误地)解释为内容结束标记的场景。

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

    但是在仔细扫描 X.690 规范几次之后,我什么也找不到。

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

    作为比较,Thrift 在编码结构时仅允许在非常特殊的情况下将 STOP 标记(字节 00)作为“不再有字段”标记(参见 https://github.com/erikvanoosten/thrift-missing-specification/blob/master/rpc-spec-binary-protocol.asciidoc

    【讨论】: