本章节对应规范文档的第4章节,这部分比较简单,就不详细的讲述了。
# 4.1 初始值
寄存器初始值,我们定义一些宏来表示
#define GM_SM3_IV_A 0x7380166f
#define GM_SM3_IV_B 0x4914b2b9
#define GM_SM3_IV_C 0x172442d7
#define GM_SM3_IV_D 0xda8a0600
#define GM_SM3_IV_E 0xa96f30bc
#define GM_SM3_IV_F 0x163138aa
#define GM_SM3_IV_G 0xe38dee4d
#define GM_SM3_IV_H 0xb0fb0e4e
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 4.2 常量
Tj常量:
当0 <= j <= 15的时候,Tj = 79cc4519
当16 <= j <= 63的时候,Tj = 7a879d8a
#define GM_SM3_T_0 0x79CC4519
#define GM_SM3_T_1 0x7A879D8A
1
2
2
# 4.3 布尔函数
先来看FFj函数
当0 <= j <= 15的时候,FFj(X, Y, Z) = X ⊕ Y ⊕ Z
当16 <= j <= 63的时候,FFj(X, Y, Z) = (X ∧ Y) ∨ (X ∧ Z) ∨ (Y ∧ Z)
#define GM_SM3_FF_0(x,y,z) ( (x) ^ (y) ^ (z) )
#define GM_SM3_FF_1(x,y,z) ( ( (x) & (y) ) | ( (x) & (z) ) | ( (y) & (z) ) )
1
2
2
再看GGj函数
当0 <= j <= 15的时候,GGj(X, Y, Z) = X ⊕ Y ⊕ Z
当16 <= j <= 63的时候,GGj(X, Y, Z) = (X ∧ Y) ∨ (¬X ∧ Z)
#define GM_SM3_GG_0(x,y,z) ( (x) ^ (y) ^ (z) )
#define GM_SM3_GG_1(x,y,z) ( ( (x) & (y) ) | ( (~(x)) & (z) ) )
1
2
2
# 4.4 置换函数
在实现置换函数前,需要先实现循环左移
#define GM_SM3_SHL(x,n) (((x) & 0xFFFFFFFF) << (n % 32))
#define GM_SM3_ROTL(x,n) (GM_SM3_SHL((x),n) | ((x) >> (32 - (n % 32))))
1
2
2
实现完循环左移后,再来实现P0 P1函数就很轻松了,规范文档中
P0(X) = X⊕(X ≪ 9)⊕(X ≪ 17)
P1(X) = X⊕(X ≪ 15)⊕(X ≪ 23)
对应的实现:
#define GM_SM3_P_0(x) ((x) ^ GM_SM3_ROTL((x),9) ^ GM_SM3_ROTL((x),17))
#define GM_SM3_P_1(x) ((x) ^ GM_SM3_ROTL((x),15) ^ GM_SM3_ROTL((x),23))
1
2
2
未经本人同意,禁止转载!