繁体   English   中英

ASN.1 BER解码器的输入中未声明的标签

[英]Undeclared tags in the input to an ASN.1 BER decoder

我有一个ASN.1语法规范,希望通过添加一些字段来进行修改。 如果我使用带有新字段的BER创建一个编码字符串,然后尝试使用不了解这些其他字段的解码器对该字符串进行解码,那么结果应该是什么? 解码是否会因为解码器无法识别的字段而失败? 解码器将仅解码它可以识别的字段,并完全忽略它不识别的字段吗? 这是否完全是解码器实现的问题,所以取决于解码器的实现方式,是否有可能实现?

现在,我使用的是开放源代码的ASN.1编译器/解码器,它似乎完全失败了,但是我不确定这是由于实现还是因为ASN.1规则规定了这种结果?

它最肯定不依赖于实现。 也就是说,如果不同的实现对它的处理方式不同,则其中之一会错误地执行它。 如果您使用不希望出现未知字段的解码器来解码未知字段,则解码应该会失败。 它不会跳过未知字段。

但是,有一种方法可以甚至在已知其他字段之前就提供它们。 将使用扩展标记(“ ...”)。 假设我们开发了ASN.1规范的各种版本。 我们将它们称为V1,V2,V3等。V1是原始规范,但是我们在设计V1时了解到,可能必须在某个时候对其进行修改。 为此,而不是类似的东西

Z ::= SEQUENCE { a INTEGER,
                 b OCTET STRING,
                 c Message1
}

我们将这样声明Z是可扩展的

Z ::= SEQUENCE { a INTEGER,
                 b OCTET STRING,
                 c Message1,
                 ...
}

扩展标记表示,在c之后,可能还有更多未知的字段。 解码器应将包含此类字段(只要它们遵循c)的消息视为有效。 解码器将无法对其进行解码,因为它不知道它们应该是什么,但知道它们是允许的。

假设我们通过插入两个新字段将V1更新为V2

Z ::= SEQUENCE { a INTEGER,            -- V1
                 b OCTET STRING,       -- V1
                 c Message1,           -- V1
                 ...,
             [[  d PrintableString,    -- V2
                 e BOOLEAN          ]] -- V2
}

在这种情况下,V1版本可以与V2版本进行互操作。 V1编码器将不包括d或e,而V2编码器将包括它们。 从解码器的角度来看,V1解码器将接受(但不解码)d和e,而V2解码器将对d和e进行解码(如果找到)。 因此,V1解码器将同时接受V1和V2编码,只要找到d和e便会忽略它们。 V2解码器也将同时接受V1和V2编码,请注意,V1编码将不包含d或e,但仍保持有效。

我们可以通过其他版本继续进行此操作,例如,

Z ::= SEQUENCE { a INTEGER,            -- V1
                 b OCTET STRING,       -- V1
                 c Message1,           -- V1
                 ...,
             [[  d PrintableString,    -- V2
                 e BOOLEAN         ]], -- V2
             [[  f PrintableString,    -- V3
                 g ExtensionMessage]]  -- V3
}

其中V1,V2和V3都可以互操作。

但是请注意,由于我们正在处理SEQUENCE,因此必须保留顺序。 如果没有d,就不可能有e;如果没有d,e和f,就不可能有g。

因此,得出的结论是,如果您的类型定义包含扩展标记,则可以添加新字段,但如果不包含,则可以不添加。

这都取决于规范和实现。 简而言之-无法告诉。 这取决于实施。 对于使用asn.1的任何给定协议/格式的某些规范将明确声明要忽略未知元素,在这种情况下,解码不应失败。

不过,更常见的是,解码器将拒绝任何严格符合应解码的ASN.1语法的输入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM