]> git.sur5r.net Git - freertos/blob - FreeRTOS-Plus/Source/CyaSSL/ctaocrypt/src/aes_asm.s
4aa35861995c05b12591951429598fde75f3ce92
[freertos] / FreeRTOS-Plus / Source / CyaSSL / ctaocrypt / src / aes_asm.s
1 /* aes_asm.s
2  *
3  * Copyright (C) 2006-2011 Sawtooth Consulting Ltd.
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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
28 //AES_CBC_encrypt (const unsigned char *in,
29 //      unsigned char *out,
30 //      unsigned char ivec[16],
31 //      unsigned long length,
32 //      const unsigned char *KS,
33 //      int nr)
34 .globl AES_CBC_encrypt
35 AES_CBC_encrypt:
36 # parameter 1: %rdi
37 # parameter 2: %rsi
38 # parameter 3: %rdx
39 # parameter 4: %rcx
40 # parameter 5: %r8
41 # parameter 6: %r9d
42 movq    %rcx, %r10
43 shrq    $4, %rcx
44 shlq    $60, %r10
45 je      NO_PARTS
46 addq    $1, %rcx
47 NO_PARTS:
48 subq    $16, %rsi
49 movdqa  (%rdx), %xmm1
50 LOOP:
51 pxor    (%rdi), %xmm1
52 pxor    (%r8), %xmm1
53 addq    $16,%rsi
54 addq    $16,%rdi
55 cmpl    $12, %r9d
56 aesenc  16(%r8),%xmm1
57 aesenc  32(%r8),%xmm1
58 aesenc  48(%r8),%xmm1
59 aesenc  64(%r8),%xmm1
60 aesenc  80(%r8),%xmm1
61 aesenc  96(%r8),%xmm1
62 aesenc  112(%r8),%xmm1
63 aesenc  128(%r8),%xmm1
64 aesenc  144(%r8),%xmm1
65 movdqa  160(%r8),%xmm2
66 jb      LAST
67 cmpl    $14, %r9d
68
69 aesenc  160(%r8),%xmm1
70 aesenc  176(%r8),%xmm1
71 movdqa  192(%r8),%xmm2
72 jb      LAST
73 aesenc  192(%r8),%xmm1
74 aesenc  208(%r8),%xmm1
75 movdqa  224(%r8),%xmm2
76 LAST:
77 decq    %rcx
78 aesenclast %xmm2,%xmm1
79 movdqu  %xmm1,(%rsi)
80 jne     LOOP
81 ret
82
83
84
85 //AES_CBC_decrypt (const unsigned char *in,
86 //  unsigned char *out,
87 //  unsigned char ivec[16],
88 //  unsigned long length,
89 //  const unsigned char *KS,
90 // int nr)
91 .globl AES_CBC_decrypt
92 AES_CBC_decrypt:
93 # parameter 1: %rdi
94 # parameter 2: %rsi
95 # parameter 3: %rdx
96 # parameter 4: %rcx
97 # parameter 5: %r8
98 # parameter 6: %r9d
99
100 movq    %rcx, %r10
101 shrq $4, %rcx
102 shlq   $60, %r10
103 je    DNO_PARTS_4
104 addq    $1, %rcx
105 DNO_PARTS_4:
106 movq   %rcx, %r10
107 shlq    $62, %r10
108 shrq  $62, %r10
109 shrq  $2, %rcx
110 movdqu (%rdx),%xmm5
111 je DREMAINDER_4
112 subq   $64, %rsi
113 DLOOP_4:
114 movdqu (%rdi), %xmm1
115 movdqu  16(%rdi), %xmm2
116 movdqu  32(%rdi), %xmm3
117 movdqu  48(%rdi), %xmm4
118 movdqa  %xmm1, %xmm6
119 movdqa %xmm2, %xmm7
120 movdqa %xmm3, %xmm8
121 movdqa %xmm4, %xmm15
122 movdqa    (%r8), %xmm9
123 movdqa 16(%r8), %xmm10
124 movdqa  32(%r8), %xmm11
125 movdqa  48(%r8), %xmm12
126 pxor    %xmm9, %xmm1
127 pxor   %xmm9, %xmm2
128 pxor   %xmm9, %xmm3
129
130 pxor    %xmm9, %xmm4
131 aesdec %xmm10, %xmm1
132 aesdec    %xmm10, %xmm2
133 aesdec    %xmm10, %xmm3
134 aesdec    %xmm10, %xmm4
135 aesdec    %xmm11, %xmm1
136 aesdec    %xmm11, %xmm2
137 aesdec    %xmm11, %xmm3
138 aesdec    %xmm11, %xmm4
139 aesdec    %xmm12, %xmm1
140 aesdec    %xmm12, %xmm2
141 aesdec    %xmm12, %xmm3
142 aesdec    %xmm12, %xmm4
143 movdqa    64(%r8), %xmm9
144 movdqa   80(%r8), %xmm10
145 movdqa  96(%r8), %xmm11
146 movdqa  112(%r8), %xmm12
147 aesdec %xmm9, %xmm1
148 aesdec %xmm9, %xmm2
149 aesdec %xmm9, %xmm3
150 aesdec %xmm9, %xmm4
151 aesdec %xmm10, %xmm1
152 aesdec    %xmm10, %xmm2
153 aesdec    %xmm10, %xmm3
154 aesdec    %xmm10, %xmm4
155 aesdec    %xmm11, %xmm1
156 aesdec    %xmm11, %xmm2
157 aesdec    %xmm11, %xmm3
158 aesdec    %xmm11, %xmm4
159 aesdec    %xmm12, %xmm1
160 aesdec    %xmm12, %xmm2
161 aesdec    %xmm12, %xmm3
162 aesdec    %xmm12, %xmm4
163 movdqa    128(%r8), %xmm9
164 movdqa  144(%r8), %xmm10
165 movdqa 160(%r8), %xmm11
166 cmpl   $12, %r9d
167 aesdec  %xmm9, %xmm1
168 aesdec %xmm9, %xmm2
169 aesdec %xmm9, %xmm3
170 aesdec %xmm9, %xmm4
171 aesdec %xmm10, %xmm1
172 aesdec    %xmm10, %xmm2
173 aesdec    %xmm10, %xmm3
174 aesdec    %xmm10, %xmm4
175 jb    DLAST_4
176 movdqa  160(%r8), %xmm9
177 movdqa  176(%r8), %xmm10
178 movdqa 192(%r8), %xmm11
179 cmpl   $14, %r9d
180 aesdec  %xmm9, %xmm1
181 aesdec %xmm9, %xmm2
182 aesdec %xmm9, %xmm3
183 aesdec %xmm9, %xmm4
184 aesdec %xmm10, %xmm1
185 aesdec    %xmm10, %xmm2
186 aesdec    %xmm10, %xmm3
187 aesdec    %xmm10, %xmm4
188 jb    DLAST_4
189
190 movdqa  192(%r8), %xmm9
191 movdqa  208(%r8), %xmm10
192 movdqa 224(%r8), %xmm11
193 aesdec %xmm9, %xmm1
194 aesdec %xmm9, %xmm2
195 aesdec %xmm9, %xmm3
196 aesdec %xmm9, %xmm4
197 aesdec %xmm10, %xmm1
198 aesdec    %xmm10, %xmm2
199 aesdec    %xmm10, %xmm3
200 aesdec    %xmm10, %xmm4
201 DLAST_4:
202 addq   $64, %rdi
203 addq    $64, %rsi
204 decq  %rcx
205 aesdeclast %xmm11, %xmm1
206 aesdeclast %xmm11, %xmm2
207 aesdeclast %xmm11, %xmm3
208 aesdeclast %xmm11, %xmm4
209 pxor   %xmm5 ,%xmm1
210 pxor    %xmm6 ,%xmm2
211 pxor   %xmm7 ,%xmm3
212 pxor   %xmm8 ,%xmm4
213 movdqu %xmm1, (%rsi)
214 movdqu    %xmm2, 16(%rsi)
215 movdqu  %xmm3, 32(%rsi)
216 movdqu  %xmm4, 48(%rsi)
217 movdqa  %xmm15,%xmm5
218 jne    DLOOP_4
219 addq    $64, %rsi
220 DREMAINDER_4:
221 cmpq    $0, %r10
222 je  DEND_4
223 DLOOP_4_2:
224 movdqu  (%rdi), %xmm1
225 movdqa    %xmm1 ,%xmm15
226 addq  $16, %rdi
227 pxor  (%r8), %xmm1
228 movdqu 160(%r8), %xmm2
229 cmpl    $12, %r9d
230 aesdec    16(%r8), %xmm1
231 aesdec   32(%r8), %xmm1
232 aesdec   48(%r8), %xmm1
233 aesdec   64(%r8), %xmm1
234 aesdec   80(%r8), %xmm1
235 aesdec   96(%r8), %xmm1
236 aesdec   112(%r8), %xmm1
237 aesdec  128(%r8), %xmm1
238 aesdec  144(%r8), %xmm1
239 jb  DLAST_4_2
240 movdqu    192(%r8), %xmm2
241 cmpl    $14, %r9d
242 aesdec    160(%r8), %xmm1
243 aesdec  176(%r8), %xmm1
244 jb  DLAST_4_2
245 movdqu    224(%r8), %xmm2
246 aesdec  192(%r8), %xmm1
247 aesdec  208(%r8), %xmm1
248 DLAST_4_2:
249 aesdeclast %xmm2, %xmm1
250 pxor    %xmm5, %xmm1
251 movdqa %xmm15, %xmm5
252 movdqu    %xmm1, (%rsi)
253
254 addq    $16, %rsi
255 decq    %r10
256 jne DLOOP_4_2
257 DEND_4:
258 ret
259
260
261
262
263 //void AES_128_Key_Expansion(const unsigned char* userkey,
264 //   unsigned char* key_schedule);
265 .align  16,0x90
266 .globl AES_128_Key_Expansion
267 AES_128_Key_Expansion:
268 # parameter 1: %rdi
269 # parameter 2: %rsi
270 movl    $10, 240(%rsi)
271
272 movdqu  (%rdi), %xmm1
273 movdqa    %xmm1, (%rsi)
274
275
276 ASSISTS:
277 aeskeygenassist $1, %xmm1, %xmm2
278 call PREPARE_ROUNDKEY_128
279 movdqa %xmm1, 16(%rsi)
280 aeskeygenassist $2, %xmm1, %xmm2
281 call PREPARE_ROUNDKEY_128
282 movdqa %xmm1, 32(%rsi)
283 aeskeygenassist $4, %xmm1, %xmm2
284 call PREPARE_ROUNDKEY_128
285 movdqa %xmm1, 48(%rsi)
286 aeskeygenassist $8, %xmm1, %xmm2
287 call PREPARE_ROUNDKEY_128
288 movdqa %xmm1, 64(%rsi)
289 aeskeygenassist $16, %xmm1, %xmm2
290 call PREPARE_ROUNDKEY_128
291 movdqa %xmm1, 80(%rsi)
292 aeskeygenassist $32, %xmm1, %xmm2
293 call PREPARE_ROUNDKEY_128
294 movdqa %xmm1, 96(%rsi)
295 aeskeygenassist $64, %xmm1, %xmm2
296 call PREPARE_ROUNDKEY_128
297 movdqa %xmm1, 112(%rsi)
298 aeskeygenassist $0x80, %xmm1, %xmm2
299 call PREPARE_ROUNDKEY_128
300 movdqa %xmm1, 128(%rsi)
301 aeskeygenassist $0x1b, %xmm1, %xmm2
302 call PREPARE_ROUNDKEY_128
303 movdqa %xmm1, 144(%rsi)
304 aeskeygenassist $0x36, %xmm1, %xmm2
305 call PREPARE_ROUNDKEY_128
306 movdqa %xmm1, 160(%rsi)
307 ret
308
309 PREPARE_ROUNDKEY_128:
310 pshufd $255, %xmm2, %xmm2
311 movdqa %xmm1, %xmm3
312 pslldq $4, %xmm3
313 pxor %xmm3, %xmm1
314 pslldq $4, %xmm3
315 pxor %xmm3, %xmm1
316 pslldq $4, %xmm3
317 pxor %xmm3, %xmm1
318 pxor %xmm2, %xmm1
319 ret
320
321
322 //void AES_192_Key_Expansion (const unsigned char *userkey,
323 //  unsigned char *key)
324 .globl AES_192_Key_Expansion
325 AES_192_Key_Expansion:
326 # parameter 1: %rdi
327 # parameter 2: %rsi
328
329 movdqu (%rdi), %xmm1
330 movdqu 16(%rdi), %xmm3
331 movdqa %xmm1, (%rsi)
332 movdqa %xmm3, %xmm5
333
334 aeskeygenassist $0x1, %xmm3, %xmm2
335 call PREPARE_ROUNDKEY_192
336 shufpd $0, %xmm1, %xmm5
337 movdqa %xmm5, 16(%rsi)
338 movdqa %xmm1, %xmm6
339 shufpd $1, %xmm3, %xmm6
340 movdqa %xmm6, 32(%rsi)
341
342 aeskeygenassist $0x2, %xmm3, %xmm2
343 call PREPARE_ROUNDKEY_192
344 movdqa %xmm1, 48(%rsi)
345 movdqa %xmm3, %xmm5
346
347 aeskeygenassist $0x4, %xmm3, %xmm2
348 call PREPARE_ROUNDKEY_192
349 shufpd $0, %xmm1, %xmm5
350 movdqa %xmm5, 64(%rsi)
351 movdqa %xmm1, %xmm6
352 shufpd $1, %xmm3, %xmm6
353 movdqa %xmm6, 80(%rsi)
354
355 aeskeygenassist $0x8, %xmm3, %xmm2
356 call PREPARE_ROUNDKEY_192
357 movdqa %xmm1, 96(%rsi)
358 movdqa %xmm3, %xmm5
359
360 aeskeygenassist $0x10, %xmm3, %xmm2
361 call PREPARE_ROUNDKEY_192
362 shufpd $0, %xmm1, %xmm5
363 movdqa %xmm5, 112(%rsi)
364 movdqa %xmm1, %xmm6
365 shufpd $1, %xmm3, %xmm6
366 movdqa %xmm6, 128(%rsi)
367
368 aeskeygenassist $0x20, %xmm3, %xmm2
369 call PREPARE_ROUNDKEY_192
370 movdqa %xmm1, 144(%rsi)
371 movdqa %xmm3, %xmm5
372
373 aeskeygenassist $0x40, %xmm3, %xmm2
374 call PREPARE_ROUNDKEY_192
375 shufpd $0, %xmm1, %xmm5
376 movdqa %xmm5, 160(%rsi)
377 movdqa %xmm1, %xmm6
378 shufpd $1, %xmm3, %xmm6
379 movdqa %xmm6, 176(%rsi)
380
381 aeskeygenassist $0x80, %xmm3, %xmm2
382 call PREPARE_ROUNDKEY_192
383 movdqa %xmm1, 192(%rsi)
384 movdqa %xmm3, 208(%rsi)
385 ret
386
387 PREPARE_ROUNDKEY_192:
388 pshufd $0x55, %xmm2, %xmm2
389 movdqu %xmm1, %xmm4
390 pslldq $4, %xmm4
391 pxor   %xmm4, %xmm1
392
393 pslldq $4, %xmm4
394 pxor   %xmm4, %xmm1
395 pslldq $4, %xmm4
396 pxor  %xmm4, %xmm1
397 pxor   %xmm2, %xmm1
398 pshufd $0xff, %xmm1, %xmm2
399 movdqu %xmm3, %xmm4
400 pslldq $4, %xmm4
401 pxor   %xmm4, %xmm3
402 pxor   %xmm2, %xmm3
403 ret
404  
405
406 //void AES_256_Key_Expansion (const unsigned char *userkey,
407 //  unsigned char *key)
408 .globl AES_256_Key_Expansion
409 AES_256_Key_Expansion:
410 # parameter 1: %rdi
411 # parameter 2: %rsi
412
413 movdqu (%rdi), %xmm1
414 movdqu 16(%rdi), %xmm3
415 movdqa %xmm1, (%rsi)
416 movdqa %xmm3, 16(%rsi)
417
418 aeskeygenassist $0x1, %xmm3, %xmm2
419 call MAKE_RK256_a
420 movdqa %xmm1, 32(%rsi)
421 aeskeygenassist $0x0, %xmm1, %xmm2
422 call MAKE_RK256_b
423 movdqa %xmm3, 48(%rsi)
424 aeskeygenassist $0x2, %xmm3, %xmm2
425 call MAKE_RK256_a
426 movdqa %xmm1, 64(%rsi)
427 aeskeygenassist $0x0, %xmm1, %xmm2
428 call MAKE_RK256_b
429 movdqa %xmm3, 80(%rsi)
430 aeskeygenassist $0x4, %xmm3, %xmm2
431 call MAKE_RK256_a
432 movdqa %xmm1, 96(%rsi)
433 aeskeygenassist $0x0, %xmm1, %xmm2
434 call MAKE_RK256_b
435 movdqa %xmm3, 112(%rsi)
436 aeskeygenassist $0x8, %xmm3, %xmm2
437 call MAKE_RK256_a
438 movdqa %xmm1, 128(%rsi)
439 aeskeygenassist $0x0, %xmm1, %xmm2
440 call MAKE_RK256_b
441 movdqa %xmm3, 144(%rsi)
442 aeskeygenassist $0x10, %xmm3, %xmm2
443 call MAKE_RK256_a
444 movdqa %xmm1, 160(%rsi)
445 aeskeygenassist $0x0, %xmm1, %xmm2
446 call MAKE_RK256_b
447 movdqa %xmm3, 176(%rsi)
448 aeskeygenassist $0x20, %xmm3, %xmm2
449 call MAKE_RK256_a
450 movdqa %xmm1, 192(%rsi)
451
452 aeskeygenassist $0x0, %xmm1, %xmm2
453 call MAKE_RK256_b
454 movdqa %xmm3, 208(%rsi)
455 aeskeygenassist $0x40, %xmm3, %xmm2
456 call MAKE_RK256_a
457 movdqa %xmm1, 224(%rsi)
458
459 ret
460
461 MAKE_RK256_a:
462 pshufd $0xff, %xmm2, %xmm2
463 movdqa %xmm1, %xmm4
464 pslldq $4, %xmm4
465 pxor   %xmm4, %xmm1
466 pslldq $4, %xmm4
467 pxor  %xmm4, %xmm1
468 pslldq $4, %xmm4
469 pxor  %xmm4, %xmm1
470 pxor   %xmm2, %xmm1
471 ret
472
473 MAKE_RK256_b:
474 pshufd $0xaa, %xmm2, %xmm2
475 movdqa %xmm3, %xmm4
476 pslldq $4, %xmm4
477 pxor   %xmm4, %xmm3
478 pslldq $4, %xmm4
479 pxor  %xmm4, %xmm3
480 pslldq $4, %xmm4
481 pxor  %xmm4, %xmm3
482 pxor   %xmm2, %xmm3
483 ret
484