diff options
-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 |