在对隐式证书ASN.1模板和生成过程进行说明后(SM2无证书及隐式证书公钥机制签名和加密过程详解(二)-CSDN博客),进一步介绍用于隐式证书编码的COER。
(3)COER编码
ASN.1模板可采用多种编码形式,如比较熟悉的BER、DER和PER等,隐式证书使用OER(Octet Encoding Rules)。OER标准存在两个不同版本,即Basic OER和Canonical OER(COER),其中COER特点是抽象值与编码内容之间一一对应。
以下使用几个ASN.1基本类型的实例来说明COER编码过程。
INTEGER类型
A ::= SEQUENCE {
a1 INTEGER(0..100),
a2 INTEGER(-290..390),
a3 INTEGER(0..60000) OPTIONAL,
a4 INTEGER(-5000000..5000000),
a5 INTEGER(1000..MAX),
a6 INTEGER(-1..MAX),
a7 INTEGER OPTIONAL
}
a A ::= {
a1 4,
a2 4,
a3 4,
a4 4,
a5 1024,
a6 4,
a7 4
}
a的COER编码过程如下:
1)a是A类型的参数,是一个序列(SEQUENCE),不存在扩展标记(...),所以前导项中不存在扩展位。
2)a3和a4有 OPTIONAL标记,所以前导项中有位图(bitmap)。
3)a中a3和a4都被启用,所以对应bitmap置为1。
--0xC0, '1100 0000'
4)a1编码为0x04,a1的取值范围1个八位。
5)a2编码为0x0004,a2的取值范围2个八位。
6)a3编码为0x0004,a3的取值范围2个八位。
7)a4编码为0x00000004,a4的取值范围4个八位。
8)a5编码为0x020400,0x02是长度表示2个八位,0x0400是具体内容。
9)a6编码为0x0104,0x01是长度表示1个八位,0x04是具体内容(变长)。
10)a7编码为0x0104,0x01是长度表示1个八位,0x04是具体内容(变长)。
--0xC004000400040000000402040001040104
STRING类型
B ::= SEQUENCE {
b1 IA5STRING(SIZE(0..10)),
b2 IA5STRING(SIZE(3)),
b3 IA5STRING,
b4 OCTET STRING,
b5 BIT STRING(SIZE(4)),
b6 BIT STRING
}
b B ::= {
b1 "ABC",
b2 "ABC",
b3 "ABC",
b4 '01020304'H,
b5 '0101'B,
b6 '0101'B
}
b的COER编码过程如下:
1)b是B类型的参数,是一个序列(SEQUENCE),不存在扩展标记(...),不存在 OPTIONAL或者 DEFAULT标记的选项,所以不需要对前导项进行编码。
2)b1编码为0x03414243,0x03是长度表示3个八位,0x414243是具体内容(变长)。
3)b2编码为0x414242,定长为3个八位。
4)b3编码为0x03414243,0x03是长度表示3个八位,0x414243是具体内容(变长)。
5)b4编码为0x0401020304,0x04是长度表示4个八位,0x01020304是具体内容(变长)。
6)b5编码为0x50,定长为1个八位,实际长度为4位,后四位并未使用。7)b6编码为0x020450,0x02是长度表示2个八位,0x0450是具体内容,0x04表示未使用的位数,0x50是具体内容(变长)。
--0x0341424341424203414243040102030450020450
其他类型
C ::= CHOICE {
c1 BOOLEAN,
c2 SEQUENCE OF ENUMERATED { a, b, c, d, e}
}
c C ::= c2 : {b, c, d, e}
c的CORE编码过程如下:c的CORE编码过程如下:
1)c是C类型的参数,是一个选择(CHOICE),tag标记类型编码为'10'B,成分编码为1。
--0x81('10000001'B)
--'00' universal,'01' application,'10' context-specific,'11' private
2)c2是 SEQUENCE OF类型的参数,编码为0x0104,长度为1个八位,循环次数为4次。
3)b的编码为0x01。
4)c的编码为0x02。
5)d的编码为0x03。
6)e的编码为0x04。
--0x81010401020304
接下来,将介绍具体隐式证书COER编码实例