【问题标题】:How do you escape double null octets within an octet string encoded with indefinite length in BER?如何在 BER 中以不确定长度编码的八位字节字符串中转义双空八位字节?
【发布时间】:2017-10-12 12:34:38
【问题描述】:

我正在尝试在 D 中编写基本编码规则编解码器,并且我希望能够使用不定长度编码对数据进行编码,其中长度字节设置为 0x80 并且值字节的结尾被划定带有双空 0x00 0x00(内容结束)。但是,有时双空值是被编码的实际值的一部分。例如,如果您有一个OCTET STRING,则两个相邻字节可能是0x00 0x00,这将被解释为END OF CONTENT,而不仅仅是编码值的一部分,从而导致编码值的截断(最好-案例场景)。有什么方法可以编码双空而不会将它们解释为END OF CONTENT?或者您是否希望只对没有双空值的值进行编码?我还没有在任何规范中找到任何关于此的内容。

【问题讨论】:

    标签: asn.1 ber


    【解决方案1】:

    您永远不会将普通的 OCTET STRING 内容放在 0x80 和 0x00 0x00 之间。相反,您将 [可能的片段] 定长编码的八位字节字符串放在那里。

    换句话说,不定长编码的单字节分块“AB”ASCII 字符串(例如十六进制的 0x41 0x42)如下所示:

    0x24 0x80      0x04 0x01 0x41       0x04 0x1 0x42     0x00 0x00 
    ^              ^                    ^                 ^
    outer header   inner chunk #1       inner chunk #2    outer EOO sentinel
    

    最终结果是解码器不必扫描实际有效载荷来搜索 EOO 标记,因为有效载荷边距由确定长度的编码片段明确定义。

    【讨论】:

    • 在这种情况下,外部标头应表示为构造函数,因此应编码为 0x24。它将标识符标签 (P/C) 的第 6 位设置为已构造。
    • @pepo 确实!谢谢! ;-)
    • 这适用于八位字节字符串,但是当我有整数 0x10000000FFFFFFFC 并且我不遵循 DER 规则时,我该如何编码,但实际上是 BER 规则,它甚至允许基元具有无限长度编码.
    猜你喜欢
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    相关资源
    最近更新 更多