13#pragma clang attribute push (__attribute__((target("aes"))), apply_to=function)
15#define vzeroq() vdupq_n_u64(0)
39 x = vdupq_n_u32( *(
unsigned int *) pIn );
40 x = vaeseq_u8(
x, vzeroq() );
41 vst1q_lane_s32( pOut,
x, 0 );
52 *(__n128 *) pDecryptionRoundKey = vaesimcq_u8( *(__n128 *)pEncryptionRoundKey );
59#define AESE_AESMC( c, rk ) \
61 c = vaeseq_u8( c, rk ); \
62 c = vaesmcq_u8( c ); \
69#define AESD_AESIMC( c, rk ) \
71 c = vaesdq_u8( c, rk ); \
72 c = vaesimcq_u8( c ); \
84#define UNROLL_AES_ROUNDS_FIRST( first_round, full_round, final_round, c0, c1, c2, c3, c4, c5, c6, c7 ) \
87 roundKey = *keyPtr++; \
88 first_round( c0, c1, c2, c3, c4, c5, c6, c7 ) \
89 roundKey = *keyPtr++; \
90 full_round( c0, c1, c2, c3, c4, c5, c6, c7 ) \
91 roundKey = *keyPtr++; \
92 full_round( c0, c1, c2, c3, c4, c5, c6, c7 ) \
93 roundKey = *keyPtr++; \
94 full_round( c0, c1, c2, c3, c4, c5, c6, c7 ) \
95 roundKey = *keyPtr++; \
96 full_round( c0, c1, c2, c3, c4, c5, c6, c7 ) \
97 roundKey = *keyPtr++; \
98 full_round( c0, c1, c2, c3, c4, c5, c6, c7 ) \
99 roundKey = *keyPtr++; \
100 full_round( c0, c1, c2, c3, c4, c5, c6, c7 ) \
101 roundKey = *keyPtr++; \
102 full_round( c0, c1, c2, c3, c4, c5, c6, c7 ) \
103 roundKey = *keyPtr++; \
104 full_round( c0, c1, c2, c3, c4, c5, c6, c7 ) \
105 roundKey = *keyPtr++; \
107 if ( keyPtr < keyLimit ) \
110 full_round( c0, c1, c2, c3, c4, c5, c6, c7 ) \
111 roundKey = *keyPtr++; \
112 full_round( c0, c1, c2, c3, c4, c5, c6, c7 ) \
113 roundKey = *keyPtr++; \
115 if ( keyPtr < keyLimit ) \
118 full_round( c0, c1, c2, c3, c4, c5, c6, c7 ) \
119 roundKey = *keyPtr++; \
120 full_round( c0, c1, c2, c3, c4, c5, c6, c7 ) \
121 roundKey = *keyPtr++; \
126 final_round( c0, c1, c2, c3, c4, c5, c6, c7 ) \
130#define UNROLL_AES_ROUNDS( full_round, final_round, c0, c1, c2, c3, c4, c5, c6, c7 ) \
131 UNROLL_AES_ROUNDS_FIRST( full_round, full_round, final_round, c0, c1, c2, c3, c4, c5, c6, c7 )
133#define AES_ENCRYPT_ROUND_1( c0, c1, c2, c3, c4, c5, c6, c7 ) \
135 AESE_AESMC( c0, roundKey ) \
137#define AES_ENCRYPT_FINAL_1( c0, c1, c2, c3, c4, c5, c6, c7 ) \
139 c0 = vaeseq_u8( c0, roundKey ); \
140 roundKey = *keyPtr; \
141 c0 = veorq_u8( c0, roundKey ); \
144#define AES_ENCRYPT_1( pExpandedKey, c0 ) \
146 const __n128 *keyPtr; \
147 const __n128 *keyLimit; \
150 keyPtr = (const __n128 *)&pExpandedKey->RoundKey[0]; \
151 keyLimit = (const __n128 *)pExpandedKey->lastEncRoundKey; \
154 AES_ENCRYPT_ROUND_1, \
155 AES_ENCRYPT_FINAL_1, \
156 c0, c1, c2, c3, c4, c5, c6, c7 \
165#define AES_ENCRYPT_CHAIN_FIRST_1( c0, mergedFirstRoundKey, c2, c3, c4, c5, c6, c7 ) \
167 AESE_AESMC( c0, mergedFirstRoundKey ) \
169#define AES_ENCRYPT_CHAIN_FINAL_1( c0, c1, c2, c3, c4, c5, c6, c7 ) \
171 c0 = vaeseq_u8( c0, roundKey ); \
174#define AES_ENCRYPT_1_CHAIN( pExpandedKey, c0, mergedFirstRoundKey ) \
176 const __n128 *keyPtr; \
177 const __n128 *keyLimit; \
180 keyPtr = (const __n128 *)&pExpandedKey->RoundKey[0]; \
181 keyLimit = (const __n128 *)pExpandedKey->lastEncRoundKey; \
183 UNROLL_AES_ROUNDS_FIRST( \
184 AES_ENCRYPT_CHAIN_FIRST_1, \
185 AES_ENCRYPT_ROUND_1, \
186 AES_ENCRYPT_CHAIN_FINAL_1, \
187 c0, mergedFirstRoundKey, c2, c3, c4, c5, c6, c7 \
191#define AES_ENCRYPT_ROUND_4( c0, c1, c2, c3, c4, c5, c6, c7 ) \
193 AESE_AESMC( c0, roundKey ) \
194 AESE_AESMC( c1, roundKey ) \
195 AESE_AESMC( c2, roundKey ) \
196 AESE_AESMC( c3, roundKey ) \
198#define AES_ENCRYPT_FINAL_4( c0, c1, c2, c3, c4, c5, c6, c7 ) \
200 c0 = vaeseq_u8( c0, roundKey ); \
201 c1 = vaeseq_u8( c1, roundKey ); \
202 c2 = vaeseq_u8( c2, roundKey ); \
203 c3 = vaeseq_u8( c3, roundKey ); \
204 roundKey = *keyPtr; \
205 c0 = veorq_u8( c0, roundKey ); \
206 c1 = veorq_u8( c1, roundKey ); \
207 c2 = veorq_u8( c2, roundKey ); \
208 c3 = veorq_u8( c3, roundKey ); \
211#define AES_ENCRYPT_4( pExpandedKey, c0, c1, c2, c3 ) \
213 const __n128 *keyPtr; \
214 const __n128 *keyLimit; \
217 keyPtr = (const __n128 *)&pExpandedKey->RoundKey[0]; \
218 keyLimit = (const __n128 *)pExpandedKey->lastEncRoundKey; \
221 AES_ENCRYPT_ROUND_4, \
222 AES_ENCRYPT_FINAL_4, \
223 c0, c1, c2, c3, c4, c5, c6, c7 \
227#define AES_ENCRYPT_ROUND_8( c0, c1, c2, c3, c4, c5, c6, c7 ) \
229 AESE_AESMC( c0, roundKey ) \
230 AESE_AESMC( c1, roundKey ) \
231 AESE_AESMC( c2, roundKey ) \
232 AESE_AESMC( c3, roundKey ) \
233 AESE_AESMC( c4, roundKey ) \
234 AESE_AESMC( c5, roundKey ) \
235 AESE_AESMC( c6, roundKey ) \
236 AESE_AESMC( c7, roundKey ) \
238#define AES_ENCRYPT_FINAL_8( c0, c1, c2, c3, c4, c5, c6, c7 ) \
240 c0 = vaeseq_u8( c0, roundKey ); \
241 c1 = vaeseq_u8( c1, roundKey ); \
242 c2 = vaeseq_u8( c2, roundKey ); \
243 c3 = vaeseq_u8( c3, roundKey ); \
244 c4 = vaeseq_u8( c4, roundKey ); \
245 c5 = vaeseq_u8( c5, roundKey ); \
246 c6 = vaeseq_u8( c6, roundKey ); \
247 c7 = vaeseq_u8( c7, roundKey ); \
248 roundKey = *keyPtr; \
249 c0 = veorq_u8( c0, roundKey ); \
250 c1 = veorq_u8( c1, roundKey ); \
251 c2 = veorq_u8( c2, roundKey ); \
252 c3 = veorq_u8( c3, roundKey ); \
253 c4 = veorq_u8( c4, roundKey ); \
254 c5 = veorq_u8( c5, roundKey ); \
255 c6 = veorq_u8( c6, roundKey ); \
256 c7 = veorq_u8( c7, roundKey ); \
259#define AES_ENCRYPT_8( pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 ) \
261 const __n128 *keyPtr; \
262 const __n128 *keyLimit; \
265 keyPtr = (const __n128 *)&pExpandedKey->RoundKey[0]; \
266 keyLimit = (const __n128 *)pExpandedKey->lastEncRoundKey; \
269 AES_ENCRYPT_ROUND_8, \
270 AES_ENCRYPT_FINAL_8, \
271 c0, c1, c2, c3, c4, c5, c6, c7 \
275#define AES_DECRYPT_ROUND_1( c0, c1, c2, c3, c4, c5, c6, c7 ) \
277 AESD_AESIMC( c0, roundKey ) \
279#define AES_DECRYPT_FINAL_1( c0, c1, c2, c3, c4, c5, c6, c7 ) \
281 c0 = vaesdq_u8( c0, roundKey ); \
282 roundKey = *keyPtr; \
283 c0 = veorq_u8( c0, roundKey ); \
286#define AES_DECRYPT_1( pExpandedKey, c0 ) \
288 const __n128 *keyPtr; \
289 const __n128 *keyLimit; \
292 keyPtr = (const __n128 *)pExpandedKey->lastEncRoundKey; \
293 keyLimit = (const __n128 *)pExpandedKey->lastDecRoundKey; \
296 AES_DECRYPT_ROUND_1, \
297 AES_DECRYPT_FINAL_1, \
298 c0, c1, c2, c3, c4, c5, c6, c7 \
302#define AES_DECRYPT_ROUND_4( c0, c1, c2, c3, c4, c5, c6, c7 ) \
304 AESD_AESIMC( c0, roundKey ) \
305 AESD_AESIMC( c1, roundKey ) \
306 AESD_AESIMC( c2, roundKey ) \
307 AESD_AESIMC( c3, roundKey ) \
309#define AES_DECRYPT_FINAL_4( c0, c1, c2, c3, c4, c5, c6, c7 ) \
311 c0 = vaesdq_u8( c0, roundKey ); \
312 c1 = vaesdq_u8( c1, roundKey ); \
313 c2 = vaesdq_u8( c2, roundKey ); \
314 c3 = vaesdq_u8( c3, roundKey ); \
315 roundKey = *keyPtr; \
316 c0 = veorq_u8( c0, roundKey ); \
317 c1 = veorq_u8( c1, roundKey ); \
318 c2 = veorq_u8( c2, roundKey ); \
319 c3 = veorq_u8( c3, roundKey ); \
322#define AES_DECRYPT_4( pExpandedKey, c0, c1, c2, c3 ) \
324 const __n128 *keyPtr; \
325 const __n128 *keyLimit; \
328 keyPtr = (const __n128 *)pExpandedKey->lastEncRoundKey; \
329 keyLimit = (const __n128 *)pExpandedKey->lastDecRoundKey; \
332 AES_DECRYPT_ROUND_4, \
333 AES_DECRYPT_FINAL_4, \
334 c0, c1, c2, c3, c4, c5, c6, c7 \
338#define AES_DECRYPT_ROUND_8( c0, c1, c2, c3, c4, c5, c6, c7 ) \
340 AESD_AESIMC( c0, roundKey ) \
341 AESD_AESIMC( c1, roundKey ) \
342 AESD_AESIMC( c2, roundKey ) \
343 AESD_AESIMC( c3, roundKey ) \
344 AESD_AESIMC( c4, roundKey ) \
345 AESD_AESIMC( c5, roundKey ) \
346 AESD_AESIMC( c6, roundKey ) \
347 AESD_AESIMC( c7, roundKey ) \
349#define AES_DECRYPT_FINAL_8( c0, c1, c2, c3, c4, c5, c6, c7 ) \
351 c0 = vaesdq_u8( c0, roundKey ); \
352 c1 = vaesdq_u8( c1, roundKey ); \
353 c2 = vaesdq_u8( c2, roundKey ); \
354 c3 = vaesdq_u8( c3, roundKey ); \
355 c4 = vaesdq_u8( c4, roundKey ); \
356 c5 = vaesdq_u8( c5, roundKey ); \
357 c6 = vaesdq_u8( c6, roundKey ); \
358 c7 = vaesdq_u8( c7, roundKey ); \
359 roundKey = *keyPtr; \
360 c0 = veorq_u8( c0, roundKey ); \
361 c1 = veorq_u8( c1, roundKey ); \
362 c2 = veorq_u8( c2, roundKey ); \
363 c3 = veorq_u8( c3, roundKey ); \
364 c4 = veorq_u8( c4, roundKey ); \
365 c5 = veorq_u8( c5, roundKey ); \
366 c6 = veorq_u8( c6, roundKey ); \
367 c7 = veorq_u8( c7, roundKey ); \
370#define AES_DECRYPT_8( pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 ) \
372 const __n128 *keyPtr; \
373 const __n128 *keyLimit; \
376 keyPtr = (const __n128 *)pExpandedKey->lastEncRoundKey; \
377 keyLimit = (const __n128 *)pExpandedKey->lastDecRoundKey; \
380 AES_DECRYPT_ROUND_8, \
381 AES_DECRYPT_FINAL_8, \
382 c0, c1, c2, c3, c4, c5, c6, c7 \
432 __n128 rkLast = *(__n128 *)
pExpandedKey->lastEncRoundKey;
433 __n128
d, rk0AndLast;
440 rk0AndLast = veorq_u8( rk0, rkLast );
442 c = veorq_u8(
c, rkLast );
446 d = veorq_u8( *(__n128 *)
pbSrc, rk0AndLast);
448 *(__n128 *)
pbDst = veorq_u8(
c, rkLast );
459#pragma warning( disable: 6001 4701 )
460#pragma runtime_checks( "u", off )
471 __n128 c0, c1, c2, c3, c4, c5, c6, c7;
472 __n128 d0, d1, d2, d3, d4, d5, d6, d7;
473 const __n128 * pSrc = (
const __n128 *)
pbSrc;
474 __n128 * pDst = (__n128 *)
pbDst;
499 AES_DECRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
501 c0 = veorq_u8( c0,
chain );
502 c1 = veorq_u8( c1, d0 );
503 c2 = veorq_u8( c2, d1 );
504 c3 = veorq_u8( c3, d2 );
505 c4 = veorq_u8( c4, d3 );
506 c5 = veorq_u8( c5, d4 );
507 c6 = veorq_u8( c6, d5 );
508 c7 = veorq_u8( c7, d6 );
562 AES_DECRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
563 c0 = veorq_u8( c0,
chain );
564 c1 = veorq_u8( c1, d0 );
565 c2 = veorq_u8( c2, d1 );
566 c3 = veorq_u8( c3, d2 );
567 c4 = veorq_u8( c4, d3 );
568 c5 = veorq_u8( c5, d4 );
569 c6 = veorq_u8( c6, d5 );
574 c0 = veorq_u8( c0,
chain );
575 c1 = veorq_u8( c1, d0 );
576 c2 = veorq_u8( c2, d1 );
577 c3 = veorq_u8( c3, d2 );
581 c0 = veorq_u8( c0,
chain );
584 chain = pSrc[ cData - 1];
616#pragma runtime_checks( "u", restore )
617#pragma warning( pop )
631 __n128 rkLast = *(__n128 *)
pExpandedKey->lastEncRoundKey;
632 __n128
d, rk0AndLast;
639 rk0AndLast = veorq_u8( rk0, rkLast );
641 c = veorq_u8(
c, rkLast );
645 d = veorq_u8( *(__n128 *)
pbData, rk0AndLast);
656#pragma warning( disable: 6001 4701 )
657#pragma runtime_checks( "u", off )
666 __n128 c0, c1, c2, c3, c4, c5, c6, c7;
667 const __n128 * pSrc = (
const __n128 *)
pbSrc;
668 __n128 * pDst = (__n128 *)
pbDst;
681 AES_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
730 AES_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
767#pragma runtime_checks( "u", restore)
768#pragma warning( pop )
771#pragma warning( disable:4701 )
772#pragma runtime_checks( "u", off )
774#define SYMCRYPT_AesCtrMsbXxNeon SymCryptAesCtrMsb64Neon
775#define VADDQ_UXX vaddq_u64
776#define VSUBQ_UXX vsubq_u64
782#undef SYMCRYPT_AesCtrMsbXxNeon
784#define SYMCRYPT_AesCtrMsbXxNeon SymCryptAesCtrMsb32Neon
785#define VADDQ_UXX vaddq_u32
786#define VSUBQ_UXX vsubq_u32
792#undef SYMCRYPT_AesCtrMsbXxNeon
794#pragma runtime_checks( "u", restore )
813#define XTS_MUL_ALPHA_old( _in, _res ) \
817 _t1 = vshlq_n_u32( _in, 1 ); \
818 _t2 = vshrq_n_u32( _in, 31); \
819 _t1 = veorq_u32( _t1, vextq_u32( vZero, _t2, 3 )); \
820 _t2 = vextq_u32( _t2, vZero, 3); \
821 _t2 = vsubq_u32( vaddq_u32( vshlq_n_u32( _t2, 7 ), vshlq_n_u32( _t2, 3 ) ), _t2 ); \
822 _res = veorq_u32( _t1, _t2 ); \
830#define XTS_MUL_ALPHA( _in, _res ) \
834 _t1 = vshlq_n_u8( _in, 1 ); \
835 _t2 = vshrq_n_s8( _in, 7 ); \
836 _t2 = vextq_u8( _t2, _t2, 15 ); \
837 _t2 = vandq_u8( _t2, vAlphaMask ); \
838 _res = veorq_u8( _t2, _t1 ); \
849#define XTS_MUL_ALPHA2( _in, _res ) \
853 _t1 = vshlq_n_u32( _in, 2 ); \
854 _t2 = vshrq_n_u32( _in, 30); \
855 _t1 = veorq_u32( _t1, vextq_u32( vZero, _t2, 3 )); \
856 _t2 = vextq_u32( _t2, vZero, 3 ); \
857 _t2 = veorq_u32( veorq_u32( veorq_u32( _t2, vshlq_n_u32( _t2, 7 )), vshlq_n_u32( _t2, 2 ) ), vshlq_n_u32( _t2, 1 ) ); \
858 _res = veorq_u32( _t1, _t2 ); \
868#define XTS_MUL_ALPHA4( _in, _res ) \
872 _t1 = vshlq_n_u32( _in, 4 ); \
873 _t2 = vshrq_n_u32( _in, 28); \
874 _t1 = veorq_u32( _t1, vextq_u32( vZero, _t2, 3 )); \
875 _t2 = vextq_u32( _t2, vZero, 3 ); \
876 _t2 = veorq_u32( veorq_u32( veorq_u32( _t2, vshlq_n_u32( _t2, 7 )), vshlq_n_u32( _t2, 2 ) ), vshlq_n_u32( _t2, 1 ) ); \
877 _res = veorq_u32( _t1, _t2 ); \
880#define XTS_MUL_ALPHA5( _in, _res ) \
884 _t1 = vshlq_n_u32( _in, 5 ); \
885 _t2 = vshrq_n_u32( _in, 27); \
886 _t1 = veorq_u32( _t1, vextq_u32( vZero, _t2, 3 )); \
887 _t2 = vextq_u32( _t2, vZero, 3 ); \
888 _t2 = veorq_u32( veorq_u32( veorq_u32( _t2, vshlq_n_u32( _t2, 7 )), vshlq_n_u32( _t2, 2 ) ), vshlq_n_u32( _t2, 1 ) ); \
889 _res = veorq_u32( _t1, _t2 ); \
901#define XTS_MUL_ALPHA8( _in, _res ) \
905 _res = vextq_u8( _in, _in, 15 ); \
906 _t2 = vmull_p8( vget_low_p8(_res), vAlphaMultiplier ); \
907 _res = veorq_u32( _res, _t2 ); \
920 __n128 t0, t1, t2, t3, t4, t5, t6, t7;
921 __n128 c0, c1, c2, c3, c4, c5, c6, c7;
922 const __n128 vZero = vmovq_n_u8(0);
923 const __n128 vAlphaMask = SYMCRYPT_SET_N128_U8(0x87, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
924 const __n64 vAlphaMultiplier = SYMCRYPT_SET_N64_U64(0x0000000000000086);
945 cbDataMain =
cbData - cbDataTail;
951 t0 = *(__n128 *)pbTweakBlock;
968 c0 = veorq_u32( vld1q_u8(
pbSrc + (0*16) ), t0 );
969 c1 = veorq_u32( vld1q_u8(
pbSrc + (1*16) ), t1 );
970 c2 = veorq_u32( vld1q_u8(
pbSrc + (2*16) ), t2 );
971 c3 = veorq_u32( vld1q_u8(
pbSrc + (3*16) ), t3 );
972 c4 = veorq_u32( vld1q_u8(
pbSrc + (4*16) ), t4 );
973 c5 = veorq_u32( vld1q_u8(
pbSrc + (5*16) ), t5 );
974 c6 = veorq_u32( vld1q_u8(
pbSrc + (6*16) ), t6 );
975 c7 = veorq_u32( vld1q_u8(
pbSrc + (7*16) ), t7 );
981 AES_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
991 vst1q_u8(
pbDst + (0*16), veorq_u32( c0, t0 ) );
992 vst1q_u8(
pbDst + (1*16), veorq_u32( c1, t1 ) );
993 vst1q_u8(
pbDst + (2*16), veorq_u32( c2, t2 ) );
994 vst1q_u8(
pbDst + (3*16), veorq_u32( c3, t3 ) );
995 vst1q_u8(
pbDst + (4*16), veorq_u32( c4, t4 ) );
996 vst1q_u8(
pbDst + (5*16), veorq_u32( c5, t5 ) );
997 vst1q_u8(
pbDst + (6*16), veorq_u32( c6, t6 ) );
998 vst1q_u8(
pbDst + (7*16), veorq_u32( c7, t7 ) );
1000 XTS_MUL_ALPHA8( t0, t0 );
1001 XTS_MUL_ALPHA8( t1, t1 );
1002 XTS_MUL_ALPHA8( t2, t2 );
1003 XTS_MUL_ALPHA8( t3, t3 );
1004 XTS_MUL_ALPHA8( t4, t4 );
1005 XTS_MUL_ALPHA8( t5, t5 );
1006 XTS_MUL_ALPHA8( t6, t6 );
1007 XTS_MUL_ALPHA8( t7, t7 );
1009 c0 = veorq_u32( vld1q_u8(
pbSrc + (0*16) ), t0 );
1010 c1 = veorq_u32( vld1q_u8(
pbSrc + (1*16) ), t1 );
1011 c2 = veorq_u32( vld1q_u8(
pbSrc + (2*16) ), t2 );
1012 c3 = veorq_u32( vld1q_u8(
pbSrc + (3*16) ), t3 );
1013 c4 = veorq_u32( vld1q_u8(
pbSrc + (4*16) ), t4 );
1014 c5 = veorq_u32( vld1q_u8(
pbSrc + (5*16) ), t5 );
1015 c6 = veorq_u32( vld1q_u8(
pbSrc + (6*16) ), t6 );
1016 c7 = veorq_u32( vld1q_u8(
pbSrc + (7*16) ), t7 );
1021 vst1q_u8(
pbDst + (0*16), veorq_u32( c0, t0 ) );
1022 vst1q_u8(
pbDst + (1*16), veorq_u32( c1, t1 ) );
1023 vst1q_u8(
pbDst + (2*16), veorq_u32( c2, t2 ) );
1024 vst1q_u8(
pbDst + (3*16), veorq_u32( c3, t3 ) );
1025 vst1q_u8(
pbDst + (4*16), veorq_u32( c4, t4 ) );
1026 vst1q_u8(
pbDst + (5*16), veorq_u32( c5, t5 ) );
1027 vst1q_u8(
pbDst + (6*16), veorq_u32( c6, t6 ) );
1028 vst1q_u8(
pbDst + (7*16), veorq_u32( c7, t7 ) );
1032 XTS_MUL_ALPHA8( t0, t0 );
1037 if( cbDataTail == 0 )
1045 c0 = veorq_u32( vld1q_u8(
pbSrc), t0 );
1048 vst1q_u8(
pbDst, veorq_u32( c0, t0 ) );
1080 c0 = veorq_u32( vld1q_u8(
pbSrc), t0 );
1082 c0 = veorq_u32( c0, t0 );
1083 vst1q_u8( &tailBuf[0], c0 );
1097 c0 = vld1q_u8( &tailBuf[0] );
1100 c0 = vld1q_u8(
pbSrc );
1104 c0 = veorq_u32( c0, t0 );
1106 vst1q_u8(
pbDst, veorq_u32( c0, t0 ) );
1119 __n128 t0, t1, t2, t3, t4, t5, t6, t7;
1120 __n128 c0, c1, c2, c3, c4, c5, c6, c7;
1121 const __n128 vZero = vmovq_n_u8(0);
1122 const __n128 vAlphaMask = SYMCRYPT_SET_N128_U8(0x87, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
1123 const __n64 vAlphaMultiplier = SYMCRYPT_SET_N64_U64(0x0000000000000086);
1144 cbDataMain =
cbData - cbDataTail;
1150 t0 = *(__n128 *)pbTweakBlock;
1153 if( cbDataMain > 0 )
1168 c0 = veorq_u32( vld1q_u8(
pbSrc + (0*16) ), t0 );
1169 c1 = veorq_u32( vld1q_u8(
pbSrc + (1*16) ), t1 );
1170 c2 = veorq_u32( vld1q_u8(
pbSrc + (2*16) ), t2 );
1171 c3 = veorq_u32( vld1q_u8(
pbSrc + (3*16) ), t3 );
1172 c4 = veorq_u32( vld1q_u8(
pbSrc + (4*16) ), t4 );
1173 c5 = veorq_u32( vld1q_u8(
pbSrc + (5*16) ), t5 );
1174 c6 = veorq_u32( vld1q_u8(
pbSrc + (6*16) ), t6 );
1175 c7 = veorq_u32( vld1q_u8(
pbSrc + (7*16) ), t7 );
1181 AES_DECRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
1191 vst1q_u8(
pbDst + (0*16), veorq_u32( c0, t0 ) );
1192 vst1q_u8(
pbDst + (1*16), veorq_u32( c1, t1 ) );
1193 vst1q_u8(
pbDst + (2*16), veorq_u32( c2, t2 ) );
1194 vst1q_u8(
pbDst + (3*16), veorq_u32( c3, t3 ) );
1195 vst1q_u8(
pbDst + (4*16), veorq_u32( c4, t4 ) );
1196 vst1q_u8(
pbDst + (5*16), veorq_u32( c5, t5 ) );
1197 vst1q_u8(
pbDst + (6*16), veorq_u32( c6, t6 ) );
1198 vst1q_u8(
pbDst + (7*16), veorq_u32( c7, t7 ) );
1200 XTS_MUL_ALPHA8( t0, t0 );
1201 XTS_MUL_ALPHA8( t1, t1 );
1202 XTS_MUL_ALPHA8( t2, t2 );
1203 XTS_MUL_ALPHA8( t3, t3 );
1204 XTS_MUL_ALPHA8( t4, t4 );
1205 XTS_MUL_ALPHA8( t5, t5 );
1206 XTS_MUL_ALPHA8( t6, t6 );
1207 XTS_MUL_ALPHA8( t7, t7 );
1209 c0 = veorq_u32( vld1q_u8(
pbSrc + (0*16) ), t0 );
1210 c1 = veorq_u32( vld1q_u8(
pbSrc + (1*16) ), t1 );
1211 c2 = veorq_u32( vld1q_u8(
pbSrc + (2*16) ), t2 );
1212 c3 = veorq_u32( vld1q_u8(
pbSrc + (3*16) ), t3 );
1213 c4 = veorq_u32( vld1q_u8(
pbSrc + (4*16) ), t4 );
1214 c5 = veorq_u32( vld1q_u8(
pbSrc + (5*16) ), t5 );
1215 c6 = veorq_u32( vld1q_u8(
pbSrc + (6*16) ), t6 );
1216 c7 = veorq_u32( vld1q_u8(
pbSrc + (7*16) ), t7 );
1221 vst1q_u8(
pbDst + (0*16), veorq_u32( c0, t0 ) );
1222 vst1q_u8(
pbDst + (1*16), veorq_u32( c1, t1 ) );
1223 vst1q_u8(
pbDst + (2*16), veorq_u32( c2, t2 ) );
1224 vst1q_u8(
pbDst + (3*16), veorq_u32( c3, t3 ) );
1225 vst1q_u8(
pbDst + (4*16), veorq_u32( c4, t4 ) );
1226 vst1q_u8(
pbDst + (5*16), veorq_u32( c5, t5 ) );
1227 vst1q_u8(
pbDst + (6*16), veorq_u32( c6, t6 ) );
1228 vst1q_u8(
pbDst + (7*16), veorq_u32( c7, t7 ) );
1232 XTS_MUL_ALPHA8( t0, t0 );
1237 if( cbDataTail == 0 )
1245 c0 = veorq_u32( vld1q_u8(
pbSrc ), t0 );
1248 vst1q_u8(
pbDst, veorq_u32( c0, t0 ) );
1284 c0 = veorq_u32( vld1q_u8(
pbSrc ), t1 );
1286 c0 = veorq_u32( c0, t1 );
1287 vst1q_u8( &tailBuf[0], c0 );
1298 c0 = vld1q_u8( &tailBuf[0] );
1301 c0 = vld1q_u8(
pbSrc );
1305 c0 = veorq_u32( c0, t0 );
1307 vst1q_u8(
pbDst, veorq_u32( c0, t0 ) );
1312#define AES_ENCRYPT_ROUND_4_GHASH_1( c0, c1, c2, c3, r0, r0x, t0, t1, gHashPointer, gHashExpandedKeyTable, todo, resl, resm, resh ) \
1314 AESE_AESMC( c0, roundKey ) \
1315 AESE_AESMC( c1, roundKey ) \
1316 AESE_AESMC( c2, roundKey ) \
1317 AESE_AESMC( c3, roundKey ) \
1319 r0x = *gHashPointer; \
1320 r0x = vrev64q_u8( r0x ); \
1321 r0 = vextq_u8( r0x, r0x, 8 ); \
1322 r0x = veorq_u8( r0, r0x ); \
1325 t1 = GHASH_H_POWER(gHashExpandedKeyTable, todo); \
1326 t0 = vmullq_p64( r0, t1 ); \
1327 t1 = vmull_high_p64( r0, t1 ); \
1329 resl = veorq_u8( resl, t0 ); \
1330 resh = veorq_u8( resh, t1 ); \
1332 t1 = GHASH_Hx_POWER(gHashExpandedKeyTable, todo); \
1333 t1 = vmullq_p64( r0x, t1 ); \
1335 resm = veorq_u8( resm, t1 ); \
1344#define AES_GCM_ENCRYPT_4( pExpandedKey, c0, c1, c2, c3, gHashPointer, gHashRounds, gHashExpandedKeyTable, todo, resl, resm, resh ) \
1346 const __n128 *keyPtr; \
1347 const __n128 *keyLimit; \
1350 keyPtr = (const __n128 *)&pExpandedKey->RoundKey[0]; \
1351 keyLimit = (const __n128 *)pExpandedKey->lastEncRoundKey; \
1352 __n128 t0, t1, r0, r0x; \
1353 SIZE_T aesEncryptGhashLoop; \
1356 roundKey = *keyPtr++; \
1357 for( aesEncryptGhashLoop = 0; aesEncryptGhashLoop < gHashRounds; aesEncryptGhashLoop++) \
1359 AES_ENCRYPT_ROUND_4_GHASH_1( c0, c1, c2, c3, r0, r0x, t0, t1, gHashPointer, gHashExpandedKeyTable, todo, resl, resm, resh ) \
1360 roundKey = *keyPtr++; \
1364 for( aesEncryptGhashLoop = 0; aesEncryptGhashLoop < (9-gHashRounds); aesEncryptGhashLoop++) \
1366 AES_ENCRYPT_ROUND_4( c0, c1, c2, c3, c4, c5, c6, c7 ) \
1367 roundKey = *keyPtr++; \
1370 if ( keyPtr < keyLimit ) \
1373 AES_ENCRYPT_ROUND_4( c0, c1, c2, c3, c4, c5, c6, c7 ) \
1374 roundKey = *keyPtr++; \
1375 AES_ENCRYPT_ROUND_4( c0, c1, c2, c3, c4, c5, c6, c7 ) \
1376 roundKey = *keyPtr++; \
1378 if ( keyPtr < keyLimit ) \
1381 AES_ENCRYPT_ROUND_4( c0, c1, c2, c3, c4, c5, c6, c7 ) \
1382 roundKey = *keyPtr++; \
1383 AES_ENCRYPT_ROUND_4( c0, c1, c2, c3, c4, c5, c6, c7 ) \
1384 roundKey = *keyPtr++; \
1389 AES_ENCRYPT_FINAL_4( c0, c1, c2, c3, c4, c5, c6, c7 ) \
1392#define AES_ENCRYPT_ROUND_8_GHASH_1( c0, c1, c2, c3, c4, c5, c6, c7, r0, r0x, t0, t1, gHashPointer, gHashExpandedKeyTable, todo, resl, resm, resh ) \
1394 AESE_AESMC( c0, roundKey ) \
1395 AESE_AESMC( c1, roundKey ) \
1396 AESE_AESMC( c2, roundKey ) \
1397 AESE_AESMC( c3, roundKey ) \
1398 AESE_AESMC( c4, roundKey ) \
1399 AESE_AESMC( c5, roundKey ) \
1400 AESE_AESMC( c6, roundKey ) \
1401 AESE_AESMC( c7, roundKey ) \
1403 r0x = *gHashPointer; \
1404 r0x = vrev64q_u8( r0x ); \
1405 r0 = vextq_u8( r0x, r0x, 8 ); \
1406 r0x = veorq_u8( r0, r0x ); \
1409 t1 = GHASH_H_POWER(gHashExpandedKeyTable, todo); \
1410 t0 = vmullq_p64( r0, t1 ); \
1411 t1 = vmull_high_p64( r0, t1 ); \
1413 resl = veorq_u8( resl, t0 ); \
1414 resh = veorq_u8( resh, t1 ); \
1416 t1 = GHASH_Hx_POWER(gHashExpandedKeyTable, todo); \
1417 t1 = vmullq_p64( r0x, t1 ); \
1419 resm = veorq_u8( resm, t1 ); \
1428#define AES_GCM_ENCRYPT_8( pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7, gHashPointer, gHashRounds, gHashExpandedKeyTable, todo, resl, resm, resh ) \
1430 const __n128 *keyPtr; \
1431 const __n128 *keyLimit; \
1434 keyPtr = (const __n128 *)&pExpandedKey->RoundKey[0]; \
1435 keyLimit = (const __n128 *)pExpandedKey->lastEncRoundKey; \
1436 __n128 t0, t1, r0, r0x; \
1437 SIZE_T aesEncryptGhashLoop; \
1440 roundKey = *keyPtr++; \
1441 for( aesEncryptGhashLoop = 0; aesEncryptGhashLoop < gHashRounds; aesEncryptGhashLoop++) \
1443 AES_ENCRYPT_ROUND_8_GHASH_1( c0, c1, c2, c3, c4, c5, c6, c7, r0, r0x, t0, t1, gHashPointer, gHashExpandedKeyTable, todo, resl, resm, resh ) \
1444 roundKey = *keyPtr++; \
1448 for( aesEncryptGhashLoop = 0; aesEncryptGhashLoop < (9-gHashRounds); aesEncryptGhashLoop++) \
1450 AES_ENCRYPT_ROUND_8( c0, c1, c2, c3, c4, c5, c6, c7 ) \
1451 roundKey = *keyPtr++; \
1454 if ( keyPtr < keyLimit ) \
1457 AES_ENCRYPT_ROUND_8( c0, c1, c2, c3, c4, c5, c6, c7 ) \
1458 roundKey = *keyPtr++; \
1459 AES_ENCRYPT_ROUND_8( c0, c1, c2, c3, c4, c5, c6, c7 ) \
1460 roundKey = *keyPtr++; \
1462 if ( keyPtr < keyLimit ) \
1465 AES_ENCRYPT_ROUND_8( c0, c1, c2, c3, c4, c5, c6, c7 ) \
1466 roundKey = *keyPtr++; \
1467 AES_ENCRYPT_ROUND_8( c0, c1, c2, c3, c4, c5, c6, c7 ) \
1468 roundKey = *keyPtr++; \
1473 AES_ENCRYPT_FINAL_8( c0, c1, c2, c3, c4, c5, c6, c7 ) \
1498 const __n128 * pSrc = (
const __n128 *)
pbSrc;
1499 const __n128 * pGhashSrc = (
const __n128 *)
pbDst;
1500 __n128 * pDst = (__n128 *)
pbDst;
1502 const __n128 chainIncrement1 = SYMCRYPT_SET_N128_U64( 0, 1 );
1503 const __n128 chainIncrement2 = SYMCRYPT_SET_N128_U64( 0, 2 );
1504 const __n128 chainIncrement8 = SYMCRYPT_SET_N128_U64( 0, 8 );
1506 __n128 ctr0, ctr1, ctr2, ctr3, ctr4, ctr5, ctr6, ctr7;
1507 __n128 c0, c1, c2, c3, c4, c5, c6, c7;
1513 const __n64 vMultiplicationConstant = SYMCRYPT_SET_N64_U64(0xc200000000000000);
1520 ctr0 = vrev64q_u8(
chain );
1521 ctr1 = vaddq_u32( ctr0, chainIncrement1 );
1522 ctr2 = vaddq_u32( ctr0, chainIncrement2 );
1523 ctr3 = vaddq_u32( ctr1, chainIncrement2 );
1524 ctr4 = vaddq_u32( ctr2, chainIncrement2 );
1525 ctr5 = vaddq_u32( ctr3, chainIncrement2 );
1526 ctr6 = vaddq_u32( ctr4, chainIncrement2 );
1527 ctr7 = vaddq_u32( ctr5, chainIncrement2 );
1532 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0,
a1,
a2 );
1535 c0 = vrev64q_u8( ctr0 );
1536 c1 = vrev64q_u8( ctr1 );
1537 c2 = vrev64q_u8( ctr2 );
1538 c3 = vrev64q_u8( ctr3 );
1539 c4 = vrev64q_u8( ctr4 );
1540 c5 = vrev64q_u8( ctr5 );
1541 c6 = vrev64q_u8( ctr6 );
1542 c7 = vrev64q_u8( ctr7 );
1544 AES_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
1548 ctr0 = vaddq_u32( ctr0, chainIncrement8 );
1549 ctr1 = vaddq_u32( ctr1, chainIncrement8 );
1550 ctr2 = vaddq_u32( ctr2, chainIncrement8 );
1551 ctr3 = vaddq_u32( ctr3, chainIncrement8 );
1552 ctr4 = vaddq_u32( ctr4, chainIncrement8 );
1553 ctr5 = vaddq_u32( ctr5, chainIncrement8 );
1554 ctr6 = vaddq_u32( ctr6, chainIncrement8 );
1555 ctr7 = vaddq_u32( ctr7, chainIncrement8 );
1558 pDst[0] = veorq_u64( pSrc[0], c0 );
1559 pDst[1] = veorq_u64( pSrc[1], c1 );
1560 pDst[2] = veorq_u64( pSrc[2], c2 );
1561 pDst[3] = veorq_u64( pSrc[3], c3 );
1562 pDst[4] = veorq_u64( pSrc[4], c4 );
1563 pDst[5] = veorq_u64( pSrc[5], c5 );
1564 pDst[6] = veorq_u64( pSrc[6], c6 );
1565 pDst[7] = veorq_u64( pSrc[7], c7 );
1570 while( nBlocks >= 16 )
1573 c0 = vrev64q_u8( ctr0 );
1574 c1 = vrev64q_u8( ctr1 );
1575 c2 = vrev64q_u8( ctr2 );
1576 c3 = vrev64q_u8( ctr3 );
1577 c4 = vrev64q_u8( ctr4 );
1578 c5 = vrev64q_u8( ctr5 );
1579 c6 = vrev64q_u8( ctr6 );
1580 c7 = vrev64q_u8( ctr7 );
1582 ctr0 = vaddq_u32( ctr0, chainIncrement8 );
1583 ctr1 = vaddq_u32( ctr1, chainIncrement8 );
1584 ctr2 = vaddq_u32( ctr2, chainIncrement8 );
1585 ctr3 = vaddq_u32( ctr3, chainIncrement8 );
1586 ctr4 = vaddq_u32( ctr4, chainIncrement8 );
1587 ctr5 = vaddq_u32( ctr5, chainIncrement8 );
1588 ctr6 = vaddq_u32( ctr6, chainIncrement8 );
1589 ctr7 = vaddq_u32( ctr7, chainIncrement8 );
1591 AES_GCM_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7, pGhashSrc, 8, expandedKeyTable,
todo, a0,
a1,
a2 );
1593 pDst[0] = veorq_u64( pSrc[0], c0 );
1594 pDst[1] = veorq_u64( pSrc[1], c1 );
1595 pDst[2] = veorq_u64( pSrc[2], c2 );
1596 pDst[3] = veorq_u64( pSrc[3], c3 );
1597 pDst[4] = veorq_u64( pSrc[4], c4 );
1598 pDst[5] = veorq_u64( pSrc[5], c5 );
1599 pDst[6] = veorq_u64( pSrc[6], c6 );
1600 pDst[7] = veorq_u64( pSrc[7], c7 );
1608 CLMUL_3_POST( a0,
a1,
a2 );
1609 MODREDUCE( vMultiplicationConstant, a0,
a1,
a2,
state );
1612 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0,
a1,
a2 );
1621 c0 = vrev64q_u8( ctr0 );
1622 c1 = vrev64q_u8( ctr1 );
1623 c2 = vrev64q_u8( ctr2 );
1624 c3 = vrev64q_u8( ctr3 );
1629 c4 = vrev64q_u8( ctr4 );
1630 c5 = vrev64q_u8( ctr5 );
1631 c6 = vrev64q_u8( ctr6 );
1633 AES_GCM_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7, pGhashSrc, 8, expandedKeyTable,
todo, a0,
a1,
a2 );
1638 AES_GCM_ENCRYPT_4(
pExpandedKey, c0, c1, c2, c3, pGhashSrc, 8, expandedKeyTable,
todo, a0,
a1,
a2 );
1643 CLMUL_3_POST( a0,
a1,
a2 );
1644 MODREDUCE( vMultiplicationConstant, a0,
a1,
a2,
state );
1647 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0,
a1,
a2 );
1655 r0x = vrev64q_u8( pGhashSrc[0] );
1656 r0 = vextq_u8( r0x, r0x, 8 );
1657 r0x = veorq_u8( r0, r0x );
1660 CLMUL_ACCX_3( r0, r0x, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0,
a1,
a2 );
1663 CLMUL_3_POST( a0,
a1,
a2 );
1664 MODREDUCE( vMultiplicationConstant, a0,
a1,
a2,
state );
1671 while( nBlocks >= 2 )
1673 ctr0 = vaddq_u32( ctr0, chainIncrement2 );
1675 r0 = veorq_u64( pSrc[0], c0 );
1676 r1 = veorq_u64( pSrc[1], c1 );
1681 r0x = vrev64q_u8( r0 );
1682 r1x = vrev64q_u8(
r1 );
1683 r0 = vextq_u8( r0x, r0x, 8 );
1684 r1 = vextq_u8( r1x, r1x, 8 );
1685 r0x = veorq_u8( r0, r0x );
1686 r1x = veorq_u8(
r1, r1x );
1688 CLMUL_ACCX_3( r0, r0x, GHASH_H_POWER(expandedKeyTable,
todo - 0), GHASH_Hx_POWER(expandedKeyTable,
todo - 0), a0,
a1,
a2 );
1689 CLMUL_ACCX_3(
r1, r1x, GHASH_H_POWER(expandedKeyTable,
todo - 1), GHASH_Hx_POWER(expandedKeyTable,
todo - 1), a0,
a1,
a2 );
1704 ctr0 = vaddq_u32( ctr0, chainIncrement1 );
1706 r0 = veorq_u64( pSrc[0], c0 );
1708 r0x = vrev64q_u8( r0 );
1709 r0 = vextq_u8( r0x, r0x, 8 );
1710 r0x = veorq_u8( r0, r0x );
1712 CLMUL_ACCX_3( r0, r0x, GHASH_H_POWER(expandedKeyTable, 1), GHASH_Hx_POWER(expandedKeyTable, 1), a0,
a1,
a2 );
1715 CLMUL_3_POST( a0,
a1,
a2 );
1716 MODREDUCE( vMultiplicationConstant, a0,
a1,
a2,
state );
1719 chain = vrev64q_u8( ctr0 );
1724#pragma warning(push)
1725#pragma warning( disable:4701 )
1726#pragma runtime_checks( "u", off )
1749 const __n128 * pSrc = (
const __n128 *)
pbSrc;
1750 const __n128 * pGhashSrc = (
const __n128 *)
pbSrc;
1751 __n128 * pDst = (__n128 *)
pbDst;
1753 const __n128 chainIncrement1 = SYMCRYPT_SET_N128_U64( 0, 1 );
1754 const __n128 chainIncrement2 = SYMCRYPT_SET_N128_U64( 0, 2 );
1755 const __n128 chainIncrement8 = SYMCRYPT_SET_N128_U64( 0, 8 );
1757 __n128 ctr0, ctr1, ctr2, ctr3, ctr4, ctr5, ctr6, ctr7;
1758 __n128 c0, c1, c2, c3, c4, c5, c6, c7;
1762 const __n64 vMultiplicationConstant = SYMCRYPT_SET_N64_U64(0xc200000000000000);
1769 ctr0 = vrev64q_u8(
chain );
1770 ctr1 = vaddq_u32( ctr0, chainIncrement1 );
1771 ctr2 = vaddq_u32( ctr0, chainIncrement2 );
1772 ctr3 = vaddq_u32( ctr1, chainIncrement2 );
1773 ctr4 = vaddq_u32( ctr2, chainIncrement2 );
1774 ctr5 = vaddq_u32( ctr3, chainIncrement2 );
1775 ctr6 = vaddq_u32( ctr4, chainIncrement2 );
1776 ctr7 = vaddq_u32( ctr5, chainIncrement2 );
1782 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0,
a1,
a2 );
1784 while( nBlocks >= 8 )
1787 c0 = vrev64q_u8( ctr0 );
1788 c1 = vrev64q_u8( ctr1 );
1789 c2 = vrev64q_u8( ctr2 );
1790 c3 = vrev64q_u8( ctr3 );
1791 c4 = vrev64q_u8( ctr4 );
1792 c5 = vrev64q_u8( ctr5 );
1793 c6 = vrev64q_u8( ctr6 );
1794 c7 = vrev64q_u8( ctr7 );
1796 ctr0 = vaddq_u32( ctr0, chainIncrement8 );
1797 ctr1 = vaddq_u32( ctr1, chainIncrement8 );
1798 ctr2 = vaddq_u32( ctr2, chainIncrement8 );
1799 ctr3 = vaddq_u32( ctr3, chainIncrement8 );
1800 ctr4 = vaddq_u32( ctr4, chainIncrement8 );
1801 ctr5 = vaddq_u32( ctr5, chainIncrement8 );
1802 ctr6 = vaddq_u32( ctr6, chainIncrement8 );
1803 ctr7 = vaddq_u32( ctr7, chainIncrement8 );
1805 AES_GCM_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7, pGhashSrc, 8, expandedKeyTable,
todo, a0,
a1,
a2 );
1807 pDst[0] = veorq_u64( pSrc[0], c0 );
1808 pDst[1] = veorq_u64( pSrc[1], c1 );
1809 pDst[2] = veorq_u64( pSrc[2], c2 );
1810 pDst[3] = veorq_u64( pSrc[3], c3 );
1811 pDst[4] = veorq_u64( pSrc[4], c4 );
1812 pDst[5] = veorq_u64( pSrc[5], c5 );
1813 pDst[6] = veorq_u64( pSrc[6], c6 );
1814 pDst[7] = veorq_u64( pSrc[7], c7 );
1822 CLMUL_3_POST( a0,
a1,
a2 );
1823 MODREDUCE( vMultiplicationConstant, a0,
a1,
a2,
state );
1828 CLMUL_3(
state, GHASH_H_POWER(expandedKeyTable,
todo), GHASH_Hx_POWER(expandedKeyTable,
todo), a0,
a1,
a2 );
1837 c0 = vrev64q_u8( ctr0 );
1838 c1 = vrev64q_u8( ctr1 );
1839 c2 = vrev64q_u8( ctr2 );
1840 c3 = vrev64q_u8( ctr3 );
1844 c4 = vrev64q_u8( ctr4 );
1845 c5 = vrev64q_u8( ctr5 );
1846 c6 = vrev64q_u8( ctr6 );
1848 AES_GCM_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7, pGhashSrc, nBlocks, expandedKeyTable,
todo, a0,
a1,
a2 );
1850 AES_GCM_ENCRYPT_4(
pExpandedKey, c0, c1, c2, c3, pGhashSrc, nBlocks, expandedKeyTable,
todo, a0,
a1,
a2 );
1852 CLMUL_3_POST( a0,
a1,
a2 );
1853 MODREDUCE( vMultiplicationConstant, a0,
a1,
a2,
state );
1856 while( nBlocks >= 2 )
1858 ctr0 = vaddq_u32( ctr0, chainIncrement2 );
1860 pDst[0] = veorq_u64( pSrc[0], c0 );
1861 pDst[1] = veorq_u64( pSrc[1], c1 );
1875 ctr0 = vaddq_u32( ctr0, chainIncrement1 );
1877 pDst[0] = veorq_u64( pSrc[0], c0 );
1881 chain = vrev64q_u8( ctr0 );
1885#pragma runtime_checks( "u", restore )
1887#pragma clang attribute pop
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 SymCryptAesCbcEncryptNeon(_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 SymCryptAes4SboxNeon(_In_reads_(4) PCBYTE pIn, _Out_writes_(4) PBYTE pOut)
VOID SYMCRYPT_CALL SymCryptXtsAesDecryptDataUnitNeon(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesEncryptNeon(_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 SymCryptAesGcmDecryptStitchedNeon(_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 SymCryptAesCbcDecryptNeon(_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 SymCryptAesCbcMacNeon(_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 SymCryptAesGcmEncryptStitchedNeon(_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 SymCryptAesEcbEncryptNeon(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesDecryptNeon(_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 SymCryptXtsAesEncryptDataUnitNeon(_In_ PCSYMCRYPT_AES_EXPANDED_KEY pExpandedKey, _Inout_updates_(SYMCRYPT_AES_BLOCK_SIZE) PBYTE pbTweakBlock, _In_reads_(cbData) PCBYTE pbSrc, _Out_writes_(cbData) PBYTE pbDst, SIZE_T cbData)
VOID SYMCRYPT_CALL SymCryptAesCreateDecryptionRoundKeyNeon(_In_reads_(16) PCBYTE pEncryptionRoundKey, _Out_writes_(16) PBYTE pDecryptionRoundKey)
#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_ALPHA(_in, _res)
#define XTS_MUL_ALPHA4(_in, _res)