15#include <botan/sha160.h>
20#if defined(BOTAN_HAS_SHA1_X86_SHA_NI)
22void SHA_160::sha1_compress_x86(
secure_vector<uint32_t>& digest,
23 const uint8_t input[],
26 const __m128i MASK = _mm_set_epi64x(0x0001020304050607ULL, 0x08090a0b0c0d0e0fULL);
27 const __m128i* input_mm =
reinterpret_cast<const __m128i*
>(input);
29 uint32_t* state = digest.data();
32 __m128i ABCD = _mm_loadu_si128(
reinterpret_cast<__m128i*
>(state));
33 __m128i E0 = _mm_set_epi32(state[4], 0, 0, 0);
34 ABCD = _mm_shuffle_epi32(ABCD, 0x1B);
39 const __m128i ABCD_SAVE = ABCD;
40 const __m128i E0_SAVE = E0;
42 __m128i MSG0, MSG1, MSG2, MSG3;
46 MSG0 = _mm_loadu_si128(input_mm+0);
47 MSG0 = _mm_shuffle_epi8(MSG0, MASK);
48 E0 = _mm_add_epi32(E0, MSG0);
50 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 0);
53 MSG1 = _mm_loadu_si128(input_mm+1);
54 MSG1 = _mm_shuffle_epi8(MSG1, MASK);
55 E1 = _mm_sha1nexte_epu32(E1, MSG1);
57 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 0);
58 MSG0 = _mm_sha1msg1_epu32(MSG0, MSG1);
61 MSG2 = _mm_loadu_si128(input_mm+2);
62 MSG2 = _mm_shuffle_epi8(MSG2, MASK);
63 E0 = _mm_sha1nexte_epu32(E0, MSG2);
65 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 0);
66 MSG1 = _mm_sha1msg1_epu32(MSG1, MSG2);
67 MSG0 = _mm_xor_si128(MSG0, MSG2);
70 MSG3 = _mm_loadu_si128(input_mm+3);
71 MSG3 = _mm_shuffle_epi8(MSG3, MASK);
72 E1 = _mm_sha1nexte_epu32(E1, MSG3);
74 MSG0 = _mm_sha1msg2_epu32(MSG0, MSG3);
75 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 0);
76 MSG2 = _mm_sha1msg1_epu32(MSG2, MSG3);
77 MSG1 = _mm_xor_si128(MSG1, MSG3);
80 E0 = _mm_sha1nexte_epu32(E0, MSG0);
82 MSG1 = _mm_sha1msg2_epu32(MSG1, MSG0);
83 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 0);
84 MSG3 = _mm_sha1msg1_epu32(MSG3, MSG0);
85 MSG2 = _mm_xor_si128(MSG2, MSG0);
88 E1 = _mm_sha1nexte_epu32(E1, MSG1);
90 MSG2 = _mm_sha1msg2_epu32(MSG2, MSG1);
91 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 1);
92 MSG0 = _mm_sha1msg1_epu32(MSG0, MSG1);
93 MSG3 = _mm_xor_si128(MSG3, MSG1);
96 E0 = _mm_sha1nexte_epu32(E0, MSG2);
98 MSG3 = _mm_sha1msg2_epu32(MSG3, MSG2);
99 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 1);
100 MSG1 = _mm_sha1msg1_epu32(MSG1, MSG2);
101 MSG0 = _mm_xor_si128(MSG0, MSG2);
104 E1 = _mm_sha1nexte_epu32(E1, MSG3);
106 MSG0 = _mm_sha1msg2_epu32(MSG0, MSG3);
107 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 1);
108 MSG2 = _mm_sha1msg1_epu32(MSG2, MSG3);
109 MSG1 = _mm_xor_si128(MSG1, MSG3);
112 E0 = _mm_sha1nexte_epu32(E0, MSG0);
114 MSG1 = _mm_sha1msg2_epu32(MSG1, MSG0);
115 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 1);
116 MSG3 = _mm_sha1msg1_epu32(MSG3, MSG0);
117 MSG2 = _mm_xor_si128(MSG2, MSG0);
120 E1 = _mm_sha1nexte_epu32(E1, MSG1);
122 MSG2 = _mm_sha1msg2_epu32(MSG2, MSG1);
123 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 1);
124 MSG0 = _mm_sha1msg1_epu32(MSG0, MSG1);
125 MSG3 = _mm_xor_si128(MSG3, MSG1);
128 E0 = _mm_sha1nexte_epu32(E0, MSG2);
130 MSG3 = _mm_sha1msg2_epu32(MSG3, MSG2);
131 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 2);
132 MSG1 = _mm_sha1msg1_epu32(MSG1, MSG2);
133 MSG0 = _mm_xor_si128(MSG0, MSG2);
136 E1 = _mm_sha1nexte_epu32(E1, MSG3);
138 MSG0 = _mm_sha1msg2_epu32(MSG0, MSG3);
139 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 2);
140 MSG2 = _mm_sha1msg1_epu32(MSG2, MSG3);
141 MSG1 = _mm_xor_si128(MSG1, MSG3);
144 E0 = _mm_sha1nexte_epu32(E0, MSG0);
146 MSG1 = _mm_sha1msg2_epu32(MSG1, MSG0);
147 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 2);
148 MSG3 = _mm_sha1msg1_epu32(MSG3, MSG0);
149 MSG2 = _mm_xor_si128(MSG2, MSG0);
152 E1 = _mm_sha1nexte_epu32(E1, MSG1);
154 MSG2 = _mm_sha1msg2_epu32(MSG2, MSG1);
155 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 2);
156 MSG0 = _mm_sha1msg1_epu32(MSG0, MSG1);
157 MSG3 = _mm_xor_si128(MSG3, MSG1);
160 E0 = _mm_sha1nexte_epu32(E0, MSG2);
162 MSG3 = _mm_sha1msg2_epu32(MSG3, MSG2);
163 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 2);
164 MSG1 = _mm_sha1msg1_epu32(MSG1, MSG2);
165 MSG0 = _mm_xor_si128(MSG0, MSG2);
168 E1 = _mm_sha1nexte_epu32(E1, MSG3);
170 MSG0 = _mm_sha1msg2_epu32(MSG0, MSG3);
171 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 3);
172 MSG2 = _mm_sha1msg1_epu32(MSG2, MSG3);
173 MSG1 = _mm_xor_si128(MSG1, MSG3);
176 E0 = _mm_sha1nexte_epu32(E0, MSG0);
178 MSG1 = _mm_sha1msg2_epu32(MSG1, MSG0);
179 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 3);
180 MSG3 = _mm_sha1msg1_epu32(MSG3, MSG0);
181 MSG2 = _mm_xor_si128(MSG2, MSG0);
184 E1 = _mm_sha1nexte_epu32(E1, MSG1);
186 MSG2 = _mm_sha1msg2_epu32(MSG2, MSG1);
187 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 3);
188 MSG3 = _mm_xor_si128(MSG3, MSG1);
191 E0 = _mm_sha1nexte_epu32(E0, MSG2);
193 MSG3 = _mm_sha1msg2_epu32(MSG3, MSG2);
194 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 3);
197 E1 = _mm_sha1nexte_epu32(E1, MSG3);
199 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 3);
202 E0 = _mm_sha1nexte_epu32(E0, E0_SAVE);
203 ABCD = _mm_add_epi32(ABCD, ABCD_SAVE);
210 ABCD = _mm_shuffle_epi32(ABCD, 0x1B);
211 _mm_storeu_si128(
reinterpret_cast<__m128i*
>(state), ABCD);
212 state[4] = _mm_extract_epi32(E0, 3);
#define BOTAN_FUNC_ISA(isa)
std::vector< T, secure_allocator< T > > secure_vector