in signature/csharp/core/SM3Digest.cs [309:393]
internal override void ProcessBlock()
{
int j;
int[] ww = X;
//64位比特串
int[] ww_ = new int[64];
#region 块消息扩展
//消息扩展16 TO 67
for (j = 16; j < 68; j++)
{
ww[j] = P1(ww[j - 16] ^ ww[j - 9] ^ (Rotate(ww[j - 3], 15))) ^ (Rotate(ww[j - 13], 7)) ^ ww[j - 6];
}
//消息扩展0 TO 63
for (j = 0; j < 64; j++)
{
ww_[j] = ww[j] ^ ww[j + 4];
}
#endregion
#region 压缩函数
int[] vv = v;
int[] vv_ = v_;//A,B,C,D,E,F,G,H为字寄存器
Array.Copy(vv, 0, vv_, 0, IV.Length);
//中间变量SS1,SS2,TT1,TT2
int SS1, SS2, TT1, TT2;
int aaa;
//将消息分组B(i)划分为16个字
for (j = 0; j < 16; j++)
{
aaa = Rotate(vv_[0], 12);
SS1 = aaa + vv_[4] + Rotate(TOne, j);
SS1 = Rotate(SS1, 7);
SS2 = SS1 ^ aaa;
TT1 = FFOne(vv_[0], vv_[1], vv_[2]) + vv_[3] + SS2 + ww_[j];
TT2 = GGOne(vv_[4], vv_[5], vv_[6]) + vv_[7] + SS1 + ww[j];
#region 更新各个寄存器
vv_[3] = vv_[2];
vv_[2] = Rotate(vv_[1], 9);
vv_[1] = vv_[0];
vv_[0] = TT1;
vv_[7] = vv_[6];
vv_[6] = Rotate(vv_[5], 19);
vv_[5] = vv_[4];
vv_[4] = P0(TT2);
#endregion
}
for (j = 16; j < 64; j++)
{
aaa = Rotate(vv_[0], 12);
SS1 = aaa + vv_[4] + Rotate(TSecond, j);
SS1 = Rotate(SS1, 7);
SS2 = SS1 ^ aaa;
TT1 = FFSecond(vv_[0], vv_[1], vv_[2]) + vv_[3] + SS2 + ww_[j];
TT2 = GGSecond(vv_[4], vv_[5], vv_[6]) + vv_[7] + SS1 + ww[j];
#region 更新各个寄存器
vv_[3] = vv_[2];
vv_[2] = Rotate(vv_[1], 9);
vv_[1] = vv_[0];
vv_[0] = TT1;
vv_[7] = vv_[6];
vv_[6] = Rotate(vv_[5], 19);
vv_[5] = vv_[4];
vv_[4] = P0(TT2);
#endregion
}
#endregion
//256比特的杂凑值y =vv_(j+1) ABCDEFGH
for (j = 0; j < 8; j++)
{
vv[j] ^= vv_[j];
}
// Reset
xOff = 0;
Array.Copy(X0, 0, X, 0, X0.Length);
}