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