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