]> begriffs open source - freertos/blob - FreeRTOS-Plus/Source/CyaSSL/ctaocrypt/src/aes_asm.s
Update CyaSSL to latest version.
[freertos] / FreeRTOS-Plus / Source / CyaSSL / ctaocrypt / src / aes_asm.s
1 /* aes_asm.s
2  *
3  * Copyright (C) 2006-2014 wolfSSL Inc.
4  *
5  * This file is part of CyaSSL.
6  *
7  * CyaSSL is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * CyaSSL is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22
23 /* See IntelĀ® Advanced Encryption Standard (AES) Instructions Set White Paper
24  * by Intel Mobility Group, Israel Development Center, Israel Shay Gueron
25  */
26
27 /* This file is in at&t asm syntax, see .asm for intel syntax */
28
29
30 /*
31 AES_CBC_encrypt (const unsigned char *in,
32         unsigned char *out,
33         unsigned char ivec[16],
34         unsigned long length,
35         const unsigned char *KS,
36         int nr)
37 */
38 .globl AES_CBC_encrypt
39 AES_CBC_encrypt:
40 # parameter 1: %rdi
41 # parameter 2: %rsi
42 # parameter 3: %rdx
43 # parameter 4: %rcx
44 # parameter 5: %r8
45 # parameter 6: %r9d
46 movq    %rcx, %r10
47 shrq    $4, %rcx
48 shlq    $60, %r10
49 je      NO_PARTS
50 addq    $1, %rcx
51 NO_PARTS:
52 subq    $16, %rsi
53 movdqa  (%rdx), %xmm1
54 LOOP:
55 pxor    (%rdi), %xmm1
56 pxor    (%r8), %xmm1
57 addq    $16,%rsi
58 addq    $16,%rdi
59 cmpl    $12, %r9d
60 aesenc  16(%r8),%xmm1
61 aesenc  32(%r8),%xmm1
62 aesenc  48(%r8),%xmm1
63 aesenc  64(%r8),%xmm1
64 aesenc  80(%r8),%xmm1
65 aesenc  96(%r8),%xmm1
66 aesenc  112(%r8),%xmm1
67 aesenc  128(%r8),%xmm1
68 aesenc  144(%r8),%xmm1
69 movdqa  160(%r8),%xmm2
70 jb      LAST
71 cmpl    $14, %r9d
72
73 aesenc  160(%r8),%xmm1
74 aesenc  176(%r8),%xmm1
75 movdqa  192(%r8),%xmm2
76 jb      LAST
77 aesenc  192(%r8),%xmm1
78 aesenc  208(%r8),%xmm1
79 movdqa  224(%r8),%xmm2
80 LAST:
81 decq    %rcx
82 aesenclast %xmm2,%xmm1
83 movdqu  %xmm1,(%rsi)
84 jne     LOOP
85 ret
86
87
88
89
90 /*
91 AES_CBC_decrypt (const unsigned char *in,
92   unsigned char *out,
93   unsigned char ivec[16],
94   unsigned long length,
95   const unsigned char *KS,
96   int nr)
97 */
98 .globl AES_CBC_decrypt
99 AES_CBC_decrypt:
100 # parameter 1: %rdi
101 # parameter 2: %rsi
102 # parameter 3: %rdx
103 # parameter 4: %rcx
104 # parameter 5: %r8
105 # parameter 6: %r9d
106
107 movq    %rcx, %r10
108 shrq $4, %rcx
109 shlq   $60, %r10
110 je    DNO_PARTS_4
111 addq    $1, %rcx
112 DNO_PARTS_4:
113 movq   %rcx, %r10
114 shlq    $62, %r10
115 shrq  $62, %r10
116 shrq  $2, %rcx
117 movdqu (%rdx),%xmm5
118 je DREMAINDER_4
119 subq   $64, %rsi
120 DLOOP_4:
121 movdqu (%rdi), %xmm1
122 movdqu  16(%rdi), %xmm2
123 movdqu  32(%rdi), %xmm3
124 movdqu  48(%rdi), %xmm4
125 movdqa  %xmm1, %xmm6
126 movdqa %xmm2, %xmm7
127 movdqa %xmm3, %xmm8
128 movdqa %xmm4, %xmm15
129 movdqa    (%r8), %xmm9
130 movdqa 16(%r8), %xmm10
131 movdqa  32(%r8), %xmm11
132 movdqa  48(%r8), %xmm12
133 pxor    %xmm9, %xmm1
134 pxor   %xmm9, %xmm2
135 pxor   %xmm9, %xmm3
136
137 pxor    %xmm9, %xmm4
138 aesdec %xmm10, %xmm1
139 aesdec    %xmm10, %xmm2
140 aesdec    %xmm10, %xmm3
141 aesdec    %xmm10, %xmm4
142 aesdec    %xmm11, %xmm1
143 aesdec    %xmm11, %xmm2
144 aesdec    %xmm11, %xmm3
145 aesdec    %xmm11, %xmm4
146 aesdec    %xmm12, %xmm1
147 aesdec    %xmm12, %xmm2
148 aesdec    %xmm12, %xmm3
149 aesdec    %xmm12, %xmm4
150 movdqa    64(%r8), %xmm9
151 movdqa   80(%r8), %xmm10
152 movdqa  96(%r8), %xmm11
153 movdqa  112(%r8), %xmm12
154 aesdec %xmm9, %xmm1
155 aesdec %xmm9, %xmm2
156 aesdec %xmm9, %xmm3
157 aesdec %xmm9, %xmm4
158 aesdec %xmm10, %xmm1
159 aesdec    %xmm10, %xmm2
160 aesdec    %xmm10, %xmm3
161 aesdec    %xmm10, %xmm4
162 aesdec    %xmm11, %xmm1
163 aesdec    %xmm11, %xmm2
164 aesdec    %xmm11, %xmm3
165 aesdec    %xmm11, %xmm4
166 aesdec    %xmm12, %xmm1
167 aesdec    %xmm12, %xmm2
168 aesdec    %xmm12, %xmm3
169 aesdec    %xmm12, %xmm4
170 movdqa    128(%r8), %xmm9
171 movdqa  144(%r8), %xmm10
172 movdqa 160(%r8), %xmm11
173 cmpl   $12, %r9d
174 aesdec  %xmm9, %xmm1
175 aesdec %xmm9, %xmm2
176 aesdec %xmm9, %xmm3
177 aesdec %xmm9, %xmm4
178 aesdec %xmm10, %xmm1
179 aesdec    %xmm10, %xmm2
180 aesdec    %xmm10, %xmm3
181 aesdec    %xmm10, %xmm4
182 jb    DLAST_4
183 movdqa  160(%r8), %xmm9
184 movdqa  176(%r8), %xmm10
185 movdqa 192(%r8), %xmm11
186 cmpl   $14, %r9d
187 aesdec  %xmm9, %xmm1
188 aesdec %xmm9, %xmm2
189 aesdec %xmm9, %xmm3
190 aesdec %xmm9, %xmm4
191 aesdec %xmm10, %xmm1
192 aesdec    %xmm10, %xmm2
193 aesdec    %xmm10, %xmm3
194 aesdec    %xmm10, %xmm4
195 jb    DLAST_4
196
197 movdqa  192(%r8), %xmm9
198 movdqa  208(%r8), %xmm10
199 movdqa 224(%r8), %xmm11
200 aesdec %xmm9, %xmm1
201 aesdec %xmm9, %xmm2
202 aesdec %xmm9, %xmm3
203 aesdec %xmm9, %xmm4
204 aesdec %xmm10, %xmm1
205 aesdec    %xmm10, %xmm2
206 aesdec    %xmm10, %xmm3
207 aesdec    %xmm10, %xmm4
208 DLAST_4:
209 addq   $64, %rdi
210 addq    $64, %rsi
211 decq  %rcx
212 aesdeclast %xmm11, %xmm1
213 aesdeclast %xmm11, %xmm2
214 aesdeclast %xmm11, %xmm3
215 aesdeclast %xmm11, %xmm4
216 pxor   %xmm5 ,%xmm1
217 pxor    %xmm6 ,%xmm2
218 pxor   %xmm7 ,%xmm3
219 pxor   %xmm8 ,%xmm4
220 movdqu %xmm1, (%rsi)
221 movdqu    %xmm2, 16(%rsi)
222 movdqu  %xmm3, 32(%rsi)
223 movdqu  %xmm4, 48(%rsi)
224 movdqa  %xmm15,%xmm5
225 jne    DLOOP_4
226 addq    $64, %rsi
227 DREMAINDER_4:
228 cmpq    $0, %r10
229 je  DEND_4
230 DLOOP_4_2:
231 movdqu  (%rdi), %xmm1
232 movdqa    %xmm1 ,%xmm15
233 addq  $16, %rdi
234 pxor  (%r8), %xmm1
235 movdqu 160(%r8), %xmm2
236 cmpl    $12, %r9d
237 aesdec    16(%r8), %xmm1
238 aesdec   32(%r8), %xmm1
239 aesdec   48(%r8), %xmm1
240 aesdec   64(%r8), %xmm1
241 aesdec   80(%r8), %xmm1
242 aesdec   96(%r8), %xmm1
243 aesdec   112(%r8), %xmm1
244 aesdec  128(%r8), %xmm1
245 aesdec  144(%r8), %xmm1
246 jb  DLAST_4_2
247 movdqu    192(%r8), %xmm2
248 cmpl    $14, %r9d
249 aesdec    160(%r8), %xmm1
250 aesdec  176(%r8), %xmm1
251 jb  DLAST_4_2
252 movdqu    224(%r8), %xmm2
253 aesdec  192(%r8), %xmm1
254 aesdec  208(%r8), %xmm1
255 DLAST_4_2:
256 aesdeclast %xmm2, %xmm1
257 pxor    %xmm5, %xmm1
258 movdqa %xmm15, %xmm5
259 movdqu    %xmm1, (%rsi)
260
261 addq    $16, %rsi
262 decq    %r10
263 jne DLOOP_4_2
264 DEND_4:
265 ret
266
267
268 /*
269 AES_ECB_encrypt (const unsigned char *in,
270         unsigned char *out,
271         unsigned long length,
272         const unsigned char *KS,
273         int nr)
274 */
275 .globl AES_ECB_encrypt
276 AES_ECB_encrypt:
277 # parameter 1: %rdi
278 # parameter 2: %rsi
279 # parameter 3: %rdx
280 # parameter 4: %rcx
281 # parameter 5: %r8d
282         movq    %rdx, %r10
283         shrq    $4, %rdx
284         shlq    $60, %r10
285         je      EECB_NO_PARTS_4
286         addq    $1, %rdx
287 EECB_NO_PARTS_4:
288         movq    %rdx, %r10
289         shlq    $62, %r10
290         shrq    $62, %r10
291         shrq    $2, %rdx
292         je      EECB_REMAINDER_4
293         subq    $64, %rsi
294 EECB_LOOP_4:
295         movdqu  (%rdi), %xmm1
296         movdqu  16(%rdi), %xmm2
297         movdqu  32(%rdi), %xmm3
298         movdqu  48(%rdi), %xmm4
299         movdqa  (%rcx), %xmm9
300         movdqa  16(%rcx), %xmm10
301         movdqa  32(%rcx), %xmm11
302         movdqa  48(%rcx), %xmm12
303         pxor    %xmm9, %xmm1
304         pxor    %xmm9, %xmm2
305         pxor    %xmm9, %xmm3
306         pxor    %xmm9, %xmm4
307         aesenc  %xmm10, %xmm1
308         aesenc  %xmm10, %xmm2
309         aesenc  %xmm10, %xmm3
310         aesenc  %xmm10, %xmm4
311         aesenc  %xmm11, %xmm1
312         aesenc  %xmm11, %xmm2
313         aesenc  %xmm11, %xmm3
314         aesenc  %xmm11, %xmm4
315         aesenc  %xmm12, %xmm1
316         aesenc  %xmm12, %xmm2
317         aesenc  %xmm12, %xmm3
318         aesenc  %xmm12, %xmm4
319         movdqa  64(%rcx), %xmm9
320         movdqa  80(%rcx), %xmm10
321         movdqa  96(%rcx), %xmm11
322         movdqa  112(%rcx), %xmm12
323         aesenc  %xmm9, %xmm1
324         aesenc  %xmm9, %xmm2
325         aesenc  %xmm9, %xmm3
326         aesenc  %xmm9, %xmm4
327         aesenc  %xmm10, %xmm1
328         aesenc  %xmm10, %xmm2
329         aesenc  %xmm10, %xmm3
330         aesenc  %xmm10, %xmm4
331         aesenc  %xmm11, %xmm1
332         aesenc  %xmm11, %xmm2
333         aesenc  %xmm11, %xmm3
334         aesenc  %xmm11, %xmm4
335         aesenc  %xmm12, %xmm1
336         aesenc  %xmm12, %xmm2
337         aesenc  %xmm12, %xmm3
338         aesenc  %xmm12, %xmm4
339         movdqa  128(%rcx), %xmm9
340         movdqa  144(%rcx), %xmm10
341         movdqa  160(%rcx), %xmm11
342         cmpl    $12, %r8d
343         aesenc  %xmm9, %xmm1
344         aesenc  %xmm9, %xmm2
345         aesenc  %xmm9, %xmm3
346         aesenc  %xmm9, %xmm4
347         aesenc  %xmm10, %xmm1
348         aesenc  %xmm10, %xmm2
349         aesenc  %xmm10, %xmm3
350         aesenc  %xmm10, %xmm4
351         jb      EECB_LAST_4
352         movdqa  160(%rcx), %xmm9
353         movdqa  176(%rcx), %xmm10
354         movdqa  192(%rcx), %xmm11
355         cmpl    $14, %r8d
356         aesenc  %xmm9, %xmm1
357         aesenc  %xmm9, %xmm2
358         aesenc  %xmm9, %xmm3
359         aesenc  %xmm9, %xmm4
360         aesenc  %xmm10, %xmm1
361         aesenc  %xmm10, %xmm2
362         aesenc  %xmm10, %xmm3
363         aesenc  %xmm10, %xmm4
364         jb      EECB_LAST_4
365         movdqa  192(%rcx), %xmm9
366         movdqa  208(%rcx), %xmm10
367         movdqa  224(%rcx), %xmm11
368         aesenc  %xmm9, %xmm1
369         aesenc  %xmm9, %xmm2
370         aesenc  %xmm9, %xmm3
371         aesenc  %xmm9, %xmm4
372         aesenc  %xmm10, %xmm1
373         aesenc  %xmm10, %xmm2
374         aesenc  %xmm10, %xmm3
375         aesenc  %xmm10, %xmm4
376 EECB_LAST_4:
377         addq    $64, %rdi
378         addq    $64, %rsi
379         decq    %rdx
380         aesenclast %xmm11, %xmm1
381         aesenclast %xmm11, %xmm2
382         aesenclast %xmm11, %xmm3
383         aesenclast %xmm11, %xmm4
384         movdqu  %xmm1, (%rsi)
385         movdqu  %xmm2, 16(%rsi)
386         movdqu  %xmm3, 32(%rsi)
387         movdqu  %xmm4, 48(%rsi)
388         jne     EECB_LOOP_4
389         addq    $64, %rsi
390 EECB_REMAINDER_4:
391         cmpq    $0, %r10
392         je      EECB_END_4
393 EECB_LOOP_4_2:
394         movdqu  (%rdi), %xmm1
395         addq    $16, %rdi
396         pxor    (%rcx), %xmm1
397         movdqu  160(%rcx), %xmm2
398         aesenc  16(%rcx), %xmm1
399         aesenc  32(%rcx), %xmm1
400         aesenc  48(%rcx), %xmm1
401         aesenc  64(%rcx), %xmm1
402         aesenc  80(%rcx), %xmm1
403         aesenc  96(%rcx), %xmm1
404         aesenc  112(%rcx), %xmm1
405         aesenc  128(%rcx), %xmm1
406         aesenc  144(%rcx), %xmm1
407         cmpl    $12, %r8d
408         jb      EECB_LAST_4_2
409         movdqu  192(%rcx), %xmm2
410         aesenc  160(%rcx), %xmm1
411         aesenc  176(%rcx), %xmm1
412         cmpl    $14, %r8d
413         jb      EECB_LAST_4_2
414         movdqu  224(%rcx), %xmm2
415         aesenc  192(%rcx), %xmm1
416         aesenc  208(%rcx), %xmm1
417 EECB_LAST_4_2:
418         aesenclast %xmm2, %xmm1
419         movdqu  %xmm1, (%rsi)
420         addq    $16, %rsi
421         decq    %r10
422         jne     EECB_LOOP_4_2
423 EECB_END_4:
424         ret
425
426
427 /*
428 AES_ECB_decrypt (const unsigned char *in,
429   unsigned char *out,
430   unsigned long length,
431   const unsigned char *KS,
432   int nr)
433 */
434 .globl AES_ECB_decrypt
435 AES_ECB_decrypt:
436 # parameter 1: %rdi
437 # parameter 2: %rsi
438 # parameter 3: %rdx
439 # parameter 4: %rcx
440 # parameter 5: %r8d
441
442         movq    %rdx, %r10
443         shrq    $4, %rdx
444         shlq    $60, %r10
445         je      DECB_NO_PARTS_4
446         addq    $1, %rdx
447 DECB_NO_PARTS_4:
448         movq    %rdx, %r10
449         shlq    $62, %r10
450         shrq    $62, %r10
451         shrq    $2, %rdx
452         je      DECB_REMAINDER_4
453         subq    $64, %rsi
454 DECB_LOOP_4:
455         movdqu  (%rdi), %xmm1
456         movdqu  16(%rdi), %xmm2
457         movdqu  32(%rdi), %xmm3
458         movdqu  48(%rdi), %xmm4
459         movdqa  (%rcx), %xmm9
460         movdqa  16(%rcx), %xmm10
461         movdqa  32(%rcx), %xmm11
462         movdqa  48(%rcx), %xmm12
463         pxor    %xmm9, %xmm1
464         pxor    %xmm9, %xmm2
465         pxor    %xmm9, %xmm3
466         pxor    %xmm9, %xmm4
467         aesdec  %xmm10, %xmm1
468         aesdec  %xmm10, %xmm2
469         aesdec  %xmm10, %xmm3
470         aesdec  %xmm10, %xmm4
471         aesdec  %xmm11, %xmm1
472         aesdec  %xmm11, %xmm2
473         aesdec  %xmm11, %xmm3
474         aesdec  %xmm11, %xmm4
475         aesdec  %xmm12, %xmm1
476         aesdec  %xmm12, %xmm2
477         aesdec  %xmm12, %xmm3
478         aesdec  %xmm12, %xmm4
479         movdqa  64(%rcx), %xmm9
480         movdqa  80(%rcx), %xmm10
481         movdqa  96(%rcx), %xmm11
482         movdqa  112(%rcx), %xmm12
483         aesdec  %xmm9, %xmm1
484         aesdec  %xmm9, %xmm2
485         aesdec  %xmm9, %xmm3
486         aesdec  %xmm9, %xmm4
487         aesdec  %xmm10, %xmm1
488         aesdec  %xmm10, %xmm2
489         aesdec  %xmm10, %xmm3
490         aesdec  %xmm10, %xmm4
491         aesdec  %xmm11, %xmm1
492         aesdec  %xmm11, %xmm2
493         aesdec  %xmm11, %xmm3
494         aesdec  %xmm11, %xmm4
495         aesdec  %xmm12, %xmm1
496         aesdec  %xmm12, %xmm2
497         aesdec  %xmm12, %xmm3
498         aesdec  %xmm12, %xmm4
499         movdqa  128(%rcx), %xmm9
500         movdqa  144(%rcx), %xmm10
501         movdqa  160(%rcx), %xmm11
502         cmpl    $12, %r8d
503         aesdec  %xmm9, %xmm1
504         aesdec  %xmm9, %xmm2
505         aesdec  %xmm9, %xmm3
506         aesdec  %xmm9, %xmm4
507         aesdec  %xmm10, %xmm1
508         aesdec  %xmm10, %xmm2
509         aesdec  %xmm10, %xmm3
510         aesdec  %xmm10, %xmm4
511         jb      DECB_LAST_4
512         movdqa  160(%rcx), %xmm9
513         movdqa  176(%rcx), %xmm10
514         movdqa  192(%rcx), %xmm11
515         cmpl    $14, %r8d
516         aesdec  %xmm9, %xmm1
517         aesdec  %xmm9, %xmm2
518         aesdec  %xmm9, %xmm3
519         aesdec  %xmm9, %xmm4
520         aesdec  %xmm10, %xmm1
521         aesdec  %xmm10, %xmm2
522         aesdec  %xmm10, %xmm3
523         aesdec  %xmm10, %xmm4
524         jb      DECB_LAST_4
525         movdqa  192(%rcx), %xmm9
526         movdqa  208(%rcx), %xmm10
527         movdqa  224(%rcx), %xmm11
528         aesdec  %xmm9, %xmm1
529         aesdec  %xmm9, %xmm2
530         aesdec  %xmm9, %xmm3
531         aesdec  %xmm9, %xmm4
532         aesdec  %xmm10, %xmm1
533         aesdec  %xmm10, %xmm2
534         aesdec  %xmm10, %xmm3
535         aesdec  %xmm10, %xmm4
536 DECB_LAST_4:
537         addq    $64, %rdi
538         addq    $64, %rsi
539         decq    %rdx
540         aesdeclast %xmm11, %xmm1
541         aesdeclast %xmm11, %xmm2
542         aesdeclast %xmm11, %xmm3
543         aesdeclast %xmm11, %xmm4
544         movdqu  %xmm1, (%rsi)
545         movdqu  %xmm2, 16(%rsi)
546         movdqu  %xmm3, 32(%rsi)
547         movdqu  %xmm4, 48(%rsi)
548         jne     DECB_LOOP_4
549         addq    $64, %rsi
550 DECB_REMAINDER_4:
551         cmpq    $0, %r10
552         je      DECB_END_4
553 DECB_LOOP_4_2:
554         movdqu  (%rdi), %xmm1
555         addq    $16, %rdi
556         pxor    (%rcx), %xmm1
557         movdqu  160(%rcx), %xmm2
558         cmpl    $12, %r8d
559         aesdec  16(%rcx), %xmm1
560         aesdec  32(%rcx), %xmm1
561         aesdec  48(%rcx), %xmm1
562         aesdec  64(%rcx), %xmm1
563         aesdec  80(%rcx), %xmm1
564         aesdec  96(%rcx), %xmm1
565         aesdec  112(%rcx), %xmm1
566         aesdec  128(%rcx), %xmm1
567         aesdec  144(%rcx), %xmm1
568         jb      DECB_LAST_4_2
569         cmpl    $14, %r8d
570         movdqu  192(%rcx), %xmm2
571         aesdec  160(%rcx), %xmm1
572         aesdec  176(%rcx), %xmm1
573         jb      DECB_LAST_4_2
574         movdqu  224(%rcx), %xmm2
575         aesdec  192(%rcx), %xmm1
576         aesdec  208(%rcx), %xmm1
577 DECB_LAST_4_2:
578         aesdeclast %xmm2, %xmm1
579         movdqu  %xmm1, (%rsi)
580         addq    $16, %rsi
581         decq    %r10
582         jne     DECB_LOOP_4_2
583 DECB_END_4:
584         ret
585
586
587
588
589 /*
590 void AES_128_Key_Expansion(const unsigned char* userkey,
591    unsigned char* key_schedule);
592 */
593 .align  16,0x90
594 .globl AES_128_Key_Expansion
595 AES_128_Key_Expansion:
596 # parameter 1: %rdi
597 # parameter 2: %rsi
598 movl    $10, 240(%rsi)
599
600 movdqu  (%rdi), %xmm1
601 movdqa    %xmm1, (%rsi)
602
603
604 ASSISTS:
605 aeskeygenassist $1, %xmm1, %xmm2
606 call PREPARE_ROUNDKEY_128
607 movdqa %xmm1, 16(%rsi)
608 aeskeygenassist $2, %xmm1, %xmm2
609 call PREPARE_ROUNDKEY_128
610 movdqa %xmm1, 32(%rsi)
611 aeskeygenassist $4, %xmm1, %xmm2
612 call PREPARE_ROUNDKEY_128
613 movdqa %xmm1, 48(%rsi)
614 aeskeygenassist $8, %xmm1, %xmm2
615 call PREPARE_ROUNDKEY_128
616 movdqa %xmm1, 64(%rsi)
617 aeskeygenassist $16, %xmm1, %xmm2
618 call PREPARE_ROUNDKEY_128
619 movdqa %xmm1, 80(%rsi)
620 aeskeygenassist $32, %xmm1, %xmm2
621 call PREPARE_ROUNDKEY_128
622 movdqa %xmm1, 96(%rsi)
623 aeskeygenassist $64, %xmm1, %xmm2
624 call PREPARE_ROUNDKEY_128
625 movdqa %xmm1, 112(%rsi)
626 aeskeygenassist $0x80, %xmm1, %xmm2
627 call PREPARE_ROUNDKEY_128
628 movdqa %xmm1, 128(%rsi)
629 aeskeygenassist $0x1b, %xmm1, %xmm2
630 call PREPARE_ROUNDKEY_128
631 movdqa %xmm1, 144(%rsi)
632 aeskeygenassist $0x36, %xmm1, %xmm2
633 call PREPARE_ROUNDKEY_128
634 movdqa %xmm1, 160(%rsi)
635 ret
636
637 PREPARE_ROUNDKEY_128:
638 pshufd $255, %xmm2, %xmm2
639 movdqa %xmm1, %xmm3
640 pslldq $4, %xmm3
641 pxor %xmm3, %xmm1
642 pslldq $4, %xmm3
643 pxor %xmm3, %xmm1
644 pslldq $4, %xmm3
645 pxor %xmm3, %xmm1
646 pxor %xmm2, %xmm1
647 ret
648
649
650 /*
651 void AES_192_Key_Expansion (const unsigned char *userkey,
652   unsigned char *key)
653 */
654 .globl AES_192_Key_Expansion
655 AES_192_Key_Expansion:
656 # parameter 1: %rdi
657 # parameter 2: %rsi
658
659 movdqu (%rdi), %xmm1
660 movdqu 16(%rdi), %xmm3
661 movdqa %xmm1, (%rsi)
662 movdqa %xmm3, %xmm5
663
664 aeskeygenassist $0x1, %xmm3, %xmm2
665 call PREPARE_ROUNDKEY_192
666 shufpd $0, %xmm1, %xmm5
667 movdqa %xmm5, 16(%rsi)
668 movdqa %xmm1, %xmm6
669 shufpd $1, %xmm3, %xmm6
670 movdqa %xmm6, 32(%rsi)
671
672 aeskeygenassist $0x2, %xmm3, %xmm2
673 call PREPARE_ROUNDKEY_192
674 movdqa %xmm1, 48(%rsi)
675 movdqa %xmm3, %xmm5
676
677 aeskeygenassist $0x4, %xmm3, %xmm2
678 call PREPARE_ROUNDKEY_192
679 shufpd $0, %xmm1, %xmm5
680 movdqa %xmm5, 64(%rsi)
681 movdqa %xmm1, %xmm6
682 shufpd $1, %xmm3, %xmm6
683 movdqa %xmm6, 80(%rsi)
684
685 aeskeygenassist $0x8, %xmm3, %xmm2
686 call PREPARE_ROUNDKEY_192
687 movdqa %xmm1, 96(%rsi)
688 movdqa %xmm3, %xmm5
689
690 aeskeygenassist $0x10, %xmm3, %xmm2
691 call PREPARE_ROUNDKEY_192
692 shufpd $0, %xmm1, %xmm5
693 movdqa %xmm5, 112(%rsi)
694 movdqa %xmm1, %xmm6
695 shufpd $1, %xmm3, %xmm6
696 movdqa %xmm6, 128(%rsi)
697
698 aeskeygenassist $0x20, %xmm3, %xmm2
699 call PREPARE_ROUNDKEY_192
700 movdqa %xmm1, 144(%rsi)
701 movdqa %xmm3, %xmm5
702
703 aeskeygenassist $0x40, %xmm3, %xmm2
704 call PREPARE_ROUNDKEY_192
705 shufpd $0, %xmm1, %xmm5
706 movdqa %xmm5, 160(%rsi)
707 movdqa %xmm1, %xmm6
708 shufpd $1, %xmm3, %xmm6
709 movdqa %xmm6, 176(%rsi)
710
711 aeskeygenassist $0x80, %xmm3, %xmm2
712 call PREPARE_ROUNDKEY_192
713 movdqa %xmm1, 192(%rsi)
714 movdqa %xmm3, 208(%rsi)
715 ret
716
717 PREPARE_ROUNDKEY_192:
718 pshufd $0x55, %xmm2, %xmm2
719 movdqu %xmm1, %xmm4
720 pslldq $4, %xmm4
721 pxor   %xmm4, %xmm1
722
723 pslldq $4, %xmm4
724 pxor   %xmm4, %xmm1
725 pslldq $4, %xmm4
726 pxor  %xmm4, %xmm1
727 pxor   %xmm2, %xmm1
728 pshufd $0xff, %xmm1, %xmm2
729 movdqu %xmm3, %xmm4
730 pslldq $4, %xmm4
731 pxor   %xmm4, %xmm3
732 pxor   %xmm2, %xmm3
733 ret
734  
735
736 /*
737 void AES_256_Key_Expansion (const unsigned char *userkey,
738   unsigned char *key)
739 */
740 .globl AES_256_Key_Expansion
741 AES_256_Key_Expansion:
742 # parameter 1: %rdi
743 # parameter 2: %rsi
744
745 movdqu (%rdi), %xmm1
746 movdqu 16(%rdi), %xmm3
747 movdqa %xmm1, (%rsi)
748 movdqa %xmm3, 16(%rsi)
749
750 aeskeygenassist $0x1, %xmm3, %xmm2
751 call MAKE_RK256_a
752 movdqa %xmm1, 32(%rsi)
753 aeskeygenassist $0x0, %xmm1, %xmm2
754 call MAKE_RK256_b
755 movdqa %xmm3, 48(%rsi)
756 aeskeygenassist $0x2, %xmm3, %xmm2
757 call MAKE_RK256_a
758 movdqa %xmm1, 64(%rsi)
759 aeskeygenassist $0x0, %xmm1, %xmm2
760 call MAKE_RK256_b
761 movdqa %xmm3, 80(%rsi)
762 aeskeygenassist $0x4, %xmm3, %xmm2
763 call MAKE_RK256_a
764 movdqa %xmm1, 96(%rsi)
765 aeskeygenassist $0x0, %xmm1, %xmm2
766 call MAKE_RK256_b
767 movdqa %xmm3, 112(%rsi)
768 aeskeygenassist $0x8, %xmm3, %xmm2
769 call MAKE_RK256_a
770 movdqa %xmm1, 128(%rsi)
771 aeskeygenassist $0x0, %xmm1, %xmm2
772 call MAKE_RK256_b
773 movdqa %xmm3, 144(%rsi)
774 aeskeygenassist $0x10, %xmm3, %xmm2
775 call MAKE_RK256_a
776 movdqa %xmm1, 160(%rsi)
777 aeskeygenassist $0x0, %xmm1, %xmm2
778 call MAKE_RK256_b
779 movdqa %xmm3, 176(%rsi)
780 aeskeygenassist $0x20, %xmm3, %xmm2
781 call MAKE_RK256_a
782 movdqa %xmm1, 192(%rsi)
783
784 aeskeygenassist $0x0, %xmm1, %xmm2
785 call MAKE_RK256_b
786 movdqa %xmm3, 208(%rsi)
787 aeskeygenassist $0x40, %xmm3, %xmm2
788 call MAKE_RK256_a
789 movdqa %xmm1, 224(%rsi)
790
791 ret
792
793 MAKE_RK256_a:
794 pshufd $0xff, %xmm2, %xmm2
795 movdqa %xmm1, %xmm4
796 pslldq $4, %xmm4
797 pxor   %xmm4, %xmm1
798 pslldq $4, %xmm4
799 pxor  %xmm4, %xmm1
800 pslldq $4, %xmm4
801 pxor  %xmm4, %xmm1
802 pxor   %xmm2, %xmm1
803 ret
804
805 MAKE_RK256_b:
806 pshufd $0xaa, %xmm2, %xmm2
807 movdqa %xmm3, %xmm4
808 pslldq $4, %xmm4
809 pxor   %xmm4, %xmm3
810 pslldq $4, %xmm4
811 pxor  %xmm4, %xmm3
812 pslldq $4, %xmm4
813 pxor  %xmm4, %xmm3
814 pxor   %xmm2, %xmm3
815 ret
816