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