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