文章目录
- 一、BER 编码规则介绍
- 二、BER编码数据组成
- 三、Identifier octets Type
- 1. tag class 分类
- 2. p/c 分类
- 3 tag type
- 4. ASN.1的原始数据类型(TAG)
- 四、 Length octets
- 1、定长的短格式
- 2、不定长格式
- 3、保留格式
- 五、Contents octets
- 六 、BER编码番外
一、BER 编码规则介绍
BER (基本编码规则) 是 ASN.1 标准制定的用于将数据编码为二进制格式的原始规则。这些规则在 ASN.1 术语中统称为传输语法,指定用于编码数据的确切八位字节(8 位字节)。
二、BER编码数据组成
BER 基本编码规则的格式指定了一种用于编码 ASN.1 数据结构的自描述和自定界格式。每个数据元素都被编码为类型标识符、长度描述、实际数据元素,以及必要时的内容结束标记。这些类型的编码通常称为类型-长度-值(TLV) 编码。但是,在 BER 的术语中,它是identifier-length-contents。这种格式允许接收者从不完整的流中解码 ASN.1 信息,而无需预先了解数据的大小、内容或语义.
Identifier octets Type | Length octets | Contents octets | End-of-Contents octets |
---|---|---|---|
Type | Length | Value | (only if indefinite form) |
三、Identifier octets Type
type 被编码成一个或多个字节,主要由 标签种类tag class,数据类型P(Primitive)/C(Constructed),tag number 组成。
结构如下:
第一个字节的前2位表示 tag class 第3位表示p/c,后边则是tag number
1. tag class 分类
tag class 有以下几种,它的值是用来区分 ASN.1 类型
类型 | 值 | 说明 |
---|---|---|
universal | 0 | 表示原始的数据类型 |
application | 1 | 只适用于一个特定的应用程序类型 |
context-specific | 3 | 根据上下文定义的类型 |
private | 4 | 私人规范中定义的类型 |
2. p/c 分类
p/c 表示数据内容是基本的数据类型还是复合的数据类型。
类型 | 值 | 说明 |
---|---|---|
Primitive § | 0 | 数据内容仅由一个数据元素组成 |
Constructed © | 1 | 数据内容由多个数据元素组成 |
3 tag type
tag type 数据的标识,是固定的。在asn.1的原始数据类型表里可以看到。
如果定义的数据类型不是 Universal 的数据类型,那么此时需要用到更多的字节序列如 Octet2。在使用这类标记的时候,要将 Octet1 的第 5 到第 1 个二进制位置为 1 ,如果 Octet2 后面还有 Octet3,那么 Octet2 的第 8 个二进制位应该为 1。
4. ASN.1的原始数据类型(TAG)
数据类型 | 编码类型 | Tag number(十进制) | Tag number(十六进制) |
---|---|---|---|
End-of-Content (EOC) | Primitive | 0 | 0 |
BOOLEAN | Primitive | 1 | 1 |
INTEGER | Primitive | 2 | 2 |
BIT STRING | Both | 3 | 3 |
OCTET STRING | Both | 4 | 4 |
NULL | Primitive | 5 | 5 |
OBJECT IDENTIFIER | Primitive | 6 | 6 |
Object Descriptor | Both | 7 | 7 |
EXTERNAL | Constructed | 8 | 8 |
REAL (float) | Primitive | 9 | 9 |
ENUMERATED | Primitive | 10 | A |
EMBEDDED PDV | Constructed | 11 | B |
UTF8String | Both | 12 | C |
RELATIVE-OID | Primitive | 13 | D |
TIME | Primitive | 14 | E |
Reserved | 15 | F | |
SEQUENCE and SEQUENCE OF | Constructed | 16 | 10 |
SET and SET OF | Constructed | 17 | 11 |
NumericString | Both | 18 | 12 |
PrintableString | Both | 19 | 13 |
T61String | Both | 20 | 14 |
VideotexString | Both | 21 | 15 |
IA5String | Both | 22 | 16 |
UTCTime | Both | 23 | 17 |
GeneralizedTime | Both | 24 | 18 |
GraphicString | Both | 25 | 19 |
VisibleString | Both | 26 | 1A |
GeneralString | Both | 27 | 1B |
UniversalString | Both | 28 | 1C |
CHARACTER STRING | Constructed | 29 | 1D |
BMPString | Both | 30 | 1E |
DATE | Primitive | 31 | 1F |
TIME-OF-DAY | Primitive | 32 | 20 |
DATE-TIME | Primitive | 33 | 21 |
DURATION | Primitive | 34 | 22 |
OID-IRI | Primitive | 35 | 23 |
RELATIVE-OID-IRI | Primitive | 36 | 24 |
四、 Length octets
Length字段标识 value字段编码 的字节数,分为定长和不定长。其中定长的length指的是长度不超过 127 的短格式和长度超过 127 字节的长格式。
1、定长的短格式
a、前面的第一位是0,后边的7个位代表长度,因为7个位的2进制是0111 1111,最大也就是127,所以要求短格式不能超过127
b、定长长格式:最高位是1,后面的7个位表示长度值占用的字节数,然后跟上长度值。
例如长度为300,转换成2进制是0000 0001 0010 1100,占用2个字节,那么编码后应该是
1 000 0010 0000 0001 0010 1100 总共占用3个字节,用16进制表示 0x82 0x01 0x2c
2、不定长格式
根据图上看到最高位为1,后边7个位全是0,那就是1000 0000 也就是0x80 固定的数值
在value结尾处标记2个0x00代表内容结束,因为是不定长,必须知道内容在网络上传输时读到啥时候结束。
3、保留格式
最高位为1,后边7个为全是1,0xFF表示
同时在数据内容结尾处用2个0x00标记,代表着内容结束。
五、Contents octets
value 是数据内容的字节编码,如果不存在或者是虚对象的时候可能没有,比如value是NULL
六 、BER编码番外
- CER 和DER 都是BER的一种变体,他们从基本编码规则允许的编码中选择一种编码,消除了其余选项。
- X.690
X.690 是一个ITU-T(https://en.wikipedia.org/wiki/ITU-T)标准,指定了几种编码规则,主要是(BER, CER, DER )