ASN1(Abstract Syntax Notation One)简介
ASN1(Abstract Syntax Notation One),抽象语法符号)是用来描述数据结构及其编码的规则集,它广泛用于RFC(Request For Comments)文本中的数据结构的描述。X.509证书结构(RFC 2459)就是采用ASN1描述和编码的。因此首先对ASN1的编码规则做一简介。 在ASN1编码中,数据类型包括简单类型和结构类型。简单类型是不能再分解类型,如整型(INTERGER)、比特串(BIT STRING)、字节串(OCTET STRING)、对象标示符(OBJECT IDENTIFIER)、日期型(UTCTime)等。结构类型是由简单类型和结构类型组合而成的,如顺序类型(SEQUENCE, SEQUENCE OF)、选择类型(CHOICE)、集合类型(SET)等。顺序类型的值由按给定顺序成员数据值组成;选择类型的值由多个成员数据类型中的某一个值构成;集合数据类型由成员数据类型的一个或多个值构成。每一种类型都有一个整数标记(TAG)来标识该类型。常用类型的TAG值如下:
Table 1.1: Tags of class UNIVERSAL
标记(TAG) 对应类型
[UNIVERSAL 1] BOOLEAN
[UNIVERSAL 2] INTEGER
[UNIVERSAL 3] BIT STRING
[UNIVERSAL 4] OCTET STRING
[UNIVERSAL 5] NULL
[UNIVERSAL 6] OBJECT IDENTIFIER
[UNIVERSAL 8] EXTERNAL, INSTANCE OF
[UNIVERSAL 12] UTF8String
[UNIVERSAL 13] RELATIVE-OID
[UNIVERSAL 16] SEQUENCE, SEQUENCE OF
[UNIVERSAL 17] SET, SET OF
[UNIVERSAL 18] NumericString
[UNIVERSAL 19] PrintableString
[UNIVERSAL 20] TeletexString, T61String
[UNIVERSAL 21] VideotexString
[UNIVERSAL 22] IA5String
[UNIVERSAL 23] UTCTime
[UNIVERSAL 24] GeneralizedTime
[UNIVERSAL 25] GraphicString
[UNIVERSAL 26] VisibleString, ISO646String
[UNIVERSAL 27] GeneralString
[UNIVERSAL 28] UniversalString
[UNIVERSAL 29] CHARACTER STRING
[UNIVERSAL 30] BMPString
[UNIVERSAL 31]... reserved for future use
不论是简单类型还是结构类型的值其编码都是由四个部分构成:类型标识字段,用来标识该值的类型;长度字段,用来标识该值所占的字节数;值字段;结束标示字段。 在类型标识字段中,使用类型的TAG来标识该类型,在证书中使用一个字节来表示。Bit8-bit7 用来标示 TAG 类型,bit6 标示是否为结构类型(1 位结构类型),bit5-bit1是类型的TAG值。如 SEQUENCE 类型,其TAG类型位UNIVERSAL(00),属于结构类型(1),TAG值为16(10000) 所以其类型标示字段值为(00110000),即为0x30。 长度字段,有两种编码格式。若长度值小于等于127,则用一个字节表示,bit8 = 0, bit7-bit1 存放长度值;若长度值大于127,则用多个字节表示,第一个字节存放长度字段所占的字节数(<=127),并且bit8 = 1,其余字节存放长度值。如果长度值不定用一个字节(0x80)表示。 值字段,存放数据值,具体编码随值的数据类型不同而不同。 结束标示字段,两个字节(0x0000),只有在长度值为不定时才会出现。