You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
30 - tag number 16(SEQUENCE), constructed type
14 - length
82 - tag number 2, context-specific class #UTF8String的默认tag number 12被覆盖成2
0E - length
616E732E31206C65617 - ans.1 learning
84 - tag number 4, context-specific class #UTF8String的默认tag number 12被覆盖成4
02 - length
6363 - cc
30 - tag number 16(SEQUENCE), constructed type
18 - length
A2 - tag number 2, context-specific class, constructed type # 新增的的TAG
10 - length
0C - tag number 12(UTF8String)
0E - length
616E732E31206C6561726E696E67 - ans.1 learning
A4 - tag number 4 # 新增的的TAG
04 - length
0C - tag number 12(UTF8String)
02 - length
6363 - cc
本文以PKCS10的ASN.1 module作为范例,介绍其中涉及到的ASN.1语法知识,也作为自己学习ASN.1的一个知识总结。
PKCS10 Module的ASN.1语法定义如下
行 1 ~ 2 定义了模块(module)名称 PKCS-10,并且定义该模块的对象标识符(object identifier)为{iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-10(10) modules(1) pkcs-10(1)},也可以表示为1.2.840.113549.1.10.1.1,用于唯一标识该模块
行 4 定义了模块的"tagging environment"
"tagging environment"影响TLV数据中T的编码,有3种选项
下面以实际例子来展示它们是如何影响数据的Tag
首先对比IMPLICIT及EXPLICIT, 定义下面两个module
当遵循以上标准使用BER编码下面这个值时
遵循Article-Implicit-Tagging-Schema的BER编码结果为:3014820E616E732E31206C6561726E696E6784026363
遵循Article-Explicit-Tagging-Schema的BER编码结果为:3018A2100C0E616E732E31206C6561726E696E67 A4040C026363
重点关注这一行
title [2] UTF8String
Article-Implicit-Tagging-Schema的编码结果是直接覆写UTF8String类型的tag number,从12改成2
而Article-Explicit-Tagging-Schema是新增一层TLV结构,用来包装原数据的TLV,且该新增的TAG为2
AUTOMATIC TAGS的作用是自动的为每个参数分配tag number,从[0]开始递增,示例如下
对前面的value值进行BER编码的结果为:3014800E616E732E31206C65 61726E696E6781026363。
可以看到title的tag number为0,author的tag number为1
行 6 ~ 23是EXPORTS/IMPORTS语句,EXPORTS可以导出本模块中的值或类型,IMPORTS则是导入其他模块中的值或类型。当省略EXPORTS时表示本模块中的所有类型都可以被其他模块导入。
可以看到PKCS-10模块没有EXPORTS语句,所以默认所有类型和值都可以被其他模块导入,规范中注释也说明了这一点
先看行15 ~ 17,从UsefulDefinitions(2.5.1.0.3)模块导入了两个值(value reference) informationFramework和authenticationFramework,UsefulDefinitions(2.5.1.0.3)模块定义在X.501规范,这里列出X.501规范中我们需要的一些定义
可以看出informationFramework及authenticationFramework都是OBJECT IDENTIFIER类型,informationFramework的值为2.5.1.1.3,authenticationFramework的值为2.5.1.7.3
接下来看行 19 ~ 23,从OID(object identifier)为2.5.1.1.3的InformationFramework模块导入ATTRIBUTE及Name,从OID为2.5.1.7.3的AuthenticationFramework模块导入ALGORITHM
下面列出ATTRIBUTE,Name及ALGORITHM的定义,方便查阅
TYPE-IDENTIFIER是ASN.1预定义的信息对象类(information object class),定义如下
行 26 ~ 31定义了CertificationRequestInfo类型
version参数的类型符号(type notation)含义如下
{}
称为named number list,用标识符来代表某个具体整数值,增加可读性()
称为single value subtyping,用于约束允许的整数值...
称为extension marker,表示允许出现其他值,比如该标准后面更新了,就可以增加一个v2(1)的版本值subjectPKInfo参数的类型符号含义如下
{}
称为参数化(Parameterization),表示将参数{ PKInfoAlgorithms }
传递给SubjectPublicKeyInfo,从规范下文关于SubjectPublicKeyInfo的定义也能看出该类型接收一个参数,且该参数是一个ALGORITHM类型的information object set{}
是引用object set的用法,可以认为是固定用法行 33 ~ 36定义了SubjectPublicKeyInfo类型,因为用到的语法均在介绍CertificationRequestInfo类型时提及,所以这里不展开讨论
行 38 ~ 39 定义了一个information object set,名称为PKInfoAlgorithms
行 41 ~ 43 涉及到的ASN.1相关知识均已提及,在此不赘述
接下来看行 45 ~ 48
首先看type参数的声明
type ATTRIBUTE.&id({IOSet})
ATTRIBUTE.&id
表示type参数使用ATTRIBUTE的&id字段作为自己的值,因此type参数的类型与&id一致为OBJECT IDENTIFIER({IOSet})
表示&id的取值被限制在IOSet这个information object set中,只能取IOSet中出现的&id值。在ASN.1中该用法术语称为table constraint
接下来看values参数的声明
values SET SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{@type})
SIZE(1..MAX)
称为Size constraint
,用来约束values集合的大小,这里表示至少有一个元素与type参数的声明相比,values增加了
relation constraint
,即{@type}
这个表达式,它表示将ATTRIBUTE.&Type与Attribute的type参数关联起来,通过上文分析我们知道type参数实际就是ATTRIBUTE.&id,为方便理解我们可以说将ATTRIBUTE.&Type和ATTRIBUTE.&id关联起来,意思就是说ATTRIBUTE.&Type及ATTRIBUTE.&id两个字段必须属于同一个information object这里举个例子,比如说IOSet此时由下面两个information object组成
一旦Attribute的type参数值为{iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) signing-time(5)},那么values的类型一定是SigningTime,因为{@type}限定了ATTRIBUTE.&Type和ATTRIBUTE.&id必须属于同一个object
到这一步基本把看懂PKCS10规范所需要的ASN.1知识简单介绍了一遍,剩下的就不赘述了。不过关于information object的知识还是很晦涩的,建议看《ASN.1 Complete》辅助理解。
参考
The text was updated successfully, but these errors were encountered: