ASN.1

http://www.doc88.com/p-639427961634.html

http://wenku.baidu.com/view/8dfe04e94afe04a1b071debd.html


ISO 协议套中的应用层协议使用了 ASN.1 来描述它们所传输的 PDU,这些协议包括:用于传输电子邮件的 X.400、用于目录服务的 X.500、用于 VoIP 的 H.323 和 SNMP。

ASN.1 取得成功的一个主要原因是它与几个标准化编码规则相关,如基本编码规则(BER) -X.209 、规范编码规则(CER)、识别名编码规则(DER)、压缩编码规则(PER)和 XML编码规则(XER)。这些编码规则描述了如何对 ASN.1 中定义的数值进行编码,以便用于传输,而不管计算机、编程语言或它在应用程序中如何表示等因素。


开放系统互联(OSI,在X.200种定义)是一个包含了大量抽象的例子。OSI是一个国际通用的标准体系,从物理层一直到用户应用层,管理着计算机之间的互联。高层次的对象被抽象定义,并将由底层的对象来实现。比如,某层的一个服务可能需要在计算机之间传递某个抽象对象;某一底层则可能提供关于0、1字符串的实现,利用一些编码规则把高层的抽象对象转换成这些字符串。OSI之所以被称为开放系统是因为它在每一层上支持不同的服务实现。 

OSI定义抽象对象的方法称为ASN.1(Abstract Syntax Notation One,X.208)

把这些对象转换成“0”和“1”的比特流的一套规则称为BER(Basic Encoding Rules ,X.209)。

ASN.1是一套灵活的记号,它允许定义多种数据类型,从integer、bit string一类的简单类型到结构化类型,如set和sequence,还可以使用这些类型构建复杂类型。BER说明了如何把每种ASN.1类型的值编码为8bit的octet流。通常每个值有不止一种的BER编码方法。一般使用另外一套编码规则DER,它是BER的一个子集,对每个ASN.1值只有唯一一种编码方法。

ASN.1有严格的BNF定义,具有简洁、精确和无二义性的特点。


ASN.1有四种类型:

  • 简单类型,它相当于原子,没有组件;
  • 结构类型,有组件;
  • 标签类型,由其他类型生成;
  • 其他类型,包括CHOICE和ANY类型。

除了CHOICE和ANY类型以外,每种ASN.1类型都有一个标签,由一个类和一个非负的标签数组成。标签值可以唯一区分ASN.1类型。也就是说,ASN.1类型的名字并不影响它的抽象含义,只有标签才有这个作用。

有四类标签: 

  • Universal该类型的含义在所有的application中都相同。这种类型只在X.208中定义。 高两位为00
  • Application该类型的含义由application决定,如X.500目录服务。两个不同的application中的类型可以具有相同的application-specific标签但是不同的含义。 高两位为01
  • Private该类型的含义根据给定的企业而不同。 高两位为11
  • Context-specific该类型的含义根据给定的结构类型而不同。Context-specific标签用于在一个给定的结构类型上下文中区分使用相同的下层标签的组件类型。在两个不同的结构类型中组建类型可以具有相同的标签但是含义不同。高两位为10。这是默认情况。

在一个application中标签(tagging)对于区分类型十分有用,标签通常也用于在一个结构类型中区分组件类型。例如,SET或SEQUENCE类型的可选组件一般都给予不同的context-specific标签以避免混淆。 

有两种方法可以标记一个类型:隐式(implicitly)和显式(explicitly)。

  •  隐式标签类型是在其它类型基础上通过改变其下层类型的标签而生成的。(如果下层为简单编码,则高6位为0,为0x80;否则为0xa0。)隐式标签使用ASN.1关键词[class number] IMPLICIT表示。 
  • 隐式标签在整个PKCS中用于可选的SEQUENCE组件,其下层类型是除ANY以外的任何类型。
  • 显式标签是在其他类型基础上通过在其下层类型的标签之外添加一个外层标签而生成的。
  • 从效果上看,显式标签类型是包含一个组件的结构类型,该组件即下层类型。显式标签由ASN.1关键词[class number] EXPLICIT表示。除非“模块”的ASN.1类型默认定义为隐式标签,关键词[class number]默认总是与使用显式标签相同。
  • 在整个PKCS中,显式标签用于下层类型为ANY的、可选的SEQUENCE类型组件,及X.509的Certificate类型的version组件
  • 从编码的角度看,隐式标签类型可视为与下层类型相同,只是标签不同。显式标签类型可视为有一个组件的结构类型,该组件即为下层类型。隐式标签可以使编码较短,但是如果下层类型是不确定的,显式标签必须避免含糊不清(例如下层类型是CHOICE或ANY)。 



你可能感兴趣的:(ASN.1)