2. 抽象语法标记(Abstract Syntax Notation One)
抽象语法标记(Abstract Syntax Notation One)是描述抽象类型和值的标记,缩写为ASN.1。
在ASN.1中,一个类型就是值的一个集合。有些类型有有限个值,有些则有无限多个。一个给定的ASN.1类型的值是该类型集合里的一个元素。ASN.1有四种类型:简单类型,它相当于原子,没有下层组件;结构类型,有组成部分;标签类型,由其它类型生成;其它类型,包括CHOICE和ANY类型。可以使用ASN.1的分配符(::=)给类型和值指定名字,这些名字可以用于定义其它类型或值。
除了CHOICE和ANY类型以外,每种ASN.1类型都有一个标签,由一个类和一个非负的标签数组成。标签值可以唯一区分ASN.1类型。也就是说,ASN.1类型的名字并不影响它的抽象含义,只有标签值才有这个作用。有四类标签:
-
●Universal:该类型的含义在所有的application中都相同。这种类型只在X.208中定义。
●Application:该类型的含义由application决定,如X.500目录服务。两个不同的application中的类型可以具有相同的application-specific标签但是可以具有不同的含义。
●Private:,该类型的含义根据给定的企业而不同。
●Context-specific:该类型的含义根据给定的结构类型而不同。Context-specific标签用于在一个给定的结构类型上下文中区分使用相同的下层标签的组件类型。在两个不同的结构类型中组件类型可以具有相同的标签但是含义不同。
具有universal标签的类型在X.208中定义,X.208也给出了类型的universal标签值。使用其他标签的类型在很多地方都有定义,通常是通过implicit或explicit标签获得。表一列出了部分ASN.1类型及其universal-class标签。
(译者注:为了表示清晰,表格中的字段用下划线分隔开来)
====Type Tag================number_(decimal)========Tag_number_(hexadecimal)
________INTEGER____________________2_________________________02________________
________BIT_STRING_________________3_________________________03________________
________OCTET_STRING_______________4_________________________04________________
________NULL_______________________5_________________________05________________
________OBJECT IDENTIFIER__________6_________________________06________________
________SEQUENCE and SEQUENCE OF___16________________________10________________
________SET and SET OF____________17________________________11_________________
________PrintableString____________19________________________13________________
________T61String__________________20________________________14________________
________IA5String__________________22________________________16________________
________UTCTime____________________23________________________17________________
-
分层(换行)无特殊意义;多个空格和多个空行相当于一个空格。
注释由一对连字符(--)开头,或者一对连字符和一个空行
识别符(值或字段的名字)和类型索引(类型的名字)由大小写字母、数字、连字符和空格组成;识别符由小写字母开头,类型索引由大写字母开头。
下面的四个子节概括介绍了简单类型、结构类型、隐式和显式标签类型,及其他类型。第5节定义了类型的更多细节。
2.1 简单类型(Simple types)
简单类型没有 组件,是“原子级”的类型。ASN.1定义了几个简单类型,其中与PKCS标准有关类型如下:
-
●BIT STRING:由0和1任意组成的比特流
●IA5String:由IA5(ASCII)字符任意组成的字符流
●INTEGER:一个任意的整数
●NULL:null值
●OBJECT IDENTIFIER:对象识别符,有一列整数构成,用于确定对象,如算法或属性类型
●OCTET STRING:任意的octet(8bit值)流
●PrintableString:任意可打印字符流
●T61String:T.61(8bit)字符的任意流
●UTCTime:"coordinated universal time"或者格林威治平均时(GMT)值。
简单类型分为两类:string类型和non-string类型。BIT STRING, IA5String, OCTET STRING, PrintableString, T61String, 和UTCTime是string类型。
考虑到编码,String类型可以视为由组件组成,组件是substring。这样即使事先不知道值的长度也可以使用结构化的、不定长的编码方式进行编码(例如,从一个file stream中输入的octet string值)。
String类型可以指定大小限制,以限制值的长度。
2.2 结构化类型(Structured types)
结构类型由组件组成。ASN.1定义了四种,都与PKCS标准有关:
-
●SEQUENCE:一个或多个类型的有序集合
●SEQUENCE OF:0个或某个给定类型多次出现的有序集合
●SET:一个或多个类型的无序集合
●SET OF:0个或某给定类型多次出现的无序集合
结构类型允许有可选组件。可