1. 简介
ASN.1(Abstract Syntax Notation One)是一个标准的接口描述语言(Interface description language/IDL),IDL是可以在跨平台中实现序列化和反序列化的数据结构。
ASN.1只定义了抽象语法,并没有限定编码规则。当前较为流行的编码规则有:Basic Encoding Rules(BER)、Canonical Encoding Rules(CER)、Distinguished Encoding Rules(DER)。本文是基于ITU-T X.690规范初步阅读形成的一个笔记。
1.1 BER、CER、DER差异
BER是ITU-T X.690给出的传输ASN.1数据结构的一套基础编码规则,因此它的规则较为宽松和灵活,在规则范围内,发送放可以自由选择。例如一个boolean类型的true值,只要该字节非0x00即可,因此发送放可以选择0x01表示true,也可以选择0x02表示true。
DER和CER在BER基础上进一步添加限制,形成一套比BER严格的编码规则,因此DER和CER是BER的一个子集。
BER/CER/DER编码都是典型的TLV格式:Type-Length-Value
基础的TLV结构包含如下三部分:
- Type:Value标识符,标识Value类型
- Length:Value长度
- Value:数据内容
TLV允许多层嵌套,如图所示,1级Value中,嵌套1个2级TLV,2级TLV中又嵌套1个TLV队列(包含2个TLV)
DER和CER一个显著的差异在于:DER的length长度必须是明确的,而CER可以通过end-of-contents octets来表明Value结束(end-of-contents octets详见章节2.1和2.1.4)。
2.BER
2.1 基础规则
BER编码也遵循TLV结构,如下:
a. identifier octets
b.length octets
c.contents octets
d.end-of-contents octets
end-of-contents octets只在length octets中要求展现时,才会展现。默认不进行展现。
2.1.1 identifier octets
identifier octets包含三个部分:Class、P/C、Tag number。针对不同的Tag number又分为2种情况:
2.1.1 .1 Tag number小于31(十进制)
当ag number小于31时,identifier octets长度为1个字节,格式如下:
- Class:2个bit。包含4个值
a. 00:Universal。最常用的类型。在ITU-T X.680里定义的tag number均属于此类型。详见Tag number处表格。
b. 01:Application。
c. 10:Context-specific。
d. 11:Private。 - P/C:1个bit。标记后续contents octets是一个基础值还是一个嵌套的TLV值。
0:Primitive。后续contents octets为基础值
1:Constructed。后续contents octets为嵌套的TLV。 - Tag number:5个bit。最大值为0x1F,即十进制的31。
Type中字段规范表如下:
Name | Class | P/C | Decimal Tag number | Hexadecimal Tag number |
---|---|---|---|---|
End-of-Content(EOC) | Universal | Primitive | 0< |