bsaes-armv7.S revision 1.5 1 #include "arm_asm.h"
2 @ Copyright 2012-2020 The OpenSSL Project Authors. All Rights Reserved.
3 @
4 @ Licensed under the OpenSSL license (the "License"). You may not use
5 @ this file except in compliance with the License. You can obtain a copy
6 @ in the file LICENSE in the source distribution or at
7 @ https://www.openssl.org/source/license.html
8
9
10 @ ====================================================================
11 @ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
12 @ project. The module is, however, dual licensed under OpenSSL and
13 @ CRYPTOGAMS licenses depending on where you obtain it. For further
14 @ details see http://www.openssl.org/~appro/cryptogams/.
15 @
16 @ Specific modes and adaptation for Linux kernel by Ard Biesheuvel
17 @ of Linaro. Permission to use under GPL terms is granted.
18 @ ====================================================================
19
20 @ Bit-sliced AES for ARM NEON
21 @
22 @ February 2012.
23 @
24 @ This implementation is direct adaptation of bsaes-x86_64 module for
25 @ ARM NEON. Except that this module is endian-neutral [in sense that
26 @ it can be compiled for either endianness] by courtesy of vld1.8's
27 @ neutrality. Initial version doesn't implement interface to OpenSSL,
28 @ only low-level primitives and unsupported entry points, just enough
29 @ to collect performance results, which for Cortex-A8 core are:
30 @
31 @ encrypt 19.5 cycles per byte processed with 128-bit key
32 @ decrypt 22.1 cycles per byte processed with 128-bit key
33 @ key conv. 440 cycles per 128-bit key/0.18 of 8x block
34 @
35 @ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7,
36 @ which is [much] worse than anticipated (for further details see
37 @ http://www.openssl.org/~appro/Snapdragon-S4.html).
38 @
39 @ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code
40 @ manages in 20.0 cycles].
41 @
42 @ When comparing to x86_64 results keep in mind that NEON unit is
43 @ [mostly] single-issue and thus can't [fully] benefit from
44 @ instruction-level parallelism. And when comparing to aes-armv4
45 @ results keep in mind key schedule conversion overhead (see
46 @ bsaes-x86_64.pl for further details)...
47 @
48 @ <appro (at) openssl.org>
49
50 @ April-August 2013
51 @ Add CBC, CTR and XTS subroutines and adapt for kernel use; courtesy of Ard.
52
53 #ifndef __KERNEL__
54 # include "arm_arch.h"
55
56 # define VFP_ABI_PUSH vstmdb sp!,{d8-d15}
57 # define VFP_ABI_POP vldmia sp!,{d8-d15}
58 # define VFP_ABI_FRAME 0x40
59 #else
60 # define VFP_ABI_PUSH
61 # define VFP_ABI_POP
62 # define VFP_ABI_FRAME 0
63 # define BSAES_ASM_EXTENDED_KEY
64 # define XTS_CHAIN_TWEAK
65 # define __ARM_ARCH__ __LINUX_ARM_ARCH__
66 # define __ARM_MAX_ARCH__ 7
67 #endif
68
69 #ifdef __thumb__
70 # define adrl adr
71 #endif
72
73 #if __ARM_MAX_ARCH__>=7
74 .arch armv7-a
75 .fpu neon
76
77 .text
78 .syntax unified @ ARMv7-capable assembler is expected to handle this
79 #if defined(__thumb2__) && !defined(__APPLE__)
80 .thumb
81 #else
82 .code 32
83 # undef __thumb2__
84 #endif
85
86 .type _bsaes_decrypt8,%function
87 .align 4
88 _bsaes_decrypt8:
89 adr r6,.
90 vldmia r4!, {q9} @ round 0 key
91 #if defined(__thumb2__) || defined(__APPLE__)
92 adr r6,.LM0ISR
93 #else
94 add r6,r6,#.LM0ISR-_bsaes_decrypt8
95 #endif
96
97 vldmia r6!, {q8} @ .LM0ISR
98 veor q10, q0, q9 @ xor with round0 key
99 veor q11, q1, q9
100 vtbl.8 d0, {q10}, d16
101 vtbl.8 d1, {q10}, d17
102 veor q12, q2, q9
103 vtbl.8 d2, {q11}, d16
104 vtbl.8 d3, {q11}, d17
105 veor q13, q3, q9
106 vtbl.8 d4, {q12}, d16
107 vtbl.8 d5, {q12}, d17
108 veor q14, q4, q9
109 vtbl.8 d6, {q13}, d16
110 vtbl.8 d7, {q13}, d17
111 veor q15, q5, q9
112 vtbl.8 d8, {q14}, d16
113 vtbl.8 d9, {q14}, d17
114 veor q10, q6, q9
115 vtbl.8 d10, {q15}, d16
116 vtbl.8 d11, {q15}, d17
117 veor q11, q7, q9
118 vtbl.8 d12, {q10}, d16
119 vtbl.8 d13, {q10}, d17
120 vtbl.8 d14, {q11}, d16
121 vtbl.8 d15, {q11}, d17
122 vmov.i8 q8,#0x55 @ compose .LBS0
123 vmov.i8 q9,#0x33 @ compose .LBS1
124 vshr.u64 q10, q6, #1
125 vshr.u64 q11, q4, #1
126 veor q10, q10, q7
127 veor q11, q11, q5
128 vand q10, q10, q8
129 vand q11, q11, q8
130 veor q7, q7, q10
131 vshl.u64 q10, q10, #1
132 veor q5, q5, q11
133 vshl.u64 q11, q11, #1
134 veor q6, q6, q10
135 veor q4, q4, q11
136 vshr.u64 q10, q2, #1
137 vshr.u64 q11, q0, #1
138 veor q10, q10, q3
139 veor q11, q11, q1
140 vand q10, q10, q8
141 vand q11, q11, q8
142 veor q3, q3, q10
143 vshl.u64 q10, q10, #1
144 veor q1, q1, q11
145 vshl.u64 q11, q11, #1
146 veor q2, q2, q10
147 veor q0, q0, q11
148 vmov.i8 q8,#0x0f @ compose .LBS2
149 vshr.u64 q10, q5, #2
150 vshr.u64 q11, q4, #2
151 veor q10, q10, q7
152 veor q11, q11, q6
153 vand q10, q10, q9
154 vand q11, q11, q9
155 veor q7, q7, q10
156 vshl.u64 q10, q10, #2
157 veor q6, q6, q11
158 vshl.u64 q11, q11, #2
159 veor q5, q5, q10
160 veor q4, q4, q11
161 vshr.u64 q10, q1, #2
162 vshr.u64 q11, q0, #2
163 veor q10, q10, q3
164 veor q11, q11, q2
165 vand q10, q10, q9
166 vand q11, q11, q9
167 veor q3, q3, q10
168 vshl.u64 q10, q10, #2
169 veor q2, q2, q11
170 vshl.u64 q11, q11, #2
171 veor q1, q1, q10
172 veor q0, q0, q11
173 vshr.u64 q10, q3, #4
174 vshr.u64 q11, q2, #4
175 veor q10, q10, q7
176 veor q11, q11, q6
177 vand q10, q10, q8
178 vand q11, q11, q8
179 veor q7, q7, q10
180 vshl.u64 q10, q10, #4
181 veor q6, q6, q11
182 vshl.u64 q11, q11, #4
183 veor q3, q3, q10
184 veor q2, q2, q11
185 vshr.u64 q10, q1, #4
186 vshr.u64 q11, q0, #4
187 veor q10, q10, q5
188 veor q11, q11, q4
189 vand q10, q10, q8
190 vand q11, q11, q8
191 veor q5, q5, q10
192 vshl.u64 q10, q10, #4
193 veor q4, q4, q11
194 vshl.u64 q11, q11, #4
195 veor q1, q1, q10
196 veor q0, q0, q11
197 sub r5,r5,#1
198 b .Ldec_sbox
199 .align 4
200 .Ldec_loop:
201 vldmia r4!, {q8,q9,q10,q11}
202 veor q8, q8, q0
203 veor q9, q9, q1
204 vtbl.8 d0, {q8}, d24
205 vtbl.8 d1, {q8}, d25
206 vldmia r4!, {q8}
207 veor q10, q10, q2
208 vtbl.8 d2, {q9}, d24
209 vtbl.8 d3, {q9}, d25
210 vldmia r4!, {q9}
211 veor q11, q11, q3
212 vtbl.8 d4, {q10}, d24
213 vtbl.8 d5, {q10}, d25
214 vldmia r4!, {q10}
215 vtbl.8 d6, {q11}, d24
216 vtbl.8 d7, {q11}, d25
217 vldmia r4!, {q11}
218 veor q8, q8, q4
219 veor q9, q9, q5
220 vtbl.8 d8, {q8}, d24
221 vtbl.8 d9, {q8}, d25
222 veor q10, q10, q6
223 vtbl.8 d10, {q9}, d24
224 vtbl.8 d11, {q9}, d25
225 veor q11, q11, q7
226 vtbl.8 d12, {q10}, d24
227 vtbl.8 d13, {q10}, d25
228 vtbl.8 d14, {q11}, d24
229 vtbl.8 d15, {q11}, d25
230 .Ldec_sbox:
231 veor q1, q1, q4
232 veor q3, q3, q4
233
234 veor q4, q4, q7
235 veor q1, q1, q6
236 veor q2, q2, q7
237 veor q6, q6, q4
238
239 veor q0, q0, q1
240 veor q2, q2, q5
241 veor q7, q7, q6
242 veor q3, q3, q0
243 veor q5, q5, q0
244 veor q1, q1, q3
245 veor q11, q3, q0
246 veor q10, q7, q4
247 veor q9, q1, q6
248 veor q13, q4, q0
249 vmov q8, q10
250 veor q12, q5, q2
251
252 vorr q10, q10, q9
253 veor q15, q11, q8
254 vand q14, q11, q12
255 vorr q11, q11, q12
256 veor q12, q12, q9
257 vand q8, q8, q9
258 veor q9, q6, q2
259 vand q15, q15, q12
260 vand q13, q13, q9
261 veor q9, q3, q7
262 veor q12, q1, q5
263 veor q11, q11, q13
264 veor q10, q10, q13
265 vand q13, q9, q12
266 vorr q9, q9, q12
267 veor q11, q11, q15
268 veor q8, q8, q13
269 veor q10, q10, q14
270 veor q9, q9, q15
271 veor q8, q8, q14
272 vand q12, q4, q6
273 veor q9, q9, q14
274 vand q13, q0, q2
275 vand q14, q7, q1
276 vorr q15, q3, q5
277 veor q11, q11, q12
278 veor q9, q9, q14
279 veor q8, q8, q15
280 veor q10, q10, q13
281
282 @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
283
284 @ new smaller inversion
285
286 vand q14, q11, q9
287 vmov q12, q8
288
289 veor q13, q10, q14
290 veor q15, q8, q14
291 veor q14, q8, q14 @ q14=q15
292
293 vbsl q13, q9, q8
294 vbsl q15, q11, q10
295 veor q11, q11, q10
296
297 vbsl q12, q13, q14
298 vbsl q8, q14, q13
299
300 vand q14, q12, q15
301 veor q9, q9, q8
302
303 veor q14, q14, q11
304 veor q12, q5, q2
305 veor q8, q1, q6
306 veor q10, q15, q14
307 vand q10, q10, q5
308 veor q5, q5, q1
309 vand q11, q1, q15
310 vand q5, q5, q14
311 veor q1, q11, q10
312 veor q5, q5, q11
313 veor q15, q15, q13
314 veor q14, q14, q9
315 veor q11, q15, q14
316 veor q10, q13, q9
317 vand q11, q11, q12
318 vand q10, q10, q2
319 veor q12, q12, q8
320 veor q2, q2, q6
321 vand q8, q8, q15
322 vand q6, q6, q13
323 vand q12, q12, q14
324 vand q2, q2, q9
325 veor q8, q8, q12
326 veor q2, q2, q6
327 veor q12, q12, q11
328 veor q6, q6, q10
329 veor q5, q5, q12
330 veor q2, q2, q12
331 veor q1, q1, q8
332 veor q6, q6, q8
333
334 veor q12, q3, q0
335 veor q8, q7, q4
336 veor q11, q15, q14
337 veor q10, q13, q9
338 vand q11, q11, q12
339 vand q10, q10, q0
340 veor q12, q12, q8
341 veor q0, q0, q4
342 vand q8, q8, q15
343 vand q4, q4, q13
344 vand q12, q12, q14
345 vand q0, q0, q9
346 veor q8, q8, q12
347 veor q0, q0, q4
348 veor q12, q12, q11
349 veor q4, q4, q10
350 veor q15, q15, q13
351 veor q14, q14, q9
352 veor q10, q15, q14
353 vand q10, q10, q3
354 veor q3, q3, q7
355 vand q11, q7, q15
356 vand q3, q3, q14
357 veor q7, q11, q10
358 veor q3, q3, q11
359 veor q3, q3, q12
360 veor q0, q0, q12
361 veor q7, q7, q8
362 veor q4, q4, q8
363 veor q1, q1, q7
364 veor q6, q6, q5
365
366 veor q4, q4, q1
367 veor q2, q2, q7
368 veor q5, q5, q7
369 veor q4, q4, q2
370 veor q7, q7, q0
371 veor q4, q4, q5
372 veor q3, q3, q6
373 veor q6, q6, q1
374 veor q3, q3, q4
375
376 veor q4, q4, q0
377 veor q7, q7, q3
378 subs r5,r5,#1
379 bcc .Ldec_done
380 @ multiplication by 0x05-0x00-0x04-0x00
381 vext.8 q8, q0, q0, #8
382 vext.8 q14, q3, q3, #8
383 vext.8 q15, q5, q5, #8
384 veor q8, q8, q0
385 vext.8 q9, q1, q1, #8
386 veor q14, q14, q3
387 vext.8 q10, q6, q6, #8
388 veor q15, q15, q5
389 vext.8 q11, q4, q4, #8
390 veor q9, q9, q1
391 vext.8 q12, q2, q2, #8
392 veor q10, q10, q6
393 vext.8 q13, q7, q7, #8
394 veor q11, q11, q4
395 veor q12, q12, q2
396 veor q13, q13, q7
397
398 veor q0, q0, q14
399 veor q1, q1, q14
400 veor q6, q6, q8
401 veor q2, q2, q10
402 veor q4, q4, q9
403 veor q1, q1, q15
404 veor q6, q6, q15
405 veor q2, q2, q14
406 veor q7, q7, q11
407 veor q4, q4, q14
408 veor q3, q3, q12
409 veor q2, q2, q15
410 veor q7, q7, q15
411 veor q5, q5, q13
412 vext.8 q8, q0, q0, #12 @ x0 <<< 32
413 vext.8 q9, q1, q1, #12
414 veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
415 vext.8 q10, q6, q6, #12
416 veor q1, q1, q9
417 vext.8 q11, q4, q4, #12
418 veor q6, q6, q10
419 vext.8 q12, q2, q2, #12
420 veor q4, q4, q11
421 vext.8 q13, q7, q7, #12
422 veor q2, q2, q12
423 vext.8 q14, q3, q3, #12
424 veor q7, q7, q13
425 vext.8 q15, q5, q5, #12
426 veor q3, q3, q14
427
428 veor q9, q9, q0
429 veor q5, q5, q15
430 vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
431 veor q10, q10, q1
432 veor q8, q8, q5
433 veor q9, q9, q5
434 vext.8 q1, q1, q1, #8
435 veor q13, q13, q2
436 veor q0, q0, q8
437 veor q14, q14, q7
438 veor q1, q1, q9
439 vext.8 q8, q2, q2, #8
440 veor q12, q12, q4
441 vext.8 q9, q7, q7, #8
442 veor q15, q15, q3
443 vext.8 q2, q4, q4, #8
444 veor q11, q11, q6
445 vext.8 q7, q5, q5, #8
446 veor q12, q12, q5
447 vext.8 q4, q3, q3, #8
448 veor q11, q11, q5
449 vext.8 q3, q6, q6, #8
450 veor q5, q9, q13
451 veor q11, q11, q2
452 veor q7, q7, q15
453 veor q6, q4, q14
454 veor q4, q8, q12
455 veor q2, q3, q10
456 vmov q3, q11
457 @ vmov q5, q9
458 vldmia r6, {q12} @ .LISR
459 ite eq @ Thumb2 thing, sanity check in ARM
460 addeq r6,r6,#0x10
461 bne .Ldec_loop
462 vldmia r6, {q12} @ .LISRM0
463 b .Ldec_loop
464 .align 4
465 .Ldec_done:
466 vmov.i8 q8,#0x55 @ compose .LBS0
467 vmov.i8 q9,#0x33 @ compose .LBS1
468 vshr.u64 q10, q3, #1
469 vshr.u64 q11, q2, #1
470 veor q10, q10, q5
471 veor q11, q11, q7
472 vand q10, q10, q8
473 vand q11, q11, q8
474 veor q5, q5, q10
475 vshl.u64 q10, q10, #1
476 veor q7, q7, q11
477 vshl.u64 q11, q11, #1
478 veor q3, q3, q10
479 veor q2, q2, q11
480 vshr.u64 q10, q6, #1
481 vshr.u64 q11, q0, #1
482 veor q10, q10, q4
483 veor q11, q11, q1
484 vand q10, q10, q8
485 vand q11, q11, q8
486 veor q4, q4, q10
487 vshl.u64 q10, q10, #1
488 veor q1, q1, q11
489 vshl.u64 q11, q11, #1
490 veor q6, q6, q10
491 veor q0, q0, q11
492 vmov.i8 q8,#0x0f @ compose .LBS2
493 vshr.u64 q10, q7, #2
494 vshr.u64 q11, q2, #2
495 veor q10, q10, q5
496 veor q11, q11, q3
497 vand q10, q10, q9
498 vand q11, q11, q9
499 veor q5, q5, q10
500 vshl.u64 q10, q10, #2
501 veor q3, q3, q11
502 vshl.u64 q11, q11, #2
503 veor q7, q7, q10
504 veor q2, q2, q11
505 vshr.u64 q10, q1, #2
506 vshr.u64 q11, q0, #2
507 veor q10, q10, q4
508 veor q11, q11, q6
509 vand q10, q10, q9
510 vand q11, q11, q9
511 veor q4, q4, q10
512 vshl.u64 q10, q10, #2
513 veor q6, q6, q11
514 vshl.u64 q11, q11, #2
515 veor q1, q1, q10
516 veor q0, q0, q11
517 vshr.u64 q10, q4, #4
518 vshr.u64 q11, q6, #4
519 veor q10, q10, q5
520 veor q11, q11, q3
521 vand q10, q10, q8
522 vand q11, q11, q8
523 veor q5, q5, q10
524 vshl.u64 q10, q10, #4
525 veor q3, q3, q11
526 vshl.u64 q11, q11, #4
527 veor q4, q4, q10
528 veor q6, q6, q11
529 vshr.u64 q10, q1, #4
530 vshr.u64 q11, q0, #4
531 veor q10, q10, q7
532 veor q11, q11, q2
533 vand q10, q10, q8
534 vand q11, q11, q8
535 veor q7, q7, q10
536 vshl.u64 q10, q10, #4
537 veor q2, q2, q11
538 vshl.u64 q11, q11, #4
539 veor q1, q1, q10
540 veor q0, q0, q11
541 vldmia r4, {q8} @ last round key
542 veor q6, q6, q8
543 veor q4, q4, q8
544 veor q2, q2, q8
545 veor q7, q7, q8
546 veor q3, q3, q8
547 veor q5, q5, q8
548 veor q0, q0, q8
549 veor q1, q1, q8
550 RET
551 .size _bsaes_decrypt8,.-_bsaes_decrypt8
552
553 .type _bsaes_const,%object
554 .align 6
555 _bsaes_const:
556 .LM0ISR:@ InvShiftRows constants
557 .quad 0x0a0e0206070b0f03, 0x0004080c0d010509
558 .LISR:
559 .quad 0x0504070602010003, 0x0f0e0d0c080b0a09
560 .LISRM0:
561 .quad 0x01040b0e0205080f, 0x0306090c00070a0d
562 .LM0SR:@ ShiftRows constants
563 .quad 0x0a0e02060f03070b, 0x0004080c05090d01
564 .LSR:
565 .quad 0x0504070600030201, 0x0f0e0d0c0a09080b
566 .LSRM0:
567 .quad 0x0304090e00050a0f, 0x01060b0c0207080d
568 .LM0:
569 .quad 0x02060a0e03070b0f, 0x0004080c0105090d
570 .LREVM0SR:
571 .quad 0x090d01050c000408, 0x03070b0f060a0e02
572 .byte 66,105,116,45,115,108,105,99,101,100,32,65,69,83,32,102,111,114,32,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
573 .align 2
574 .align 6
575 .size _bsaes_const,.-_bsaes_const
576
577 .type _bsaes_encrypt8,%function
578 .align 4
579 _bsaes_encrypt8:
580 adr r6,.
581 vldmia r4!, {q9} @ round 0 key
582 #if defined(__thumb2__) || defined(__APPLE__)
583 adr r6,.LM0SR
584 #else
585 sub r6,r6,#_bsaes_encrypt8-.LM0SR
586 #endif
587
588 vldmia r6!, {q8} @ .LM0SR
589 _bsaes_encrypt8_alt:
590 veor q10, q0, q9 @ xor with round0 key
591 veor q11, q1, q9
592 vtbl.8 d0, {q10}, d16
593 vtbl.8 d1, {q10}, d17
594 veor q12, q2, q9
595 vtbl.8 d2, {q11}, d16
596 vtbl.8 d3, {q11}, d17
597 veor q13, q3, q9
598 vtbl.8 d4, {q12}, d16
599 vtbl.8 d5, {q12}, d17
600 veor q14, q4, q9
601 vtbl.8 d6, {q13}, d16
602 vtbl.8 d7, {q13}, d17
603 veor q15, q5, q9
604 vtbl.8 d8, {q14}, d16
605 vtbl.8 d9, {q14}, d17
606 veor q10, q6, q9
607 vtbl.8 d10, {q15}, d16
608 vtbl.8 d11, {q15}, d17
609 veor q11, q7, q9
610 vtbl.8 d12, {q10}, d16
611 vtbl.8 d13, {q10}, d17
612 vtbl.8 d14, {q11}, d16
613 vtbl.8 d15, {q11}, d17
614 _bsaes_encrypt8_bitslice:
615 vmov.i8 q8,#0x55 @ compose .LBS0
616 vmov.i8 q9,#0x33 @ compose .LBS1
617 vshr.u64 q10, q6, #1
618 vshr.u64 q11, q4, #1
619 veor q10, q10, q7
620 veor q11, q11, q5
621 vand q10, q10, q8
622 vand q11, q11, q8
623 veor q7, q7, q10
624 vshl.u64 q10, q10, #1
625 veor q5, q5, q11
626 vshl.u64 q11, q11, #1
627 veor q6, q6, q10
628 veor q4, q4, q11
629 vshr.u64 q10, q2, #1
630 vshr.u64 q11, q0, #1
631 veor q10, q10, q3
632 veor q11, q11, q1
633 vand q10, q10, q8
634 vand q11, q11, q8
635 veor q3, q3, q10
636 vshl.u64 q10, q10, #1
637 veor q1, q1, q11
638 vshl.u64 q11, q11, #1
639 veor q2, q2, q10
640 veor q0, q0, q11
641 vmov.i8 q8,#0x0f @ compose .LBS2
642 vshr.u64 q10, q5, #2
643 vshr.u64 q11, q4, #2
644 veor q10, q10, q7
645 veor q11, q11, q6
646 vand q10, q10, q9
647 vand q11, q11, q9
648 veor q7, q7, q10
649 vshl.u64 q10, q10, #2
650 veor q6, q6, q11
651 vshl.u64 q11, q11, #2
652 veor q5, q5, q10
653 veor q4, q4, q11
654 vshr.u64 q10, q1, #2
655 vshr.u64 q11, q0, #2
656 veor q10, q10, q3
657 veor q11, q11, q2
658 vand q10, q10, q9
659 vand q11, q11, q9
660 veor q3, q3, q10
661 vshl.u64 q10, q10, #2
662 veor q2, q2, q11
663 vshl.u64 q11, q11, #2
664 veor q1, q1, q10
665 veor q0, q0, q11
666 vshr.u64 q10, q3, #4
667 vshr.u64 q11, q2, #4
668 veor q10, q10, q7
669 veor q11, q11, q6
670 vand q10, q10, q8
671 vand q11, q11, q8
672 veor q7, q7, q10
673 vshl.u64 q10, q10, #4
674 veor q6, q6, q11
675 vshl.u64 q11, q11, #4
676 veor q3, q3, q10
677 veor q2, q2, q11
678 vshr.u64 q10, q1, #4
679 vshr.u64 q11, q0, #4
680 veor q10, q10, q5
681 veor q11, q11, q4
682 vand q10, q10, q8
683 vand q11, q11, q8
684 veor q5, q5, q10
685 vshl.u64 q10, q10, #4
686 veor q4, q4, q11
687 vshl.u64 q11, q11, #4
688 veor q1, q1, q10
689 veor q0, q0, q11
690 sub r5,r5,#1
691 b .Lenc_sbox
692 .align 4
693 .Lenc_loop:
694 vldmia r4!, {q8,q9,q10,q11}
695 veor q8, q8, q0
696 veor q9, q9, q1
697 vtbl.8 d0, {q8}, d24
698 vtbl.8 d1, {q8}, d25
699 vldmia r4!, {q8}
700 veor q10, q10, q2
701 vtbl.8 d2, {q9}, d24
702 vtbl.8 d3, {q9}, d25
703 vldmia r4!, {q9}
704 veor q11, q11, q3
705 vtbl.8 d4, {q10}, d24
706 vtbl.8 d5, {q10}, d25
707 vldmia r4!, {q10}
708 vtbl.8 d6, {q11}, d24
709 vtbl.8 d7, {q11}, d25
710 vldmia r4!, {q11}
711 veor q8, q8, q4
712 veor q9, q9, q5
713 vtbl.8 d8, {q8}, d24
714 vtbl.8 d9, {q8}, d25
715 veor q10, q10, q6
716 vtbl.8 d10, {q9}, d24
717 vtbl.8 d11, {q9}, d25
718 veor q11, q11, q7
719 vtbl.8 d12, {q10}, d24
720 vtbl.8 d13, {q10}, d25
721 vtbl.8 d14, {q11}, d24
722 vtbl.8 d15, {q11}, d25
723 .Lenc_sbox:
724 veor q2, q2, q1
725 veor q5, q5, q6
726 veor q3, q3, q0
727 veor q6, q6, q2
728 veor q5, q5, q0
729
730 veor q6, q6, q3
731 veor q3, q3, q7
732 veor q7, q7, q5
733 veor q3, q3, q4
734 veor q4, q4, q5
735
736 veor q2, q2, q7
737 veor q3, q3, q1
738 veor q1, q1, q5
739 veor q11, q7, q4
740 veor q10, q1, q2
741 veor q9, q5, q3
742 veor q13, q2, q4
743 vmov q8, q10
744 veor q12, q6, q0
745
746 vorr q10, q10, q9
747 veor q15, q11, q8
748 vand q14, q11, q12
749 vorr q11, q11, q12
750 veor q12, q12, q9
751 vand q8, q8, q9
752 veor q9, q3, q0
753 vand q15, q15, q12
754 vand q13, q13, q9
755 veor q9, q7, q1
756 veor q12, q5, q6
757 veor q11, q11, q13
758 veor q10, q10, q13
759 vand q13, q9, q12
760 vorr q9, q9, q12
761 veor q11, q11, q15
762 veor q8, q8, q13
763 veor q10, q10, q14
764 veor q9, q9, q15
765 veor q8, q8, q14
766 vand q12, q2, q3
767 veor q9, q9, q14
768 vand q13, q4, q0
769 vand q14, q1, q5
770 vorr q15, q7, q6
771 veor q11, q11, q12
772 veor q9, q9, q14
773 veor q8, q8, q15
774 veor q10, q10, q13
775
776 @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
777
778 @ new smaller inversion
779
780 vand q14, q11, q9
781 vmov q12, q8
782
783 veor q13, q10, q14
784 veor q15, q8, q14
785 veor q14, q8, q14 @ q14=q15
786
787 vbsl q13, q9, q8
788 vbsl q15, q11, q10
789 veor q11, q11, q10
790
791 vbsl q12, q13, q14
792 vbsl q8, q14, q13
793
794 vand q14, q12, q15
795 veor q9, q9, q8
796
797 veor q14, q14, q11
798 veor q12, q6, q0
799 veor q8, q5, q3
800 veor q10, q15, q14
801 vand q10, q10, q6
802 veor q6, q6, q5
803 vand q11, q5, q15
804 vand q6, q6, q14
805 veor q5, q11, q10
806 veor q6, q6, q11
807 veor q15, q15, q13
808 veor q14, q14, q9
809 veor q11, q15, q14
810 veor q10, q13, q9
811 vand q11, q11, q12
812 vand q10, q10, q0
813 veor q12, q12, q8
814 veor q0, q0, q3
815 vand q8, q8, q15
816 vand q3, q3, q13
817 vand q12, q12, q14
818 vand q0, q0, q9
819 veor q8, q8, q12
820 veor q0, q0, q3
821 veor q12, q12, q11
822 veor q3, q3, q10
823 veor q6, q6, q12
824 veor q0, q0, q12
825 veor q5, q5, q8
826 veor q3, q3, q8
827
828 veor q12, q7, q4
829 veor q8, q1, q2
830 veor q11, q15, q14
831 veor q10, q13, q9
832 vand q11, q11, q12
833 vand q10, q10, q4
834 veor q12, q12, q8
835 veor q4, q4, q2
836 vand q8, q8, q15
837 vand q2, q2, q13
838 vand q12, q12, q14
839 vand q4, q4, q9
840 veor q8, q8, q12
841 veor q4, q4, q2
842 veor q12, q12, q11
843 veor q2, q2, q10
844 veor q15, q15, q13
845 veor q14, q14, q9
846 veor q10, q15, q14
847 vand q10, q10, q7
848 veor q7, q7, q1
849 vand q11, q1, q15
850 vand q7, q7, q14
851 veor q1, q11, q10
852 veor q7, q7, q11
853 veor q7, q7, q12
854 veor q4, q4, q12
855 veor q1, q1, q8
856 veor q2, q2, q8
857 veor q7, q7, q0
858 veor q1, q1, q6
859 veor q6, q6, q0
860 veor q4, q4, q7
861 veor q0, q0, q1
862
863 veor q1, q1, q5
864 veor q5, q5, q2
865 veor q2, q2, q3
866 veor q3, q3, q5
867 veor q4, q4, q5
868
869 veor q6, q6, q3
870 subs r5,r5,#1
871 bcc .Lenc_done
872 vext.8 q8, q0, q0, #12 @ x0 <<< 32
873 vext.8 q9, q1, q1, #12
874 veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
875 vext.8 q10, q4, q4, #12
876 veor q1, q1, q9
877 vext.8 q11, q6, q6, #12
878 veor q4, q4, q10
879 vext.8 q12, q3, q3, #12
880 veor q6, q6, q11
881 vext.8 q13, q7, q7, #12
882 veor q3, q3, q12
883 vext.8 q14, q2, q2, #12
884 veor q7, q7, q13
885 vext.8 q15, q5, q5, #12
886 veor q2, q2, q14
887
888 veor q9, q9, q0
889 veor q5, q5, q15
890 vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
891 veor q10, q10, q1
892 veor q8, q8, q5
893 veor q9, q9, q5
894 vext.8 q1, q1, q1, #8
895 veor q13, q13, q3
896 veor q0, q0, q8
897 veor q14, q14, q7
898 veor q1, q1, q9
899 vext.8 q8, q3, q3, #8
900 veor q12, q12, q6
901 vext.8 q9, q7, q7, #8
902 veor q15, q15, q2
903 vext.8 q3, q6, q6, #8
904 veor q11, q11, q4
905 vext.8 q7, q5, q5, #8
906 veor q12, q12, q5
907 vext.8 q6, q2, q2, #8
908 veor q11, q11, q5
909 vext.8 q2, q4, q4, #8
910 veor q5, q9, q13
911 veor q4, q8, q12
912 veor q3, q3, q11
913 veor q7, q7, q15
914 veor q6, q6, q14
915 @ vmov q4, q8
916 veor q2, q2, q10
917 @ vmov q5, q9
918 vldmia r6, {q12} @ .LSR
919 ite eq @ Thumb2 thing, samity check in ARM
920 addeq r6,r6,#0x10
921 bne .Lenc_loop
922 vldmia r6, {q12} @ .LSRM0
923 b .Lenc_loop
924 .align 4
925 .Lenc_done:
926 vmov.i8 q8,#0x55 @ compose .LBS0
927 vmov.i8 q9,#0x33 @ compose .LBS1
928 vshr.u64 q10, q2, #1
929 vshr.u64 q11, q3, #1
930 veor q10, q10, q5
931 veor q11, q11, q7
932 vand q10, q10, q8
933 vand q11, q11, q8
934 veor q5, q5, q10
935 vshl.u64 q10, q10, #1
936 veor q7, q7, q11
937 vshl.u64 q11, q11, #1
938 veor q2, q2, q10
939 veor q3, q3, q11
940 vshr.u64 q10, q4, #1
941 vshr.u64 q11, q0, #1
942 veor q10, q10, q6
943 veor q11, q11, q1
944 vand q10, q10, q8
945 vand q11, q11, q8
946 veor q6, q6, q10
947 vshl.u64 q10, q10, #1
948 veor q1, q1, q11
949 vshl.u64 q11, q11, #1
950 veor q4, q4, q10
951 veor q0, q0, q11
952 vmov.i8 q8,#0x0f @ compose .LBS2
953 vshr.u64 q10, q7, #2
954 vshr.u64 q11, q3, #2
955 veor q10, q10, q5
956 veor q11, q11, q2
957 vand q10, q10, q9
958 vand q11, q11, q9
959 veor q5, q5, q10
960 vshl.u64 q10, q10, #2
961 veor q2, q2, q11
962 vshl.u64 q11, q11, #2
963 veor q7, q7, q10
964 veor q3, q3, q11
965 vshr.u64 q10, q1, #2
966 vshr.u64 q11, q0, #2
967 veor q10, q10, q6
968 veor q11, q11, q4
969 vand q10, q10, q9
970 vand q11, q11, q9
971 veor q6, q6, q10
972 vshl.u64 q10, q10, #2
973 veor q4, q4, q11
974 vshl.u64 q11, q11, #2
975 veor q1, q1, q10
976 veor q0, q0, q11
977 vshr.u64 q10, q6, #4
978 vshr.u64 q11, q4, #4
979 veor q10, q10, q5
980 veor q11, q11, q2
981 vand q10, q10, q8
982 vand q11, q11, q8
983 veor q5, q5, q10
984 vshl.u64 q10, q10, #4
985 veor q2, q2, q11
986 vshl.u64 q11, q11, #4
987 veor q6, q6, q10
988 veor q4, q4, q11
989 vshr.u64 q10, q1, #4
990 vshr.u64 q11, q0, #4
991 veor q10, q10, q7
992 veor q11, q11, q3
993 vand q10, q10, q8
994 vand q11, q11, q8
995 veor q7, q7, q10
996 vshl.u64 q10, q10, #4
997 veor q3, q3, q11
998 vshl.u64 q11, q11, #4
999 veor q1, q1, q10
1000 veor q0, q0, q11
1001 vldmia r4, {q8} @ last round key
1002 veor q4, q4, q8
1003 veor q6, q6, q8
1004 veor q3, q3, q8
1005 veor q7, q7, q8
1006 veor q2, q2, q8
1007 veor q5, q5, q8
1008 veor q0, q0, q8
1009 veor q1, q1, q8
1010 RET
1011 .size _bsaes_encrypt8,.-_bsaes_encrypt8
1012 .type _bsaes_key_convert,%function
1013 .align 4
1014 _bsaes_key_convert:
1015 adr r6,.
1016 vld1.8 {q7}, [r4]! @ load round 0 key
1017 #if defined(__thumb2__) || defined(__APPLE__)
1018 adr r6,.LM0
1019 #else
1020 sub r6,r6,#_bsaes_key_convert-.LM0
1021 #endif
1022 vld1.8 {q15}, [r4]! @ load round 1 key
1023
1024 vmov.i8 q8, #0x01 @ bit masks
1025 vmov.i8 q9, #0x02
1026 vmov.i8 q10, #0x04
1027 vmov.i8 q11, #0x08
1028 vmov.i8 q12, #0x10
1029 vmov.i8 q13, #0x20
1030 vldmia r6, {q14} @ .LM0
1031
1032 #ifdef __ARMEL__
1033 vrev32.8 q7, q7
1034 vrev32.8 q15, q15
1035 #endif
1036 sub r5,r5,#1
1037 vstmia r12!, {q7} @ save round 0 key
1038 b .Lkey_loop
1039
1040 .align 4
1041 .Lkey_loop:
1042 vtbl.8 d14,{q15},d28
1043 vtbl.8 d15,{q15},d29
1044 vmov.i8 q6, #0x40
1045 vmov.i8 q15, #0x80
1046
1047 vtst.8 q0, q7, q8
1048 vtst.8 q1, q7, q9
1049 vtst.8 q2, q7, q10
1050 vtst.8 q3, q7, q11
1051 vtst.8 q4, q7, q12
1052 vtst.8 q5, q7, q13
1053 vtst.8 q6, q7, q6
1054 vtst.8 q7, q7, q15
1055 vld1.8 {q15}, [r4]! @ load next round key
1056 vmvn q0, q0 @ "pnot"
1057 vmvn q1, q1
1058 vmvn q5, q5
1059 vmvn q6, q6
1060 #ifdef __ARMEL__
1061 vrev32.8 q15, q15
1062 #endif
1063 subs r5,r5,#1
1064 vstmia r12!,{q0,q1,q2,q3,q4,q5,q6,q7} @ write bit-sliced round key
1065 bne .Lkey_loop
1066
1067 vmov.i8 q7,#0x63 @ compose .L63
1068 @ don't save last round key
1069 RET
1070 .size _bsaes_key_convert,.-_bsaes_key_convert
1071
1072
1073
1074 .globl bsaes_cbc_encrypt
1075 .type bsaes_cbc_encrypt,%function
1076 .align 5
1077 bsaes_cbc_encrypt:
1078 #ifndef __KERNEL__
1079 cmp r2, #128
1080 #ifndef __thumb__
1081 blo AES_cbc_encrypt
1082 #else
1083 bhs 1f
1084 b AES_cbc_encrypt
1085 1:
1086 #endif
1087 #endif
1088
1089 @ it is up to the caller to make sure we are called with enc == 0
1090
1091 mov ip, sp
1092 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
1093 VFP_ABI_PUSH
1094 ldr r8, [ip] @ IV is 1st arg on the stack
1095 mov r2, r2, lsr#4 @ len in 16 byte blocks
1096 sub sp, #0x10 @ scratch space to carry over the IV
1097 mov r9, sp @ save sp
1098
1099 ldr r10, [r3, #240] @ get # of rounds
1100 #ifndef BSAES_ASM_EXTENDED_KEY
1101 @ allocate the key schedule on the stack
1102 sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
1103 add r12, #96 @ sifze of bit-slices key schedule
1104
1105 @ populate the key schedule
1106 mov r4, r3 @ pass key
1107 mov r5, r10 @ pass # of rounds
1108 mov sp, r12 @ sp is sp
1109 bl _bsaes_key_convert
1110 vldmia sp, {q6}
1111 vstmia r12, {q15} @ save last round key
1112 veor q7, q7, q6 @ fix up round 0 key
1113 vstmia sp, {q7}
1114 #else
1115 ldr r12, [r3, #244]
1116 eors r12, #1
1117 beq 0f
1118
1119 @ populate the key schedule
1120 str r12, [r3, #244]
1121 mov r4, r3 @ pass key
1122 mov r5, r10 @ pass # of rounds
1123 add r12, r3, #248 @ pass key schedule
1124 bl _bsaes_key_convert
1125 add r4, r3, #248
1126 vldmia r4, {q6}
1127 vstmia r12, {q15} @ save last round key
1128 veor q7, q7, q6 @ fix up round 0 key
1129 vstmia r4, {q7}
1130
1131 .align 2
1132
1133 #endif
1134
1135 vld1.8 {q15}, [r8] @ load IV
1136 b .Lcbc_dec_loop
1137
1138 .align 4
1139 .Lcbc_dec_loop:
1140 subs r2, r2, #0x8
1141 bmi .Lcbc_dec_loop_finish
1142
1143 vld1.8 {q0,q1}, [r0]! @ load input
1144 vld1.8 {q2,q3}, [r0]!
1145 #ifndef BSAES_ASM_EXTENDED_KEY
1146 mov r4, sp @ pass the key
1147 #else
1148 add r4, r3, #248
1149 #endif
1150 vld1.8 {q4,q5}, [r0]!
1151 mov r5, r10
1152 vld1.8 {q6,q7}, [r0]
1153 sub r0, r0, #0x60
1154 vstmia r9, {q15} @ put aside IV
1155
1156 bl _bsaes_decrypt8
1157
1158 vldmia r9, {q14} @ reload IV
1159 vld1.8 {q8,q9}, [r0]! @ reload input
1160 veor q0, q0, q14 @ ^= IV
1161 vld1.8 {q10,q11}, [r0]!
1162 veor q1, q1, q8
1163 veor q6, q6, q9
1164 vld1.8 {q12,q13}, [r0]!
1165 veor q4, q4, q10
1166 veor q2, q2, q11
1167 vld1.8 {q14,q15}, [r0]!
1168 veor q7, q7, q12
1169 vst1.8 {q0,q1}, [r1]! @ write output
1170 veor q3, q3, q13
1171 vst1.8 {q6}, [r1]!
1172 veor q5, q5, q14
1173 vst1.8 {q4}, [r1]!
1174 vst1.8 {q2}, [r1]!
1175 vst1.8 {q7}, [r1]!
1176 vst1.8 {q3}, [r1]!
1177 vst1.8 {q5}, [r1]!
1178
1179 b .Lcbc_dec_loop
1180
1181 .Lcbc_dec_loop_finish:
1182 adds r2, r2, #8
1183 beq .Lcbc_dec_done
1184
1185 vld1.8 {q0}, [r0]! @ load input
1186 cmp r2, #2
1187 blo .Lcbc_dec_one
1188 vld1.8 {q1}, [r0]!
1189 #ifndef BSAES_ASM_EXTENDED_KEY
1190 mov r4, sp @ pass the key
1191 #else
1192 add r4, r3, #248
1193 #endif
1194 mov r5, r10
1195 vstmia r9, {q15} @ put aside IV
1196 beq .Lcbc_dec_two
1197 vld1.8 {q2}, [r0]!
1198 cmp r2, #4
1199 blo .Lcbc_dec_three
1200 vld1.8 {q3}, [r0]!
1201 beq .Lcbc_dec_four
1202 vld1.8 {q4}, [r0]!
1203 cmp r2, #6
1204 blo .Lcbc_dec_five
1205 vld1.8 {q5}, [r0]!
1206 beq .Lcbc_dec_six
1207 vld1.8 {q6}, [r0]!
1208 sub r0, r0, #0x70
1209
1210 bl _bsaes_decrypt8
1211
1212 vldmia r9, {q14} @ reload IV
1213 vld1.8 {q8,q9}, [r0]! @ reload input
1214 veor q0, q0, q14 @ ^= IV
1215 vld1.8 {q10,q11}, [r0]!
1216 veor q1, q1, q8
1217 veor q6, q6, q9
1218 vld1.8 {q12,q13}, [r0]!
1219 veor q4, q4, q10
1220 veor q2, q2, q11
1221 vld1.8 {q15}, [r0]!
1222 veor q7, q7, q12
1223 vst1.8 {q0,q1}, [r1]! @ write output
1224 veor q3, q3, q13
1225 vst1.8 {q6}, [r1]!
1226 vst1.8 {q4}, [r1]!
1227 vst1.8 {q2}, [r1]!
1228 vst1.8 {q7}, [r1]!
1229 vst1.8 {q3}, [r1]!
1230 b .Lcbc_dec_done
1231 .align 4
1232 .Lcbc_dec_six:
1233 sub r0, r0, #0x60
1234 bl _bsaes_decrypt8
1235 vldmia r9,{q14} @ reload IV
1236 vld1.8 {q8,q9}, [r0]! @ reload input
1237 veor q0, q0, q14 @ ^= IV
1238 vld1.8 {q10,q11}, [r0]!
1239 veor q1, q1, q8
1240 veor q6, q6, q9
1241 vld1.8 {q12}, [r0]!
1242 veor q4, q4, q10
1243 veor q2, q2, q11
1244 vld1.8 {q15}, [r0]!
1245 veor q7, q7, q12
1246 vst1.8 {q0,q1}, [r1]! @ write output
1247 vst1.8 {q6}, [r1]!
1248 vst1.8 {q4}, [r1]!
1249 vst1.8 {q2}, [r1]!
1250 vst1.8 {q7}, [r1]!
1251 b .Lcbc_dec_done
1252 .align 4
1253 .Lcbc_dec_five:
1254 sub r0, r0, #0x50
1255 bl _bsaes_decrypt8
1256 vldmia r9, {q14} @ reload IV
1257 vld1.8 {q8,q9}, [r0]! @ reload input
1258 veor q0, q0, q14 @ ^= IV
1259 vld1.8 {q10,q11}, [r0]!
1260 veor q1, q1, q8
1261 veor q6, q6, q9
1262 vld1.8 {q15}, [r0]!
1263 veor q4, q4, q10
1264 vst1.8 {q0,q1}, [r1]! @ write output
1265 veor q2, q2, q11
1266 vst1.8 {q6}, [r1]!
1267 vst1.8 {q4}, [r1]!
1268 vst1.8 {q2}, [r1]!
1269 b .Lcbc_dec_done
1270 .align 4
1271 .Lcbc_dec_four:
1272 sub r0, r0, #0x40
1273 bl _bsaes_decrypt8
1274 vldmia r9, {q14} @ reload IV
1275 vld1.8 {q8,q9}, [r0]! @ reload input
1276 veor q0, q0, q14 @ ^= IV
1277 vld1.8 {q10}, [r0]!
1278 veor q1, q1, q8
1279 veor q6, q6, q9
1280 vld1.8 {q15}, [r0]!
1281 veor q4, q4, q10
1282 vst1.8 {q0,q1}, [r1]! @ write output
1283 vst1.8 {q6}, [r1]!
1284 vst1.8 {q4}, [r1]!
1285 b .Lcbc_dec_done
1286 .align 4
1287 .Lcbc_dec_three:
1288 sub r0, r0, #0x30
1289 bl _bsaes_decrypt8
1290 vldmia r9, {q14} @ reload IV
1291 vld1.8 {q8,q9}, [r0]! @ reload input
1292 veor q0, q0, q14 @ ^= IV
1293 vld1.8 {q15}, [r0]!
1294 veor q1, q1, q8
1295 veor q6, q6, q9
1296 vst1.8 {q0,q1}, [r1]! @ write output
1297 vst1.8 {q6}, [r1]!
1298 b .Lcbc_dec_done
1299 .align 4
1300 .Lcbc_dec_two:
1301 sub r0, r0, #0x20
1302 bl _bsaes_decrypt8
1303 vldmia r9, {q14} @ reload IV
1304 vld1.8 {q8}, [r0]! @ reload input
1305 veor q0, q0, q14 @ ^= IV
1306 vld1.8 {q15}, [r0]! @ reload input
1307 veor q1, q1, q8
1308 vst1.8 {q0,q1}, [r1]! @ write output
1309 b .Lcbc_dec_done
1310 .align 4
1311 .Lcbc_dec_one:
1312 sub r0, r0, #0x10
1313 mov r10, r1 @ save original out pointer
1314 mov r1, r9 @ use the iv scratch space as out buffer
1315 mov r2, r3
1316 vmov q4,q15 @ just in case ensure that IV
1317 vmov q5,q0 @ and input are preserved
1318 bl AES_decrypt
1319 vld1.8 {q0}, [r9] @ load result
1320 veor q0, q0, q4 @ ^= IV
1321 vmov q15, q5 @ q5 holds input
1322 vst1.8 {q0}, [r10] @ write output
1323
1324 .Lcbc_dec_done:
1325 #ifndef BSAES_ASM_EXTENDED_KEY
1326 vmov.i32 q0, #0
1327 vmov.i32 q1, #0
1328 .Lcbc_dec_bzero:@ wipe key schedule [if any]
1329 vstmia sp!, {q0,q1}
1330 cmp sp, r9
1331 bne .Lcbc_dec_bzero
1332 #endif
1333
1334 mov sp, r9
1335 add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
1336 vst1.8 {q15}, [r8] @ return IV
1337 VFP_ABI_POP
1338 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc}
1339 .size bsaes_cbc_encrypt,.-bsaes_cbc_encrypt
1340
1341 .globl bsaes_ctr32_encrypt_blocks
1342 .type bsaes_ctr32_encrypt_blocks,%function
1343 .align 5
1344 bsaes_ctr32_encrypt_blocks:
1345 cmp r2, #8 @ use plain AES for
1346 blo .Lctr_enc_short @ small sizes
1347
1348 mov ip, sp
1349 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
1350 VFP_ABI_PUSH
1351 ldr r8, [ip] @ ctr is 1st arg on the stack
1352 sub sp, sp, #0x10 @ scratch space to carry over the ctr
1353 mov r9, sp @ save sp
1354
1355 ldr r10, [r3, #240] @ get # of rounds
1356 #ifndef BSAES_ASM_EXTENDED_KEY
1357 @ allocate the key schedule on the stack
1358 sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
1359 add r12, #96 @ size of bit-sliced key schedule
1360
1361 @ populate the key schedule
1362 mov r4, r3 @ pass key
1363 mov r5, r10 @ pass # of rounds
1364 mov sp, r12 @ sp is sp
1365 bl _bsaes_key_convert
1366 veor q7,q7,q15 @ fix up last round key
1367 vstmia r12, {q7} @ save last round key
1368
1369 vld1.8 {q0}, [r8] @ load counter
1370 #ifdef __APPLE__
1371 mov r8, #:lower16:(.LREVM0SR-.LM0)
1372 add r8, r6, r8
1373 #else
1374 add r8, r6, #.LREVM0SR-.LM0 @ borrow r8
1375 #endif
1376 vldmia sp, {q4} @ load round0 key
1377 #else
1378 ldr r12, [r3, #244]
1379 eors r12, #1
1380 beq 0f
1381
1382 @ populate the key schedule
1383 str r12, [r3, #244]
1384 mov r4, r3 @ pass key
1385 mov r5, r10 @ pass # of rounds
1386 add r12, r3, #248 @ pass key schedule
1387 bl _bsaes_key_convert
1388 veor q7,q7,q15 @ fix up last round key
1389 vstmia r12, {q7} @ save last round key
1390
1391 .align 2
1392 add r12, r3, #248
1393 vld1.8 {q0}, [r8] @ load counter
1394 adrl r8, .LREVM0SR @ borrow r8
1395 vldmia r12, {q4} @ load round0 key
1396 sub sp, #0x10 @ place for adjusted round0 key
1397 #endif
1398
1399 vmov.i32 q8,#1 @ compose 1<<96
1400 veor q9,q9,q9
1401 vrev32.8 q0,q0
1402 vext.8 q8,q9,q8,#4
1403 vrev32.8 q4,q4
1404 vadd.u32 q9,q8,q8 @ compose 2<<96
1405 vstmia sp, {q4} @ save adjusted round0 key
1406 b .Lctr_enc_loop
1407
1408 .align 4
1409 .Lctr_enc_loop:
1410 vadd.u32 q10, q8, q9 @ compose 3<<96
1411 vadd.u32 q1, q0, q8 @ +1
1412 vadd.u32 q2, q0, q9 @ +2
1413 vadd.u32 q3, q0, q10 @ +3
1414 vadd.u32 q4, q1, q10
1415 vadd.u32 q5, q2, q10
1416 vadd.u32 q6, q3, q10
1417 vadd.u32 q7, q4, q10
1418 vadd.u32 q10, q5, q10 @ next counter
1419
1420 @ Borrow prologue from _bsaes_encrypt8 to use the opportunity
1421 @ to flip byte order in 32-bit counter
1422
1423 vldmia sp, {q9} @ load round0 key
1424 #ifndef BSAES_ASM_EXTENDED_KEY
1425 add r4, sp, #0x10 @ pass next round key
1426 #else
1427 add r4, r3, #264
1428 #endif
1429 vldmia r8, {q8} @ .LREVM0SR
1430 mov r5, r10 @ pass rounds
1431 vstmia r9, {q10} @ save next counter
1432 #ifdef __APPLE__
1433 mov r6, #:lower16:(.LREVM0SR-.LSR)
1434 sub r6, r8, r6
1435 #else
1436 sub r6, r8, #.LREVM0SR-.LSR @ pass constants
1437 #endif
1438
1439 bl _bsaes_encrypt8_alt
1440
1441 subs r2, r2, #8
1442 blo .Lctr_enc_loop_done
1443
1444 vld1.8 {q8,q9}, [r0]! @ load input
1445 vld1.8 {q10,q11}, [r0]!
1446 veor q0, q8
1447 veor q1, q9
1448 vld1.8 {q12,q13}, [r0]!
1449 veor q4, q10
1450 veor q6, q11
1451 vld1.8 {q14,q15}, [r0]!
1452 veor q3, q12
1453 vst1.8 {q0,q1}, [r1]! @ write output
1454 veor q7, q13
1455 veor q2, q14
1456 vst1.8 {q4}, [r1]!
1457 veor q5, q15
1458 vst1.8 {q6}, [r1]!
1459 vmov.i32 q8, #1 @ compose 1<<96
1460 vst1.8 {q3}, [r1]!
1461 veor q9, q9, q9
1462 vst1.8 {q7}, [r1]!
1463 vext.8 q8, q9, q8, #4
1464 vst1.8 {q2}, [r1]!
1465 vadd.u32 q9,q8,q8 @ compose 2<<96
1466 vst1.8 {q5}, [r1]!
1467 vldmia r9, {q0} @ load counter
1468
1469 bne .Lctr_enc_loop
1470 b .Lctr_enc_done
1471
1472 .align 4
1473 .Lctr_enc_loop_done:
1474 add r2, r2, #8
1475 vld1.8 {q8}, [r0]! @ load input
1476 veor q0, q8
1477 vst1.8 {q0}, [r1]! @ write output
1478 cmp r2, #2
1479 blo .Lctr_enc_done
1480 vld1.8 {q9}, [r0]!
1481 veor q1, q9
1482 vst1.8 {q1}, [r1]!
1483 beq .Lctr_enc_done
1484 vld1.8 {q10}, [r0]!
1485 veor q4, q10
1486 vst1.8 {q4}, [r1]!
1487 cmp r2, #4
1488 blo .Lctr_enc_done
1489 vld1.8 {q11}, [r0]!
1490 veor q6, q11
1491 vst1.8 {q6}, [r1]!
1492 beq .Lctr_enc_done
1493 vld1.8 {q12}, [r0]!
1494 veor q3, q12
1495 vst1.8 {q3}, [r1]!
1496 cmp r2, #6
1497 blo .Lctr_enc_done
1498 vld1.8 {q13}, [r0]!
1499 veor q7, q13
1500 vst1.8 {q7}, [r1]!
1501 beq .Lctr_enc_done
1502 vld1.8 {q14}, [r0]
1503 veor q2, q14
1504 vst1.8 {q2}, [r1]!
1505
1506 .Lctr_enc_done:
1507 vmov.i32 q0, #0
1508 vmov.i32 q1, #0
1509 #ifndef BSAES_ASM_EXTENDED_KEY
1510 .Lctr_enc_bzero:@ wipe key schedule [if any]
1511 vstmia sp!, {q0,q1}
1512 cmp sp, r9
1513 bne .Lctr_enc_bzero
1514 #else
1515 vstmia sp, {q0,q1}
1516 #endif
1517
1518 mov sp, r9
1519 add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
1520 VFP_ABI_POP
1521 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
1522
1523 .align 4
1524 .Lctr_enc_short:
1525 ldr ip, [sp] @ ctr pointer is passed on stack
1526 stmdb sp!, {r4,r5,r6,r7,r8, lr}
1527
1528 mov r4, r0 @ copy arguments
1529 mov r5, r1
1530 mov r6, r2
1531 mov r7, r3
1532 ldr r8, [ip, #12] @ load counter .LSW
1533 vld1.8 {q1}, [ip] @ load whole counter value
1534 #ifdef __ARMEL__
1535 rev r8, r8
1536 #endif
1537 sub sp, sp, #0x10
1538 vst1.8 {q1}, [sp] @ copy counter value
1539 sub sp, sp, #0x10
1540
1541 .Lctr_enc_short_loop:
1542 add r0, sp, #0x10 @ input counter value
1543 mov r1, sp @ output on the stack
1544 mov r2, r7 @ key
1545
1546 bl AES_encrypt
1547
1548 vld1.8 {q0}, [r4]! @ load input
1549 vld1.8 {q1}, [sp] @ load encrypted counter
1550 add r8, r8, #1
1551 #ifdef __ARMEL__
1552 rev r0, r8
1553 str r0, [sp, #0x1c] @ next counter value
1554 #else
1555 str r8, [sp, #0x1c] @ next counter value
1556 #endif
1557 veor q0,q0,q1
1558 vst1.8 {q0}, [r5]! @ store output
1559 subs r6, r6, #1
1560 bne .Lctr_enc_short_loop
1561
1562 vmov.i32 q0, #0
1563 vmov.i32 q1, #0
1564 vstmia sp!, {q0,q1}
1565
1566 ldmia sp!, {r4,r5,r6,r7,r8, pc}
1567 .size bsaes_ctr32_encrypt_blocks,.-bsaes_ctr32_encrypt_blocks
1568 .globl bsaes_xts_encrypt
1569 .type bsaes_xts_encrypt,%function
1570 .align 4
1571 bsaes_xts_encrypt:
1572 mov ip, sp
1573 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} @ 0x20
1574 VFP_ABI_PUSH
1575 mov r6, sp @ future r3
1576
1577 mov r7, r0
1578 mov r8, r1
1579 mov r9, r2
1580 mov r10, r3
1581
1582 sub r0, sp, #0x10 @ 0x10
1583 bic r0, #0xf @ align at 16 bytes
1584 mov sp, r0
1585
1586 #ifdef XTS_CHAIN_TWEAK
1587 ldr r0, [ip] @ pointer to input tweak
1588 #else
1589 @ generate initial tweak
1590 ldr r0, [ip, #4] @ iv[]
1591 mov r1, sp
1592 ldr r2, [ip, #0] @ key2
1593 bl AES_encrypt
1594 mov r0,sp @ pointer to initial tweak
1595 #endif
1596
1597 ldr r1, [r10, #240] @ get # of rounds
1598 mov r3, r6
1599 #ifndef BSAES_ASM_EXTENDED_KEY
1600 @ allocate the key schedule on the stack
1601 sub r12, sp, r1, lsl#7 @ 128 bytes per inner round key
1602 @ add r12, #96 @ size of bit-sliced key schedule
1603 sub r12, #48 @ place for tweak[9]
1604
1605 @ populate the key schedule
1606 mov r4, r10 @ pass key
1607 mov r5, r1 @ pass # of rounds
1608 mov sp, r12
1609 add r12, #0x90 @ pass key schedule
1610 bl _bsaes_key_convert
1611 veor q7, q7, q15 @ fix up last round key
1612 vstmia r12, {q7} @ save last round key
1613 #else
1614 ldr r12, [r10, #244]
1615 eors r12, #1
1616 beq 0f
1617
1618 str r12, [r10, #244]
1619 mov r4, r10 @ pass key
1620 mov r5, r1 @ pass # of rounds
1621 add r12, r10, #248 @ pass key schedule
1622 bl _bsaes_key_convert
1623 veor q7, q7, q15 @ fix up last round key
1624 vstmia r12, {q7}
1625
1626 .align 2
1627 sub sp, #0x90 @ place for tweak[9]
1628 #endif
1629
1630 vld1.8 {q8}, [r0] @ initial tweak
1631 adr r2, .Lxts_magic
1632
1633 subs r9, #0x80
1634 blo .Lxts_enc_short
1635 b .Lxts_enc_loop
1636
1637 .align 4
1638 .Lxts_enc_loop:
1639 vldmia r2, {q5} @ load XTS magic
1640 vshr.s64 q6, q8, #63
1641 mov r0, sp
1642 vand q6, q6, q5
1643 vadd.u64 q9, q8, q8
1644 vst1.64 {q8}, [r0,:128]!
1645 vswp d13,d12
1646 vshr.s64 q7, q9, #63
1647 veor q9, q9, q6
1648 vand q7, q7, q5
1649 vadd.u64 q10, q9, q9
1650 vst1.64 {q9}, [r0,:128]!
1651 vswp d15,d14
1652 vshr.s64 q6, q10, #63
1653 veor q10, q10, q7
1654 vand q6, q6, q5
1655 vld1.8 {q0}, [r7]!
1656 vadd.u64 q11, q10, q10
1657 vst1.64 {q10}, [r0,:128]!
1658 vswp d13,d12
1659 vshr.s64 q7, q11, #63
1660 veor q11, q11, q6
1661 vand q7, q7, q5
1662 vld1.8 {q1}, [r7]!
1663 veor q0, q0, q8
1664 vadd.u64 q12, q11, q11
1665 vst1.64 {q11}, [r0,:128]!
1666 vswp d15,d14
1667 vshr.s64 q6, q12, #63
1668 veor q12, q12, q7
1669 vand q6, q6, q5
1670 vld1.8 {q2}, [r7]!
1671 veor q1, q1, q9
1672 vadd.u64 q13, q12, q12
1673 vst1.64 {q12}, [r0,:128]!
1674 vswp d13,d12
1675 vshr.s64 q7, q13, #63
1676 veor q13, q13, q6
1677 vand q7, q7, q5
1678 vld1.8 {q3}, [r7]!
1679 veor q2, q2, q10
1680 vadd.u64 q14, q13, q13
1681 vst1.64 {q13}, [r0,:128]!
1682 vswp d15,d14
1683 vshr.s64 q6, q14, #63
1684 veor q14, q14, q7
1685 vand q6, q6, q5
1686 vld1.8 {q4}, [r7]!
1687 veor q3, q3, q11
1688 vadd.u64 q15, q14, q14
1689 vst1.64 {q14}, [r0,:128]!
1690 vswp d13,d12
1691 vshr.s64 q7, q15, #63
1692 veor q15, q15, q6
1693 vand q7, q7, q5
1694 vld1.8 {q5}, [r7]!
1695 veor q4, q4, q12
1696 vadd.u64 q8, q15, q15
1697 vst1.64 {q15}, [r0,:128]!
1698 vswp d15,d14
1699 veor q8, q8, q7
1700 vst1.64 {q8}, [r0,:128] @ next round tweak
1701
1702 vld1.8 {q6,q7}, [r7]!
1703 veor q5, q5, q13
1704 #ifndef BSAES_ASM_EXTENDED_KEY
1705 add r4, sp, #0x90 @ pass key schedule
1706 #else
1707 add r4, r10, #248 @ pass key schedule
1708 #endif
1709 veor q6, q6, q14
1710 mov r5, r1 @ pass rounds
1711 veor q7, q7, q15
1712 mov r0, sp
1713
1714 bl _bsaes_encrypt8
1715
1716 vld1.64 {q8,q9}, [r0,:128]!
1717 vld1.64 {q10,q11}, [r0,:128]!
1718 veor q0, q0, q8
1719 vld1.64 {q12,q13}, [r0,:128]!
1720 veor q1, q1, q9
1721 veor q8, q4, q10
1722 vst1.8 {q0,q1}, [r8]!
1723 veor q9, q6, q11
1724 vld1.64 {q14,q15}, [r0,:128]!
1725 veor q10, q3, q12
1726 vst1.8 {q8,q9}, [r8]!
1727 veor q11, q7, q13
1728 veor q12, q2, q14
1729 vst1.8 {q10,q11}, [r8]!
1730 veor q13, q5, q15
1731 vst1.8 {q12,q13}, [r8]!
1732
1733 vld1.64 {q8}, [r0,:128] @ next round tweak
1734
1735 subs r9, #0x80
1736 bpl .Lxts_enc_loop
1737
1738 .Lxts_enc_short:
1739 adds r9, #0x70
1740 bmi .Lxts_enc_done
1741
1742 vldmia r2, {q5} @ load XTS magic
1743 vshr.s64 q7, q8, #63
1744 mov r0, sp
1745 vand q7, q7, q5
1746 vadd.u64 q9, q8, q8
1747 vst1.64 {q8}, [r0,:128]!
1748 vswp d15,d14
1749 vshr.s64 q6, q9, #63
1750 veor q9, q9, q7
1751 vand q6, q6, q5
1752 vadd.u64 q10, q9, q9
1753 vst1.64 {q9}, [r0,:128]!
1754 vswp d13,d12
1755 vshr.s64 q7, q10, #63
1756 veor q10, q10, q6
1757 vand q7, q7, q5
1758 vld1.8 {q0}, [r7]!
1759 subs r9, #0x10
1760 bmi .Lxts_enc_1
1761 vadd.u64 q11, q10, q10
1762 vst1.64 {q10}, [r0,:128]!
1763 vswp d15,d14
1764 vshr.s64 q6, q11, #63
1765 veor q11, q11, q7
1766 vand q6, q6, q5
1767 vld1.8 {q1}, [r7]!
1768 subs r9, #0x10
1769 bmi .Lxts_enc_2
1770 veor q0, q0, q8
1771 vadd.u64 q12, q11, q11
1772 vst1.64 {q11}, [r0,:128]!
1773 vswp d13,d12
1774 vshr.s64 q7, q12, #63
1775 veor q12, q12, q6
1776 vand q7, q7, q5
1777 vld1.8 {q2}, [r7]!
1778 subs r9, #0x10
1779 bmi .Lxts_enc_3
1780 veor q1, q1, q9
1781 vadd.u64 q13, q12, q12
1782 vst1.64 {q12}, [r0,:128]!
1783 vswp d15,d14
1784 vshr.s64 q6, q13, #63
1785 veor q13, q13, q7
1786 vand q6, q6, q5
1787 vld1.8 {q3}, [r7]!
1788 subs r9, #0x10
1789 bmi .Lxts_enc_4
1790 veor q2, q2, q10
1791 vadd.u64 q14, q13, q13
1792 vst1.64 {q13}, [r0,:128]!
1793 vswp d13,d12
1794 vshr.s64 q7, q14, #63
1795 veor q14, q14, q6
1796 vand q7, q7, q5
1797 vld1.8 {q4}, [r7]!
1798 subs r9, #0x10
1799 bmi .Lxts_enc_5
1800 veor q3, q3, q11
1801 vadd.u64 q15, q14, q14
1802 vst1.64 {q14}, [r0,:128]!
1803 vswp d15,d14
1804 vshr.s64 q6, q15, #63
1805 veor q15, q15, q7
1806 vand q6, q6, q5
1807 vld1.8 {q5}, [r7]!
1808 subs r9, #0x10
1809 bmi .Lxts_enc_6
1810 veor q4, q4, q12
1811 sub r9, #0x10
1812 vst1.64 {q15}, [r0,:128] @ next round tweak
1813
1814 vld1.8 {q6}, [r7]!
1815 veor q5, q5, q13
1816 #ifndef BSAES_ASM_EXTENDED_KEY
1817 add r4, sp, #0x90 @ pass key schedule
1818 #else
1819 add r4, r10, #248 @ pass key schedule
1820 #endif
1821 veor q6, q6, q14
1822 mov r5, r1 @ pass rounds
1823 mov r0, sp
1824
1825 bl _bsaes_encrypt8
1826
1827 vld1.64 {q8,q9}, [r0,:128]!
1828 vld1.64 {q10,q11}, [r0,:128]!
1829 veor q0, q0, q8
1830 vld1.64 {q12,q13}, [r0,:128]!
1831 veor q1, q1, q9
1832 veor q8, q4, q10
1833 vst1.8 {q0,q1}, [r8]!
1834 veor q9, q6, q11
1835 vld1.64 {q14}, [r0,:128]!
1836 veor q10, q3, q12
1837 vst1.8 {q8,q9}, [r8]!
1838 veor q11, q7, q13
1839 veor q12, q2, q14
1840 vst1.8 {q10,q11}, [r8]!
1841 vst1.8 {q12}, [r8]!
1842
1843 vld1.64 {q8}, [r0,:128] @ next round tweak
1844 b .Lxts_enc_done
1845 .align 4
1846 .Lxts_enc_6:
1847 veor q4, q4, q12
1848 #ifndef BSAES_ASM_EXTENDED_KEY
1849 add r4, sp, #0x90 @ pass key schedule
1850 #else
1851 add r4, r10, #248 @ pass key schedule
1852 #endif
1853 veor q5, q5, q13
1854 mov r5, r1 @ pass rounds
1855 mov r0, sp
1856
1857 bl _bsaes_encrypt8
1858
1859 vld1.64 {q8,q9}, [r0,:128]!
1860 vld1.64 {q10,q11}, [r0,:128]!
1861 veor q0, q0, q8
1862 vld1.64 {q12,q13}, [r0,:128]!
1863 veor q1, q1, q9
1864 veor q8, q4, q10
1865 vst1.8 {q0,q1}, [r8]!
1866 veor q9, q6, q11
1867 veor q10, q3, q12
1868 vst1.8 {q8,q9}, [r8]!
1869 veor q11, q7, q13
1870 vst1.8 {q10,q11}, [r8]!
1871
1872 vld1.64 {q8}, [r0,:128] @ next round tweak
1873 b .Lxts_enc_done
1874
1875 @ put this in range for both ARM and Thumb mode adr instructions
1876 .align 5
1877 .Lxts_magic:
1878 .quad 1, 0x87
1879
1880 .align 5
1881 .Lxts_enc_5:
1882 veor q3, q3, q11
1883 #ifndef BSAES_ASM_EXTENDED_KEY
1884 add r4, sp, #0x90 @ pass key schedule
1885 #else
1886 add r4, r10, #248 @ pass key schedule
1887 #endif
1888 veor q4, q4, q12
1889 mov r5, r1 @ pass rounds
1890 mov r0, sp
1891
1892 bl _bsaes_encrypt8
1893
1894 vld1.64 {q8,q9}, [r0,:128]!
1895 vld1.64 {q10,q11}, [r0,:128]!
1896 veor q0, q0, q8
1897 vld1.64 {q12}, [r0,:128]!
1898 veor q1, q1, q9
1899 veor q8, q4, q10
1900 vst1.8 {q0,q1}, [r8]!
1901 veor q9, q6, q11
1902 veor q10, q3, q12
1903 vst1.8 {q8,q9}, [r8]!
1904 vst1.8 {q10}, [r8]!
1905
1906 vld1.64 {q8}, [r0,:128] @ next round tweak
1907 b .Lxts_enc_done
1908 .align 4
1909 .Lxts_enc_4:
1910 veor q2, q2, q10
1911 #ifndef BSAES_ASM_EXTENDED_KEY
1912 add r4, sp, #0x90 @ pass key schedule
1913 #else
1914 add r4, r10, #248 @ pass key schedule
1915 #endif
1916 veor q3, q3, q11
1917 mov r5, r1 @ pass rounds
1918 mov r0, sp
1919
1920 bl _bsaes_encrypt8
1921
1922 vld1.64 {q8,q9}, [r0,:128]!
1923 vld1.64 {q10,q11}, [r0,:128]!
1924 veor q0, q0, q8
1925 veor q1, q1, q9
1926 veor q8, q4, q10
1927 vst1.8 {q0,q1}, [r8]!
1928 veor q9, q6, q11
1929 vst1.8 {q8,q9}, [r8]!
1930
1931 vld1.64 {q8}, [r0,:128] @ next round tweak
1932 b .Lxts_enc_done
1933 .align 4
1934 .Lxts_enc_3:
1935 veor q1, q1, q9
1936 #ifndef BSAES_ASM_EXTENDED_KEY
1937 add r4, sp, #0x90 @ pass key schedule
1938 #else
1939 add r4, r10, #248 @ pass key schedule
1940 #endif
1941 veor q2, q2, q10
1942 mov r5, r1 @ pass rounds
1943 mov r0, sp
1944
1945 bl _bsaes_encrypt8
1946
1947 vld1.64 {q8,q9}, [r0,:128]!
1948 vld1.64 {q10}, [r0,:128]!
1949 veor q0, q0, q8
1950 veor q1, q1, q9
1951 veor q8, q4, q10
1952 vst1.8 {q0,q1}, [r8]!
1953 vst1.8 {q8}, [r8]!
1954
1955 vld1.64 {q8}, [r0,:128] @ next round tweak
1956 b .Lxts_enc_done
1957 .align 4
1958 .Lxts_enc_2:
1959 veor q0, q0, q8
1960 #ifndef BSAES_ASM_EXTENDED_KEY
1961 add r4, sp, #0x90 @ pass key schedule
1962 #else
1963 add r4, r10, #248 @ pass key schedule
1964 #endif
1965 veor q1, q1, q9
1966 mov r5, r1 @ pass rounds
1967 mov r0, sp
1968
1969 bl _bsaes_encrypt8
1970
1971 vld1.64 {q8,q9}, [r0,:128]!
1972 veor q0, q0, q8
1973 veor q1, q1, q9
1974 vst1.8 {q0,q1}, [r8]!
1975
1976 vld1.64 {q8}, [r0,:128] @ next round tweak
1977 b .Lxts_enc_done
1978 .align 4
1979 .Lxts_enc_1:
1980 mov r0, sp
1981 veor q0, q0, q8
1982 mov r1, sp
1983 vst1.8 {q0}, [sp,:128]
1984 mov r2, r10
1985 mov r4, r3 @ preserve fp
1986
1987 bl AES_encrypt
1988
1989 vld1.8 {q0}, [sp,:128]
1990 veor q0, q0, q8
1991 vst1.8 {q0}, [r8]!
1992 mov r3, r4
1993
1994 vmov q8, q9 @ next round tweak
1995
1996 .Lxts_enc_done:
1997 #ifndef XTS_CHAIN_TWEAK
1998 adds r9, #0x10
1999 beq .Lxts_enc_ret
2000 sub r6, r8, #0x10
2001
2002 .Lxts_enc_steal:
2003 ldrb r0, [r7], #1
2004 ldrb r1, [r8, #-0x10]
2005 strb r0, [r8, #-0x10]
2006 strb r1, [r8], #1
2007
2008 subs r9, #1
2009 bhi .Lxts_enc_steal
2010
2011 vld1.8 {q0}, [r6]
2012 mov r0, sp
2013 veor q0, q0, q8
2014 mov r1, sp
2015 vst1.8 {q0}, [sp,:128]
2016 mov r2, r10
2017 mov r4, r3 @ preserve fp
2018
2019 bl AES_encrypt
2020
2021 vld1.8 {q0}, [sp,:128]
2022 veor q0, q0, q8
2023 vst1.8 {q0}, [r6]
2024 mov r3, r4
2025 #endif
2026
2027 .Lxts_enc_ret:
2028 bic r0, r3, #0xf
2029 vmov.i32 q0, #0
2030 vmov.i32 q1, #0
2031 #ifdef XTS_CHAIN_TWEAK
2032 ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak
2033 #endif
2034 .Lxts_enc_bzero:@ wipe key schedule [if any]
2035 vstmia sp!, {q0,q1}
2036 cmp sp, r0
2037 bne .Lxts_enc_bzero
2038
2039 mov sp, r3
2040 #ifdef XTS_CHAIN_TWEAK
2041 vst1.8 {q8}, [r1]
2042 #endif
2043 VFP_ABI_POP
2044 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
2045
2046 .size bsaes_xts_encrypt,.-bsaes_xts_encrypt
2047
2048 .globl bsaes_xts_decrypt
2049 .type bsaes_xts_decrypt,%function
2050 .align 4
2051 bsaes_xts_decrypt:
2052 mov ip, sp
2053 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} @ 0x20
2054 VFP_ABI_PUSH
2055 mov r6, sp @ future r3
2056
2057 mov r7, r0
2058 mov r8, r1
2059 mov r9, r2
2060 mov r10, r3
2061
2062 sub r0, sp, #0x10 @ 0x10
2063 bic r0, #0xf @ align at 16 bytes
2064 mov sp, r0
2065
2066 #ifdef XTS_CHAIN_TWEAK
2067 ldr r0, [ip] @ pointer to input tweak
2068 #else
2069 @ generate initial tweak
2070 ldr r0, [ip, #4] @ iv[]
2071 mov r1, sp
2072 ldr r2, [ip, #0] @ key2
2073 bl AES_encrypt
2074 mov r0, sp @ pointer to initial tweak
2075 #endif
2076
2077 ldr r1, [r10, #240] @ get # of rounds
2078 mov r3, r6
2079 #ifndef BSAES_ASM_EXTENDED_KEY
2080 @ allocate the key schedule on the stack
2081 sub r12, sp, r1, lsl#7 @ 128 bytes per inner round key
2082 @ add r12, #96 @ size of bit-sliced key schedule
2083 sub r12, #48 @ place for tweak[9]
2084
2085 @ populate the key schedule
2086 mov r4, r10 @ pass key
2087 mov r5, r1 @ pass # of rounds
2088 mov sp, r12
2089 add r12, #0x90 @ pass key schedule
2090 bl _bsaes_key_convert
2091 add r4, sp, #0x90
2092 vldmia r4, {q6}
2093 vstmia r12, {q15} @ save last round key
2094 veor q7, q7, q6 @ fix up round 0 key
2095 vstmia r4, {q7}
2096 #else
2097 ldr r12, [r10, #244]
2098 eors r12, #1
2099 beq 0f
2100
2101 str r12, [r10, #244]
2102 mov r4, r10 @ pass key
2103 mov r5, r1 @ pass # of rounds
2104 add r12, r10, #248 @ pass key schedule
2105 bl _bsaes_key_convert
2106 add r4, r10, #248
2107 vldmia r4, {q6}
2108 vstmia r12, {q15} @ save last round key
2109 veor q7, q7, q6 @ fix up round 0 key
2110 vstmia r4, {q7}
2111
2112 .align 2
2113 sub sp, #0x90 @ place for tweak[9]
2114 #endif
2115 vld1.8 {q8}, [r0] @ initial tweak
2116 adr r2, .Lxts_magic
2117
2118 #ifndef XTS_CHAIN_TWEAK
2119 tst r9, #0xf @ if not multiple of 16
2120 it ne @ Thumb2 thing, sanity check in ARM
2121 subne r9, #0x10 @ subtract another 16 bytes
2122 #endif
2123 subs r9, #0x80
2124
2125 blo .Lxts_dec_short
2126 b .Lxts_dec_loop
2127
2128 .align 4
2129 .Lxts_dec_loop:
2130 vldmia r2, {q5} @ load XTS magic
2131 vshr.s64 q6, q8, #63
2132 mov r0, sp
2133 vand q6, q6, q5
2134 vadd.u64 q9, q8, q8
2135 vst1.64 {q8}, [r0,:128]!
2136 vswp d13,d12
2137 vshr.s64 q7, q9, #63
2138 veor q9, q9, q6
2139 vand q7, q7, q5
2140 vadd.u64 q10, q9, q9
2141 vst1.64 {q9}, [r0,:128]!
2142 vswp d15,d14
2143 vshr.s64 q6, q10, #63
2144 veor q10, q10, q7
2145 vand q6, q6, q5
2146 vld1.8 {q0}, [r7]!
2147 vadd.u64 q11, q10, q10
2148 vst1.64 {q10}, [r0,:128]!
2149 vswp d13,d12
2150 vshr.s64 q7, q11, #63
2151 veor q11, q11, q6
2152 vand q7, q7, q5
2153 vld1.8 {q1}, [r7]!
2154 veor q0, q0, q8
2155 vadd.u64 q12, q11, q11
2156 vst1.64 {q11}, [r0,:128]!
2157 vswp d15,d14
2158 vshr.s64 q6, q12, #63
2159 veor q12, q12, q7
2160 vand q6, q6, q5
2161 vld1.8 {q2}, [r7]!
2162 veor q1, q1, q9
2163 vadd.u64 q13, q12, q12
2164 vst1.64 {q12}, [r0,:128]!
2165 vswp d13,d12
2166 vshr.s64 q7, q13, #63
2167 veor q13, q13, q6
2168 vand q7, q7, q5
2169 vld1.8 {q3}, [r7]!
2170 veor q2, q2, q10
2171 vadd.u64 q14, q13, q13
2172 vst1.64 {q13}, [r0,:128]!
2173 vswp d15,d14
2174 vshr.s64 q6, q14, #63
2175 veor q14, q14, q7
2176 vand q6, q6, q5
2177 vld1.8 {q4}, [r7]!
2178 veor q3, q3, q11
2179 vadd.u64 q15, q14, q14
2180 vst1.64 {q14}, [r0,:128]!
2181 vswp d13,d12
2182 vshr.s64 q7, q15, #63
2183 veor q15, q15, q6
2184 vand q7, q7, q5
2185 vld1.8 {q5}, [r7]!
2186 veor q4, q4, q12
2187 vadd.u64 q8, q15, q15
2188 vst1.64 {q15}, [r0,:128]!
2189 vswp d15,d14
2190 veor q8, q8, q7
2191 vst1.64 {q8}, [r0,:128] @ next round tweak
2192
2193 vld1.8 {q6,q7}, [r7]!
2194 veor q5, q5, q13
2195 #ifndef BSAES_ASM_EXTENDED_KEY
2196 add r4, sp, #0x90 @ pass key schedule
2197 #else
2198 add r4, r10, #248 @ pass key schedule
2199 #endif
2200 veor q6, q6, q14
2201 mov r5, r1 @ pass rounds
2202 veor q7, q7, q15
2203 mov r0, sp
2204
2205 bl _bsaes_decrypt8
2206
2207 vld1.64 {q8,q9}, [r0,:128]!
2208 vld1.64 {q10,q11}, [r0,:128]!
2209 veor q0, q0, q8
2210 vld1.64 {q12,q13}, [r0,:128]!
2211 veor q1, q1, q9
2212 veor q8, q6, q10
2213 vst1.8 {q0,q1}, [r8]!
2214 veor q9, q4, q11
2215 vld1.64 {q14,q15}, [r0,:128]!
2216 veor q10, q2, q12
2217 vst1.8 {q8,q9}, [r8]!
2218 veor q11, q7, q13
2219 veor q12, q3, q14
2220 vst1.8 {q10,q11}, [r8]!
2221 veor q13, q5, q15
2222 vst1.8 {q12,q13}, [r8]!
2223
2224 vld1.64 {q8}, [r0,:128] @ next round tweak
2225
2226 subs r9, #0x80
2227 bpl .Lxts_dec_loop
2228
2229 .Lxts_dec_short:
2230 adds r9, #0x70
2231 bmi .Lxts_dec_done
2232
2233 vldmia r2, {q5} @ load XTS magic
2234 vshr.s64 q7, q8, #63
2235 mov r0, sp
2236 vand q7, q7, q5
2237 vadd.u64 q9, q8, q8
2238 vst1.64 {q8}, [r0,:128]!
2239 vswp d15,d14
2240 vshr.s64 q6, q9, #63
2241 veor q9, q9, q7
2242 vand q6, q6, q5
2243 vadd.u64 q10, q9, q9
2244 vst1.64 {q9}, [r0,:128]!
2245 vswp d13,d12
2246 vshr.s64 q7, q10, #63
2247 veor q10, q10, q6
2248 vand q7, q7, q5
2249 vld1.8 {q0}, [r7]!
2250 subs r9, #0x10
2251 bmi .Lxts_dec_1
2252 vadd.u64 q11, q10, q10
2253 vst1.64 {q10}, [r0,:128]!
2254 vswp d15,d14
2255 vshr.s64 q6, q11, #63
2256 veor q11, q11, q7
2257 vand q6, q6, q5
2258 vld1.8 {q1}, [r7]!
2259 subs r9, #0x10
2260 bmi .Lxts_dec_2
2261 veor q0, q0, q8
2262 vadd.u64 q12, q11, q11
2263 vst1.64 {q11}, [r0,:128]!
2264 vswp d13,d12
2265 vshr.s64 q7, q12, #63
2266 veor q12, q12, q6
2267 vand q7, q7, q5
2268 vld1.8 {q2}, [r7]!
2269 subs r9, #0x10
2270 bmi .Lxts_dec_3
2271 veor q1, q1, q9
2272 vadd.u64 q13, q12, q12
2273 vst1.64 {q12}, [r0,:128]!
2274 vswp d15,d14
2275 vshr.s64 q6, q13, #63
2276 veor q13, q13, q7
2277 vand q6, q6, q5
2278 vld1.8 {q3}, [r7]!
2279 subs r9, #0x10
2280 bmi .Lxts_dec_4
2281 veor q2, q2, q10
2282 vadd.u64 q14, q13, q13
2283 vst1.64 {q13}, [r0,:128]!
2284 vswp d13,d12
2285 vshr.s64 q7, q14, #63
2286 veor q14, q14, q6
2287 vand q7, q7, q5
2288 vld1.8 {q4}, [r7]!
2289 subs r9, #0x10
2290 bmi .Lxts_dec_5
2291 veor q3, q3, q11
2292 vadd.u64 q15, q14, q14
2293 vst1.64 {q14}, [r0,:128]!
2294 vswp d15,d14
2295 vshr.s64 q6, q15, #63
2296 veor q15, q15, q7
2297 vand q6, q6, q5
2298 vld1.8 {q5}, [r7]!
2299 subs r9, #0x10
2300 bmi .Lxts_dec_6
2301 veor q4, q4, q12
2302 sub r9, #0x10
2303 vst1.64 {q15}, [r0,:128] @ next round tweak
2304
2305 vld1.8 {q6}, [r7]!
2306 veor q5, q5, q13
2307 #ifndef BSAES_ASM_EXTENDED_KEY
2308 add r4, sp, #0x90 @ pass key schedule
2309 #else
2310 add r4, r10, #248 @ pass key schedule
2311 #endif
2312 veor q6, q6, q14
2313 mov r5, r1 @ pass rounds
2314 mov r0, sp
2315
2316 bl _bsaes_decrypt8
2317
2318 vld1.64 {q8,q9}, [r0,:128]!
2319 vld1.64 {q10,q11}, [r0,:128]!
2320 veor q0, q0, q8
2321 vld1.64 {q12,q13}, [r0,:128]!
2322 veor q1, q1, q9
2323 veor q8, q6, q10
2324 vst1.8 {q0,q1}, [r8]!
2325 veor q9, q4, q11
2326 vld1.64 {q14}, [r0,:128]!
2327 veor q10, q2, q12
2328 vst1.8 {q8,q9}, [r8]!
2329 veor q11, q7, q13
2330 veor q12, q3, q14
2331 vst1.8 {q10,q11}, [r8]!
2332 vst1.8 {q12}, [r8]!
2333
2334 vld1.64 {q8}, [r0,:128] @ next round tweak
2335 b .Lxts_dec_done
2336 .align 4
2337 .Lxts_dec_6:
2338 vst1.64 {q14}, [r0,:128] @ next round tweak
2339
2340 veor q4, q4, q12
2341 #ifndef BSAES_ASM_EXTENDED_KEY
2342 add r4, sp, #0x90 @ pass key schedule
2343 #else
2344 add r4, r10, #248 @ pass key schedule
2345 #endif
2346 veor q5, q5, q13
2347 mov r5, r1 @ pass rounds
2348 mov r0, sp
2349
2350 bl _bsaes_decrypt8
2351
2352 vld1.64 {q8,q9}, [r0,:128]!
2353 vld1.64 {q10,q11}, [r0,:128]!
2354 veor q0, q0, q8
2355 vld1.64 {q12,q13}, [r0,:128]!
2356 veor q1, q1, q9
2357 veor q8, q6, q10
2358 vst1.8 {q0,q1}, [r8]!
2359 veor q9, q4, q11
2360 veor q10, q2, q12
2361 vst1.8 {q8,q9}, [r8]!
2362 veor q11, q7, q13
2363 vst1.8 {q10,q11}, [r8]!
2364
2365 vld1.64 {q8}, [r0,:128] @ next round tweak
2366 b .Lxts_dec_done
2367 .align 4
2368 .Lxts_dec_5:
2369 veor q3, q3, q11
2370 #ifndef BSAES_ASM_EXTENDED_KEY
2371 add r4, sp, #0x90 @ pass key schedule
2372 #else
2373 add r4, r10, #248 @ pass key schedule
2374 #endif
2375 veor q4, q4, q12
2376 mov r5, r1 @ pass rounds
2377 mov r0, sp
2378
2379 bl _bsaes_decrypt8
2380
2381 vld1.64 {q8,q9}, [r0,:128]!
2382 vld1.64 {q10,q11}, [r0,:128]!
2383 veor q0, q0, q8
2384 vld1.64 {q12}, [r0,:128]!
2385 veor q1, q1, q9
2386 veor q8, q6, q10
2387 vst1.8 {q0,q1}, [r8]!
2388 veor q9, q4, q11
2389 veor q10, q2, q12
2390 vst1.8 {q8,q9}, [r8]!
2391 vst1.8 {q10}, [r8]!
2392
2393 vld1.64 {q8}, [r0,:128] @ next round tweak
2394 b .Lxts_dec_done
2395 .align 4
2396 .Lxts_dec_4:
2397 veor q2, q2, q10
2398 #ifndef BSAES_ASM_EXTENDED_KEY
2399 add r4, sp, #0x90 @ pass key schedule
2400 #else
2401 add r4, r10, #248 @ pass key schedule
2402 #endif
2403 veor q3, q3, q11
2404 mov r5, r1 @ pass rounds
2405 mov r0, sp
2406
2407 bl _bsaes_decrypt8
2408
2409 vld1.64 {q8,q9}, [r0,:128]!
2410 vld1.64 {q10,q11}, [r0,:128]!
2411 veor q0, q0, q8
2412 veor q1, q1, q9
2413 veor q8, q6, q10
2414 vst1.8 {q0,q1}, [r8]!
2415 veor q9, q4, q11
2416 vst1.8 {q8,q9}, [r8]!
2417
2418 vld1.64 {q8}, [r0,:128] @ next round tweak
2419 b .Lxts_dec_done
2420 .align 4
2421 .Lxts_dec_3:
2422 veor q1, q1, q9
2423 #ifndef BSAES_ASM_EXTENDED_KEY
2424 add r4, sp, #0x90 @ pass key schedule
2425 #else
2426 add r4, r10, #248 @ pass key schedule
2427 #endif
2428 veor q2, q2, q10
2429 mov r5, r1 @ pass rounds
2430 mov r0, sp
2431
2432 bl _bsaes_decrypt8
2433
2434 vld1.64 {q8,q9}, [r0,:128]!
2435 vld1.64 {q10}, [r0,:128]!
2436 veor q0, q0, q8
2437 veor q1, q1, q9
2438 veor q8, q6, q10
2439 vst1.8 {q0,q1}, [r8]!
2440 vst1.8 {q8}, [r8]!
2441
2442 vld1.64 {q8}, [r0,:128] @ next round tweak
2443 b .Lxts_dec_done
2444 .align 4
2445 .Lxts_dec_2:
2446 veor q0, q0, q8
2447 #ifndef BSAES_ASM_EXTENDED_KEY
2448 add r4, sp, #0x90 @ pass key schedule
2449 #else
2450 add r4, r10, #248 @ pass key schedule
2451 #endif
2452 veor q1, q1, q9
2453 mov r5, r1 @ pass rounds
2454 mov r0, sp
2455
2456 bl _bsaes_decrypt8
2457
2458 vld1.64 {q8,q9}, [r0,:128]!
2459 veor q0, q0, q8
2460 veor q1, q1, q9
2461 vst1.8 {q0,q1}, [r8]!
2462
2463 vld1.64 {q8}, [r0,:128] @ next round tweak
2464 b .Lxts_dec_done
2465 .align 4
2466 .Lxts_dec_1:
2467 mov r0, sp
2468 veor q0, q0, q8
2469 mov r1, sp
2470 vst1.8 {q0}, [sp,:128]
2471 mov r5, r2 @ preserve magic
2472 mov r2, r10
2473 mov r4, r3 @ preserve fp
2474
2475 bl AES_decrypt
2476
2477 vld1.8 {q0}, [sp,:128]
2478 veor q0, q0, q8
2479 vst1.8 {q0}, [r8]!
2480 mov r3, r4
2481 mov r2, r5
2482
2483 vmov q8, q9 @ next round tweak
2484
2485 .Lxts_dec_done:
2486 #ifndef XTS_CHAIN_TWEAK
2487 adds r9, #0x10
2488 beq .Lxts_dec_ret
2489
2490 @ calculate one round of extra tweak for the stolen ciphertext
2491 vldmia r2, {q5}
2492 vshr.s64 q6, q8, #63
2493 vand q6, q6, q5
2494 vadd.u64 q9, q8, q8
2495 vswp d13,d12
2496 veor q9, q9, q6
2497
2498 @ perform the final decryption with the last tweak value
2499 vld1.8 {q0}, [r7]!
2500 mov r0, sp
2501 veor q0, q0, q9
2502 mov r1, sp
2503 vst1.8 {q0}, [sp,:128]
2504 mov r2, r10
2505 mov r4, r3 @ preserve fp
2506
2507 bl AES_decrypt
2508
2509 vld1.8 {q0}, [sp,:128]
2510 veor q0, q0, q9
2511 vst1.8 {q0}, [r8]
2512
2513 mov r6, r8
2514 .Lxts_dec_steal:
2515 ldrb r1, [r8]
2516 ldrb r0, [r7], #1
2517 strb r1, [r8, #0x10]
2518 strb r0, [r8], #1
2519
2520 subs r9, #1
2521 bhi .Lxts_dec_steal
2522
2523 vld1.8 {q0}, [r6]
2524 mov r0, sp
2525 veor q0, q8
2526 mov r1, sp
2527 vst1.8 {q0}, [sp,:128]
2528 mov r2, r10
2529
2530 bl AES_decrypt
2531
2532 vld1.8 {q0}, [sp,:128]
2533 veor q0, q0, q8
2534 vst1.8 {q0}, [r6]
2535 mov r3, r4
2536 #endif
2537
2538 .Lxts_dec_ret:
2539 bic r0, r3, #0xf
2540 vmov.i32 q0, #0
2541 vmov.i32 q1, #0
2542 #ifdef XTS_CHAIN_TWEAK
2543 ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak
2544 #endif
2545 .Lxts_dec_bzero:@ wipe key schedule [if any]
2546 vstmia sp!, {q0,q1}
2547 cmp sp, r0
2548 bne .Lxts_dec_bzero
2549
2550 mov sp, r3
2551 #ifdef XTS_CHAIN_TWEAK
2552 vst1.8 {q8}, [r1]
2553 #endif
2554 VFP_ABI_POP
2555 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
2556
2557 .size bsaes_xts_decrypt,.-bsaes_xts_decrypt
2558 #endif
2559