18SYMCRYPT_AesCtrMsbXxNeon(
26 const __n128 * pSrc = (
const __n128 *)
pbSrc;
27 __n128 * pDst = (__n128 *)
pbDst;
29 const __n128 chainIncrement1 = SYMCRYPT_SET_N128_U64( 0, 1 );
30 const __n128 chainIncrement2 = SYMCRYPT_SET_N128_U64( 0, 2 );
31 const __n128 chainIncrement8 = SYMCRYPT_SET_N128_U64( 0, 8 );
33 __n128 ctr0, ctr1, ctr2, ctr3, ctr4, ctr5, ctr6, ctr7;
34 __n128 c0, c1, c2, c3, c4, c5, c6, c7;
39 ctr0 = vrev64q_u8(
chain );
40 ctr1 = VADDQ_UXX( ctr0, chainIncrement1 );
41 ctr2 = VADDQ_UXX( ctr0, chainIncrement2 );
42 ctr3 = VADDQ_UXX( ctr1, chainIncrement2 );
43 ctr4 = VADDQ_UXX( ctr2, chainIncrement2 );
44 ctr5 = VADDQ_UXX( ctr3, chainIncrement2 );
45 ctr6 = VADDQ_UXX( ctr4, chainIncrement2 );
46 ctr7 = VADDQ_UXX( ctr5, chainIncrement2 );
67 c0 = vrev64q_u8( ctr0 );
68 c1 = vrev64q_u8( ctr1 );
69 c2 = vrev64q_u8( ctr2 );
70 c3 = vrev64q_u8( ctr3 );
71 c4 = vrev64q_u8( ctr4 );
72 c5 = vrev64q_u8( ctr5 );
73 c6 = vrev64q_u8( ctr6 );
74 c7 = vrev64q_u8( ctr7 );
76 ctr0 = VADDQ_UXX( ctr0, chainIncrement8 );
77 ctr1 = VADDQ_UXX( ctr1, chainIncrement8 );
78 ctr2 = VADDQ_UXX( ctr2, chainIncrement8 );
79 ctr3 = VADDQ_UXX( ctr3, chainIncrement8 );
80 ctr4 = VADDQ_UXX( ctr4, chainIncrement8 );
81 ctr5 = VADDQ_UXX( ctr5, chainIncrement8 );
82 ctr6 = VADDQ_UXX( ctr6, chainIncrement8 );
83 ctr7 = VADDQ_UXX( ctr7, chainIncrement8 );
85 AES_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
92 pDst[0] = veorq_u64( pSrc[0], c0 );
93 pDst[1] = veorq_u64( pSrc[1], c1 );
94 pDst[2] = veorq_u64( pSrc[2], c2 );
95 pDst[3] = veorq_u64( pSrc[3], c3 );
96 pDst[4] = veorq_u64( pSrc[4], c4 );
97 pDst[5] = veorq_u64( pSrc[5], c5 );
98 pDst[6] = veorq_u64( pSrc[6], c6 );
99 pDst[7] = veorq_u64( pSrc[7], c7 );
119 pDst[0] = veorq_u64( pSrc[0], c0 );
120 pDst[1] = veorq_u64( pSrc[1], c1 );
121 pDst[2] = veorq_u64( pSrc[2], c2 );
122 pDst[3] = veorq_u64( pSrc[3], c3 );
123 pDst[4] = veorq_u64( pSrc[4], c4 );
124 chain = VSUBQ_UXX( ctr5, chainIncrement8 );
128 chain = VSUBQ_UXX( ctr6, chainIncrement8 );
129 pDst[5] = veorq_u64( pSrc[5], c5 );
132 chain = VSUBQ_UXX( ctr7, chainIncrement8 );
133 pDst[6] = veorq_u64( pSrc[6], c6 );
143 c0 = vrev64q_u8( ctr0 );
144 c1 = vrev64q_u8( ctr1 );
145 c2 = vrev64q_u8( ctr2 );
146 c3 = vrev64q_u8( ctr3 );
150 pDst[0] = veorq_u64( pSrc[0], c0 );
151 pDst[1] = veorq_u64( pSrc[1], c1 );
155 pDst[2] = veorq_u64( pSrc[2], c2 );
159 pDst[3] = veorq_u64( pSrc[3], c3 );
168 c0 = vrev64q_u8( ctr0 );
171 pDst[0] = veorq_u64( pSrc[0], c0 );
185#if SYMCRYPT_CPU_X86 | SYMCRYPT_CPU_AMD64
189SYMCRYPT_AesCtrMsbXxXmm(
199 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
206 __m128i c0, c1, c2, c3, c4, c5, c6, c7;
210 chain = _mm_shuffle_epi8(
chain, BYTE_REVERSE_ORDER );
232 c1 = MM_ADD_EPIXX(
chain, chainIncrement1 );
233 c2 = MM_ADD_EPIXX(
chain, chainIncrement2 );
234 c3 = MM_ADD_EPIXX( c1, chainIncrement2 );
235 c4 = MM_ADD_EPIXX( c2, chainIncrement2 );
236 c5 = MM_ADD_EPIXX( c3, chainIncrement2 );
237 c6 = MM_ADD_EPIXX( c4, chainIncrement2 );
238 c7 = MM_ADD_EPIXX( c5, chainIncrement2 );
239 chain = MM_ADD_EPIXX( c6, chainIncrement2 );
241 c0 = _mm_shuffle_epi8( c0, BYTE_REVERSE_ORDER );
242 c1 = _mm_shuffle_epi8( c1, BYTE_REVERSE_ORDER );
243 c2 = _mm_shuffle_epi8( c2, BYTE_REVERSE_ORDER );
244 c3 = _mm_shuffle_epi8( c3, BYTE_REVERSE_ORDER );
245 c4 = _mm_shuffle_epi8( c4, BYTE_REVERSE_ORDER );
246 c5 = _mm_shuffle_epi8( c5, BYTE_REVERSE_ORDER );
247 c6 = _mm_shuffle_epi8( c6, BYTE_REVERSE_ORDER );
248 c7 = _mm_shuffle_epi8( c7, BYTE_REVERSE_ORDER );
250 AES_ENCRYPT_8(
pExpandedKey, c0, c1, c2, c3, c4, c5, c6, c7 );
288 chain = MM_SUB_EPIXX(
chain, chainIncrement3 );
292 chain = MM_ADD_EPIXX(
chain, chainIncrement1 );
296 chain = MM_ADD_EPIXX(
chain, chainIncrement1 );
306 c1 = MM_ADD_EPIXX(
chain, chainIncrement1 );
307 c2 = MM_ADD_EPIXX(
chain, chainIncrement2 );
308 c3 = MM_ADD_EPIXX( c1, chainIncrement2 );
311 c0 = _mm_shuffle_epi8( c0, BYTE_REVERSE_ORDER );
312 c1 = _mm_shuffle_epi8( c1, BYTE_REVERSE_ORDER );
313 c2 = _mm_shuffle_epi8( c2, BYTE_REVERSE_ORDER );
314 c3 = _mm_shuffle_epi8( c3, BYTE_REVERSE_ORDER );
322 chain = MM_ADD_EPIXX(
chain, chainIncrement1 );
326 chain = MM_ADD_EPIXX(
chain, chainIncrement1 );
335 chain = MM_ADD_EPIXX(
chain, chainIncrement1 );
337 c0 = _mm_shuffle_epi8( c0, BYTE_REVERSE_ORDER );
344 chain = _mm_shuffle_epi8(
chain, BYTE_REVERSE_ORDER );
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)
#define _Inout_updates_(s)
#define SYMCRYPT_AES_BLOCK_SIZE
const SYMCRYPT_AES_EXPANDED_KEY * PCSYMCRYPT_AES_EXPANDED_KEY
PCBYTE PBYTE SIZE_T cbData