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