ASN.1
简单介绍
ASN.1 (Abstract Syntax Notation dot one) ,用来描述通信协议中传输的数据,定义了抽象数据类型规范的形式, 具有健壮性, 准确性, 独立于编程语言,独立于硬件和操作系统, 可以通过简单类型组成复杂的数据类型。
例如定义联系人 Contact 类型的语法
1 | Contact ::= SEQUENCE { |
上述的例子中定义了一个联系人的结构, 具有这样结构的联系人 name = ‘Josn Smith’, phone = 987 6543210可以通过 AS1.1 的编码规则 (后面会讲到) 序列化为二进制或文本格式, 便于进行传输
1 | JSON Encoding Rules (JER) |
完整定义的示例
购买订单类型的 ASN.1 定义
1 | -- 所有的定义都需要包含在一个模块(module)中, module 是以 'BEGIN' 关键字开始, 'END' 关键字结束 |
ASN.1 基础数据类型
1 | -- BOOLEAN |
Constaints 约束
ASN.1 的 schema 定义中可以包含约束, 用来限制给定字段或类型的有效值集合, 通过使用约束, 也可以生成一个更紧凑的编码, 例如 INTEGER(0..200)
的值用一个字节进行编码就够了
基础约束
字母表约束
1 | ardToReadChars ::= IA5String (FROM("8BI10OD5S")) |
模式(类似于正则表达式)
1 | LicensePlate ::= IA5String (PATTERN "[0-9]#4(-[A-Z]#2)?") -- NNNN[-NN] |
值的大小,长度约束
1 | LicensePlate ::= IA5String (SIZE (4..7)) |
值取值范围约束
1 | CarSpeed ::= INTEGER (0..200) |
单值约束
1 | WarningColors ::= UTF8String ("Red" | "Yellow") |
包含子类型
1 | SignColors ::= UTF8String (InfoColors UNION WarningColors) |
编码约束
1 | PerInside ::= OCTET STRING ( |
更复杂的字段条件依赖约束
1 |
|
Encoding Rules - 编码规则
编码规则描述了应该将 ASN.1 中定义的值如何进行编码以进行传输(被转换为字节进行传输,或者反之,将字节转为 ASN.1 中的值) ,并且不受机器,编程语言,应用程序表示的影响。每一种编码规则都有其特点,例如在压缩方面的,解码速度方面的。任何一种编码规则都能表示要进行交换的信息,只是使用场景不同
BER, DER, CER
BER (Basic Encoding Rules) 是最古老的编码规则,使用 TLV (Tag-Length-Value) 的格式对所有的信息进行编码,即先发送一个标签(Tag)表明数据的类型,如 SEQUENCE,接着是数据的长度(Length), 然年后是实际的数据,DER (Distinguished Encoding Rules) 以及 CER (Canonical Encoding Rules) 是 BER 的子集,消除了 BER 提供的一些灵活性。DER 通常使用在于安全相关的应用中,例如 X.509 数字证书。
OER
OER (Octet Encoding Rules) - 最快的 ASN.1 编码规则,与 PER (Packed Encoding Rules) 一样,通过利用 ASN.1 的 schema 的信息表示的优势来限制包含类每个编码消息的信息数量,生成紧凑的编码输出。聚焦于编码与解码的速度。
PER
PER (Packed Encoding Rules) 最紧凑的编码规则,与 BER 不同的是,PER 不会发送 TLV 中的标签 T, 是应为消息中的组件的顺序是一致的,如果 TLV 中的值 V 是大小固定的,也不会发送长度 L. PER 同样使用的 ASN.1 定义之外的的信息来减少冗余的数据(V). 因此,PER 编码的消息更加紧凑,能够节省带宽.
XER,E-XER
XER (XML Encodind Rules), E-XER(Extended XER) 使用 XML 文本格式来进行编码, 格式为 <start-tag> value <end-tag>
. XER 与 E-XER 的区别在于 E-XER 生成的默认编码更适合与 XSD(XML Schema Definition) 引擎进行信息交换. 相同的 ASN.1 数据可以使用多个编码规则, 这意味着来自于手机的 PER 编码的消息可以转换为 E-XER 编码, 用于在一个 web 浏览器中进行展示和操作
JER
JER (JSON Encoding Rules), 基于 JSON 格式的编码规则, 相比 XER, E-XER, 更加紧凑, 易于使用. 基于 RFC-7159 中的 JSON 规范.
通过JER,ASN.1用户可以轻松调试ASN.1协议并进行故障排除.
参考文献
[1] What is ASN1
[2] ASN.1简介及OpenSSL中ASN.1接口使用举例
[3] openssl 密钥生成和解析