5 标识
5.1 概述
5.1.1 ASN.1标识由在第11章定义的ASN.1字符集组成。
5.1.2 每个ASN.1标识所包含的来自ASN.1字符集的字符被分为词项类。12章定义了所有字符集组成词项,并为他们命名。
5.1.3 第13章及后续章节详细阐述和命名了构成ASN.1标识的有效实例的词项序列,并每个序列的使用场景。
5.1.4 为详细阐述有效词项序列,本规范在后续章节使用了一个形式上的标识。
5.2 表达式
5.2.1 所有的词项和有效词项序列都被命名。(详见12章)
5.2.2 一个新的(更复杂的)有效词项序列通过表达式进行定义。这个过程使用了词项名称、有效词项序列名称形成一个新的有效词项序列。
5.2.3 每个表达式按照顺序包含以下几个部份:
a) 新的有效词项序列的名称;
b) ::= 字符;
c) 一个或多个在5.3中定义的词项,使用字符|分开。
5.2.4 一个词项序列在新的有效词项序列中作为一个或多个可选项出现。新的有效词项序列通过本规范的5.2.3 a)的名称被引用。
注:如果同一词项序列在可选集中出现多次,结果标识的歧义在相关文本中进行解决。
5.3 可选集
5.3.1 每个表达式中的可选集(详见5.2.3 c))由一系列名称定义。每个名称既可以是词项的名称,也可以是通过其他表达式定义和命名的有效词项序列。
5.3.2 有效词项序列包含每个由所有与第一个名称相关的序列组成的可选项,连接第二个名称相关的序列,知道包含最后一个名称的可选序列。
5.4 非空指示符
如果非空指示符“&”在生产序列之间插入,那么在他之前和在他之后的词项都不可以是空白字符。
5.5 表达式举例
5.5.1 表达式:
ExampleProduction ::=
bstring
| hstring
| “{” IdnetifierList ” }”
“ExampleProduction”可获取以下词项序列:
a) 任意”bstring”(一个词项);或
b) 任意”cstring”(一个词项);或
c) 任意与“IdentifierList”相关的词项序列
注:“{}”包含单一词项名称(详见12.37)
5.5.2 在本例中,“IdentifierList”在其他地方进行定义,可能在定义“ExampleProduction”之前,也可能在定义“ExampleProduction”之后。
5.6 布局
本规范定义的表达式之后都包含一个空行。表达式之内不存在空行。表达式可以是单列的,也可以是多列的。布局样式并不重要。
5.7 复用
本规范的表达式经常复用。表达式经常复用直到新的表达式被建立。
注:在一些情况下,一些重复结果可能包含在无线词项序列中,一些序列可能包含无限词项。这并不是错误。
5.8 词项序列引用
本规范通过引用表达式“::=”前的名称来引用词项序列;这个名称使用单引号包围和日常文本进行区分,除非它作为表达式的一部分出现。
5.9 词项引用
本规范通过使用词项名称来引用词项。并使用单引号来与日常文本进行区分。
5.10 简化标识
为使标识看起来更简明,以下的简化标识在定义词项序列时被使用。
a) *号跟随在A和B之后,表示空词项或和A有关的词项序列或A和B的交集词项序列。
因此,C ::= A B * 相当于:
C ::= D | empty
D ::= A | A B D
D是一个辅助名称,不在其他表达式的中出现。
例如-“C ::= A B *”是以下C的可选项的简写:
Empty
A
A B A
A B A B A
…
b) +号是*号的简化版,除了空词项被排除。因此,
E ::= A B + 相当与
E ::= A | A B E
例如-“E ::= A B +”是以下E的可选项的简写:
A
A B A
A B A B A
…
c) ?号跟在一个名称之后表示空词项或和A有关的词项序列。因此,
F ::= A ? 相当于
F ::= empty | A
注:在表达式序列中简化标识符号优先与并列的词项。
5.11 值引用和值类型
5.11.1 ASN.1值分配标识可以给特定类型的值赋予名称。这个名称可以在需要使用的地方进行使用。附录C定义和解释了使用第一个特定类型的值引用名称来识别一个值的第二类型的机制。
5.11.2 在ASN.1标准中,通用英语文本被用来注释包含一个以上类型的结构体的合法使用方法。这些合法性使用说明通常包含2个以上类型兼容。例如,用于定义值引用的类型应该兼容与值引用被使用的控制类型。附录C使用值映射概念来提供关于ASN.1结构体是否合法的精确声明。
6 ASN.1的类型扩展模型
对扩展类型进行解码的时候,解码者可能会侦测到:
a) 在序列或集合中缺少期望的扩展类型;或
b) 在序列或集合中存在不被期望的扩展类型,或未知的选项在选择类型中,或未知的枚举项在枚举类型中,或不被预期长度或值的类型约束是扩展的。
在正式情况下,扩展类型x定义的抽象语法,不仅包含类型x的值,还包含与x扩展相关的值,因此,当a或b的任意情况被检测出来的时候,解码进程不会报错。以上状态的处理方式由ASN.1指定。
注:通常会忽视不期望的额外扩展;缺席期望的扩展项时,使用默认值或“丢失”指示符。
如果随后的传输语法是一致的,被解码者检测出来的不期望的扩展项可以在随后的那个类型的编码中把不期望的扩展项编码进去(用于回传给发送者或第三方)。
7 编码规则的可扩展性要求
注:这些要求适用与对标准编码规则。不适用与使用ECN定义的编码规则。
7.1 ASN.1编码规则应允许扩展类型x的编码后的值使用和x相关的扩展类型y进行解码。进一步说ASN.1编码规则应允许y解码之后重新编码的值可以被和y相关(同样和x相关)的扩展类型进行解码。
注:类型x,y,z可以出现任何扩展顺序。
如果扩展类型x的值被编码,然后传输给其他应用,并使用扩展类型y进行解码,那么使用扩展类型y的解码者可以获取到以下抽象值:
a) 扩展根类型的抽象值;
b) 类型x和y共有的抽象值;
c) 只在扩展类型x中包含的抽象值的编码将受限。
如果应用有需求,选项C中包含的编码应能够被包含与扩展类型y的编码中。这样的编码对于扩展类型x应该是一个有效的编码。
指导实例:系统A使用的扩展根类型x是一个包含了一个可选整型类型扩展的序列类型或集合类型。系统B使用的是相关扩展类型y,包含了两个可选整型类型扩展项。B传输给A一个类型y的缺少第一个可选整型值的值应该能够被A所识别。此外,如果应用协议要求,A必须能够重新编码一个x类型的第一个可选整型值存在的值,并附上从B得到的第二个整型值,传输回系统B。
7.2 所有ASN.1编码规则应该支持枚举类型和选择类型的编码和解码。特别是如果传输值是在一系列扩展中,应该能够被顺利解码,否则,解码者应该能够限制编码范围,并把不能识别的扩展值作为一个不能识别扩展。
7.3 所有ASN.1编码规则应支持对待扩展约束的类型的编码和解码。如果编码和解码者都包含待传输值扩展时,它可以成功解码,如果解码者没有待传输的扩展类型时,解码者应该能够限制编码范围,然后把不能识别的扩展值作为一个不能识别扩展。
综上所述,额外扩展是否存在应不影响之后的在其他类型中的其他扩展。
注1- 所有BER和PER编码格式应都满足这些要求,但是ECN不确定一定会满足这些要求。
注2- BER和PER不使用版本号来编码扩展项。ECN可能会使用这样的识别机制。