12#if SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_AMD64
15#pragma clang attribute push (__attribute__((target("avx2,pclmul,vaes,vpclmulqdq"))), apply_to=function)
17#pragma GCC push_options
18#pragma GCC target("avx2,pclmul,vaes,vpclmulqdq")
24#define AES_ENCRYPT_YMM_2048( pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 ) \
26 const BYTE (*keyPtr)[4][4]; \
27 const BYTE (*keyLimit)[4][4]; \
30 keyPtr = pExpandedKey->RoundKey; \
31 keyLimit = pExpandedKey->lastEncRoundKey; \
34 roundkeys = _mm256_broadcastsi128_si256( *( (const __m128i *) keyPtr ) ); \
38 c0 = _mm256_xor_si256( c0, roundkeys ); \
39 c1 = _mm256_xor_si256( c1, roundkeys ); \
40 c2 = _mm256_xor_si256( c2, roundkeys ); \
41 c3 = _mm256_xor_si256( c3, roundkeys ); \
42 c4 = _mm256_xor_si256( c4, roundkeys ); \
43 c5 = _mm256_xor_si256( c5, roundkeys ); \
44 c6 = _mm256_xor_si256( c6, roundkeys ); \
45 c7 = _mm256_xor_si256( c7, roundkeys ); \
49 roundkeys = _mm256_broadcastsi128_si256( *( (const __m128i *) keyPtr ) ); \
51 c0 = _mm256_aesenc_epi128( c0, roundkeys ); \
52 c1 = _mm256_aesenc_epi128( c1, roundkeys ); \
53 c2 = _mm256_aesenc_epi128( c2, roundkeys ); \
54 c3 = _mm256_aesenc_epi128( c3, roundkeys ); \
55 c4 = _mm256_aesenc_epi128( c4, roundkeys ); \
56 c5 = _mm256_aesenc_epi128( c5, roundkeys ); \
57 c6 = _mm256_aesenc_epi128( c6, roundkeys ); \
58 c7 = _mm256_aesenc_epi128( c7, roundkeys ); \
59 } while( keyPtr < keyLimit ); \
61 roundkeys = _mm256_broadcastsi128_si256( *( (const __m128i *) keyPtr ) ); \
63 c0 = _mm256_aesenclast_epi128( c0, roundkeys ); \
64 c1 = _mm256_aesenclast_epi128( c1, roundkeys ); \
65 c2 = _mm256_aesenclast_epi128( c2, roundkeys ); \
66 c3 = _mm256_aesenclast_epi128( c3, roundkeys ); \
67 c4 = _mm256_aesenclast_epi128( c4, roundkeys ); \
68 c5 = _mm256_aesenclast_epi128( c5, roundkeys ); \
69 c6 = _mm256_aesenclast_epi128( c6, roundkeys ); \
70 c7 = _mm256_aesenclast_epi128( c7, roundkeys ); \
73#define AES_DECRYPT_YMM_2048( pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 ) \
75 const BYTE (*keyPtr)[4][4]; \
76 const BYTE (*keyLimit)[4][4]; \
79 keyPtr = pExpandedKey->lastEncRoundKey; \
80 keyLimit = pExpandedKey->lastDecRoundKey; \
83 roundkeys = _mm256_broadcastsi128_si256( *( (const __m128i *) keyPtr ) ); \
87 c0 = _mm256_xor_si256( c0, roundkeys ); \
88 c1 = _mm256_xor_si256( c1, roundkeys ); \
89 c2 = _mm256_xor_si256( c2, roundkeys ); \
90 c3 = _mm256_xor_si256( c3, roundkeys ); \
91 c4 = _mm256_xor_si256( c4, roundkeys ); \
92 c5 = _mm256_xor_si256( c5, roundkeys ); \
93 c6 = _mm256_xor_si256( c6, roundkeys ); \
94 c7 = _mm256_xor_si256( c7, roundkeys ); \
98 roundkeys = _mm256_broadcastsi128_si256( *( (const __m128i *) keyPtr ) ); \
100 c0 = _mm256_aesdec_epi128( c0, roundkeys ); \
101 c1 = _mm256_aesdec_epi128( c1, roundkeys ); \
102 c2 = _mm256_aesdec_epi128( c2, roundkeys ); \
103 c3 = _mm256_aesdec_epi128( c3, roundkeys ); \
104 c4 = _mm256_aesdec_epi128( c4, roundkeys ); \
105 c5 = _mm256_aesdec_epi128( c5, roundkeys ); \
106 c6 = _mm256_aesdec_epi128( c6, roundkeys ); \
107 c7 = _mm256_aesdec_epi128( c7, roundkeys ); \
108 } while( keyPtr < keyLimit ); \
110 roundkeys = _mm256_broadcastsi128_si256( *( (const __m128i *) keyPtr ) ); \
112 c0 = _mm256_aesdeclast_epi128( c0, roundkeys ); \
113 c1 = _mm256_aesdeclast_epi128( c1, roundkeys ); \
114 c2 = _mm256_aesdeclast_epi128( c2, roundkeys ); \
115 c3 = _mm256_aesdeclast_epi128( c3, roundkeys ); \
116 c4 = _mm256_aesdeclast_epi128( c4, roundkeys ); \
117 c5 = _mm256_aesdeclast_epi128( c5, roundkeys ); \
118 c6 = _mm256_aesdeclast_epi128( c6, roundkeys ); \
119 c7 = _mm256_aesdeclast_epi128( c7, roundkeys ); \
132 __m128i t0, t1, t2, t3, t4, t5, t6, t7;
133 __m256i c0, c1, c2, c3, c4, c5, c6, c7;
134 __m128i XTS_ALPHA_MASK;
135 __m256i XTS_ALPHA_MULTIPLIER_Ymm;
138 __m256i T0, T1, T2, T3, T4, T5, T6, T7;
150 cbDataMain =
cbData - cbDataTail;
156 if( cbDataMain == 0 )
164 XTS_ALPHA_MULTIPLIER_Ymm = _mm256_set_epi64x( 0, 0x87, 0, 0x87 );
175 T0 = _mm256_insertf128_si256( _mm256_castsi128_si256( t0 ), t1, 1 );
176 T1 = _mm256_insertf128_si256( _mm256_castsi128_si256( t2 ), t3, 1 );
177 T2 = _mm256_insertf128_si256( _mm256_castsi128_si256( t4 ), t5, 1 );
178 T3 = _mm256_insertf128_si256( _mm256_castsi128_si256( t6 ), t7, 1 );
186 c0 = _mm256_xor_si256( T0, _mm256_loadu_si256( ( __m256i * ) (
pbSrc + 0 ) ) );
197 AES_ENCRYPT_YMM_2048(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
199 _mm256_storeu_si256( ( __m256i * ) (
pbDst + 0 ), _mm256_xor_si256( c0, T0 ) );
235 t7 = _mm256_extracti128_si256 ( T7, 1 );
257 __m128i t0, t1, t2, t3, t4, t5, t6, t7;
258 __m256i c0, c1, c2, c3, c4, c5, c6, c7;
259 __m128i XTS_ALPHA_MASK;
260 __m256i XTS_ALPHA_MULTIPLIER_Ymm;
263 __m256i T0, T1, T2, T3, T4, T5, T6, T7;
275 cbDataMain =
cbData - cbDataTail;
281 if( cbDataMain == 0 )
289 XTS_ALPHA_MULTIPLIER_Ymm = _mm256_set_epi64x( 0, 0x87, 0, 0x87 );
300 T0 = _mm256_insertf128_si256( _mm256_castsi128_si256( t0 ), t1, 1);
301 T1 = _mm256_insertf128_si256( _mm256_castsi128_si256( t2 ), t3, 1);
302 T2 = _mm256_insertf128_si256( _mm256_castsi128_si256( t4 ), t5, 1);
303 T3 = _mm256_insertf128_si256( _mm256_castsi128_si256( t6 ), t7, 1);
311 c0 = _mm256_xor_si256( T0, _mm256_loadu_si256( ( __m256i * ) (
pbSrc + 0 ) ) );
322 AES_DECRYPT_YMM_2048(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
324 _mm256_storeu_si256( ( __m256i * ) (
pbDst + 0 ), _mm256_xor_si256( c0, T0 ) );
360 t7 = _mm256_extracti128_si256 ( T7, 1 );
372#define AES_FULLROUND_16_GHASH_2_Ymm( roundkeys, keyPtr, c0, c1, c2, c3, c4, c5, c6, c7, r0, t0, t1, gHashPointer, byteReverseOrder, gHashExpandedKeyTable, todo, resl, resm, resh ) \
374 roundkeys = _mm256_broadcastsi128_si256( *( (const __m128i *) keyPtr ) ); \
376 c0 = _mm256_aesenc_epi128( c0, roundkeys ); \
377 c1 = _mm256_aesenc_epi128( c1, roundkeys ); \
378 c2 = _mm256_aesenc_epi128( c2, roundkeys ); \
379 c3 = _mm256_aesenc_epi128( c3, roundkeys ); \
380 c4 = _mm256_aesenc_epi128( c4, roundkeys ); \
381 c5 = _mm256_aesenc_epi128( c5, roundkeys ); \
382 c6 = _mm256_aesenc_epi128( c6, roundkeys ); \
383 c7 = _mm256_aesenc_epi128( c7, roundkeys ); \
385 r0 = _mm256_loadu_si256( (__m256i *) gHashPointer ); \
386 r0 = _mm256_shuffle_epi8( r0, byteReverseOrder ); \
387 gHashPointer += 32; \
389 t1 = _mm256_loadu_si256( (__m256i *) &GHASH_H_POWER(gHashExpandedKeyTable, todo) ); \
390 t0 = _mm256_clmulepi64_epi128( r0, t1, 0x00 ); \
391 t1 = _mm256_clmulepi64_epi128( r0, t1, 0x11 ); \
393 resl = _mm256_xor_si256( resl, t0 ); \
394 resh = _mm256_xor_si256( resh, t1 ); \
396 t0 = _mm256_srli_si256( r0, 8 ); \
397 r0 = _mm256_xor_si256( r0, t0 ); \
398 t1 = _mm256_loadu_si256( (__m256i *) &GHASH_Hx_POWER(gHashExpandedKeyTable, todo) ); \
399 t1 = _mm256_clmulepi64_epi128( r0, t1, 0x00 ); \
401 resm = _mm256_xor_si256( resm, t1 ); \
405#define AES_GCM_ENCRYPT_16_Ymm( pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7, gHashPointer, byteReverseOrder, gHashExpandedKeyTable, todo, resl, resm, resh ) \
407 const BYTE (*keyPtr)[4][4]; \
408 const BYTE (*keyLimit)[4][4]; \
412 int aesEncryptGhashLoop; \
414 keyPtr = pExpandedKey->RoundKey; \
415 keyLimit = pExpandedKey->lastEncRoundKey; \
418 roundkeys = _mm256_broadcastsi128_si256( *( (const __m128i *) keyPtr ) ); \
422 c0 = _mm256_xor_si256( c0, roundkeys ); \
423 c1 = _mm256_xor_si256( c1, roundkeys ); \
424 c2 = _mm256_xor_si256( c2, roundkeys ); \
425 c3 = _mm256_xor_si256( c3, roundkeys ); \
426 c4 = _mm256_xor_si256( c4, roundkeys ); \
427 c5 = _mm256_xor_si256( c5, roundkeys ); \
428 c6 = _mm256_xor_si256( c6, roundkeys ); \
429 c7 = _mm256_xor_si256( c7, roundkeys ); \
432 for( aesEncryptGhashLoop = 0; aesEncryptGhashLoop < 4; aesEncryptGhashLoop++ ) \
434 AES_FULLROUND_16_GHASH_2_Ymm( roundkeys, keyPtr, c0, c1, c2, c3, c4, c5, c6, c7, r0, t0, t1, gHashPointer, byteReverseOrder, gHashExpandedKeyTable, todo, resl, resm, resh ); \
435 AES_FULLROUND_16_GHASH_2_Ymm( roundkeys, keyPtr, c0, c1, c2, c3, c4, c5, c6, c7, r0, t0, t1, gHashPointer, byteReverseOrder, gHashExpandedKeyTable, todo, resl, resm, resh ); \
440 roundkeys = _mm256_broadcastsi128_si256( *( (const __m128i *) keyPtr ) ); \
442 c0 = _mm256_aesenc_epi128( c0, roundkeys ); \
443 c1 = _mm256_aesenc_epi128( c1, roundkeys ); \
444 c2 = _mm256_aesenc_epi128( c2, roundkeys ); \
445 c3 = _mm256_aesenc_epi128( c3, roundkeys ); \
446 c4 = _mm256_aesenc_epi128( c4, roundkeys ); \
447 c5 = _mm256_aesenc_epi128( c5, roundkeys ); \
448 c6 = _mm256_aesenc_epi128( c6, roundkeys ); \
449 c7 = _mm256_aesenc_epi128( c7, roundkeys ); \
450 } while( keyPtr < keyLimit ); \
452 roundkeys = _mm256_broadcastsi128_si256( *( (const __m128i *) keyPtr ) ); \
454 c0 = _mm256_aesenclast_epi128( c0, roundkeys ); \
455 c1 = _mm256_aesenclast_epi128( c1, roundkeys ); \
456 c2 = _mm256_aesenclast_epi128( c2, roundkeys ); \
457 c3 = _mm256_aesenclast_epi128( c3, roundkeys ); \
458 c4 = _mm256_aesenclast_epi128( c4, roundkeys ); \
459 c5 = _mm256_aesenclast_epi128( c5, roundkeys ); \
460 c6 = _mm256_aesenclast_epi128( c6, roundkeys ); \
461 c7 = _mm256_aesenclast_epi128( c7, roundkeys ); \
478 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
479 __m256i BYTE_REVERSE_ORDER = _mm256_set_epi64x( 0x0001020304050607, 0x08090a0b0c0d0e0f, 0x0001020304050607, 0x08090a0b0c0d0e0f );
480 __m128i vMultiplicationConstant =
_mm_set_epi32( 0, 0, 0xc2000000, 0 );
482 __m256i chainIncrementUpper1 = _mm256_set_epi64x( 0, 1, 0, 0 );
483 __m256i chainIncrement2 = _mm256_set_epi64x( 0, 2, 0, 2 );
484 __m256i chainIncrement4 = _mm256_set_epi64x( 0, 4, 0, 4 );
485 __m256i chainIncrement16 = _mm256_set_epi64x( 0, 16, 0, 16 );
487 __m256i ctr0, ctr1, ctr2, ctr3, ctr4, ctr5, ctr6, ctr7;
488 __m256i c0, c1, c2, c3, c4, c5, c6, c7;
489 __m256i r0,
r1,
r2,
r3, r4, r5, r6, r7;
493 __m128i a0_xmm, a1_xmm, a2_xmm;
503 chain = _mm_shuffle_epi8(
chain, BYTE_REVERSE_ORDER_xmm );
506 ctr0 = _mm256_insertf128_si256( _mm256_castsi128_si256(
chain ),
chain, 1);
507 ctr0 = _mm256_add_epi32( ctr0, chainIncrementUpper1 );
508 ctr1 = _mm256_add_epi32( ctr0, chainIncrement2 );
509 ctr2 = _mm256_add_epi32( ctr0, chainIncrement4 );
510 ctr3 = _mm256_add_epi32( ctr1, chainIncrement4 );
511 ctr4 = _mm256_add_epi32( ctr2, chainIncrement4 );
512 ctr5 = _mm256_add_epi32( ctr3, chainIncrement4 );
513 ctr6 = _mm256_add_epi32( ctr4, chainIncrement4 );
514 ctr7 = _mm256_add_epi32( ctr5, chainIncrement4 );
516 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0_xmm, a1_xmm, a2_xmm );
519 c0 = _mm256_shuffle_epi8( ctr0, BYTE_REVERSE_ORDER );
520 c1 = _mm256_shuffle_epi8( ctr1, BYTE_REVERSE_ORDER );
521 c2 = _mm256_shuffle_epi8( ctr2, BYTE_REVERSE_ORDER );
522 c3 = _mm256_shuffle_epi8( ctr3, BYTE_REVERSE_ORDER );
523 c4 = _mm256_shuffle_epi8( ctr4, BYTE_REVERSE_ORDER );
524 c5 = _mm256_shuffle_epi8( ctr5, BYTE_REVERSE_ORDER );
525 c6 = _mm256_shuffle_epi8( ctr6, BYTE_REVERSE_ORDER );
526 c7 = _mm256_shuffle_epi8( ctr7, BYTE_REVERSE_ORDER );
528 ctr0 = _mm256_add_epi32( ctr0, chainIncrement16 );
529 ctr1 = _mm256_add_epi32( ctr1, chainIncrement16 );
530 ctr2 = _mm256_add_epi32( ctr2, chainIncrement16 );
531 ctr3 = _mm256_add_epi32( ctr3, chainIncrement16 );
532 ctr4 = _mm256_add_epi32( ctr4, chainIncrement16 );
533 ctr5 = _mm256_add_epi32( ctr5, chainIncrement16 );
534 ctr6 = _mm256_add_epi32( ctr6, chainIncrement16 );
535 ctr7 = _mm256_add_epi32( ctr7, chainIncrement16 );
537 AES_ENCRYPT_YMM_2048(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
539 _mm256_storeu_si256( (__m256i *) (
pbDst + 0), _mm256_xor_si256( c0, _mm256_loadu_si256( ( __m256i * ) (
pbSrc + 0) ) ) );
540 _mm256_storeu_si256( (__m256i *) (
pbDst + 32), _mm256_xor_si256( c1, _mm256_loadu_si256( ( __m256i * ) (
pbSrc + 32) ) ) );
541 _mm256_storeu_si256( (__m256i *) (
pbDst + 64), _mm256_xor_si256( c2, _mm256_loadu_si256( ( __m256i * ) (
pbSrc + 64) ) ) );
542 _mm256_storeu_si256( (__m256i *) (
pbDst + 96), _mm256_xor_si256( c3, _mm256_loadu_si256( ( __m256i * ) (
pbSrc + 96) ) ) );
543 _mm256_storeu_si256( (__m256i *) (
pbDst +128), _mm256_xor_si256( c4, _mm256_loadu_si256( ( __m256i * ) (
pbSrc +128) ) ) );
544 _mm256_storeu_si256( (__m256i *) (
pbDst +160), _mm256_xor_si256( c5, _mm256_loadu_si256( ( __m256i * ) (
pbSrc +160) ) ) );
545 _mm256_storeu_si256( (__m256i *) (
pbDst +192), _mm256_xor_si256( c6, _mm256_loadu_si256( ( __m256i * ) (
pbSrc +192) ) ) );
546 _mm256_storeu_si256( (__m256i *) (
pbDst +224), _mm256_xor_si256( c7, _mm256_loadu_si256( ( __m256i * ) (
pbSrc +224) ) ) );
553 c0 = _mm256_shuffle_epi8( ctr0, BYTE_REVERSE_ORDER );
554 c1 = _mm256_shuffle_epi8( ctr1, BYTE_REVERSE_ORDER );
555 c2 = _mm256_shuffle_epi8( ctr2, BYTE_REVERSE_ORDER );
556 c3 = _mm256_shuffle_epi8( ctr3, BYTE_REVERSE_ORDER );
557 c4 = _mm256_shuffle_epi8( ctr4, BYTE_REVERSE_ORDER );
558 c5 = _mm256_shuffle_epi8( ctr5, BYTE_REVERSE_ORDER );
559 c6 = _mm256_shuffle_epi8( ctr6, BYTE_REVERSE_ORDER );
560 c7 = _mm256_shuffle_epi8( ctr7, BYTE_REVERSE_ORDER );
562 ctr0 = _mm256_add_epi32( ctr0, chainIncrement16 );
563 ctr1 = _mm256_add_epi32( ctr1, chainIncrement16 );
564 ctr2 = _mm256_add_epi32( ctr2, chainIncrement16 );
565 ctr3 = _mm256_add_epi32( ctr3, chainIncrement16 );
566 ctr4 = _mm256_add_epi32( ctr4, chainIncrement16 );
567 ctr5 = _mm256_add_epi32( ctr5, chainIncrement16 );
568 ctr6 = _mm256_add_epi32( ctr6, chainIncrement16 );
569 ctr7 = _mm256_add_epi32( ctr7, chainIncrement16 );
571 AES_GCM_ENCRYPT_16_Ymm(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7, pbGhashSrc, BYTE_REVERSE_ORDER, expandedKeyTable,
todo, a0,
a1,
a2 );
573 _mm256_storeu_si256( (__m256i *) (
pbDst + 0), _mm256_xor_si256( c0, _mm256_loadu_si256( ( __m256i * ) (
pbSrc + 0) ) ) );
574 _mm256_storeu_si256( (__m256i *) (
pbDst + 32), _mm256_xor_si256( c1, _mm256_loadu_si256( ( __m256i * ) (
pbSrc + 32) ) ) );
575 _mm256_storeu_si256( (__m256i *) (
pbDst + 64), _mm256_xor_si256( c2, _mm256_loadu_si256( ( __m256i * ) (
pbSrc + 64) ) ) );
576 _mm256_storeu_si256( (__m256i *) (
pbDst + 96), _mm256_xor_si256( c3, _mm256_loadu_si256( ( __m256i * ) (
pbSrc + 96) ) ) );
577 _mm256_storeu_si256( (__m256i *) (
pbDst +128), _mm256_xor_si256( c4, _mm256_loadu_si256( ( __m256i * ) (
pbSrc +128) ) ) );
578 _mm256_storeu_si256( (__m256i *) (
pbDst +160), _mm256_xor_si256( c5, _mm256_loadu_si256( ( __m256i * ) (
pbSrc +160) ) ) );
579 _mm256_storeu_si256( (__m256i *) (
pbDst +192), _mm256_xor_si256( c6, _mm256_loadu_si256( ( __m256i * ) (
pbSrc +192) ) ) );
580 _mm256_storeu_si256( (__m256i *) (
pbDst +224), _mm256_xor_si256( c7, _mm256_loadu_si256( ( __m256i * ) (
pbSrc +224) ) ) );
588 a0_xmm =
_mm_xor_si128( a0_xmm, _mm256_extracti128_si256 ( a0, 0 ));
592 a0_xmm =
_mm_xor_si128( a0_xmm, _mm256_extracti128_si256 ( a0, 1 ));
595 CLMUL_3_POST( a0_xmm, a1_xmm, a2_xmm );
596 MODREDUCE( vMultiplicationConstant, a0_xmm, a1_xmm, a2_xmm,
state );
599 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0_xmm, a1_xmm, a2_xmm );
604 r0 = _mm256_shuffle_epi8( _mm256_loadu_si256( (__m256i *) (pbGhashSrc + 0) ), BYTE_REVERSE_ORDER );
605 r1 = _mm256_shuffle_epi8( _mm256_loadu_si256( (__m256i *) (pbGhashSrc + 32) ), BYTE_REVERSE_ORDER );
606 r2 = _mm256_shuffle_epi8( _mm256_loadu_si256( (__m256i *) (pbGhashSrc + 64) ), BYTE_REVERSE_ORDER );
607 r3 = _mm256_shuffle_epi8( _mm256_loadu_si256( (__m256i *) (pbGhashSrc + 96) ), BYTE_REVERSE_ORDER );
608 r4 = _mm256_shuffle_epi8( _mm256_loadu_si256( (__m256i *) (pbGhashSrc +128) ), BYTE_REVERSE_ORDER );
609 r5 = _mm256_shuffle_epi8( _mm256_loadu_si256( (__m256i *) (pbGhashSrc +160) ), BYTE_REVERSE_ORDER );
610 r6 = _mm256_shuffle_epi8( _mm256_loadu_si256( (__m256i *) (pbGhashSrc +192) ), BYTE_REVERSE_ORDER );
611 r7 = _mm256_shuffle_epi8( _mm256_loadu_si256( (__m256i *) (pbGhashSrc +224) ), BYTE_REVERSE_ORDER );
613 Hi = _mm256_loadu_si256( (__m256i *) &GHASH_H_POWER(expandedKeyTable,
todo - 0) );
614 Hix = _mm256_loadu_si256( (__m256i *) &GHASH_Hx_POWER(expandedKeyTable,
todo - 0) );
615 CLMUL_ACC_3_Ymm( r0, Hi, Hix, a0,
a1,
a2 );
616 Hi = _mm256_loadu_si256( (__m256i *) &GHASH_H_POWER(expandedKeyTable,
todo - 2) );
617 Hix = _mm256_loadu_si256( (__m256i *) &GHASH_Hx_POWER(expandedKeyTable,
todo - 2) );
618 CLMUL_ACC_3_Ymm(
r1, Hi, Hix, a0,
a1,
a2 );
619 Hi = _mm256_loadu_si256( (__m256i *) &GHASH_H_POWER(expandedKeyTable,
todo - 4) );
620 Hix = _mm256_loadu_si256( (__m256i *) &GHASH_Hx_POWER(expandedKeyTable,
todo - 4) );
621 CLMUL_ACC_3_Ymm(
r2, Hi, Hix, a0,
a1,
a2 );
622 Hi = _mm256_loadu_si256( (__m256i *) &GHASH_H_POWER(expandedKeyTable,
todo - 6) );
623 Hix = _mm256_loadu_si256( (__m256i *) &GHASH_Hx_POWER(expandedKeyTable,
todo - 6) );
624 CLMUL_ACC_3_Ymm(
r3, Hi, Hix, a0,
a1,
a2 );
625 Hi = _mm256_loadu_si256( (__m256i *) &GHASH_H_POWER(expandedKeyTable,
todo - 8) );
626 Hix = _mm256_loadu_si256( (__m256i *) &GHASH_Hx_POWER(expandedKeyTable,
todo - 8) );
627 CLMUL_ACC_3_Ymm( r4, Hi, Hix, a0,
a1,
a2 );
628 Hi = _mm256_loadu_si256( (__m256i *) &GHASH_H_POWER(expandedKeyTable,
todo -10) );
629 Hix = _mm256_loadu_si256( (__m256i *) &GHASH_Hx_POWER(expandedKeyTable,
todo -10) );
630 CLMUL_ACC_3_Ymm( r5, Hi, Hix, a0,
a1,
a2 );
631 Hi = _mm256_loadu_si256( (__m256i *) &GHASH_H_POWER(expandedKeyTable,
todo -12) );
632 Hix = _mm256_loadu_si256( (__m256i *) &GHASH_Hx_POWER(expandedKeyTable,
todo -12) );
633 CLMUL_ACC_3_Ymm( r6, Hi, Hix, a0,
a1,
a2 );
634 Hi = _mm256_loadu_si256( (__m256i *) &GHASH_H_POWER(expandedKeyTable,
todo -14) );
635 Hix = _mm256_loadu_si256( (__m256i *) &GHASH_Hx_POWER(expandedKeyTable,
todo -14) );
636 CLMUL_ACC_3_Ymm( r7, Hi, Hix, a0,
a1,
a2 );
638 a0_xmm =
_mm_xor_si128( a0_xmm, _mm256_extracti128_si256 ( a0, 0 ));
642 a0_xmm =
_mm_xor_si128( a0_xmm, _mm256_extracti128_si256 ( a0, 1 ));
645 CLMUL_3_POST( a0_xmm, a1_xmm, a2_xmm );
646 MODREDUCE( vMultiplicationConstant, a0_xmm, a1_xmm, a2_xmm,
state );
648 chain = _mm256_extracti128_si256 ( ctr0, 0 );
651 chain = _mm_shuffle_epi8(
chain, BYTE_REVERSE_ORDER_xmm );
677 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
678 __m256i BYTE_REVERSE_ORDER = _mm256_set_epi64x( 0x0001020304050607, 0x08090a0b0c0d0e0f, 0x0001020304050607, 0x08090a0b0c0d0e0f );
679 __m128i vMultiplicationConstant =
_mm_set_epi32( 0, 0, 0xc2000000, 0 );
681 __m256i chainIncrementUpper1 = _mm256_set_epi64x( 0, 1, 0, 0 );
682 __m256i chainIncrement2 = _mm256_set_epi64x( 0, 2, 0, 2 );
683 __m256i chainIncrement4 = _mm256_set_epi64x( 0, 4, 0, 4 );
684 __m256i chainIncrement16 = _mm256_set_epi64x( 0, 16, 0, 16 );
686 __m256i ctr0, ctr1, ctr2, ctr3, ctr4, ctr5, ctr6, ctr7;
687 __m256i c0, c1, c2, c3, c4, c5, c6, c7;
690 __m128i a0_xmm, a1_xmm, a2_xmm;
700 chain = _mm_shuffle_epi8(
chain, BYTE_REVERSE_ORDER_xmm );
703 ctr0 = _mm256_insertf128_si256( _mm256_castsi128_si256(
chain ),
chain, 1);
704 ctr0 = _mm256_add_epi32( ctr0, chainIncrementUpper1 );
705 ctr1 = _mm256_add_epi32( ctr0, chainIncrement2 );
706 ctr2 = _mm256_add_epi32( ctr0, chainIncrement4 );
707 ctr3 = _mm256_add_epi32( ctr1, chainIncrement4 );
708 ctr4 = _mm256_add_epi32( ctr2, chainIncrement4 );
709 ctr5 = _mm256_add_epi32( ctr3, chainIncrement4 );
710 ctr6 = _mm256_add_epi32( ctr4, chainIncrement4 );
711 ctr7 = _mm256_add_epi32( ctr5, chainIncrement4 );
713 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0_xmm, a1_xmm, a2_xmm );
718 c0 = _mm256_shuffle_epi8( ctr0, BYTE_REVERSE_ORDER );
719 c1 = _mm256_shuffle_epi8( ctr1, BYTE_REVERSE_ORDER );
720 c2 = _mm256_shuffle_epi8( ctr2, BYTE_REVERSE_ORDER );
721 c3 = _mm256_shuffle_epi8( ctr3, BYTE_REVERSE_ORDER );
722 c4 = _mm256_shuffle_epi8( ctr4, BYTE_REVERSE_ORDER );
723 c5 = _mm256_shuffle_epi8( ctr5, BYTE_REVERSE_ORDER );
724 c6 = _mm256_shuffle_epi8( ctr6, BYTE_REVERSE_ORDER );
725 c7 = _mm256_shuffle_epi8( ctr7, BYTE_REVERSE_ORDER );
727 ctr0 = _mm256_add_epi32( ctr0, chainIncrement16 );
728 ctr1 = _mm256_add_epi32( ctr1, chainIncrement16 );
729 ctr2 = _mm256_add_epi32( ctr2, chainIncrement16 );
730 ctr3 = _mm256_add_epi32( ctr3, chainIncrement16 );
731 ctr4 = _mm256_add_epi32( ctr4, chainIncrement16 );
732 ctr5 = _mm256_add_epi32( ctr5, chainIncrement16 );
733 ctr6 = _mm256_add_epi32( ctr6, chainIncrement16 );
734 ctr7 = _mm256_add_epi32( ctr7, chainIncrement16 );
736 AES_GCM_ENCRYPT_16_Ymm(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7, pbGhashSrc, BYTE_REVERSE_ORDER, expandedKeyTable,
todo, a0,
a1,
a2 );
738 _mm256_storeu_si256( (__m256i *) (
pbDst + 0), _mm256_xor_si256( c0, _mm256_loadu_si256( ( __m256i * ) (
pbSrc + 0) ) ) );
739 _mm256_storeu_si256( (__m256i *) (
pbDst + 32), _mm256_xor_si256( c1, _mm256_loadu_si256( ( __m256i * ) (
pbSrc + 32) ) ) );
740 _mm256_storeu_si256( (__m256i *) (
pbDst + 64), _mm256_xor_si256( c2, _mm256_loadu_si256( ( __m256i * ) (
pbSrc + 64) ) ) );
741 _mm256_storeu_si256( (__m256i *) (
pbDst + 96), _mm256_xor_si256( c3, _mm256_loadu_si256( ( __m256i * ) (
pbSrc + 96) ) ) );
742 _mm256_storeu_si256( (__m256i *) (
pbDst +128), _mm256_xor_si256( c4, _mm256_loadu_si256( ( __m256i * ) (
pbSrc +128) ) ) );
743 _mm256_storeu_si256( (__m256i *) (
pbDst +160), _mm256_xor_si256( c5, _mm256_loadu_si256( ( __m256i * ) (
pbSrc +160) ) ) );
744 _mm256_storeu_si256( (__m256i *) (
pbDst +192), _mm256_xor_si256( c6, _mm256_loadu_si256( ( __m256i * ) (
pbSrc +192) ) ) );
745 _mm256_storeu_si256( (__m256i *) (
pbDst +224), _mm256_xor_si256( c7, _mm256_loadu_si256( ( __m256i * ) (
pbSrc +224) ) ) );
753 a0_xmm =
_mm_xor_si128( a0_xmm, _mm256_extracti128_si256 ( a0, 0 ));
757 a0_xmm =
_mm_xor_si128( a0_xmm, _mm256_extracti128_si256 ( a0, 1 ));
760 CLMUL_3_POST( a0_xmm, a1_xmm, a2_xmm );
761 MODREDUCE( vMultiplicationConstant, a0_xmm, a1_xmm, a2_xmm,
state );
766 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0_xmm, a1_xmm, a2_xmm );
772 chain = _mm256_extracti128_si256 ( ctr0, 0 );
775 chain = _mm_shuffle_epi8(
chain, BYTE_REVERSE_ORDER_xmm );
788#pragma clang attribute pop
790#pragma GCC pop_options
void _mm_storeu_si128(__m128i_u *p, __m128i b)
__m128i _mm_set_epi8(char b15, char b14, char b13, char b12, char b11, char b10, char b9, char b8, char b7, char b6, char b5, char b4, char b3, char b2, char b1, char b0)
__m128i _mm_set_epi32(int i3, int i2, int i1, int i0)
__m128i _mm_xor_si128(__m128i a, __m128i b)
__m128i _mm_loadu_si128(__m128i_u const *p)
__m256i __cdecl _mm256_setzero_si256(void)
void __cdecl _mm256_zeroupper(void)
static const struct update_accum a1
static const struct update_accum a2
#define _Inout_updates_(s)
#define GCM_YMM_MINBLOCKS
VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE pbScratch, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE pbScratch, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesGcmDecryptStitchedYmm_2048(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesGcmEncryptStitchedXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesGcmDecryptStitchedXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesGcmEncryptStitchedYmm_2048(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(SYMCRYPT_GF128_FIELD_SIZE) PCSYMCRYPT_GF128_ELEMENT expandedKeyTable, _Inout_ PSYMCRYPT_GF128_ELEMENT pState, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitYmm_2048(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE pbScratch, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptXtsAesEncryptDataUnitYmm_2048(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE *16) PBYTE pbScratch, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
#define SYMCRYPT_ASSERT(_x)
#define SYMCRYPT_AES_BLOCK_SIZE
const SYMCRYPT_GF128_ELEMENT * PCSYMCRYPT_GF128_ELEMENT
#define SYMCRYPT_GCM_BLOCK_MOD_MASK
const SYMCRYPT_AES_EXPANDED_KEY * PCSYMCRYPT_AES_EXPANDED_KEY
#define SYMCRYPT_GF128_FIELD_SIZE
#define SYMCRYPT_GF128_BLOCK_SIZE
#define SYMCRYPT_MIN(_a, _b)
* PSYMCRYPT_GF128_ELEMENT
PCBYTE PBYTE SIZE_T cbData
PSYMCRYPT_COMMON_HASH_STATE pState
#define XTS_MUL_ALPHA8_YMM(_in, _res)
#define XTS_MUL_ALPHA(_in, _res)
#define XTS_MUL_ALPHA16_YMM(_in, _res)
#define XTS_MUL_ALPHA4(_in, _res)