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