Updated Armv8.2 SM3和SM4 (markdown)

Sun Yimin 2022-02-23 11:08:37 +08:00
parent 92dfdd7a37
commit 814bd2002c

@ -111,6 +111,28 @@ WORD $0x0884c0ce // SM4E V0.S4, V8.S4
[代码](https://gist.github.com/emmansun/a3feef970cdf3ffe5db623f324550950)
## SM3 with SM3PARTW1 / SM3PARTW2 / SM3SS1 / SM3TT1A / SM3TT2A / SM3TT2A / SM3TT2B
```
P1(X)= X XOR (X <<< 15) XOR (X <<< 23)
P1(X1 XOR X2)
=(X1 XOR X2) XOR ((X1 XOR X2) <<< 15) XOR ((X1 XOR X2) <<< 23)
=X1 XOR X2 XOR (X1 <<< 15) XOR (X2 <<< 15) XOR (X1 <<< 23) XOR (X2 <<< 23)
=X1 XOR (X1 <<< 15) XOR (X1 <<< 23) XOR X2 XOR (X2 <<< 15) XOR (X2 <<< 23)
=P1(X1) XOR P1(X2)
这里, 异或XOR运算满足
交换律
结合律
并且假定(X1 XOR X2) <<< 15 = (X1 <<< 15) XOR (X2 <<< 15), 也就是说循环左移ROL对异或XOR运算满足分配律这一点是不显然的
SM3PARTW1中最后一个字
Vd[3] = P1(C XOR (R1 <<< 15)), 这里 C 是另外两个字的异或结果 R1 X(4i+16)的一部分X(4i+16) = R1 XOR R2
SM3PARTW2中的tmp.value[0]就是R2
P1(C XOR (R1 <<< 15)) XOR P1(R2 <<< 15) = P1(C XOR (R1 <<< 15) XOR (R2 <<< 15)) = P1(C XOR ((R1 XOR R2) <<< 15))
```
所以,关键就是**循环位移对异或运算满足分配律成立**。
[模拟代码](https://gist.github.com/emmansun/c05b5e2262997ae546950f806fcd0146)
## Reference