12#if SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_AMD64
18#pragma clang attribute push (__attribute__((target("ssse3,aes,pclmul"))), apply_to=function)
20#pragma GCC push_options
21#pragma GCC target("ssse3,aes,pclmul")
31 x = _mm_aeskeygenassist_si128(
x, 0 );
72#define AES_ENCRYPT_1( pExpandedKey, c0 ) \
74 const BYTE (*keyPtr)[4][4]; \
75 const BYTE (*keyLimit)[4][4]; \
78 keyPtr = &pExpandedKey->RoundKey[0]; \
79 keyLimit = pExpandedKey->lastEncRoundKey; \
81 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
84 c0 = _mm_xor_si128( c0, roundkey ); \
86 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
88 c0 = _mm_aesenc_si128( c0, roundkey ); \
92 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
94 c0 = _mm_aesenc_si128( c0, roundkey ); \
95 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
97 c0 = _mm_aesenc_si128( c0, roundkey ); \
98 } while( keyPtr < keyLimit ); \
100 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
102 c0 = _mm_aesenclast_si128( c0, roundkey ); \
111#define AES_ENCRYPT_1_CHAIN( pExpandedKey, cipherState, mergedLastRoundKey ) \
113 const BYTE (*keyPtr)[4][4]; \
114 const BYTE (*keyLimit)[4][4]; \
117 keyPtr = &pExpandedKey->RoundKey[1]; \
118 keyLimit = pExpandedKey->lastEncRoundKey; \
120 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
123 cipherState = _mm_aesenc_si128( cipherState, roundkey ); \
127 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
129 cipherState = _mm_aesenc_si128( cipherState, roundkey ); \
130 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
132 cipherState = _mm_aesenc_si128( cipherState, roundkey ); \
133 } while( keyPtr < keyLimit ); \
135 cipherState = _mm_aesenclast_si128( cipherState, mergedLastRoundKey ); \
138#define AES_ENCRYPT_4( pExpandedKey, c0, c1, c2, c3 ) \
140 const BYTE (*keyPtr)[4][4]; \
141 const BYTE (*keyLimit)[4][4]; \
144 keyPtr = &pExpandedKey->RoundKey[0]; \
145 keyLimit = pExpandedKey->lastEncRoundKey; \
147 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
150 c0 = _mm_xor_si128( c0, roundkey ); \
151 c1 = _mm_xor_si128( c1, roundkey ); \
152 c2 = _mm_xor_si128( c2, roundkey ); \
153 c3 = _mm_xor_si128( c3, roundkey ); \
157 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
159 c0 = _mm_aesenc_si128( c0, roundkey ); \
160 c1 = _mm_aesenc_si128( c1, roundkey ); \
161 c2 = _mm_aesenc_si128( c2, roundkey ); \
162 c3 = _mm_aesenc_si128( c3, roundkey ); \
163 } while( keyPtr < keyLimit ); \
165 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
167 c0 = _mm_aesenclast_si128( c0, roundkey ); \
168 c1 = _mm_aesenclast_si128( c1, roundkey ); \
169 c2 = _mm_aesenclast_si128( c2, roundkey ); \
170 c3 = _mm_aesenclast_si128( c3, roundkey ); \
173#define AES_ENCRYPT_8( pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 ) \
175 const BYTE (*keyPtr)[4][4]; \
176 const BYTE (*keyLimit)[4][4]; \
179 keyPtr = &pExpandedKey->RoundKey[0]; \
180 keyLimit = pExpandedKey->lastEncRoundKey; \
182 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
185 c0 = _mm_xor_si128( c0, roundkey ); \
186 c1 = _mm_xor_si128( c1, roundkey ); \
187 c2 = _mm_xor_si128( c2, roundkey ); \
188 c3 = _mm_xor_si128( c3, roundkey ); \
189 c4 = _mm_xor_si128( c4, roundkey ); \
190 c5 = _mm_xor_si128( c5, roundkey ); \
191 c6 = _mm_xor_si128( c6, roundkey ); \
192 c7 = _mm_xor_si128( c7, roundkey ); \
196 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
198 c0 = _mm_aesenc_si128( c0, roundkey ); \
199 c1 = _mm_aesenc_si128( c1, roundkey ); \
200 c2 = _mm_aesenc_si128( c2, roundkey ); \
201 c3 = _mm_aesenc_si128( c3, roundkey ); \
202 c4 = _mm_aesenc_si128( c4, roundkey ); \
203 c5 = _mm_aesenc_si128( c5, roundkey ); \
204 c6 = _mm_aesenc_si128( c6, roundkey ); \
205 c7 = _mm_aesenc_si128( c7, roundkey ); \
206 } while( keyPtr < keyLimit ); \
208 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
210 c0 = _mm_aesenclast_si128( c0, roundkey ); \
211 c1 = _mm_aesenclast_si128( c1, roundkey ); \
212 c2 = _mm_aesenclast_si128( c2, roundkey ); \
213 c3 = _mm_aesenclast_si128( c3, roundkey ); \
214 c4 = _mm_aesenclast_si128( c4, roundkey ); \
215 c5 = _mm_aesenclast_si128( c5, roundkey ); \
216 c6 = _mm_aesenclast_si128( c6, roundkey ); \
217 c7 = _mm_aesenclast_si128( c7, roundkey ); \
220#define AES_DECRYPT_1( pExpandedKey, c0 ) \
222 const BYTE (*keyPtr)[4][4]; \
223 const BYTE (*keyLimit)[4][4]; \
226 keyPtr = pExpandedKey->lastEncRoundKey; \
227 keyLimit = pExpandedKey->lastDecRoundKey; \
229 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
232 c0 = _mm_xor_si128( c0, roundkey ); \
234 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
236 c0 = _mm_aesdec_si128( c0, roundkey ); \
240 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
242 c0 = _mm_aesdec_si128( c0, roundkey ); \
243 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
245 c0 = _mm_aesdec_si128( c0, roundkey ); \
246 } while( keyPtr < keyLimit ); \
248 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
250 c0 = _mm_aesdeclast_si128( c0, roundkey ); \
253#define AES_DECRYPT_4( pExpandedKey, c0, c1, c2, c3 ) \
255 const BYTE (*keyPtr)[4][4]; \
256 const BYTE (*keyLimit)[4][4]; \
259 keyPtr = pExpandedKey->lastEncRoundKey; \
260 keyLimit = pExpandedKey->lastDecRoundKey; \
262 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
265 c0 = _mm_xor_si128( c0, roundkey ); \
266 c1 = _mm_xor_si128( c1, roundkey ); \
267 c2 = _mm_xor_si128( c2, roundkey ); \
268 c3 = _mm_xor_si128( c3, roundkey ); \
272 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
274 c0 = _mm_aesdec_si128( c0, roundkey ); \
275 c1 = _mm_aesdec_si128( c1, roundkey ); \
276 c2 = _mm_aesdec_si128( c2, roundkey ); \
277 c3 = _mm_aesdec_si128( c3, roundkey ); \
278 } while( keyPtr < keyLimit ); \
280 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
282 c0 = _mm_aesdeclast_si128( c0, roundkey ); \
283 c1 = _mm_aesdeclast_si128( c1, roundkey ); \
284 c2 = _mm_aesdeclast_si128( c2, roundkey ); \
285 c3 = _mm_aesdeclast_si128( c3, roundkey ); \
288#define AES_DECRYPT_8( pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 ) \
290 const BYTE (*keyPtr)[4][4]; \
291 const BYTE (*keyLimit)[4][4]; \
294 keyPtr = pExpandedKey->lastEncRoundKey; \
295 keyLimit = pExpandedKey->lastDecRoundKey; \
297 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
300 c0 = _mm_xor_si128( c0, roundkey ); \
301 c1 = _mm_xor_si128( c1, roundkey ); \
302 c2 = _mm_xor_si128( c2, roundkey ); \
303 c3 = _mm_xor_si128( c3, roundkey ); \
304 c4 = _mm_xor_si128( c4, roundkey ); \
305 c5 = _mm_xor_si128( c5, roundkey ); \
306 c6 = _mm_xor_si128( c6, roundkey ); \
307 c7 = _mm_xor_si128( c7, roundkey ); \
311 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
313 c0 = _mm_aesdec_si128( c0, roundkey ); \
314 c1 = _mm_aesdec_si128( c1, roundkey ); \
315 c2 = _mm_aesdec_si128( c2, roundkey ); \
316 c3 = _mm_aesdec_si128( c3, roundkey ); \
317 c4 = _mm_aesdec_si128( c4, roundkey ); \
318 c5 = _mm_aesdec_si128( c5, roundkey ); \
319 c6 = _mm_aesdec_si128( c6, roundkey ); \
320 c7 = _mm_aesdec_si128( c7, roundkey ); \
321 } while( keyPtr < keyLimit ); \
323 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
325 c0 = _mm_aesdeclast_si128( c0, roundkey ); \
326 c1 = _mm_aesdeclast_si128( c1, roundkey ); \
327 c2 = _mm_aesdeclast_si128( c2, roundkey ); \
328 c3 = _mm_aesdeclast_si128( c3, roundkey ); \
329 c4 = _mm_aesdeclast_si128( c4, roundkey ); \
330 c5 = _mm_aesdeclast_si128( c5, roundkey ); \
331 c6 = _mm_aesdeclast_si128( c6, roundkey ); \
332 c7 = _mm_aesdeclast_si128( c7, roundkey ); \
376#pragma warning( disable: 6001 4701 )
377#pragma runtime_checks( "u", off )
386 __m128i c0, c1, c2, c3, c4, c5, c6, c7;
399 AES_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
448 AES_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
485#pragma runtime_checks( "u", restore )
486#pragma warning( pop )
534#pragma warning( disable: 6001 4701 )
535#pragma runtime_checks( "u", off )
546 __m128i c0, c1, c2, c3, c4, c5, c6, c7;
547 __m128i d0, d1, d2, d3, d4, d5, d6, d7;
571 AES_DECRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
634 AES_DECRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
688#pragma runtime_checks( "u", restore )
689#pragma warning( pop )
702 __m128i
d, rk0AndLast;
734#pragma warning( disable:4701 )
735#pragma runtime_checks( "u", off )
737#define SYMCRYPT_AesCtrMsbXxXmm SymCryptAesCtrMsb64Xmm
738#define MM_ADD_EPIXX _mm_add_epi64
739#define MM_SUB_EPIXX _mm_sub_epi64
745#undef SYMCRYPT_AesCtrMsbXxXmm
747#define SYMCRYPT_AesCtrMsbXxXmm SymCryptAesCtrMsb32Xmm
748#define MM_ADD_EPIXX _mm_add_epi32
749#define MM_SUB_EPIXX _mm_sub_epi32
755#undef SYMCRYPT_AesCtrMsbXxXmm
757#pragma runtime_checks( "u", restore )
795 __m128i c0, c1, c2, c3, c4, c5, c6, c7;
796 __m128i roundkey, firstRoundKey, lastRoundKey;
800 const BYTE (*keyPtr)[4][4];
802 UINT64 lastTweakLow, lastTweakHigh;
803 int aesEncryptXtsLoop;
823 cbDataMain =
cbData - cbDataTail;
839 tweakBuffer[0].m128i = c0;
840 tweakBuffer[1].m128i = c1;
841 tweakBuffer[2].m128i = c2;
842 tweakBuffer[3].m128i = c3;
843 tweakBuffer[4].m128i = c4;
844 tweakBuffer[5].m128i = c5;
845 tweakBuffer[6].m128i = c6;
846 tweakBuffer[7].m128i = c7;
847 lastTweakLow = tweakBuffer[7].ull[0];
848 lastTweakHigh = tweakBuffer[7].ull[1];
853 while( cbDataMain > 0 )
877 for( aesEncryptXtsLoop = 0; aesEncryptXtsLoop < 8; aesEncryptXtsLoop++ )
881 c0 = _mm_aesenc_si128( c0, roundkey );
882 c1 = _mm_aesenc_si128( c1, roundkey );
883 c2 = _mm_aesenc_si128( c2, roundkey );
884 c3 = _mm_aesenc_si128( c3, roundkey );
885 c4 = _mm_aesenc_si128( c4, roundkey );
886 c5 = _mm_aesenc_si128( c5, roundkey );
887 c6 = _mm_aesenc_si128( c6, roundkey );
888 c7 = _mm_aesenc_si128( c7, roundkey );
891 tweakBuffer[ 8+aesEncryptXtsLoop ].m128i =
_mm_xor_si128( tweakBuffer[ aesEncryptXtsLoop ].m128i, lastRoundKey );
894 tweakBuffer[ aesEncryptXtsLoop ].ull[0] = lastTweakLow;
895 tweakBuffer[ aesEncryptXtsLoop ].ull[1] = lastTweakHigh;
902 c0 = _mm_aesenc_si128( c0, roundkey );
903 c1 = _mm_aesenc_si128( c1, roundkey );
904 c2 = _mm_aesenc_si128( c2, roundkey );
905 c3 = _mm_aesenc_si128( c3, roundkey );
906 c4 = _mm_aesenc_si128( c4, roundkey );
907 c5 = _mm_aesenc_si128( c5, roundkey );
908 c6 = _mm_aesenc_si128( c6, roundkey );
909 c7 = _mm_aesenc_si128( c7, roundkey );
910 }
while( keyPtr < keyLimit );
926 if( cbDataTail == 0 )
932 t0 = tweakBuffer[0].m128i;
978 tweakBuffer[1].m128i = tweakBuffer[0].m128i;
988 c0 = tweakBuffer[0].m128i;
1011 __m128i c0, c1, c2, c3, c4, c5, c6, c7;
1012 __m128i roundkey, firstRoundKey, lastRoundKey;
1016 const BYTE (*keyPtr)[4][4];
1018 UINT64 lastTweakLow, lastTweakHigh;
1019 int aesDecryptXtsLoop;
1039 cbDataMain =
cbData - cbDataTail;
1055 tweakBuffer[0].m128i = c0;
1056 tweakBuffer[1].m128i = c1;
1057 tweakBuffer[2].m128i = c2;
1058 tweakBuffer[3].m128i = c3;
1059 tweakBuffer[4].m128i = c4;
1060 tweakBuffer[5].m128i = c5;
1061 tweakBuffer[6].m128i = c6;
1062 tweakBuffer[7].m128i = c7;
1063 lastTweakLow = tweakBuffer[7].ull[0];
1064 lastTweakHigh = tweakBuffer[7].ull[1];
1069 while( cbDataMain > 0 )
1093 for( aesDecryptXtsLoop = 0; aesDecryptXtsLoop < 8; aesDecryptXtsLoop++ )
1097 c0 = _mm_aesdec_si128( c0, roundkey );
1098 c1 = _mm_aesdec_si128( c1, roundkey );
1099 c2 = _mm_aesdec_si128( c2, roundkey );
1100 c3 = _mm_aesdec_si128( c3, roundkey );
1101 c4 = _mm_aesdec_si128( c4, roundkey );
1102 c5 = _mm_aesdec_si128( c5, roundkey );
1103 c6 = _mm_aesdec_si128( c6, roundkey );
1104 c7 = _mm_aesdec_si128( c7, roundkey );
1107 tweakBuffer[ 8+aesDecryptXtsLoop ].m128i =
_mm_xor_si128( tweakBuffer[ aesDecryptXtsLoop ].m128i, lastRoundKey );
1110 tweakBuffer[ aesDecryptXtsLoop ].ull[0] = lastTweakLow;
1111 tweakBuffer[ aesDecryptXtsLoop ].ull[1] = lastTweakHigh;
1118 c0 = _mm_aesdec_si128( c0, roundkey );
1119 c1 = _mm_aesdec_si128( c1, roundkey );
1120 c2 = _mm_aesdec_si128( c2, roundkey );
1121 c3 = _mm_aesdec_si128( c3, roundkey );
1122 c4 = _mm_aesdec_si128( c4, roundkey );
1123 c5 = _mm_aesdec_si128( c5, roundkey );
1124 c6 = _mm_aesdec_si128( c6, roundkey );
1125 c7 = _mm_aesdec_si128( c7, roundkey );
1126 }
while( keyPtr < keyLimit );
1142 if( cbDataTail == 0 )
1148 t0 = tweakBuffer[0].m128i;
1199 tweakBuffer[1].m128i = tweakBuffer[0].m128i;
1206 c0 = tweakBuffer[0].m128i;
1218#define AES_FULLROUND_4_GHASH_1( roundkey, keyPtr, c0, c1, c2, c3, r0, t0, t1, gHashPointer, byteReverseOrder, gHashExpandedKeyTable, todo, resl, resm, resh ) \
1220 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
1222 c0 = _mm_aesenc_si128( c0, roundkey ); \
1223 c1 = _mm_aesenc_si128( c1, roundkey ); \
1224 c2 = _mm_aesenc_si128( c2, roundkey ); \
1225 c3 = _mm_aesenc_si128( c3, roundkey ); \
1227 r0 = _mm_loadu_si128( (__m128i *) gHashPointer ); \
1228 r0 = _mm_shuffle_epi8( r0, byteReverseOrder ); \
1229 gHashPointer += 16; \
1231 t1 = _mm_loadu_si128( (__m128i *) &GHASH_H_POWER(gHashExpandedKeyTable, todo) ); \
1232 t0 = _mm_clmulepi64_si128( r0, t1, 0x00 ); \
1233 t1 = _mm_clmulepi64_si128( r0, t1, 0x11 ); \
1235 resl = _mm_xor_si128( resl, t0 ); \
1236 resh = _mm_xor_si128( resh, t1 ); \
1238 t0 = _mm_srli_si128( r0, 8 ); \
1239 r0 = _mm_xor_si128( r0, t0 ); \
1240 t1 = _mm_loadu_si128( (__m128i *) &GHASH_Hx_POWER(gHashExpandedKeyTable, todo) ); \
1241 t1 = _mm_clmulepi64_si128( r0, t1, 0x00 ); \
1243 resm = _mm_xor_si128( resm, t1 ); \
1247#define AES_GCM_ENCRYPT_4( pExpandedKey, c0, c1, c2, c3, gHashPointer, ghashRounds, byteReverseOrder, gHashExpandedKeyTable, todo, resl, resm, resh ) \
1249 const BYTE (*keyPtr)[4][4]; \
1250 const BYTE (*keyLimit)[4][4]; \
1254 SIZE_T aesEncryptGhashLoop; \
1256 keyPtr = &pExpandedKey->RoundKey[0]; \
1257 keyLimit = pExpandedKey->lastEncRoundKey; \
1259 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
1261 c0 = _mm_xor_si128( c0, roundkey ); \
1262 c1 = _mm_xor_si128( c1, roundkey ); \
1263 c2 = _mm_xor_si128( c2, roundkey ); \
1264 c3 = _mm_xor_si128( c3, roundkey ); \
1267 for( aesEncryptGhashLoop = 0; aesEncryptGhashLoop < ghashRounds; aesEncryptGhashLoop++ ) \
1269 AES_FULLROUND_4_GHASH_1( roundkey, keyPtr, c0, c1, c2, c3, r0, t0, t1, gHashPointer, byteReverseOrder, gHashExpandedKeyTable, todo, resl, resm, resh ); \
1274 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
1276 c0 = _mm_aesenc_si128( c0, roundkey ); \
1277 c1 = _mm_aesenc_si128( c1, roundkey ); \
1278 c2 = _mm_aesenc_si128( c2, roundkey ); \
1279 c3 = _mm_aesenc_si128( c3, roundkey ); \
1280 } while( keyPtr < keyLimit ); \
1282 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
1284 c0 = _mm_aesenclast_si128( c0, roundkey ); \
1285 c1 = _mm_aesenclast_si128( c1, roundkey ); \
1286 c2 = _mm_aesenclast_si128( c2, roundkey ); \
1287 c3 = _mm_aesenclast_si128( c3, roundkey ); \
1290#define AES_FULLROUND_8_GHASH_1( roundkey, keyPtr, c0, c1, c2, c3, c4, c5, c6, c7, r0, t0, t1, gHashPointer, byteReverseOrder, gHashExpandedKeyTable, todo, resl, resm, resh ) \
1292 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
1294 c0 = _mm_aesenc_si128( c0, roundkey ); \
1295 c1 = _mm_aesenc_si128( c1, roundkey ); \
1296 c2 = _mm_aesenc_si128( c2, roundkey ); \
1297 c3 = _mm_aesenc_si128( c3, roundkey ); \
1298 c4 = _mm_aesenc_si128( c4, roundkey ); \
1299 c5 = _mm_aesenc_si128( c5, roundkey ); \
1300 c6 = _mm_aesenc_si128( c6, roundkey ); \
1301 c7 = _mm_aesenc_si128( c7, roundkey ); \
1303 r0 = _mm_loadu_si128( (__m128i *) gHashPointer ); \
1304 r0 = _mm_shuffle_epi8( r0, byteReverseOrder ); \
1305 gHashPointer += 16; \
1307 t1 = _mm_loadu_si128( (__m128i *) &GHASH_H_POWER(gHashExpandedKeyTable, todo) ); \
1308 t0 = _mm_clmulepi64_si128( r0, t1, 0x00 ); \
1309 t1 = _mm_clmulepi64_si128( r0, t1, 0x11 ); \
1311 resl = _mm_xor_si128( resl, t0 ); \
1312 resh = _mm_xor_si128( resh, t1 ); \
1314 t0 = _mm_srli_si128( r0, 8 ); \
1315 r0 = _mm_xor_si128( r0, t0 ); \
1316 t1 = _mm_loadu_si128( (__m128i *) &GHASH_Hx_POWER(gHashExpandedKeyTable, todo) ); \
1317 t1 = _mm_clmulepi64_si128( r0, t1, 0x00 ); \
1319 resm = _mm_xor_si128( resm, t1 ); \
1323#define AES_GCM_ENCRYPT_8( pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7, gHashPointer, ghashRounds, byteReverseOrder, gHashExpandedKeyTable, todo, resl, resm, resh ) \
1325 const BYTE (*keyPtr)[4][4]; \
1326 const BYTE (*keyLimit)[4][4]; \
1330 SIZE_T aesEncryptGhashLoop; \
1332 keyPtr = &pExpandedKey->RoundKey[0]; \
1333 keyLimit = pExpandedKey->lastEncRoundKey; \
1335 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
1337 c0 = _mm_xor_si128( c0, roundkey ); \
1338 c1 = _mm_xor_si128( c1, roundkey ); \
1339 c2 = _mm_xor_si128( c2, roundkey ); \
1340 c3 = _mm_xor_si128( c3, roundkey ); \
1341 c4 = _mm_xor_si128( c4, roundkey ); \
1342 c5 = _mm_xor_si128( c5, roundkey ); \
1343 c6 = _mm_xor_si128( c6, roundkey ); \
1344 c7 = _mm_xor_si128( c7, roundkey ); \
1347 for( aesEncryptGhashLoop = 0; aesEncryptGhashLoop < ghashRounds; aesEncryptGhashLoop++ ) \
1349 AES_FULLROUND_8_GHASH_1( roundkey, keyPtr, c0, c1, c2, c3, c4, c5, c6, c7, r0, t0, t1, gHashPointer, byteReverseOrder, gHashExpandedKeyTable, todo, resl, resm, resh ); \
1354 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
1356 c0 = _mm_aesenc_si128( c0, roundkey ); \
1357 c1 = _mm_aesenc_si128( c1, roundkey ); \
1358 c2 = _mm_aesenc_si128( c2, roundkey ); \
1359 c3 = _mm_aesenc_si128( c3, roundkey ); \
1360 c4 = _mm_aesenc_si128( c4, roundkey ); \
1361 c5 = _mm_aesenc_si128( c5, roundkey ); \
1362 c6 = _mm_aesenc_si128( c6, roundkey ); \
1363 c7 = _mm_aesenc_si128( c7, roundkey ); \
1364 } while( keyPtr < keyLimit ); \
1366 roundkey = _mm_loadu_si128( (__m128i *) keyPtr ); \
1368 c0 = _mm_aesenclast_si128( c0, roundkey ); \
1369 c1 = _mm_aesenclast_si128( c1, roundkey ); \
1370 c2 = _mm_aesenclast_si128( c2, roundkey ); \
1371 c3 = _mm_aesenclast_si128( c3, roundkey ); \
1372 c4 = _mm_aesenclast_si128( c4, roundkey ); \
1373 c5 = _mm_aesenclast_si128( c5, roundkey ); \
1374 c6 = _mm_aesenclast_si128( c6, roundkey ); \
1375 c7 = _mm_aesenclast_si128( c7, roundkey ); \
1402 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
1403 __m128i vMultiplicationConstant =
_mm_set_epi32( 0, 0, 0xc2000000, 0 );
1409 __m128i c0, c1, c2, c3, c4, c5, c6, c7;
1420 chain = _mm_shuffle_epi8(
chain, BYTE_REVERSE_ORDER );
1424 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0,
a1,
a2 );
1436 c0 = _mm_shuffle_epi8( c0, BYTE_REVERSE_ORDER );
1437 c1 = _mm_shuffle_epi8( c1, BYTE_REVERSE_ORDER );
1438 c2 = _mm_shuffle_epi8( c2, BYTE_REVERSE_ORDER );
1439 c3 = _mm_shuffle_epi8( c3, BYTE_REVERSE_ORDER );
1440 c4 = _mm_shuffle_epi8( c4, BYTE_REVERSE_ORDER );
1441 c5 = _mm_shuffle_epi8( c5, BYTE_REVERSE_ORDER );
1442 c6 = _mm_shuffle_epi8( c6, BYTE_REVERSE_ORDER );
1443 c7 = _mm_shuffle_epi8( c7, BYTE_REVERSE_ORDER );
1445 AES_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
1464 while( nBlocks >= 16 )
1477 c0 = _mm_shuffle_epi8( c0, BYTE_REVERSE_ORDER );
1478 c1 = _mm_shuffle_epi8( c1, BYTE_REVERSE_ORDER );
1479 c2 = _mm_shuffle_epi8( c2, BYTE_REVERSE_ORDER );
1480 c3 = _mm_shuffle_epi8( c3, BYTE_REVERSE_ORDER );
1481 c4 = _mm_shuffle_epi8( c4, BYTE_REVERSE_ORDER );
1482 c5 = _mm_shuffle_epi8( c5, BYTE_REVERSE_ORDER );
1483 c6 = _mm_shuffle_epi8( c6, BYTE_REVERSE_ORDER );
1484 c7 = _mm_shuffle_epi8( c7, BYTE_REVERSE_ORDER );
1486 AES_GCM_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7, pbGhashSrc, 8, BYTE_REVERSE_ORDER, expandedKeyTable,
todo, a0,
a1,
a2 );
1503 CLMUL_3_POST( a0,
a1,
a2 );
1504 MODREDUCE( vMultiplicationConstant, a0,
a1,
a2,
state );
1507 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0,
a1,
a2 );
1522 c0 = _mm_shuffle_epi8( c0, BYTE_REVERSE_ORDER );
1523 c1 = _mm_shuffle_epi8( c1, BYTE_REVERSE_ORDER );
1524 c2 = _mm_shuffle_epi8( c2, BYTE_REVERSE_ORDER );
1525 c3 = _mm_shuffle_epi8( c3, BYTE_REVERSE_ORDER );
1533 c4 = _mm_shuffle_epi8( c4, BYTE_REVERSE_ORDER );
1534 c5 = _mm_shuffle_epi8( c5, BYTE_REVERSE_ORDER );
1535 c6 = _mm_shuffle_epi8( c6, BYTE_REVERSE_ORDER );
1537 AES_GCM_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7, pbGhashSrc, 8, BYTE_REVERSE_ORDER, expandedKeyTable,
todo, a0,
a1,
a2 );
1542 AES_GCM_ENCRYPT_4(
pExpandedKey, c0, c1, c2, c3, pbGhashSrc, 8, BYTE_REVERSE_ORDER, expandedKeyTable,
todo, a0,
a1,
a2 );
1547 CLMUL_3_POST( a0,
a1,
a2 );
1548 MODREDUCE( vMultiplicationConstant, a0,
a1,
a2,
state );
1551 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0,
a1,
a2 );
1559 r0 = _mm_shuffle_epi8(
_mm_loadu_si128( (__m128i *) (pbGhashSrc + 0) ), BYTE_REVERSE_ORDER );
1562 CLMUL_ACC_3( r0, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0,
a1,
a2 );
1565 CLMUL_3_POST( a0,
a1,
a2 );
1566 MODREDUCE( vMultiplicationConstant, a0,
a1,
a2,
state );
1573 while( nBlocks >= 2 )
1583 r0 = _mm_shuffle_epi8( r0, BYTE_REVERSE_ORDER );
1584 r1 = _mm_shuffle_epi8(
r1, BYTE_REVERSE_ORDER );
1586 CLMUL_ACC_3( r0, GHASH_H_POWER(expandedKeyTable,
todo - 0), GHASH_Hx_POWER(expandedKeyTable,
todo - 0), a0,
a1,
a2 );
1587 CLMUL_ACC_3(
r1, GHASH_H_POWER(expandedKeyTable,
todo - 1), GHASH_Hx_POWER(expandedKeyTable,
todo - 1), a0,
a1,
a2 );
1608 r0 = _mm_shuffle_epi8( r0, BYTE_REVERSE_ORDER );
1610 CLMUL_ACC_3( r0, GHASH_H_POWER(expandedKeyTable, 1), GHASH_Hx_POWER(expandedKeyTable, 1), a0,
a1,
a2 );
1613 CLMUL_3_POST( a0,
a1,
a2 );
1614 MODREDUCE( vMultiplicationConstant, a0,
a1,
a2,
state );
1617 chain = _mm_shuffle_epi8(
chain, BYTE_REVERSE_ORDER );
1622#pragma warning(push)
1623#pragma warning( disable:4701 )
1624#pragma runtime_checks( "u", off )
1649 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
1650 __m128i vMultiplicationConstant =
_mm_set_epi32( 0, 0, 0xc2000000, 0 );
1655 __m128i c0, c1, c2, c3, c4, c5, c6, c7;
1665 chain = _mm_shuffle_epi8(
chain, BYTE_REVERSE_ORDER );
1669 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0,
a1,
a2 );
1671 while( nBlocks >= 8 )
1684 c0 = _mm_shuffle_epi8( c0, BYTE_REVERSE_ORDER );
1685 c1 = _mm_shuffle_epi8( c1, BYTE_REVERSE_ORDER );
1686 c2 = _mm_shuffle_epi8( c2, BYTE_REVERSE_ORDER );
1687 c3 = _mm_shuffle_epi8( c3, BYTE_REVERSE_ORDER );
1688 c4 = _mm_shuffle_epi8( c4, BYTE_REVERSE_ORDER );
1689 c5 = _mm_shuffle_epi8( c5, BYTE_REVERSE_ORDER );
1690 c6 = _mm_shuffle_epi8( c6, BYTE_REVERSE_ORDER );
1691 c7 = _mm_shuffle_epi8( c7, BYTE_REVERSE_ORDER );
1693 AES_GCM_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7, pbGhashSrc, 8, BYTE_REVERSE_ORDER, expandedKeyTable,
todo, a0,
a1,
a2 );
1710 CLMUL_3_POST( a0,
a1,
a2 );
1711 MODREDUCE( vMultiplicationConstant, a0,
a1,
a2,
state );
1716 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0,
a1,
a2 );
1731 c0 = _mm_shuffle_epi8( c0, BYTE_REVERSE_ORDER );
1732 c1 = _mm_shuffle_epi8( c1, BYTE_REVERSE_ORDER );
1733 c2 = _mm_shuffle_epi8( c2, BYTE_REVERSE_ORDER );
1734 c3 = _mm_shuffle_epi8( c3, BYTE_REVERSE_ORDER );
1741 c4 = _mm_shuffle_epi8( c4, BYTE_REVERSE_ORDER );
1742 c5 = _mm_shuffle_epi8( c5, BYTE_REVERSE_ORDER );
1743 c6 = _mm_shuffle_epi8( c6, BYTE_REVERSE_ORDER );
1745 AES_GCM_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7, pbGhashSrc, nBlocks, BYTE_REVERSE_ORDER, expandedKeyTable,
todo, a0,
a1,
a2 );
1747 AES_GCM_ENCRYPT_4(
pExpandedKey, c0, c1, c2, c3, pbGhashSrc, nBlocks, BYTE_REVERSE_ORDER, expandedKeyTable,
todo, a0,
a1,
a2 );
1750 CLMUL_3_POST( a0,
a1,
a2 );
1751 MODREDUCE( vMultiplicationConstant, a0,
a1,
a2,
state );
1754 while( nBlocks >= 2 )
1779 chain = _mm_shuffle_epi8(
chain, BYTE_REVERSE_ORDER );
1783#pragma runtime_checks( "u", restore )
1787#pragma clang attribute pop
1789#pragma GCC pop_options
COMPILER_DEPENDENT_UINT64 UINT64
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)
__m128 _mm_castsi128_ps(__m128i a)
__m128i _mm_add_epi32(__m128i a, __m128i b)
__m128i _mm_loadu_si128(__m128i_u const *p)
__m128i _mm_set1_epi32(int i)
GLint GLint GLint GLint GLint x
#define memcpy(s1, s2, n)
static const struct update_accum a1
static const struct update_accum a2
#define _Inout_updates_(s)
VOID SYMCRYPT_CALL SymCryptAesCbcDecryptXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesCbcMacXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _In_reads_(cbData) PCBYTE pbData, SIZE_T cbData)
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 SymCryptAesCbcEncryptXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbChainingValue, _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 SymCryptAesEcbEncryptXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAes4SboxXmm(_In_reads_(4) PCBYTE pIn, _Out_writes_(4) PBYTE pOut)
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 SymCryptAesEncryptXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyXmm(_In_reads_(16) PCBYTE pEncryptionRoundKey, _Out_writes_(16) PBYTE pDecryptionRoundKey)
VOID SYMCRYPT_CALL SymCryptAesDecryptXmm(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(SYMCRYPT_AES_BLOCK_SIZE) PCBYTE pbSrc, _Out_writes_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbDst)
#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
void _mm_store_ss(float *p, __m128 a)
#define XTS_MUL_ALPHA(_in, _res)
#define XTS_MUL_ALPHA_Scalar(_inout_low_u64, _inout_high_u64)
#define XTS_MUL_ALPHA4(_in, _res)