ASN.1中隐式和显式标签的编码

我试图了解IMPLICIT和EXPLICIT标签实际上是如何以DER二进制格式编码的。

基本示例很清楚。纯整数

x INTEGER ::= 5

被编码为TLV三元组02 01 05。在

x [2] IMPLICIT INTEGER ::= 5

隐式标签82替换现有标签02并形成另一个TLV:82 01 05,并在

x [3] EXPLICIT INTEGER ::= 5

在原始TLV:A3 03 02 01 05周围添加了包装器。

现在我正在研究一个更复杂的案例

30 42 A1 40 30 0D 82 0B  77 77 77 2E 62 61 64 2E
6F 72 67 30 09 82 07 62  61 64 2E 63 6F 6D 30 0D
81 0B 62 61 64 40 62 61  64 2E 6F 72 67 30 09 81
07 62 61 64 2E 63 6F 6D  30 0A 87 08 0A 00 00 00
FF 00 00 00

被解码为

SEQUENCE {
  [1] {
    SEQUENCE {
      [2] www.bad.org
    }
    SEQUENCE {
      [2] bad.com
    }
    SEQUENCE {
      [1] bad@bad.org
    }
    SEQUENCE {
      [1] bad.com
    }
    SEQUENCE {
      [7] 0A000000FF000000
    }
  }
}

我的问题是,如何知道A1是隐式标签[1] IMPLICIT SEQUENCE,它取代了原始标签10,并包含五个TLV元素(序列),还是一个包含这五个元素的显式标签?什么是A1

显式标签可以包装几个TLV元素吗?

“已构造”标志(第6位)指示标记是显式的还是隐式的,是否正确?还是我需要查看包装纸的长度和被包装的东西?

我不认为二进制数据是正确的,因此另一种可能性是A1 40环绕以下序列30 0D ...,长度不匹配并且必须拒绝数据。

iCMS 回答:ASN.1中隐式和显式标签的编码

您在问几个问题,但每个问题都应有单独的答案。

标签本身不是隐式或显式的。 “标记”(将标记添加到类型的操作)是隐式的或显式的。

请考虑以下事实:在ASN.1中,每个基本类型(例如INTEGER,BOOLEAN)或类型构造函数(除CHOICE之外)(例如SEQUENCE)都具有内置的“通用”标签。例如,类型INTEGER具有内置标记UNIVERSAL 2,类型OBJECT IDENTIFIER具有内置标记UNIVERSAL 6,每个SEQUENCE类型都具有内置标记UNIVERSAL 16,依此类推。这并非特定于BER / DER。这是类型本身的属性。

当某个类型作为另一种类型的组件(例如SEQUENCE或CHOICE)出现时,通常(但并非总是)为其分配另一个标签。新标签可以替换现有标签,也可以在现有标签之前插入。这就是隐式标记和显式标记。在隐式标记中,新标记将替换其所应用类型的现有标记。在显式标记中,新标记以现有标记为前缀。这也不是BER / DER专用的,它是ASN.1的功能。某些编码规则(BER,DER和OER在一定程度上)在编码中使用标签,而其他编码规则(PER,JER)在编码中不包含标签。尽管如此,标签的存在与所使用的编码规则无关。

给定类型使用隐式或显式标记取决于几件事。首先,在模块标题中指定了默认标记(EXPLICIT TAGS,IMPLICIT TAGS,AUTOMATIC TAGS),这为模块中存在的类型建立了默认标记模式。 (“默认默认值”是显式标记。)其次,可以通过在“]”之后使用关键字IMPLICIT或EXPLICIT覆盖特定类型模块的默认标记。第三,在某些情况下,标记必须是明确的。

如果您在模块标题中指定了AUTOMATIC TAGS,则过程将生成连续的标签并将其从“特定于上下文的” 0开始应用于每个序列类型,设置类型和选择类型的每个组件,而不会在其任何组件中都包含文字标记。自动标记过程将应用隐式标记,这意味着每个生成的标记将替换现有标记。

有一些限制和一些特殊情况。一个是CHOICE类型没有自己的通用标签,因此不可能对不带文字标签的CHOICE类型应用隐式标签(没有标签可替换)。如果您不使用“自动标签”并且不向选择类型添加新标签,则选择类型将保留为没有其自己的标签。在BER / DER中,解码器仍然可以通过查看即将到来的标签来检测未加标签的选择类型的存在,该标签属于存在的选择选择。

以上显示,在BER / DER解码器如何解释编码中的下一个标签方面,没有任何歧义。标记过程为模块中的每种类型(包括复杂类型的组件类型)分配定义良好的标记(通常为一个或两个标记,对于未标记的选择类型可能为一个)。如上所述,这些标签是ASN.1模式中存在的每种类型的属性。在BER和DER中,编码器将只插入其正在编码的每个值类型的所有标签。如果值的类型带有一个标签,则编码器将产生一个TLV。如果值的类型具有两个标签,则编码器将产生两个嵌套的TLV。实际上很简单。解码器会知道会发生什么。

,

Alessandro为您提供了出色的标记教程。快速补充几点:

通用BER解码器可以将BER数据解码为TLV层次结构,但是通常需要具有了解如何将其与ASN.1类型关联的架构。

标签适用于类型,因此,不能,您不能添加显式标签来包装多个TLV元素。它会包装一个TLV。

构造的标志告诉您TLV中的V(值)本身是否为TLV。某些类型(例如BIT STRING)可以以构造形式或原始形式进行编码。当对类型进行显式标记时,它将始终生成带有构造标志集的TLV,但这不是唯一使用构造标志的时间。

本文链接:https://www.f2er.com/1529574.html

大家都在问