Merge tag 'tty-4.0-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
[deliverable/linux.git] / arch / arm / crypto / aesbs-core.S_shipped
1
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/.
7 @
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 @ ====================================================================
12
13 @ Bit-sliced AES for ARM NEON
14 @
15 @ February 2012.
16 @
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:
23 @
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
27 @
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).
31 @
32 @ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code
33 @ manages in 20.0 cycles].
34 @
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)...
40 @
41 @ <appro@openssl.org>
42
43 @ April-August 2013
44 @
45 @ Add CBC, CTR and XTS subroutines, adapt for kernel use.
46 @
47 @ <ard.biesheuvel@linaro.org>
48
49 #ifndef __KERNEL__
50 # include "arm_arch.h"
51
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
64
65 #ifdef __thumb__
66 # define adrl adr
67 #endif
68
69 #if __ARM_MAX_ARCH__>=7
70 .arch armv7-a
71 .fpu neon
72
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
80
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
87
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
224
225 veor q4, q4, q7
226 veor q1, q1, q6
227 veor q2, q2, q7
228 veor q6, q6, q4
229
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
242
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
272
273 @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
274
275 @ new smaller inversion
276
277 vand q14, q11, q9
278 vmov q12, q8
279
280 veor q13, q10, q14
281 veor q15, q8, q14
282 veor q14, q8, q14 @ q14=q15
283
284 vbsl q13, q9, q8
285 vbsl q15, q11, q10
286 veor q11, q11, q10
287
288 vbsl q12, q13, q14
289 vbsl q8, q14, q13
290
291 vand q14, q12, q15
292 veor q9, q9, q8
293
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
324
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
356
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
366
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
388
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
418
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
543
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
566
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
573
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
715
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
721
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
731
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
761
762 @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
763
764 @ new smaller inversion
765
766 vand q14, q11, q9
767 vmov q12, q8
768
769 veor q13, q10, q14
770 veor q15, q8, q14
771 veor q14, q8, q14 @ q14=q15
772
773 vbsl q13, q9, q8
774 vbsl q15, q11, q10
775 veor q11, q11, q10
776
777 vbsl q12, q13, q14
778 vbsl q8, q14, q13
779
780 vand q14, q12, q15
781 veor q9, q9, q8
782
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
813
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
848
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
854
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
873
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
1005
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
1013
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
1021
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
1028
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
1048
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
1055
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
1067 1:
1068 #endif
1069 #endif
1070
1071 @ it is up to the caller to make sure we are called with enc == 0
1072
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
1080
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
1086
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
1100
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}
1112
1113 .align 2
1114 0:
1115 #endif
1116
1117 vld1.8 {q15}, [r8] @ load IV
1118 b .Lcbc_dec_loop
1119
1120 .align 4
1121 .Lcbc_dec_loop:
1122 subs r2, r2, #0x8
1123 bmi .Lcbc_dec_loop_finish
1124
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
1137
1138 bl _bsaes_decrypt8
1139
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]!
1160
1161 b .Lcbc_dec_loop
1162
1163 .Lcbc_dec_loop_finish:
1164 adds r2, r2, #8
1165 beq .Lcbc_dec_done
1166
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
1191
1192 bl _bsaes_decrypt8
1193
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
1305
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
1315
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
1329
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
1336
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
1342
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
1350
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
1358
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
1367
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
1375
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
1384
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
1396
1397 @ Borrow prologue from _bsaes_encrypt8 to use the opportunity
1398 @ to flip byte order in 32-bit counter
1399
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
1410
1411 bl _bsaes_encrypt8_alt
1412
1413 subs r2, r2, #8
1414 blo .Lctr_enc_loop_done
1415
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
1440
1441 bne .Lctr_enc_loop
1442 b .Lctr_enc_done
1443
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]!
1477
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
1489
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
1494
1495 .align 4
1496 .Lctr_enc_short:
1497 ldr ip, [sp] @ ctr pointer is passed on stack
1498 stmdb sp!, {r4-r8, lr}
1499
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
1512
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
1517
1518 bl AES_encrypt
1519
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
1533
1534 vmov.i32 q0, #0
1535 vmov.i32 q1, #0
1536 vstmia sp!, {q0-q1}
1537
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
1548
1549 mov r7, r0
1550 mov r8, r1
1551 mov r9, r2
1552 mov r10, r3
1553
1554 sub r0, sp, #0x10 @ 0x10
1555 bic r0, #0xf @ align at 16 bytes
1556 mov sp, r0
1557
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
1568
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]
1576
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
1589
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}
1597
1598 .align 2
1599 0: sub sp, #0x90 @ place for tweak[9]
1600 #endif
1601
1602 vld1.8 {q8}, [r0] @ initial tweak
1603 adr r2, .Lxts_magic
1604
1605 subs r9, #0x80
1606 blo .Lxts_enc_short
1607 b .Lxts_enc_loop
1608
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
1673
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
1685
1686 bl _bsaes_encrypt8
1687
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]!
1704
1705 vld1.64 {q8}, [r0,:128] @ next round tweak
1706
1707 subs r9, #0x80
1708 bpl .Lxts_enc_loop
1709
1710 .Lxts_enc_short:
1711 adds r9, #0x70
1712 bmi .Lxts_enc_done
1713
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
1785
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
1796
1797 bl _bsaes_encrypt8
1798
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]!
1814
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
1820
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
1830
1831 bl _bsaes_encrypt8
1832
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]!
1845
1846 vld1.64 {q8}, [r0,:128] @ next round tweak
1847 b .Lxts_enc_done
1848
1849 @ put this in range for both ARM and Thumb mode adr instructions
1850 .align 5
1851 .Lxts_magic:
1852 .quad 1, 0x87
1853
1854 .align 5
1855 .Lxts_enc_5:
1856 vst1.64 {q13}, [r0,:128] @ next round tweak
1857
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
1867
1868 bl _bsaes_encrypt8
1869
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]!
1881
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
1887
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
1897
1898 bl _bsaes_encrypt8
1899
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]!
1908
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
1914
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
1924
1925 bl _bsaes_encrypt8
1926
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]!
1934
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
1940
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
1950
1951 bl _bsaes_encrypt8
1952
1953 vld1.64 {q8-q9}, [r0,:128]!
1954 veor q0, q0, q8
1955 veor q1, q1, q9
1956 vst1.8 {q0-q1}, [r8]!
1957
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
1968
1969 bl AES_encrypt
1970
1971 vld1.8 {q0}, [sp,:128]
1972 veor q0, q0, q8
1973 vst1.8 {q0}, [r8]!
1974 mov r3, r4
1975
1976 vmov q8, q9 @ next round tweak
1977
1978 .Lxts_enc_done:
1979 #ifndef XTS_CHAIN_TWEAK
1980 adds r9, #0x10
1981 beq .Lxts_enc_ret
1982 sub r6, r8, #0x10
1983
1984 .Lxts_enc_steal:
1985 ldrb r0, [r7], #1
1986 ldrb r1, [r8, #-0x10]
1987 strb r0, [r8, #-0x10]
1988 strb r1, [r8], #1
1989
1990 subs r9, #1
1991 bhi .Lxts_enc_steal
1992
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
2000
2001 bl AES_encrypt
2002
2003 vld1.8 {q0}, [sp,:128]
2004 veor q0, q0, q8
2005 vst1.8 {q0}, [r6]
2006 mov r3, r4
2007 #endif
2008
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
2020
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
2027
2028 .size bsaes_xts_encrypt,.-bsaes_xts_encrypt
2029
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
2038
2039 mov r7, r0
2040 mov r8, r1
2041 mov r9, r2
2042 mov r10, r3
2043
2044 sub r0, sp, #0x10 @ 0x10
2045 bic r0, #0xf @ align at 16 bytes
2046 mov sp, r0
2047
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
2058
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]
2066
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
2082
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}
2093
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
2099
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
2106
2107 blo .Lxts_dec_short
2108 b .Lxts_dec_loop
2109
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
2174
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
2186
2187 bl _bsaes_decrypt8
2188
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]!
2205
2206 vld1.64 {q8}, [r0,:128] @ next round tweak
2207
2208 subs r9, #0x80
2209 bpl .Lxts_dec_loop
2210
2211 .Lxts_dec_short:
2212 adds r9, #0x70
2213 bmi .Lxts_dec_done
2214
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
2286
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
2297
2298 bl _bsaes_decrypt8
2299
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]!
2315
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
2321
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
2331
2332 bl _bsaes_decrypt8
2333
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]!
2346
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
2352
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
2362
2363 bl _bsaes_decrypt8
2364
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]!
2376
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
2382
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
2392
2393 bl _bsaes_decrypt8
2394
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]!
2403
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
2409
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
2419
2420 bl _bsaes_decrypt8
2421
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]!
2429
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
2435
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
2445
2446 bl _bsaes_decrypt8
2447
2448 vld1.64 {q8-q9}, [r0,:128]!
2449 veor q0, q0, q8
2450 veor q1, q1, q9
2451 vst1.8 {q0-q1}, [r8]!
2452
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
2464
2465 bl AES_decrypt
2466
2467 vld1.8 {q0}, [sp,:128]
2468 veor q0, q0, q8
2469 vst1.8 {q0}, [r8]!
2470 mov r3, r4
2471 mov r2, r5
2472
2473 vmov q8, q9 @ next round tweak
2474
2475 .Lxts_dec_done:
2476 #ifndef XTS_CHAIN_TWEAK
2477 adds r9, #0x10
2478 beq .Lxts_dec_ret
2479
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
2487
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
2496
2497 bl AES_decrypt
2498
2499 vld1.8 {q0}, [sp,:128]
2500 veor q0, q0, q9
2501 vst1.8 {q0}, [r8]
2502
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
2509
2510 subs r9, #1
2511 bhi .Lxts_dec_steal
2512
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
2519
2520 bl AES_decrypt
2521
2522 vld1.8 {q0}, [sp,:128]
2523 veor q0, q0, q8
2524 vst1.8 {q0}, [r6]
2525 mov r3, r4
2526 #endif
2527
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
2539
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
2546
2547 .size bsaes_xts_decrypt,.-bsaes_xts_decrypt
2548 #endif
This page took 0.082712 seconds and 6 git commands to generate.