GMSSL SM9-签名验签流程
1.初始化
SM9_standard_init();
2.生成签名主密钥
SM9_standard_generatesignkey(hid, IDA, strlen(IDA), ks, Ppub, dSA);
3.签名
SM9_standard_generatesignkey(hid, IDA, strlen(IDA), ks, Ppub, dSA);
3.1
//Step1:g = e(P1, Ppub-s)
ecap(Ppubs, P1, para_t, X, &g)
3.2
//Step2:calculate w=g(r)
w = zzn12_pow(g, r);
3.3
//Step3:calculate h=H2(M||w,N)
SM9_standard_h2(Z, Zlen, N, h);
3.4
//Step4:l=(r-h)mod N
3.5
//Step5:S=[l]dSA=(xS,yS)
数字签名生成算法
设待签名的消息为比特串 M,为了获取消息 M 的数字签名(h, S),作为签名者的用户 A 应实现以下
运算步骤:
A1: 计算群 GT 中的元素 g = e(P1, Ppub-s);
A2: 产生随机数 r∈[1, N-1];
A3: 计算群 GT 中的元素 w = gr, 将 w 的数据类型转换为比特串;
A4: 计算整数 h = H2(M||w, N);
A5: 计算整数 l = (r-h) mod N,若 l = 0 则返回 A2;
A6: 计算群 G1 中的元素 S = [l]dsA;
A7: 消息 M 的签名为(h, S)。
4.验签
SM9_standard_verify(h, S, hid, IDA, message, mlen, Ppub);
4.1
//Step 1:test if h in the rangge [1,N-1]
Test_Range(h)
4.2
//Step 2:test if S is on G1
Test_Point(S1)
4.3
//Step3:g = e(P1, Ppub-s)
ecap(Ppubs, P1, para_t, X, &g)
4.4
//Step4:calculate t=g(h)
zzn12_pow(g, h);
4.5
//Step5:calculate h1=H1(IDA||hid,N)
SM9_standard_h1(Z1, Zlen1, N, h1);
4.6
//Step6:P=[h1]P2+Ppubs
4.7
//Step7:u=e(S1,P)
ecap(P, S1, para_t, X, &u))
4.8
//Step8:w=u*t
zzn12_mul(u, t, &w);
4.9
//Step9:h2=H2(M||w,N)
SM9_standard_h2(Z2, Zlen2, N, h2);
数字签名验证算法
为了检验收到的消息 M’ 及其数字签名( h’, S’ ),作为验证者的用户 B 应实现以下运算步骤:
B1: 检验 h’∈[1, N-1] 是否成立,若不成立则验证不通过;
B2: 将 S’的数据类型转换为椭圆曲线上的点,检验 S’∈G1 是否成立,若不成立则验证不通过;
B3: 计算群 GT 中的元素 g = e(P1, Ppub-s);
B4: 计算群 GT 中的元素 t = gh’;
B5: 计算整数 h1= H1(IDA||hid, N);
B6: 计算群 G2 中的元素 P = [h1]P2+ Ppub-s;
B7: 计算群 GT 中的元素 u = e(S’, P);
B8: 计算群 GT 中的元素 w’ = u⋅ t, 将 w’的数据类型转换为比特串;
B9: 计算整数 h2 = H2(M’||w’, N),检验 h2 = h’ 是否成立,若成立则验证通过;否则验证不通过。