SSE2 SHA1 问题

SSE2 SHA1 Problems

我正在尝试在 C 中使用 SSE2 指令实现 SHA1。 初始化似乎有效,但如果我尝试

round1(testhashe, testhasha, testhashb, testhashc, testhashd, loadConstant(b[z]));

作为算法的第一轮,我遇到了错误。 Constants 和 Values before 检查是正确的,但最后一个值将是错误的。我的宏是

#define rotthirty(val) (_mm_or_si128(_mm_slli_epi32(val,30),_mm_srli_epi32(val,2)))

#define f1(b,c,d) (_mm_xor_si128(d,_mm_and_si128(b, _mm_xor_si128(c, d))))

// Round functions
#define round1(A,B,C,D,E,w) \
temp = rotthirty(A);\
temp = _mm_add_epi32(temp,f1(B, C, D));\
temp = _mm_add_epi32(temp,k1);\
temp = _mm_add_epi32(temp,w);\
E = _mm_add_epi32(temp, E);\
B = rotthirty(B);\

这些在我毫无问题地更改为 SSE2 函数之前有效,我只是将运算符更改为函数。我做错了什么?

此函数之后一次使用内在函数和 4 个 sha 计算的输出

Vector: 67452301 67452301 67452301 67452301
Vector: 7bf36ae2 7bf36ae2 7bf36ae2 7bf36ae2
Vector: 98badcfe 98badcfe 98badcfe 98badcfe
Vector: 10325476 10325476 10325476 10325476
Vector: 734fe2b5 724fe2b5 8b4ee2b5 8a4ee2b5

除了最后一行包含正确的值,在第 1 轮之后执行 SSE2 自由工作代码时可以看出

67452301
7bf36ae2
98badcfe
10325476
122fa21

不是 Rot 30,而是 A 的 Rot 5。 而且,如果其他人遇到这个问题,我想解决@jww 的问题,因为这似乎是我听过几次的误解。 如果您只使用 SSE2 内在函数,则不能使用那些提到的 SHA 函数,因为它们不在其中。您不必通过将值加载到向量中来交换字节模式,这可以保持如上所示