题
我有一个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,可能还有更多的字段尚不清楚。解码器应将包含此类字段的消息视为有效。解码器将无法解码它们,因为它不知道应该是什么,但它知道它们是允许的。
假设我们通过插入两个有点像这样的新字段将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将解码D和E。因此,V1解码器将同时接受V1和V2编码,每当发现D和E时忽略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都可以互操作。
但是请注意,由于我们要处理序列,因此必须保留该顺序。如果没有d,也不能没有d,e和f。
因此,结论是,如果您的类型定义包含扩展标记,则可以添加新字段,但是如果没有,则可能不会。
这完全取决于规范和实施。简而言之 - 没有办法说明。这取决于实施。使用ASN.1的任何给定协议/格式的规范都会明确说明要忽略未知元素,在这种情况下,解码不会失败。
不过,更常见的是,解码器将拒绝任何不符合ASN的输入。1语法应该是解码。