diff options
Diffstat (limited to 'c')
| -rw-r--r-- | c/sha1/sha1-x86.c | 137 | 
1 files changed, 26 insertions, 111 deletions
diff --git a/c/sha1/sha1-x86.c b/c/sha1/sha1-x86.c index b7cf000..2fcf7d8 100644 --- a/c/sha1/sha1-x86.c +++ b/c/sha1/sha1-x86.c @@ -71,6 +71,16 @@ sha1end(sha1_t *s, uint8_t dgst[SHA1DGSTSZ])  		((uint32_t *)dgst)[i] = htobe32(s->dgst[i]);  } +#define R(mi, mj, mk, ml, ei, ej, f) \ +	do { \ +		ei = _mm_sha1nexte_epu32(ei, mi); \ +		ej = abcd; \ +		mj = _mm_sha1msg2_epu32(mj, mi); \ +		abcd = _mm_sha1rnds4_epu32(abcd, ei, f); \ +		ml = _mm_sha1msg1_epu32(ml, mi); \ +		mk = _mm_xor_si128(mk, mi); \ +	} while (0) +  static void  sha1hashblk(sha1_t *s, const uint8_t *blk)  { @@ -115,118 +125,21 @@ sha1hashblk(sha1_t *s, const uint8_t *blk)  	msg1 = _mm_sha1msg1_epu32(msg1, msg2);  	msg0 = _mm_xor_si128(msg0, msg2); -	/* Rounds 12–15 */  	msg3 = _mm_shuffle_epi8(_mm_loadu_si128(blkx + 3), bswapbmsk); -	e1 = _mm_sha1nexte_epu32(e1, msg3); -	e0 = abcd; -	msg0 = _mm_sha1msg2_epu32(msg0, msg3); -	abcd = _mm_sha1rnds4_epu32(abcd, e1, 0); -	msg2 = _mm_sha1msg1_epu32(msg2, msg3); -	msg1 = _mm_xor_si128(msg1, msg3); - -	/* Rounds 16–19 */ -	e0 = _mm_sha1nexte_epu32(e0, msg0); -	e1 = abcd; -	msg1 = _mm_sha1msg2_epu32(msg1, msg0); -	abcd = _mm_sha1rnds4_epu32(abcd, e0, 0); -	msg3 = _mm_sha1msg1_epu32(msg3, msg0); -	msg2 = _mm_xor_si128(msg2, msg0); - -	/* Rounds 20–23 */ -	e1 = _mm_sha1nexte_epu32(e1, msg1); -	e0 = abcd; -	msg2 = _mm_sha1msg2_epu32(msg2, msg1); -	abcd = _mm_sha1rnds4_epu32(abcd, e1, 1); -	msg0 = _mm_sha1msg1_epu32(msg0, msg1); -	msg3 = _mm_xor_si128(msg3, msg1); - -	/* Rounds 24–27 */ -	e0 = _mm_sha1nexte_epu32(e0, msg2); -	e1 = abcd; -	msg3 = _mm_sha1msg2_epu32(msg3, msg2); -	abcd = _mm_sha1rnds4_epu32(abcd, e0, 1); -	msg1 = _mm_sha1msg1_epu32(msg1, msg2); -	msg0 = _mm_xor_si128(msg0, msg2); - -	/* Rounds 28–31 */ -	e1 = _mm_sha1nexte_epu32(e1, msg3); -	e0 = abcd; -	msg0 = _mm_sha1msg2_epu32(msg0, msg3); -	abcd = _mm_sha1rnds4_epu32(abcd, e1, 1); -	msg2 = _mm_sha1msg1_epu32(msg2, msg3); -	msg1 = _mm_xor_si128(msg1, msg3); - -	/* Rounds 32–35 */ -	e0 = _mm_sha1nexte_epu32(e0, msg0); -	e1 = abcd; -	msg1 = _mm_sha1msg2_epu32(msg1, msg0); -	abcd = _mm_sha1rnds4_epu32(abcd, e0, 1); -	msg3 = _mm_sha1msg1_epu32(msg3, msg0); -	msg2 = _mm_xor_si128(msg2, msg0); - -	/* Rounds 36–39 */ -	e1 = _mm_sha1nexte_epu32(e1, msg1); -	e0 = abcd; -	msg2 = _mm_sha1msg2_epu32(msg2, msg1); -	abcd = _mm_sha1rnds4_epu32(abcd, e1, 1); -	msg0 = _mm_sha1msg1_epu32(msg0, msg1); -	msg3 = _mm_xor_si128(msg3, msg1); - -	/* Rounds 40–43 */ -	e0 = _mm_sha1nexte_epu32(e0, msg2); -	e1 = abcd; -	msg3 = _mm_sha1msg2_epu32(msg3, msg2); -	abcd = _mm_sha1rnds4_epu32(abcd, e0, 2); -	msg1 = _mm_sha1msg1_epu32(msg1, msg2); -	msg0 = _mm_xor_si128(msg0, msg2); - -	/* Rounds 44–47 */ -	e1 = _mm_sha1nexte_epu32(e1, msg3); -	e0 = abcd; -	msg0 = _mm_sha1msg2_epu32(msg0, msg3); -	abcd = _mm_sha1rnds4_epu32(abcd, e1, 2); -	msg2 = _mm_sha1msg1_epu32(msg2, msg3); -	msg1 = _mm_xor_si128(msg1, msg3); - -	/* Rounds 48–51 */ -	e0 = _mm_sha1nexte_epu32(e0, msg0); -	e1 = abcd; -	msg1 = _mm_sha1msg2_epu32(msg1, msg0); -	abcd = _mm_sha1rnds4_epu32(abcd, e0, 2); -	msg3 = _mm_sha1msg1_epu32(msg3, msg0); -	msg2 = _mm_xor_si128(msg2, msg0); - -	/* Rounds 52–55 */ -	e1 = _mm_sha1nexte_epu32(e1, msg1); -	e0 = abcd; -	msg2 = _mm_sha1msg2_epu32(msg2, msg1); -	abcd = _mm_sha1rnds4_epu32(abcd, e1, 2); -	msg0 = _mm_sha1msg1_epu32(msg0, msg1); -	msg3 = _mm_xor_si128(msg3, msg1); - -	/* Rounds 56–59 */ -	e0 = _mm_sha1nexte_epu32(e0, msg2); -	e1 = abcd; -	msg3 = _mm_sha1msg2_epu32(msg3, msg2); -	abcd = _mm_sha1rnds4_epu32(abcd, e0, 2); -	msg1 = _mm_sha1msg1_epu32(msg1, msg2); -	msg0 = _mm_xor_si128(msg0, msg2); - -	/* Rounds 60–63 */ -	e1 = _mm_sha1nexte_epu32(e1, msg3); -	e0 = abcd; -	msg0 = _mm_sha1msg2_epu32(msg0, msg3); -	abcd = _mm_sha1rnds4_epu32(abcd, e1, 3); -	msg2 = _mm_sha1msg1_epu32(msg2, msg3); -	msg1 = _mm_xor_si128(msg1, msg3); - -	/* Rounds 64–67 */ -	e0 = _mm_sha1nexte_epu32(e0, msg0); -	e1 = abcd; -	msg1 = _mm_sha1msg2_epu32(msg1, msg0); -	abcd = _mm_sha1rnds4_epu32(abcd, e0, 3); -	msg3 = _mm_sha1msg1_epu32(msg3, msg0); -	msg2 = _mm_xor_si128(msg2, msg0); +	R(msg3, msg0, msg1, msg2, e1, e0, 0); /* Rounds 12–15 */ +	R(msg0, msg1, msg2, msg3, e0, e1, 0); /* Rounds 16–19 */ +	R(msg1, msg2, msg3, msg0, e1, e0, 1); /* Rounds 20–23 */ +	R(msg2, msg3, msg0, msg1, e0, e1, 1); /* Rounds 24–27 */ +	R(msg3, msg0, msg1, msg2, e1, e0, 1); /* Rounds 28–31 */ +	R(msg0, msg1, msg2, msg3, e0, e1, 1); /* Rounds 32–35 */ +	R(msg1, msg2, msg3, msg0, e1, e0, 1); /* Rounds 36–39 */ +	R(msg2, msg3, msg0, msg1, e0, e1, 2); /* Rounds 40–43 */ +	R(msg3, msg0, msg1, msg2, e1, e0, 2); /* Rounds 44–47 */ +	R(msg0, msg1, msg2, msg3, e0, e1, 2); /* Rounds 48–51 */ +	R(msg1, msg2, msg3, msg0, e1, e0, 2); /* Rounds 52–55 */ +	R(msg2, msg3, msg0, msg1, e0, e1, 2); /* Rounds 56–59 */ +	R(msg3, msg0, msg1, msg2, e1, e0, 3); /* Rounds 60–63 */ +	R(msg0, msg1, msg2, msg3, e0, e1, 3); /* Rounds 64–67 */  	/* Rounds 68–71 */  	e1 = _mm_sha1nexte_epu32(e1, msg1); @@ -253,3 +166,5 @@ sha1hashblk(sha1_t *s, const uint8_t *blk)      s->dgst[4] = _mm_extract_epi32(e0, 3);  #undef bswapdmsk  } + +#undef R  |