我有一个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语法应该是解码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top