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