14 #if (CRYPTOPP_SHANI_AVAILABLE) 15 # include <nmmintrin.h> 16 # include <immintrin.h> 20 #if (CRYPTOPP_ARM_SHA_AVAILABLE) 21 # include <arm_neon.h> 26 #if defined(CRYPTOPP_ARM_ACLE_AVAILABLE) 28 # include <arm_acle.h> 31 #if CRYPTOPP_POWER8_SHA_AVAILABLE 35 #ifdef CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY 40 #ifndef EXCEPTION_EXECUTE_HANDLER 41 # define EXCEPTION_EXECUTE_HANDLER 1 45 #define M128_CAST(x) ((__m128i *)(void *)(x)) 46 #define CONST_M128_CAST(x) ((const __m128i *)(const void *)(x)) 52 #ifdef CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY 54 typedef void (*SigHandler)(int);
56 static jmp_buf s_jmpSIGILL;
57 static void SigIllHandler(
int)
59 longjmp(s_jmpSIGILL, 1);
62 #endif // Not CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY 64 #if (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64) 67 #if defined(CRYPTOPP_NO_CPU_FEATURE_PROBES) 69 #elif (CRYPTOPP_ARM_SHA_AVAILABLE) 70 # if defined(CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY) 71 volatile bool result =
true;
74 uint32x4_t data1 = {1,2,3,4}, data2 = {5,6,7,8}, data3 = {9,10,11,12};
76 uint32x4_t r1 = vsha1cq_u32 (data1, 0, data2);
77 uint32x4_t r2 = vsha1mq_u32 (data1, 0, data2);
78 uint32x4_t r3 = vsha1pq_u32 (data1, 0, data2);
79 uint32x4_t r4 = vsha1su0q_u32 (data1, data2, data3);
80 uint32x4_t r5 = vsha1su1q_u32 (data1, data2);
82 result = !!(vgetq_lane_u32(r1,0) | vgetq_lane_u32(r2,1) | vgetq_lane_u32(r3,2) | vgetq_lane_u32(r4,3) | vgetq_lane_u32(r5,0));
84 __except (EXCEPTION_EXECUTE_HANDLER)
93 volatile bool result =
true;
95 volatile SigHandler oldHandler = signal(SIGILL, SigIllHandler);
96 if (oldHandler == SIG_ERR)
99 volatile sigset_t oldMask;
100 if (sigprocmask(0, NULLPTR, (sigset_t*)&oldMask))
103 if (setjmp(s_jmpSIGILL))
107 uint32x4_t data1 = {1,2,3,4}, data2 = {5,6,7,8}, data3 = {9,10,11,12};
109 uint32x4_t r1 = vsha1cq_u32 (data1, 0, data2);
110 uint32x4_t r2 = vsha1mq_u32 (data1, 0, data2);
111 uint32x4_t r3 = vsha1pq_u32 (data1, 0, data2);
112 uint32x4_t r4 = vsha1su0q_u32 (data1, data2, data3);
113 uint32x4_t r5 = vsha1su1q_u32 (data1, data2);
115 result = !!(vgetq_lane_u32(r1,0) | vgetq_lane_u32(r2,1) | vgetq_lane_u32(r3,2) | vgetq_lane_u32(r4,3) | vgetq_lane_u32(r5,0));
118 sigprocmask(SIG_SETMASK, (sigset_t*)&oldMask, NULLPTR);
119 signal(SIGILL, oldHandler);
124 #endif // CRYPTOPP_ARM_SHA_AVAILABLE 129 #if defined(CRYPTOPP_NO_CPU_FEATURE_PROBES) 131 #elif (CRYPTOPP_ARM_SHA_AVAILABLE) 132 # if defined(CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY) 133 volatile bool result =
true;
136 uint32x4_t data1 = {1,2,3,4}, data2 = {5,6,7,8}, data3 = {9,10,11,12};
138 uint32x4_t r1 = vsha256hq_u32 (data1, data2, data3);
139 uint32x4_t r2 = vsha256h2q_u32 (data1, data2, data3);
140 uint32x4_t r3 = vsha256su0q_u32 (data1, data2);
141 uint32x4_t r4 = vsha256su1q_u32 (data1, data2, data3);
143 result = !!(vgetq_lane_u32(r1,0) | vgetq_lane_u32(r2,1) | vgetq_lane_u32(r3,2) | vgetq_lane_u32(r4,3));
145 __except (EXCEPTION_EXECUTE_HANDLER)
154 volatile bool result =
true;
156 volatile SigHandler oldHandler = signal(SIGILL, SigIllHandler);
157 if (oldHandler == SIG_ERR)
160 volatile sigset_t oldMask;
161 if (sigprocmask(0, NULLPTR, (sigset_t*)&oldMask))
164 if (setjmp(s_jmpSIGILL))
168 uint32x4_t data1 = {1,2,3,4}, data2 = {5,6,7,8}, data3 = {9,10,11,12};
170 uint32x4_t r1 = vsha256hq_u32 (data1, data2, data3);
171 uint32x4_t r2 = vsha256h2q_u32 (data1, data2, data3);
172 uint32x4_t r3 = vsha256su0q_u32 (data1, data2);
173 uint32x4_t r4 = vsha256su1q_u32 (data1, data2, data3);
175 result = !!(vgetq_lane_u32(r1,0) | vgetq_lane_u32(r2,1) | vgetq_lane_u32(r3,2) | vgetq_lane_u32(r4,3));
178 sigprocmask(SIG_SETMASK, (sigset_t*)&oldMask, NULLPTR);
179 signal(SIGILL, oldHandler);
184 #endif // CRYPTOPP_ARM_SHA_AVAILABLE 186 #endif // ARM32 or ARM64 191 extern const word32 SHA256_K[64];
197 #if CRYPTOPP_SHANI_AVAILABLE 199 void SHA1_HashMultipleBlocks_SHANI(word32 *state,
const word32 *data,
size_t length,
ByteOrder order)
205 __m128i ABCD, ABCD_SAVE, E0, E0_SAVE, E1;
206 __m128i MASK, MSG0, MSG1, MSG2, MSG3;
209 ABCD = _mm_loadu_si128(CONST_M128_CAST(state));
210 E0 = _mm_set_epi32(state[4], 0, 0, 0);
211 ABCD = _mm_shuffle_epi32(ABCD, 0x1B);
217 _mm_set_epi8(0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15) :
218 _mm_set_epi8(3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12) ;
220 while (length >= SHA1::BLOCKSIZE)
227 MSG0 = _mm_loadu_si128(CONST_M128_CAST(data+0));
228 MSG0 = _mm_shuffle_epi8(MSG0, MASK);
229 E0 = _mm_add_epi32(E0, MSG0);
231 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 0);
234 MSG1 = _mm_loadu_si128(CONST_M128_CAST(data+4));
235 MSG1 = _mm_shuffle_epi8(MSG1, MASK);
236 E1 = _mm_sha1nexte_epu32(E1, MSG1);
238 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 0);
239 MSG0 = _mm_sha1msg1_epu32(MSG0, MSG1);
242 MSG2 = _mm_loadu_si128(CONST_M128_CAST(data+8));
243 MSG2 = _mm_shuffle_epi8(MSG2, MASK);
244 E0 = _mm_sha1nexte_epu32(E0, MSG2);
246 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 0);
247 MSG1 = _mm_sha1msg1_epu32(MSG1, MSG2);
248 MSG0 = _mm_xor_si128(MSG0, MSG2);
251 MSG3 = _mm_loadu_si128(CONST_M128_CAST(data+12));
252 MSG3 = _mm_shuffle_epi8(MSG3, MASK);
253 E1 = _mm_sha1nexte_epu32(E1, MSG3);
255 MSG0 = _mm_sha1msg2_epu32(MSG0, MSG3);
256 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 0);
257 MSG2 = _mm_sha1msg1_epu32(MSG2, MSG3);
258 MSG1 = _mm_xor_si128(MSG1, MSG3);
261 E0 = _mm_sha1nexte_epu32(E0, MSG0);
263 MSG1 = _mm_sha1msg2_epu32(MSG1, MSG0);
264 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 0);
265 MSG3 = _mm_sha1msg1_epu32(MSG3, MSG0);
266 MSG2 = _mm_xor_si128(MSG2, MSG0);
269 E1 = _mm_sha1nexte_epu32(E1, MSG1);
271 MSG2 = _mm_sha1msg2_epu32(MSG2, MSG1);
272 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 1);
273 MSG0 = _mm_sha1msg1_epu32(MSG0, MSG1);
274 MSG3 = _mm_xor_si128(MSG3, MSG1);
277 E0 = _mm_sha1nexte_epu32(E0, MSG2);
279 MSG3 = _mm_sha1msg2_epu32(MSG3, MSG2);
280 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 1);
281 MSG1 = _mm_sha1msg1_epu32(MSG1, MSG2);
282 MSG0 = _mm_xor_si128(MSG0, MSG2);
285 E1 = _mm_sha1nexte_epu32(E1, MSG3);
287 MSG0 = _mm_sha1msg2_epu32(MSG0, MSG3);
288 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 1);
289 MSG2 = _mm_sha1msg1_epu32(MSG2, MSG3);
290 MSG1 = _mm_xor_si128(MSG1, MSG3);
293 E0 = _mm_sha1nexte_epu32(E0, MSG0);
295 MSG1 = _mm_sha1msg2_epu32(MSG1, MSG0);
296 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 1);
297 MSG3 = _mm_sha1msg1_epu32(MSG3, MSG0);
298 MSG2 = _mm_xor_si128(MSG2, MSG0);
301 E1 = _mm_sha1nexte_epu32(E1, MSG1);
303 MSG2 = _mm_sha1msg2_epu32(MSG2, MSG1);
304 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 1);
305 MSG0 = _mm_sha1msg1_epu32(MSG0, MSG1);
306 MSG3 = _mm_xor_si128(MSG3, MSG1);
309 E0 = _mm_sha1nexte_epu32(E0, MSG2);
311 MSG3 = _mm_sha1msg2_epu32(MSG3, MSG2);
312 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 2);
313 MSG1 = _mm_sha1msg1_epu32(MSG1, MSG2);
314 MSG0 = _mm_xor_si128(MSG0, MSG2);
317 E1 = _mm_sha1nexte_epu32(E1, MSG3);
319 MSG0 = _mm_sha1msg2_epu32(MSG0, MSG3);
320 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 2);
321 MSG2 = _mm_sha1msg1_epu32(MSG2, MSG3);
322 MSG1 = _mm_xor_si128(MSG1, MSG3);
325 E0 = _mm_sha1nexte_epu32(E0, MSG0);
327 MSG1 = _mm_sha1msg2_epu32(MSG1, MSG0);
328 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 2);
329 MSG3 = _mm_sha1msg1_epu32(MSG3, MSG0);
330 MSG2 = _mm_xor_si128(MSG2, MSG0);
333 E1 = _mm_sha1nexte_epu32(E1, MSG1);
335 MSG2 = _mm_sha1msg2_epu32(MSG2, MSG1);
336 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 2);
337 MSG0 = _mm_sha1msg1_epu32(MSG0, MSG1);
338 MSG3 = _mm_xor_si128(MSG3, MSG1);
341 E0 = _mm_sha1nexte_epu32(E0, MSG2);
343 MSG3 = _mm_sha1msg2_epu32(MSG3, MSG2);
344 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 2);
345 MSG1 = _mm_sha1msg1_epu32(MSG1, MSG2);
346 MSG0 = _mm_xor_si128(MSG0, MSG2);
349 E1 = _mm_sha1nexte_epu32(E1, MSG3);
351 MSG0 = _mm_sha1msg2_epu32(MSG0, MSG3);
352 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 3);
353 MSG2 = _mm_sha1msg1_epu32(MSG2, MSG3);
354 MSG1 = _mm_xor_si128(MSG1, MSG3);
357 E0 = _mm_sha1nexte_epu32(E0, MSG0);
359 MSG1 = _mm_sha1msg2_epu32(MSG1, MSG0);
360 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 3);
361 MSG3 = _mm_sha1msg1_epu32(MSG3, MSG0);
362 MSG2 = _mm_xor_si128(MSG2, MSG0);
365 E1 = _mm_sha1nexte_epu32(E1, MSG1);
367 MSG2 = _mm_sha1msg2_epu32(MSG2, MSG1);
368 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 3);
369 MSG3 = _mm_xor_si128(MSG3, MSG1);
372 E0 = _mm_sha1nexte_epu32(E0, MSG2);
374 MSG3 = _mm_sha1msg2_epu32(MSG3, MSG2);
375 ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 3);
378 E1 = _mm_sha1nexte_epu32(E1, MSG3);
380 ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 3);
383 E0 = _mm_sha1nexte_epu32(E0, E0_SAVE);
384 ABCD = _mm_add_epi32(ABCD, ABCD_SAVE);
386 data += SHA1::BLOCKSIZE/
sizeof(word32);
387 length -= SHA1::BLOCKSIZE;
391 ABCD = _mm_shuffle_epi32(ABCD, 0x1B);
392 _mm_storeu_si128(M128_CAST(state), ABCD);
393 state[4] = _mm_extract_epi32(E0, 3);
397 void SHA256_HashMultipleBlocks_SHANI(word32 *state,
const word32 *data,
size_t length,
ByteOrder order)
403 __m128i STATE0, STATE1;
404 __m128i MSG, TMP, MASK;
405 __m128i TMSG0, TMSG1, TMSG2, TMSG3;
406 __m128i ABEF_SAVE, CDGH_SAVE;
409 TMP = _mm_loadu_si128(M128_CAST(&state[0]));
410 STATE1 = _mm_loadu_si128(M128_CAST(&state[4]));
416 _mm_set_epi8(12,13,14,15, 8,9,10,11, 4,5,6,7, 0,1,2,3) :
417 _mm_set_epi8(15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0) ;
419 TMP = _mm_shuffle_epi32(TMP, 0xB1);
420 STATE1 = _mm_shuffle_epi32(STATE1, 0x1B);
421 STATE0 = _mm_alignr_epi8(TMP, STATE1, 8);
422 STATE1 = _mm_blend_epi16(STATE1, TMP, 0xF0);
424 while (length >= SHA256::BLOCKSIZE)
431 MSG = _mm_loadu_si128(CONST_M128_CAST(data+0));
432 TMSG0 = _mm_shuffle_epi8(MSG, MASK);
433 MSG = _mm_add_epi32(TMSG0, _mm_set_epi64x(W64LIT(0xE9B5DBA5B5C0FBCF), W64LIT(0x71374491428A2F98)));
434 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
435 MSG = _mm_shuffle_epi32(MSG, 0x0E);
436 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
439 TMSG1 = _mm_loadu_si128(CONST_M128_CAST(data+4));
440 TMSG1 = _mm_shuffle_epi8(TMSG1, MASK);
441 MSG = _mm_add_epi32(TMSG1, _mm_set_epi64x(W64LIT(0xAB1C5ED5923F82A4), W64LIT(0x59F111F13956C25B)));
442 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
443 MSG = _mm_shuffle_epi32(MSG, 0x0E);
444 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
445 TMSG0 = _mm_sha256msg1_epu32(TMSG0, TMSG1);
448 TMSG2 = _mm_loadu_si128(CONST_M128_CAST(data+8));
449 TMSG2 = _mm_shuffle_epi8(TMSG2, MASK);
450 MSG = _mm_add_epi32(TMSG2, _mm_set_epi64x(W64LIT(0x550C7DC3243185BE), W64LIT(0x12835B01D807AA98)));
451 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
452 MSG = _mm_shuffle_epi32(MSG, 0x0E);
453 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
454 TMSG1 = _mm_sha256msg1_epu32(TMSG1, TMSG2);
457 TMSG3 = _mm_loadu_si128(CONST_M128_CAST(data+12));
458 TMSG3 = _mm_shuffle_epi8(TMSG3, MASK);
459 MSG = _mm_add_epi32(TMSG3, _mm_set_epi64x(W64LIT(0xC19BF1749BDC06A7), W64LIT(0x80DEB1FE72BE5D74)));
460 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
461 TMP = _mm_alignr_epi8(TMSG3, TMSG2, 4);
462 TMSG0 = _mm_add_epi32(TMSG0, TMP);
463 TMSG0 = _mm_sha256msg2_epu32(TMSG0, TMSG3);
464 MSG = _mm_shuffle_epi32(MSG, 0x0E);
465 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
466 TMSG2 = _mm_sha256msg1_epu32(TMSG2, TMSG3);
469 MSG = _mm_add_epi32(TMSG0, _mm_set_epi64x(W64LIT(0x240CA1CC0FC19DC6), W64LIT(0xEFBE4786E49B69C1)));
470 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
471 TMP = _mm_alignr_epi8(TMSG0, TMSG3, 4);
472 TMSG1 = _mm_add_epi32(TMSG1, TMP);
473 TMSG1 = _mm_sha256msg2_epu32(TMSG1, TMSG0);
474 MSG = _mm_shuffle_epi32(MSG, 0x0E);
475 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
476 TMSG3 = _mm_sha256msg1_epu32(TMSG3, TMSG0);
479 MSG = _mm_add_epi32(TMSG1, _mm_set_epi64x(W64LIT(0x76F988DA5CB0A9DC), W64LIT(0x4A7484AA2DE92C6F)));
480 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
481 TMP = _mm_alignr_epi8(TMSG1, TMSG0, 4);
482 TMSG2 = _mm_add_epi32(TMSG2, TMP);
483 TMSG2 = _mm_sha256msg2_epu32(TMSG2, TMSG1);
484 MSG = _mm_shuffle_epi32(MSG, 0x0E);
485 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
486 TMSG0 = _mm_sha256msg1_epu32(TMSG0, TMSG1);
489 MSG = _mm_add_epi32(TMSG2, _mm_set_epi64x(W64LIT(0xBF597FC7B00327C8), W64LIT(0xA831C66D983E5152)));
490 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
491 TMP = _mm_alignr_epi8(TMSG2, TMSG1, 4);
492 TMSG3 = _mm_add_epi32(TMSG3, TMP);
493 TMSG3 = _mm_sha256msg2_epu32(TMSG3, TMSG2);
494 MSG = _mm_shuffle_epi32(MSG, 0x0E);
495 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
496 TMSG1 = _mm_sha256msg1_epu32(TMSG1, TMSG2);
499 MSG = _mm_add_epi32(TMSG3, _mm_set_epi64x(W64LIT(0x1429296706CA6351), W64LIT(0xD5A79147C6E00BF3)));
500 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
501 TMP = _mm_alignr_epi8(TMSG3, TMSG2, 4);
502 TMSG0 = _mm_add_epi32(TMSG0, TMP);
503 TMSG0 = _mm_sha256msg2_epu32(TMSG0, TMSG3);
504 MSG = _mm_shuffle_epi32(MSG, 0x0E);
505 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
506 TMSG2 = _mm_sha256msg1_epu32(TMSG2, TMSG3);
509 MSG = _mm_add_epi32(TMSG0, _mm_set_epi64x(W64LIT(0x53380D134D2C6DFC), W64LIT(0x2E1B213827B70A85)));
510 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
511 TMP = _mm_alignr_epi8(TMSG0, TMSG3, 4);
512 TMSG1 = _mm_add_epi32(TMSG1, TMP);
513 TMSG1 = _mm_sha256msg2_epu32(TMSG1, TMSG0);
514 MSG = _mm_shuffle_epi32(MSG, 0x0E);
515 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
516 TMSG3 = _mm_sha256msg1_epu32(TMSG3, TMSG0);
519 MSG = _mm_add_epi32(TMSG1, _mm_set_epi64x(W64LIT(0x92722C8581C2C92E), W64LIT(0x766A0ABB650A7354)));
520 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
521 TMP = _mm_alignr_epi8(TMSG1, TMSG0, 4);
522 TMSG2 = _mm_add_epi32(TMSG2, TMP);
523 TMSG2 = _mm_sha256msg2_epu32(TMSG2, TMSG1);
524 MSG = _mm_shuffle_epi32(MSG, 0x0E);
525 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
526 TMSG0 = _mm_sha256msg1_epu32(TMSG0, TMSG1);
529 MSG = _mm_add_epi32(TMSG2, _mm_set_epi64x(W64LIT(0xC76C51A3C24B8B70), W64LIT(0xA81A664BA2BFE8A1)));
530 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
531 TMP = _mm_alignr_epi8(TMSG2, TMSG1, 4);
532 TMSG3 = _mm_add_epi32(TMSG3, TMP);
533 TMSG3 = _mm_sha256msg2_epu32(TMSG3, TMSG2);
534 MSG = _mm_shuffle_epi32(MSG, 0x0E);
535 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
536 TMSG1 = _mm_sha256msg1_epu32(TMSG1, TMSG2);
539 MSG = _mm_add_epi32(TMSG3, _mm_set_epi64x(W64LIT(0x106AA070F40E3585), W64LIT(0xD6990624D192E819)));
540 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
541 TMP = _mm_alignr_epi8(TMSG3, TMSG2, 4);
542 TMSG0 = _mm_add_epi32(TMSG0, TMP);
543 TMSG0 = _mm_sha256msg2_epu32(TMSG0, TMSG3);
544 MSG = _mm_shuffle_epi32(MSG, 0x0E);
545 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
546 TMSG2 = _mm_sha256msg1_epu32(TMSG2, TMSG3);
549 MSG = _mm_add_epi32(TMSG0, _mm_set_epi64x(W64LIT(0x34B0BCB52748774C), W64LIT(0x1E376C0819A4C116)));
550 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
551 TMP = _mm_alignr_epi8(TMSG0, TMSG3, 4);
552 TMSG1 = _mm_add_epi32(TMSG1, TMP);
553 TMSG1 = _mm_sha256msg2_epu32(TMSG1, TMSG0);
554 MSG = _mm_shuffle_epi32(MSG, 0x0E);
555 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
556 TMSG3 = _mm_sha256msg1_epu32(TMSG3, TMSG0);
559 MSG = _mm_add_epi32(TMSG1, _mm_set_epi64x(W64LIT(0x682E6FF35B9CCA4F), W64LIT(0x4ED8AA4A391C0CB3)));
560 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
561 TMP = _mm_alignr_epi8(TMSG1, TMSG0, 4);
562 TMSG2 = _mm_add_epi32(TMSG2, TMP);
563 TMSG2 = _mm_sha256msg2_epu32(TMSG2, TMSG1);
564 MSG = _mm_shuffle_epi32(MSG, 0x0E);
565 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
568 MSG = _mm_add_epi32(TMSG2, _mm_set_epi64x(W64LIT(0x8CC7020884C87814), W64LIT(0x78A5636F748F82EE)));
569 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
570 TMP = _mm_alignr_epi8(TMSG2, TMSG1, 4);
571 TMSG3 = _mm_add_epi32(TMSG3, TMP);
572 TMSG3 = _mm_sha256msg2_epu32(TMSG3, TMSG2);
573 MSG = _mm_shuffle_epi32(MSG, 0x0E);
574 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
577 MSG = _mm_add_epi32(TMSG3, _mm_set_epi64x(W64LIT(0xC67178F2BEF9A3F7), W64LIT(0xA4506CEB90BEFFFA)));
578 STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
579 MSG = _mm_shuffle_epi32(MSG, 0x0E);
580 STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
583 STATE0 = _mm_add_epi32(STATE0, ABEF_SAVE);
584 STATE1 = _mm_add_epi32(STATE1, CDGH_SAVE);
586 data += SHA256::BLOCKSIZE/
sizeof(word32);
587 length -= SHA256::BLOCKSIZE;
590 TMP = _mm_shuffle_epi32(STATE0, 0x1B);
591 STATE1 = _mm_shuffle_epi32(STATE1, 0xB1);
592 STATE0 = _mm_blend_epi16(TMP, STATE1, 0xF0);
593 STATE1 = _mm_alignr_epi8(STATE1, TMP, 8);
596 _mm_storeu_si128(M128_CAST(&state[0]), STATE0);
597 _mm_storeu_si128(M128_CAST(&state[4]), STATE1);
599 #endif // CRYPTOPP_SHANI_AVAILABLE 611 #if CRYPTOPP_ARM_SHA_AVAILABLE 612 void SHA1_HashMultipleBlocks_ARMV8(word32 *state,
const word32 *data,
size_t length,
ByteOrder order)
618 uint32x4_t C0, C1, C2, C3;
619 uint32x4_t ABCD, ABCD_SAVED;
620 uint32x4_t MSG0, MSG1, MSG2, MSG3;
621 uint32x4_t TMP0, TMP1;
622 uint32_t E0, E0_SAVED, E1;
625 C0 = vdupq_n_u32(0x5A827999);
626 C1 = vdupq_n_u32(0x6ED9EBA1);
627 C2 = vdupq_n_u32(0x8F1BBCDC);
628 C3 = vdupq_n_u32(0xCA62C1D6);
630 ABCD = vld1q_u32(&state[0]);
633 while (length >= SHA1::BLOCKSIZE)
639 MSG0 = vld1q_u32(data + 0);
640 MSG1 = vld1q_u32(data + 4);
641 MSG2 = vld1q_u32(data + 8);
642 MSG3 = vld1q_u32(data + 12);
646 MSG0 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG0)));
647 MSG1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG1)));
648 MSG2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG2)));
649 MSG3 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG3)));
652 TMP0 = vaddq_u32(MSG0, C0);
653 TMP1 = vaddq_u32(MSG1, C0);
656 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
657 ABCD = vsha1cq_u32(ABCD, E0, TMP0);
658 TMP0 = vaddq_u32(MSG2, C0);
659 MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2);
662 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
663 ABCD = vsha1cq_u32(ABCD, E1, TMP1);
664 TMP1 = vaddq_u32(MSG3, C0);
665 MSG0 = vsha1su1q_u32(MSG0, MSG3);
666 MSG1 = vsha1su0q_u32(MSG1, MSG2, MSG3);
669 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
670 ABCD = vsha1cq_u32(ABCD, E0, TMP0);
671 TMP0 = vaddq_u32(MSG0, C0);
672 MSG1 = vsha1su1q_u32(MSG1, MSG0);
673 MSG2 = vsha1su0q_u32(MSG2, MSG3, MSG0);
676 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
677 ABCD = vsha1cq_u32(ABCD, E1, TMP1);
678 TMP1 = vaddq_u32(MSG1, C1);
679 MSG2 = vsha1su1q_u32(MSG2, MSG1);
680 MSG3 = vsha1su0q_u32(MSG3, MSG0, MSG1);
683 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
684 ABCD = vsha1cq_u32(ABCD, E0, TMP0);
685 TMP0 = vaddq_u32(MSG2, C1);
686 MSG3 = vsha1su1q_u32(MSG3, MSG2);
687 MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2);
690 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
691 ABCD = vsha1pq_u32(ABCD, E1, TMP1);
692 TMP1 = vaddq_u32(MSG3, C1);
693 MSG0 = vsha1su1q_u32(MSG0, MSG3);
694 MSG1 = vsha1su0q_u32(MSG1, MSG2, MSG3);
697 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
698 ABCD = vsha1pq_u32(ABCD, E0, TMP0);
699 TMP0 = vaddq_u32(MSG0, C1);
700 MSG1 = vsha1su1q_u32(MSG1, MSG0);
701 MSG2 = vsha1su0q_u32(MSG2, MSG3, MSG0);
704 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
705 ABCD = vsha1pq_u32(ABCD, E1, TMP1);
706 TMP1 = vaddq_u32(MSG1, C1);
707 MSG2 = vsha1su1q_u32(MSG2, MSG1);
708 MSG3 = vsha1su0q_u32(MSG3, MSG0, MSG1);
711 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
712 ABCD = vsha1pq_u32(ABCD, E0, TMP0);
713 TMP0 = vaddq_u32(MSG2, C2);
714 MSG3 = vsha1su1q_u32(MSG3, MSG2);
715 MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2);
718 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
719 ABCD = vsha1pq_u32(ABCD, E1, TMP1);
720 TMP1 = vaddq_u32(MSG3, C2);
721 MSG0 = vsha1su1q_u32(MSG0, MSG3);
722 MSG1 = vsha1su0q_u32(MSG1, MSG2, MSG3);
725 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
726 ABCD = vsha1mq_u32(ABCD, E0, TMP0);
727 TMP0 = vaddq_u32(MSG0, C2);
728 MSG1 = vsha1su1q_u32(MSG1, MSG0);
729 MSG2 = vsha1su0q_u32(MSG2, MSG3, MSG0);
732 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
733 ABCD = vsha1mq_u32(ABCD, E1, TMP1);
734 TMP1 = vaddq_u32(MSG1, C2);
735 MSG2 = vsha1su1q_u32(MSG2, MSG1);
736 MSG3 = vsha1su0q_u32(MSG3, MSG0, MSG1);
739 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
740 ABCD = vsha1mq_u32(ABCD, E0, TMP0);
741 TMP0 = vaddq_u32(MSG2, C2);
742 MSG3 = vsha1su1q_u32(MSG3, MSG2);
743 MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2);
746 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
747 ABCD = vsha1mq_u32(ABCD, E1, TMP1);
748 TMP1 = vaddq_u32(MSG3, C3);
749 MSG0 = vsha1su1q_u32(MSG0, MSG3);
750 MSG1 = vsha1su0q_u32(MSG1, MSG2, MSG3);
753 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
754 ABCD = vsha1mq_u32(ABCD, E0, TMP0);
755 TMP0 = vaddq_u32(MSG0, C3);
756 MSG1 = vsha1su1q_u32(MSG1, MSG0);
757 MSG2 = vsha1su0q_u32(MSG2, MSG3, MSG0);
760 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
761 ABCD = vsha1pq_u32(ABCD, E1, TMP1);
762 TMP1 = vaddq_u32(MSG1, C3);
763 MSG2 = vsha1su1q_u32(MSG2, MSG1);
764 MSG3 = vsha1su0q_u32(MSG3, MSG0, MSG1);
767 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
768 ABCD = vsha1pq_u32(ABCD, E0, TMP0);
769 TMP0 = vaddq_u32(MSG2, C3);
770 MSG3 = vsha1su1q_u32(MSG3, MSG2);
771 MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2);
774 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
775 ABCD = vsha1pq_u32(ABCD, E1, TMP1);
776 TMP1 = vaddq_u32(MSG3, C3);
777 MSG0 = vsha1su1q_u32(MSG0, MSG3);
780 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
781 ABCD = vsha1pq_u32(ABCD, E0, TMP0);
784 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
785 ABCD = vsha1pq_u32(ABCD, E1, TMP1);
788 ABCD = vaddq_u32(ABCD_SAVED, ABCD);
790 data += SHA1::BLOCKSIZE/
sizeof(word32);
791 length -= SHA1::BLOCKSIZE;
795 vst1q_u32(&state[0], ABCD);
799 void SHA256_HashMultipleBlocks_ARMV8(word32 *state,
const word32 *data,
size_t length,
ByteOrder order)
805 uint32x4_t STATE0, STATE1, ABEF_SAVE, CDGH_SAVE;
806 uint32x4_t MSG0, MSG1, MSG2, MSG3;
807 uint32x4_t TMP0, TMP1, TMP2;
810 STATE0 = vld1q_u32(&state[0]);
811 STATE1 = vld1q_u32(&state[4]);
813 while (length >= SHA256::BLOCKSIZE)
820 MSG0 = vld1q_u32(data + 0);
821 MSG1 = vld1q_u32(data + 4);
822 MSG2 = vld1q_u32(data + 8);
823 MSG3 = vld1q_u32(data + 12);
827 MSG0 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG0)));
828 MSG1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG1)));
829 MSG2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG2)));
830 MSG3 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG3)));
833 TMP0 = vaddq_u32(MSG0, vld1q_u32(&SHA256_K[0x00]));
836 MSG0 = vsha256su0q_u32(MSG0, MSG1);
838 TMP1 = vaddq_u32(MSG1, vld1q_u32(&SHA256_K[0x04]));
839 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
840 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
841 MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);;
844 MSG1 = vsha256su0q_u32(MSG1, MSG2);
846 TMP0 = vaddq_u32(MSG2, vld1q_u32(&SHA256_K[0x08]));
847 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
848 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
849 MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);;
852 MSG2 = vsha256su0q_u32(MSG2, MSG3);
854 TMP1 = vaddq_u32(MSG3, vld1q_u32(&SHA256_K[0x0c]));
855 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
856 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
857 MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);;
860 MSG3 = vsha256su0q_u32(MSG3, MSG0);
862 TMP0 = vaddq_u32(MSG0, vld1q_u32(&SHA256_K[0x10]));
863 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
864 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
865 MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);;
868 MSG0 = vsha256su0q_u32(MSG0, MSG1);
870 TMP1 = vaddq_u32(MSG1, vld1q_u32(&SHA256_K[0x14]));
871 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
872 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
873 MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);;
876 MSG1 = vsha256su0q_u32(MSG1, MSG2);
878 TMP0 = vaddq_u32(MSG2, vld1q_u32(&SHA256_K[0x18]));
879 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
880 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
881 MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);;
884 MSG2 = vsha256su0q_u32(MSG2, MSG3);
886 TMP1 = vaddq_u32(MSG3, vld1q_u32(&SHA256_K[0x1c]));
887 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
888 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
889 MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);;
892 MSG3 = vsha256su0q_u32(MSG3, MSG0);
894 TMP0 = vaddq_u32(MSG0, vld1q_u32(&SHA256_K[0x20]));
895 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
896 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
897 MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);;
900 MSG0 = vsha256su0q_u32(MSG0, MSG1);
902 TMP1 = vaddq_u32(MSG1, vld1q_u32(&SHA256_K[0x24]));
903 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
904 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
905 MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);;
908 MSG1 = vsha256su0q_u32(MSG1, MSG2);
910 TMP0 = vaddq_u32(MSG2, vld1q_u32(&SHA256_K[0x28]));
911 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
912 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
913 MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);;
916 MSG2 = vsha256su0q_u32(MSG2, MSG3);
918 TMP1 = vaddq_u32(MSG3, vld1q_u32(&SHA256_K[0x2c]));
919 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
920 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
921 MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);;
924 MSG3 = vsha256su0q_u32(MSG3, MSG0);
926 TMP0 = vaddq_u32(MSG0, vld1q_u32(&SHA256_K[0x30]));
927 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
928 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
929 MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);;
933 TMP1 = vaddq_u32(MSG1, vld1q_u32(&SHA256_K[0x34]));
934 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
935 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);;
939 TMP0 = vaddq_u32(MSG2, vld1q_u32(&SHA256_K[0x38]));
940 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
941 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);;
945 TMP1 = vaddq_u32(MSG3, vld1q_u32(&SHA256_K[0x3c]));
946 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
947 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);;
951 STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
952 STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);;
955 STATE0 = vaddq_u32(STATE0, ABEF_SAVE);
956 STATE1 = vaddq_u32(STATE1, CDGH_SAVE);
958 data += SHA256::BLOCKSIZE/
sizeof(word32);
959 length -= SHA256::BLOCKSIZE;
963 vst1q_u32(&state[0], STATE0);
964 vst1q_u32(&state[4], STATE1);
966 #endif // CRYPTOPP_ARM_SHA_AVAILABLE 978 #if CRYPTOPP_POWER8_SHA_AVAILABLE 979 void SHA256_HashMultipleBlocks_POWER8(word32 *state,
const word32 *data,
size_t length,
ByteOrder order)
988 void SHA512_HashMultipleBlocks_POWER8(word64 *state,
const word64 *data,
size_t length,
ByteOrder order)
997 #endif // CRYPTOPP_POWER8_SHA_AVAILABLE Utility functions for the Crypto++ library.
ByteOrder
Provides the byte ordering.
Library configuration file.
Support functions for PowerPC and vector operations.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
Classes for SHA-1 and SHA-2 family of message digests.
Crypto++ library namespace.