当前位置:编程学习 > JAVA >>

ASN.1/BER/DER编码子集入门指南(二)

前接文档请参见:ASN.1/BER/DER编码子集入门指南(一)

2. 抽象语法标记(Abstract Syntax Notation One)


    抽象语法标记(Abstract Syntax Notation One)是描述抽象类型和值的标记,缩写为ASN.1。

    在ASN.1中,一个类型就是值的一个集合。有些类型有有限个值,有些则有无限多个。一个给定的ASN.1类型的值是该类型集合里的一个元素。ASN.1有四种类型:简单类型,它相当于原子,没有下层组件;结构类型,有组成部分;标签类型,由其它类型生成;其它类型,包括CHOICE和ANY类型。可以使用ASN.1的分配符(::=)给类型和值指定名字,这些名字可以用于定义其它类型或值。

    除了CHOICE和ANY类型以外,每种ASN.1类型都有一个标签,由一个类和一个非负的标签数组成。标签值可以唯一区分ASN.1类型。也就是说,ASN.1类型的名字并不影响它的抽象含义,只有标签值才有这个作用。有四类标签:
    
    ●Universal:该类型的含义在所有的application中都相同。这种类型只在X.208中定义。
        ●Application:该类型的含义由application决定,如X.500目录服务。两个不同的application中的类型可以具有相同的application-specific标签但是可以具有不同的含义。
        ●Private:,该类型的含义根据给定的企业而不同。
        ●Context-specific:该类型的含义根据给定的结构类型而不同。Context-specific标签用于在一个给定的结构类型上下文中区分使用相同的下层标签的组件类型。在两个不同的结构类型中组件类型可以具有相同的标签但是含义不同。

    具有universal标签的类型在X.208中定义,X.208也给出了类型的universal标签值。使用其他标签的类型在很多地方都有定义,通常是通过implicit或explicit标签获得。表一列出了部分ASN.1类型及其universal-class标签。

(译者注:为了表示清晰,表格中的字段用下划线分隔开来)

====Type Tag================number_(decimal)========Tag_number_(hexadecimal)
________INTEGER____________________2_________________________02________________
________BIT_STRING_________________3_________________________03________________
________OCTET_STRING_______________4_________________________04________________
________NULL_______________________5_________________________05________________
________OBJECT IDENTIFIER__________6_________________________06________________
________SEQUENCE and SEQUENCE OF___16________________________10________________
________SET and SET OF____________17________________________11_________________
________PrintableString____________19________________________13________________
________T61String__________________20________________________14________________
________IA5String__________________22________________________16________________
________UTCTime____________________23________________________17________________
 
    ASN.1类型和值使用一种灵活的、类似编程语言的符号表示,规则如下:
    
    分层(换行)无特殊意义;多个空格和多个空行相当于一个空格。
        注释由一对连字符(--)开头,或者一对连字符和一个空行
        识别符(值或字段的名字)和类型索引(类型的名字)由大小写字母、数字、连字符和空格组成;识别符由小写字母开头,类型索引由大写字母开头。

    下面的四个子节概括介绍了简单类型、结构类型、隐式和显式标签类型,及其他类型。第5节定义了类型的更多细节。

2.1 简单类型(Simple types)


    简单类型没有组件,是“原子级”的类型。ASN.1定义了几个简单类型,其中与PKCS标准有关类型如下:
    
    ●BIT STRING:由0和1任意组成的比特流
        ●IA5String:由IA5(ASCII)字符任意组成的字符流
        ●INTEGER:一个任意的整数
        ●NULL:null值
        ●OBJECT IDENTIFIER:对象识别符,有一列整数构成,用于确定对象,如算法或属性类型
        ●OCTET STRING:任意的octet(8bit值)流
        ●PrintableString:任意可打印字符流
        ●T61String:T.61(8bit)字符的任意流
        ●UTCTime:"coordinated universal time"或者格林威治平均时(GMT)值。

    简单类型分为两类:string类型和non-string类型。BIT STRING, IA5String, OCTET STRING, PrintableString, T61String, 和UTCTime是string类型。

    考虑到编码,String类型可以视为由组件组成,组件是substring。这样即使事先不知道值的长度也可以使用结构化的、不定长的编码方式进行编码(例如,从一个file stream中输入的octet string值)。

    String类型可以指定大小限制,以限制值的长度。
    

2.2 结构化类型(Structured types)


    结构类型由组件组成。ASN.1定义了四种,都与PKCS标准有关:
    
    ●SEQUENCE:一个或多个类型的有序集合
        ●SEQUENCE OF:0个或某个给定类型多次出现的有序集合
        ●SET:一个或多个类型的无序集合
        ●SET OF:0个或某给定类型多次出现的无序集合

    结构类型允许有可选组件。可选组件可能有默认值。
    

2.3 隐式和显式标签类型(Implicitly and explicitly tagged types)


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

    有两种方法可以标记一个类型:隐式(implicitly)和显式(explicitly)。
隐式标签类型是在其它类型基础上通过改变其下层类型的标签生成的。隐式标签使用ASN.1关键词[class number] IMPLICIT(见第5.1节)表示。

    显式标签是在其它类型基础上通过在其下层类型的标签之外添加一个外层标签生成的。从效果上看,显式标签类型是包含一个组件的结构类型,该组件即下层类型。显式标签由ASN.1关键词[class number] EXPLICIT(见第5.2节)表示。

    只有关键词[class number]与使用显式标签相同,除非该“模块”的ASN.1类型默认定义为隐式标签。(“模块”属于高级特性,不在本文档描述范围内)

    从编码的角度看,隐式标签类型可视为与下层类型相同,除非标签不同。显式标签类型可视为有一个组件的结构类型,该组件即为下层类型。隐式标签可以使编码较短,但是如果下层类型是不确定的,显式标签必须避免含糊不清(例如下层类型是CHOICE或ANY)。

    ASN.1中的其他类型包括CHOICE和ANY类型。CHOICE类型表示一个联合体,它具有一个或多个备选项(alternative);ANY类型表示任意类型的任意值,其中任意类型可能在使用对象识别符或整数值注册中定义。

(未完待续) 
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,