33 #if defined(POLARSSL_AESNI_C)
38 #if defined(POLARSSL_HAVE_X86_64)
43 int aesni_supports(
unsigned int what )
46 static unsigned int c = 0;
50 asm(
"movl $1, %%eax \n"
54 :
"eax",
"ebx",
"edx" );
58 return( ( c & what ) != 0 );
66 const unsigned char input[16],
67 unsigned char output[16] )
69 asm(
"movdqu (%3), %%xmm0 \n"
70 "movdqu (%1), %%xmm1 \n"
71 "pxor %%xmm1, %%xmm0 \n"
78 "movdqu (%1), %%xmm1 \n"
79 "aesenc %%xmm1, %%xmm0 \n"
83 "movdqu (%1), %%xmm1 \n"
84 "aesenclast %%xmm1, %%xmm0 \n"
88 "movdqu (%1), %%xmm1 \n"
89 "aesdec %%xmm1, %%xmm0 \n"
93 "movdqu (%1), %%xmm1 \n"
94 "aesdeclast %%xmm1, %%xmm0 \n"
97 "movdqu %%xmm0, (%4) \n"
99 :
"r" (ctx->
nr),
"r" (ctx->
rk),
"r" (mode),
"r" (input),
"r" (output)
100 :
"memory",
"cc",
"xmm0",
"xmm1" );
110 void aesni_gcm_mult(
unsigned char c[16],
111 const unsigned char a[16],
112 const unsigned char b[16] )
114 unsigned char aa[16], bb[16], cc[16];
118 for( i = 0; i < 16; i++ )
124 asm(
"movdqu (%0), %%xmm0 \n"
125 "movdqu (%1), %%xmm1 \n"
131 "movdqa %%xmm1, %%xmm2 \n"
132 "movdqa %%xmm1, %%xmm3 \n"
133 "movdqa %%xmm1, %%xmm4 \n"
134 "pclmulqdq $0x00, %%xmm0, %%xmm1 \n"
135 "pclmulqdq $0x11, %%xmm0, %%xmm2 \n"
136 "pclmulqdq $0x10, %%xmm0, %%xmm3 \n"
137 "pclmulqdq $0x01, %%xmm0, %%xmm4 \n"
138 "pxor %%xmm3, %%xmm4 \n"
139 "movdqa %%xmm4, %%xmm3 \n"
140 "psrldq $8, %%xmm4 \n"
141 "pslldq $8, %%xmm3 \n"
142 "pxor %%xmm4, %%xmm2 \n"
143 "pxor %%xmm3, %%xmm1 \n"
149 "movdqa %%xmm1, %%xmm3 \n"
150 "movdqa %%xmm2, %%xmm4 \n"
151 "psllq $1, %%xmm1 \n"
152 "psllq $1, %%xmm2 \n"
153 "psrlq $63, %%xmm3 \n"
154 "psrlq $63, %%xmm4 \n"
155 "movdqa %%xmm3, %%xmm5 \n"
156 "pslldq $8, %%xmm3 \n"
157 "pslldq $8, %%xmm4 \n"
158 "psrldq $8, %%xmm5 \n"
159 "por %%xmm3, %%xmm1 \n"
160 "por %%xmm4, %%xmm2 \n"
161 "por %%xmm5, %%xmm2 \n"
169 "movdqa %%xmm1, %%xmm3 \n"
170 "movdqa %%xmm1, %%xmm4 \n"
171 "movdqa %%xmm1, %%xmm5 \n"
172 "psllq $63, %%xmm3 \n"
173 "psllq $62, %%xmm4 \n"
174 "psllq $57, %%xmm5 \n"
177 "pxor %%xmm4, %%xmm3 \n"
178 "pxor %%xmm5, %%xmm3 \n"
179 "pslldq $8, %%xmm3 \n"
180 "pxor %%xmm3, %%xmm1 \n"
183 "movdqa %%xmm1,%%xmm0 \n"
184 "movdqa %%xmm1,%%xmm4 \n"
185 "movdqa %%xmm1,%%xmm5 \n"
186 "psrlq $1, %%xmm0 \n"
187 "psrlq $2, %%xmm4 \n"
188 "psrlq $7, %%xmm5 \n"
189 "pxor %%xmm4, %%xmm0 \n"
190 "pxor %%xmm5, %%xmm0 \n"
193 "movdqa %%xmm1,%%xmm3 \n"
194 "movdqa %%xmm1,%%xmm4 \n"
195 "movdqa %%xmm1,%%xmm5 \n"
196 "psllq $63, %%xmm3 \n"
197 "psllq $62, %%xmm4 \n"
198 "psllq $57, %%xmm5 \n"
199 "pxor %%xmm4, %%xmm3 \n"
200 "pxor %%xmm5, %%xmm3 \n"
201 "psrldq $8, %%xmm3 \n"
202 "pxor %%xmm3, %%xmm0 \n"
203 "pxor %%xmm1, %%xmm0 \n"
204 "pxor %%xmm2, %%xmm0 \n"
206 "movdqu %%xmm0, (%2) \n"
208 :
"r" (aa),
"r" (bb),
"r" (cc)
209 :
"memory",
"cc",
"xmm0",
"xmm1",
"xmm2",
"xmm3",
"xmm4",
"xmm5" );
212 for( i = 0; i < 16; i++ )
221 void aesni_inverse_key(
unsigned char *invkey,
222 const unsigned char *fwdkey,
int nr )
224 unsigned char *ik = invkey;
225 const unsigned char *fk = fwdkey + 16 * nr;
227 memcpy( ik, fk, 16 );
229 for( fk -= 16, ik += 16; fk > fwdkey; fk -= 16, ik += 16 )
230 asm(
"movdqu (%0), %%xmm0 \n"
231 "aesimc %%xmm0, %%xmm0 \n"
232 "movdqu %%xmm0, (%1) \n"
235 :
"memory",
"xmm0" );
237 memcpy( ik, fk, 16 );
243 static void aesni_setkey_enc_128(
unsigned char *rk,
244 const unsigned char *key )
246 asm(
"movdqu (%1), %%xmm0 \n"
247 "movdqu %%xmm0, (%0) \n"
261 "pshufd $0xff, %%xmm1, %%xmm1 \n"
262 "pxor %%xmm0, %%xmm1 \n"
263 "pslldq $4, %%xmm0 \n"
264 "pxor %%xmm0, %%xmm1 \n"
265 "pslldq $4, %%xmm0 \n"
266 "pxor %%xmm0, %%xmm1 \n"
267 "pslldq $4, %%xmm0 \n"
268 "pxor %%xmm1, %%xmm0 \n"
270 "movdqu %%xmm0, (%0) \n"
275 "aeskeygenassist $0x01, %%xmm0, %%xmm1 \ncall 1b \n"
276 "aeskeygenassist $0x02, %%xmm0, %%xmm1 \ncall 1b \n"
277 "aeskeygenassist $0x04, %%xmm0, %%xmm1 \ncall 1b \n"
278 "aeskeygenassist $0x08, %%xmm0, %%xmm1 \ncall 1b \n"
279 "aeskeygenassist $0x10, %%xmm0, %%xmm1 \ncall 1b \n"
280 "aeskeygenassist $0x20, %%xmm0, %%xmm1 \ncall 1b \n"
281 "aeskeygenassist $0x40, %%xmm0, %%xmm1 \ncall 1b \n"
282 "aeskeygenassist $0x80, %%xmm0, %%xmm1 \ncall 1b \n"
283 "aeskeygenassist $0x1B, %%xmm0, %%xmm1 \ncall 1b \n"
284 "aeskeygenassist $0x36, %%xmm0, %%xmm1 \ncall 1b \n"
286 :
"r" (rk),
"r" (key)
287 :
"memory",
"cc",
"0" );
293 static void aesni_setkey_enc_192(
unsigned char *rk,
294 const unsigned char *key )
296 asm(
"movdqu (%1), %%xmm0 \n"
297 "movdqu %%xmm0, (%0) \n"
299 "movq 16(%1), %%xmm1 \n"
300 "movq %%xmm1, (%0) \n"
314 "pshufd $0x55, %%xmm2, %%xmm2 \n"
315 "pxor %%xmm0, %%xmm2 \n"
316 "pslldq $4, %%xmm0 \n"
317 "pxor %%xmm0, %%xmm2 \n"
318 "pslldq $4, %%xmm0 \n"
319 "pxor %%xmm0, %%xmm2 \n"
320 "pslldq $4, %%xmm0 \n"
321 "pxor %%xmm2, %%xmm0 \n"
322 "movdqu %%xmm0, (%0) \n"
324 "pshufd $0xff, %%xmm0, %%xmm2 \n"
325 "pxor %%xmm1, %%xmm2 \n"
326 "pslldq $4, %%xmm1 \n"
327 "pxor %%xmm2, %%xmm1 \n"
328 "movq %%xmm1, (%0) \n"
333 "aeskeygenassist $0x01, %%xmm1, %%xmm2 \ncall 1b \n"
334 "aeskeygenassist $0x02, %%xmm1, %%xmm2 \ncall 1b \n"
335 "aeskeygenassist $0x04, %%xmm1, %%xmm2 \ncall 1b \n"
336 "aeskeygenassist $0x08, %%xmm1, %%xmm2 \ncall 1b \n"
337 "aeskeygenassist $0x10, %%xmm1, %%xmm2 \ncall 1b \n"
338 "aeskeygenassist $0x20, %%xmm1, %%xmm2 \ncall 1b \n"
339 "aeskeygenassist $0x40, %%xmm1, %%xmm2 \ncall 1b \n"
340 "aeskeygenassist $0x80, %%xmm1, %%xmm2 \ncall 1b \n"
343 :
"r" (rk),
"r" (key)
344 :
"memory",
"cc",
"0" );
350 static void aesni_setkey_enc_256(
unsigned char *rk,
351 const unsigned char *key )
353 asm(
"movdqu (%1), %%xmm0 \n"
354 "movdqu %%xmm0, (%0) \n"
356 "movdqu 16(%1), %%xmm1 \n"
357 "movdqu %%xmm1, (%0) \n"
370 "pshufd $0xff, %%xmm2, %%xmm2 \n"
371 "pxor %%xmm0, %%xmm2 \n"
372 "pslldq $4, %%xmm0 \n"
373 "pxor %%xmm0, %%xmm2 \n"
374 "pslldq $4, %%xmm0 \n"
375 "pxor %%xmm0, %%xmm2 \n"
376 "pslldq $4, %%xmm0 \n"
377 "pxor %%xmm2, %%xmm0 \n"
379 "movdqu %%xmm0, (%0) \n"
383 "aeskeygenassist $0, %%xmm0, %%xmm2\n"
384 "pshufd $0xaa, %%xmm2, %%xmm2 \n"
385 "pxor %%xmm1, %%xmm2 \n"
386 "pslldq $4, %%xmm1 \n"
387 "pxor %%xmm1, %%xmm2 \n"
388 "pslldq $4, %%xmm1 \n"
389 "pxor %%xmm1, %%xmm2 \n"
390 "pslldq $4, %%xmm1 \n"
391 "pxor %%xmm2, %%xmm1 \n"
393 "movdqu %%xmm1, (%0) \n"
401 "aeskeygenassist $0x01, %%xmm1, %%xmm2 \ncall 1b \n"
402 "aeskeygenassist $0x02, %%xmm1, %%xmm2 \ncall 1b \n"
403 "aeskeygenassist $0x04, %%xmm1, %%xmm2 \ncall 1b \n"
404 "aeskeygenassist $0x08, %%xmm1, %%xmm2 \ncall 1b \n"
405 "aeskeygenassist $0x10, %%xmm1, %%xmm2 \ncall 1b \n"
406 "aeskeygenassist $0x20, %%xmm1, %%xmm2 \ncall 1b \n"
407 "aeskeygenassist $0x40, %%xmm1, %%xmm2 \ncall 1b \n"
409 :
"r" (rk),
"r" (key)
410 :
"memory",
"cc",
"0" );
416 int aesni_setkey_enc(
unsigned char *rk,
417 const unsigned char *key,
422 case 128: aesni_setkey_enc_128( rk, key );
break;
423 case 192: aesni_setkey_enc_192( rk, key );
break;
424 case 256: aesni_setkey_enc_256( rk, key );
break;
Configuration options (set of defines)
AES-NI for hardware AES acceleration on some Intel processors.
#define POLARSSL_ERR_AES_INVALID_KEY_LENGTH
Invalid key length.