文档名称:ASN.1编码概述 5
<2>.默认(DEFAULT).默认修改器允许容器包含默认值.如果待编码的数据值等同于它的默认值,那么它将在发送的数据流中被忽略.例如:
Command ::= SEQUENCE {
Token IA5String(NOP) DEFAULT,
Parameter INTEGER
}
如果编码器把Token看成是代表字符串NOP,那么序列将按照定义的那样编码为:
Command ::= SEQUENCE {
Parameter INTEGER
}
<3>.选择(CHOICE). 选择修改器允许一个元素在给定的实例中可以有多个可能值.实质上说,解码器将尝试所有期望的解码算法,直到有一个类型符合为止.当一个复杂的容器中包含其他容器时,时候选择器就十分有用了.例如:
UserKey ::= SEQUENCE {
Name IA5String,
StartDate UTCTIME,
Expire UTCTIME,
KeyData CHOICE {
ECCKey ECCKeyType,
文档名称:ASN.1编码概述 6
RSAKey RSAKeyType
}
}
上例简单的允许ECC也允许RSA密钥的公钥证书.
3.ASN.1数据类型
ASN.1针对广泛的应用定义了多种数据类型,我们这里只讨论跟密码学应用相关的数据类型.我们将讨论如下数据类型:
布尔型 (Boolean);
八位位组串 (OCTET String);
位串 (BIT String);
IA5String;
可打印字符串 (PrintableString);
整数 (INTEGER);
对象标识符 (OBJECT Identifier, OID);
世界协调时 (UTCTIME);
空 (NULL);
序列,单一序列;
文档名称:ASN.1编码概述 7
集合;
单一集合;
任何ASN.1编码都是以两个字节开始(或者八位位组,含有8个二进制位),不管什么类型,它们都是通用的.第一个字节是类型标识符,也包含一些修正位;第二各字节是长度.
3.1 ASN.1头字节
头字节(hearder byte)位于ASN.1编码的开始,由3部分组成。如下图:
<1>. 类别位。
类别位(classification bits)由两位表示,用来描述数据将要解释的上下文。
位8 位7 类别 0 0 通用(Universal) 文档名称:ASN.1编码概述 8
0 1 应用(Application) 1 0 上下文特定(Context Specific) 1 1 专用(Private)
所有的类型中,通用类别最常用。
<2>. 结构化位。
结构化位(constructed bit)表示一个给定的编码是否是相同类型的多种编码的结构化。结构化元素是容器类型必需的,因为在逻辑上,它们只是其他元素的集合。
结构化元素有自己的头字节和长度字节,之后是元素各个要素组件的单独编码。也就是说,这些要素组件是独立地可解码ASN.1数据类型。
严格的说,容器类是唯一允许使用结构化位的数据类型。这是因为对于其他数据类型,给定内容,只允许一种编码。所以其他所有数据类型的结构化位都为0。
<3>. 原始类型。
ASN.1头字节的低5位定义了32种ASN.1的原始类型(primitive type)
代码 ASN.1类型 作用 文档名称:ASN.1编码概述 9
1 布尔型 储存布尔值 2 整数 储存大整数 3 位串 存储位数组 4 八位位串 存储字节数组 5 空 预留位(例如在选择修改器中) 6 对象标识符 标识算法及协议 16 序列和单一序列 未分类元素的容器 17 集合和单一集合 已分类元素的容器 19 可打印字符串 ASCII编码(忽略一些不可打印字符) 22 IA5String ASCII编码 23 世界协调时 以统一格式表示的时间