着定义了结构体类型CHAR64LONG,并声明了一个该类型的指针变量block(实际是数组实现),前面有介绍。然后:
memcpy(block, buffer, 64);
将参数buffer里面的字节复制到block中。
a = state[0];
b = state[1];
c = state[2];
d = state[3];
e = state[4]; 实际上完成的就是RFC文档中的H0~H4赋值给ABCDE的操作。接下来就是80轮运算的代码。每20轮为一组,共分四组。
R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
... 第一组比较特殊,使用了R0和R1两个宏函数,其原因前面已经介绍了。因为第0~15轮运算和16~79轮运算的时候消息块M(i)和字块W(i)的转换是不一样的。后面的20~39轮,40~59轮,60~79轮就是依次使用的R2,R3,R4来运算了,比较好理解,就不表了。接着:
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
state[4] += e;
/* Wipe variables */
a = b = c = d = e = 0; 完成的就是更新缓冲区H0~H4的内容。然后把a~e清空为0(这一步我感觉意义不到,本身就是栈存储的5个变量,函数结束后就释放了啊)。
最后state[0]~state[4]中存储的就是SHA-1算法的生成的消息摘要。