代码之家  ›  专栏  ›  技术社区  ›  Larry

ASN输入中未声明的标记。1误码解码器

  •  1
  • Larry  · 技术社区  · 16 年前

    我有ASN的规格。1我希望通过添加一些字段来修改的语法。如果我使用BER和新字段创建一个编码字符串,然后尝试使用不知道这些额外字段的解码器解码该字符串,结果应该是什么?解码是否会因为存在解码器无法识别的字段而失败?解码器会只解码它能识别的字段,而完全忽略它不能识别的字段吗?这完全是一个解码器实现问题,因此根据解码器的实现方式,两种结果都是可能的吗?

    现在,我正在使用一个开源ASN。1个编译器/解码器,它似乎完全失败了,但我不确定这是因为实现还是因为ASN。1规则决定了这种结果?

    2 回复  |  直到 16 年前
        1
  •  3
  •   Conrad Sigona    16 年前

    它当然不取决于实施。也就是说,如果不同的实现以不同的方式处理它,其中一个就是做得不正确。 如果使用不需要未知字段的解码器对未知字段进行解码,解码应该会失败。它不会跳过未知字段。

    然而,有一种方法可以在已知其他字段之前就提供这些字段。它将使用扩展标记(“…”)。假设我们开发了各种版本的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都可以互操作。

    然而,请注意,由于我们处理的是一个序列,因此必须保留顺序。没有d就不能有e,没有d,e和f就不能有g。

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

        2
  •  0
  •   nos    16 年前

    这一切都取决于规范和实现。简言之,这是无从得知的。这取决于实施情况。使用asn的任何给定协议/格式的一些规范。1将明确说明忽略未知元素,在这种情况下,解码不应失败。

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

    推荐文章