SM2无证书及隐式证书公钥机制签名和加密过程详解(三)

在对隐式证书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编码实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游鲦亭长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值