blob: 8329a8c20294809af3bebe0534b4d1124f6c14c7 [file] [log] [blame]
Robert Sloanc9abfe42018-11-26 12:19:07 -08001// This file is generated from a similarly-named Perl script in the BoringSSL
2// source tree. Do not edit by hand.
3
Pete Bentley0c61efe2019-08-13 09:32:23 +01004#if !defined(__has_feature)
5#define __has_feature(x) 0
6#endif
Robert Sloan726e9d12018-09-11 11:45:04 -07007#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
8#define OPENSSL_NO_ASM
9#endif
Robert Sloan726e9d12018-09-11 11:45:04 -070010
11#if !defined(OPENSSL_NO_ASM)
12#if defined(BORINGSSL_PREFIX)
13#include <boringssl_prefix_symbols_asm.h>
14#endif
Robert Sloan8ff03552017-06-14 12:40:58 -070015@ Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved.
16@
17@ Licensed under the OpenSSL license (the "License"). You may not use
18@ this file except in compliance with the License. You can obtain a copy
19@ in the file LICENSE in the source distribution or at
20@ https://www.openssl.org/source/license.html
21
22
23@ ====================================================================
24@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
25@ project. The module is, however, dual licensed under OpenSSL and
26@ CRYPTOGAMS licenses depending on where you obtain it. For further
27@ details see http://www.openssl.org/~appro/cryptogams/.
28@
29@ Specific modes and adaptation for Linux kernel by Ard Biesheuvel
Robert Sloanab8b8882018-03-26 11:39:51 -070030@ of Linaro. Permission to use under GPL terms is granted.
Robert Sloan8ff03552017-06-14 12:40:58 -070031@ ====================================================================
32
33@ Bit-sliced AES for ARM NEON
34@
35@ February 2012.
36@
37@ This implementation is direct adaptation of bsaes-x86_64 module for
38@ ARM NEON. Except that this module is endian-neutral [in sense that
39@ it can be compiled for either endianness] by courtesy of vld1.8's
40@ neutrality. Initial version doesn't implement interface to OpenSSL,
41@ only low-level primitives and unsupported entry points, just enough
42@ to collect performance results, which for Cortex-A8 core are:
43@
44@ encrypt 19.5 cycles per byte processed with 128-bit key
45@ decrypt 22.1 cycles per byte processed with 128-bit key
46@ key conv. 440 cycles per 128-bit key/0.18 of 8x block
47@
48@ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7,
49@ which is [much] worse than anticipated (for further details see
50@ http://www.openssl.org/~appro/Snapdragon-S4.html).
51@
52@ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code
53@ manages in 20.0 cycles].
54@
55@ When comparing to x86_64 results keep in mind that NEON unit is
56@ [mostly] single-issue and thus can't [fully] benefit from
57@ instruction-level parallelism. And when comparing to aes-armv4
58@ results keep in mind key schedule conversion overhead (see
59@ bsaes-x86_64.pl for further details)...
60@
61@ <appro@openssl.org>
62
63@ April-August 2013
Robert Sloanab8b8882018-03-26 11:39:51 -070064@ Add CBC, CTR and XTS subroutines and adapt for kernel use; courtesy of Ard.
Robert Sloan8ff03552017-06-14 12:40:58 -070065
66#ifndef __KERNEL__
67# include <openssl/arm_arch.h>
68
69# define VFP_ABI_PUSH vstmdb sp!,{d8-d15}
70# define VFP_ABI_POP vldmia sp!,{d8-d15}
71# define VFP_ABI_FRAME 0x40
72#else
73# define VFP_ABI_PUSH
74# define VFP_ABI_POP
75# define VFP_ABI_FRAME 0
76# define BSAES_ASM_EXTENDED_KEY
77# define XTS_CHAIN_TWEAK
78# define __ARM_ARCH__ __LINUX_ARM_ARCH__
79# define __ARM_MAX_ARCH__ 7
80#endif
81
82#ifdef __thumb__
83# define adrl adr
84#endif
85
86#if __ARM_MAX_ARCH__>=7
87
88
89
90.text
91.syntax unified @ ARMv7-capable assembler is expected to handle this
92#if defined(__thumb2__) && !defined(__APPLE__)
93.thumb
94#else
95.code 32
96# undef __thumb2__
97#endif
98
99#ifdef __thumb2__
100.thumb_func _bsaes_decrypt8
101#endif
102.align 4
103_bsaes_decrypt8:
Robert Sloand5c22152017-11-13 09:22:12 -0800104 adr r6,.
Robert Sloan8ff03552017-06-14 12:40:58 -0700105 vldmia r4!, {q9} @ round 0 key
Robert Sloanab8b8882018-03-26 11:39:51 -0700106#if defined(__thumb2__) || defined(__APPLE__)
Robert Sloan8ff03552017-06-14 12:40:58 -0700107 adr r6,LM0ISR
108#else
109 add r6,r6,#LM0ISR-_bsaes_decrypt8
110#endif
111
112 vldmia r6!, {q8} @ LM0ISR
113 veor q10, q0, q9 @ xor with round0 key
114 veor q11, q1, q9
115 vtbl.8 d0, {q10}, d16
116 vtbl.8 d1, {q10}, d17
117 veor q12, q2, q9
118 vtbl.8 d2, {q11}, d16
119 vtbl.8 d3, {q11}, d17
120 veor q13, q3, q9
121 vtbl.8 d4, {q12}, d16
122 vtbl.8 d5, {q12}, d17
123 veor q14, q4, q9
124 vtbl.8 d6, {q13}, d16
125 vtbl.8 d7, {q13}, d17
126 veor q15, q5, q9
127 vtbl.8 d8, {q14}, d16
128 vtbl.8 d9, {q14}, d17
129 veor q10, q6, q9
130 vtbl.8 d10, {q15}, d16
131 vtbl.8 d11, {q15}, d17
132 veor q11, q7, q9
133 vtbl.8 d12, {q10}, d16
134 vtbl.8 d13, {q10}, d17
135 vtbl.8 d14, {q11}, d16
136 vtbl.8 d15, {q11}, d17
137 vmov.i8 q8,#0x55 @ compose LBS0
138 vmov.i8 q9,#0x33 @ compose LBS1
139 vshr.u64 q10, q6, #1
140 vshr.u64 q11, q4, #1
141 veor q10, q10, q7
142 veor q11, q11, q5
143 vand q10, q10, q8
144 vand q11, q11, q8
145 veor q7, q7, q10
146 vshl.u64 q10, q10, #1
147 veor q5, q5, q11
148 vshl.u64 q11, q11, #1
149 veor q6, q6, q10
150 veor q4, q4, q11
151 vshr.u64 q10, q2, #1
152 vshr.u64 q11, q0, #1
153 veor q10, q10, q3
154 veor q11, q11, q1
155 vand q10, q10, q8
156 vand q11, q11, q8
157 veor q3, q3, q10
158 vshl.u64 q10, q10, #1
159 veor q1, q1, q11
160 vshl.u64 q11, q11, #1
161 veor q2, q2, q10
162 veor q0, q0, q11
163 vmov.i8 q8,#0x0f @ compose LBS2
164 vshr.u64 q10, q5, #2
165 vshr.u64 q11, q4, #2
166 veor q10, q10, q7
167 veor q11, q11, q6
168 vand q10, q10, q9
169 vand q11, q11, q9
170 veor q7, q7, q10
171 vshl.u64 q10, q10, #2
172 veor q6, q6, q11
173 vshl.u64 q11, q11, #2
174 veor q5, q5, q10
175 veor q4, q4, q11
176 vshr.u64 q10, q1, #2
177 vshr.u64 q11, q0, #2
178 veor q10, q10, q3
179 veor q11, q11, q2
180 vand q10, q10, q9
181 vand q11, q11, q9
182 veor q3, q3, q10
183 vshl.u64 q10, q10, #2
184 veor q2, q2, q11
185 vshl.u64 q11, q11, #2
186 veor q1, q1, q10
187 veor q0, q0, q11
188 vshr.u64 q10, q3, #4
189 vshr.u64 q11, q2, #4
190 veor q10, q10, q7
191 veor q11, q11, q6
192 vand q10, q10, q8
193 vand q11, q11, q8
194 veor q7, q7, q10
195 vshl.u64 q10, q10, #4
196 veor q6, q6, q11
197 vshl.u64 q11, q11, #4
198 veor q3, q3, q10
199 veor q2, q2, q11
200 vshr.u64 q10, q1, #4
201 vshr.u64 q11, q0, #4
202 veor q10, q10, q5
203 veor q11, q11, q4
204 vand q10, q10, q8
205 vand q11, q11, q8
206 veor q5, q5, q10
207 vshl.u64 q10, q10, #4
208 veor q4, q4, q11
209 vshl.u64 q11, q11, #4
210 veor q1, q1, q10
211 veor q0, q0, q11
212 sub r5,r5,#1
213 b Ldec_sbox
214.align 4
215Ldec_loop:
216 vldmia r4!, {q8,q9,q10,q11}
217 veor q8, q8, q0
218 veor q9, q9, q1
219 vtbl.8 d0, {q8}, d24
220 vtbl.8 d1, {q8}, d25
221 vldmia r4!, {q8}
222 veor q10, q10, q2
223 vtbl.8 d2, {q9}, d24
224 vtbl.8 d3, {q9}, d25
225 vldmia r4!, {q9}
226 veor q11, q11, q3
227 vtbl.8 d4, {q10}, d24
228 vtbl.8 d5, {q10}, d25
229 vldmia r4!, {q10}
230 vtbl.8 d6, {q11}, d24
231 vtbl.8 d7, {q11}, d25
232 vldmia r4!, {q11}
233 veor q8, q8, q4
234 veor q9, q9, q5
235 vtbl.8 d8, {q8}, d24
236 vtbl.8 d9, {q8}, d25
237 veor q10, q10, q6
238 vtbl.8 d10, {q9}, d24
239 vtbl.8 d11, {q9}, d25
240 veor q11, q11, q7
241 vtbl.8 d12, {q10}, d24
242 vtbl.8 d13, {q10}, d25
243 vtbl.8 d14, {q11}, d24
244 vtbl.8 d15, {q11}, d25
245Ldec_sbox:
246 veor q1, q1, q4
247 veor q3, q3, q4
248
249 veor q4, q4, q7
250 veor q1, q1, q6
251 veor q2, q2, q7
252 veor q6, q6, q4
253
254 veor q0, q0, q1
255 veor q2, q2, q5
256 veor q7, q7, q6
257 veor q3, q3, q0
258 veor q5, q5, q0
259 veor q1, q1, q3
260 veor q11, q3, q0
261 veor q10, q7, q4
262 veor q9, q1, q6
263 veor q13, q4, q0
264 vmov q8, q10
265 veor q12, q5, q2
266
267 vorr q10, q10, q9
268 veor q15, q11, q8
269 vand q14, q11, q12
270 vorr q11, q11, q12
271 veor q12, q12, q9
272 vand q8, q8, q9
273 veor q9, q6, q2
274 vand q15, q15, q12
275 vand q13, q13, q9
276 veor q9, q3, q7
277 veor q12, q1, q5
278 veor q11, q11, q13
279 veor q10, q10, q13
280 vand q13, q9, q12
281 vorr q9, q9, q12
282 veor q11, q11, q15
283 veor q8, q8, q13
284 veor q10, q10, q14
285 veor q9, q9, q15
286 veor q8, q8, q14
287 vand q12, q4, q6
288 veor q9, q9, q14
289 vand q13, q0, q2
290 vand q14, q7, q1
291 vorr q15, q3, q5
292 veor q11, q11, q12
293 veor q9, q9, q14
294 veor q8, q8, q15
295 veor q10, q10, q13
296
297 @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
298
299 @ new smaller inversion
300
301 vand q14, q11, q9
302 vmov q12, q8
303
304 veor q13, q10, q14
305 veor q15, q8, q14
306 veor q14, q8, q14 @ q14=q15
307
308 vbsl q13, q9, q8
309 vbsl q15, q11, q10
310 veor q11, q11, q10
311
312 vbsl q12, q13, q14
313 vbsl q8, q14, q13
314
315 vand q14, q12, q15
316 veor q9, q9, q8
317
318 veor q14, q14, q11
319 veor q12, q5, q2
320 veor q8, q1, q6
321 veor q10, q15, q14
322 vand q10, q10, q5
323 veor q5, q5, q1
324 vand q11, q1, q15
325 vand q5, q5, q14
326 veor q1, q11, q10
327 veor q5, q5, q11
328 veor q15, q15, q13
329 veor q14, q14, q9
330 veor q11, q15, q14
331 veor q10, q13, q9
332 vand q11, q11, q12
333 vand q10, q10, q2
334 veor q12, q12, q8
335 veor q2, q2, q6
336 vand q8, q8, q15
337 vand q6, q6, q13
338 vand q12, q12, q14
339 vand q2, q2, q9
340 veor q8, q8, q12
341 veor q2, q2, q6
342 veor q12, q12, q11
343 veor q6, q6, q10
344 veor q5, q5, q12
345 veor q2, q2, q12
346 veor q1, q1, q8
347 veor q6, q6, q8
348
349 veor q12, q3, q0
350 veor q8, q7, q4
351 veor q11, q15, q14
352 veor q10, q13, q9
353 vand q11, q11, q12
354 vand q10, q10, q0
355 veor q12, q12, q8
356 veor q0, q0, q4
357 vand q8, q8, q15
358 vand q4, q4, q13
359 vand q12, q12, q14
360 vand q0, q0, q9
361 veor q8, q8, q12
362 veor q0, q0, q4
363 veor q12, q12, q11
364 veor q4, q4, q10
365 veor q15, q15, q13
366 veor q14, q14, q9
367 veor q10, q15, q14
368 vand q10, q10, q3
369 veor q3, q3, q7
370 vand q11, q7, q15
371 vand q3, q3, q14
372 veor q7, q11, q10
373 veor q3, q3, q11
374 veor q3, q3, q12
375 veor q0, q0, q12
376 veor q7, q7, q8
377 veor q4, q4, q8
378 veor q1, q1, q7
379 veor q6, q6, q5
380
381 veor q4, q4, q1
382 veor q2, q2, q7
383 veor q5, q5, q7
384 veor q4, q4, q2
385 veor q7, q7, q0
386 veor q4, q4, q5
387 veor q3, q3, q6
388 veor q6, q6, q1
389 veor q3, q3, q4
390
391 veor q4, q4, q0
392 veor q7, q7, q3
393 subs r5,r5,#1
394 bcc Ldec_done
395 @ multiplication by 0x05-0x00-0x04-0x00
396 vext.8 q8, q0, q0, #8
397 vext.8 q14, q3, q3, #8
398 vext.8 q15, q5, q5, #8
399 veor q8, q8, q0
400 vext.8 q9, q1, q1, #8
401 veor q14, q14, q3
402 vext.8 q10, q6, q6, #8
403 veor q15, q15, q5
404 vext.8 q11, q4, q4, #8
405 veor q9, q9, q1
406 vext.8 q12, q2, q2, #8
407 veor q10, q10, q6
408 vext.8 q13, q7, q7, #8
409 veor q11, q11, q4
410 veor q12, q12, q2
411 veor q13, q13, q7
412
413 veor q0, q0, q14
414 veor q1, q1, q14
415 veor q6, q6, q8
416 veor q2, q2, q10
417 veor q4, q4, q9
418 veor q1, q1, q15
419 veor q6, q6, q15
420 veor q2, q2, q14
421 veor q7, q7, q11
422 veor q4, q4, q14
423 veor q3, q3, q12
424 veor q2, q2, q15
425 veor q7, q7, q15
426 veor q5, q5, q13
427 vext.8 q8, q0, q0, #12 @ x0 <<< 32
428 vext.8 q9, q1, q1, #12
429 veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
430 vext.8 q10, q6, q6, #12
431 veor q1, q1, q9
432 vext.8 q11, q4, q4, #12
433 veor q6, q6, q10
434 vext.8 q12, q2, q2, #12
435 veor q4, q4, q11
436 vext.8 q13, q7, q7, #12
437 veor q2, q2, q12
438 vext.8 q14, q3, q3, #12
439 veor q7, q7, q13
440 vext.8 q15, q5, q5, #12
441 veor q3, q3, q14
442
443 veor q9, q9, q0
444 veor q5, q5, q15
445 vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
446 veor q10, q10, q1
447 veor q8, q8, q5
448 veor q9, q9, q5
449 vext.8 q1, q1, q1, #8
450 veor q13, q13, q2
451 veor q0, q0, q8
452 veor q14, q14, q7
453 veor q1, q1, q9
454 vext.8 q8, q2, q2, #8
455 veor q12, q12, q4
456 vext.8 q9, q7, q7, #8
457 veor q15, q15, q3
458 vext.8 q2, q4, q4, #8
459 veor q11, q11, q6
460 vext.8 q7, q5, q5, #8
461 veor q12, q12, q5
462 vext.8 q4, q3, q3, #8
463 veor q11, q11, q5
464 vext.8 q3, q6, q6, #8
465 veor q5, q9, q13
466 veor q11, q11, q2
467 veor q7, q7, q15
468 veor q6, q4, q14
469 veor q4, q8, q12
470 veor q2, q3, q10
471 vmov q3, q11
472 @ vmov q5, q9
473 vldmia r6, {q12} @ LISR
474 ite eq @ Thumb2 thing, sanity check in ARM
475 addeq r6,r6,#0x10
476 bne Ldec_loop
477 vldmia r6, {q12} @ LISRM0
478 b Ldec_loop
479.align 4
480Ldec_done:
481 vmov.i8 q8,#0x55 @ compose LBS0
482 vmov.i8 q9,#0x33 @ compose LBS1
483 vshr.u64 q10, q3, #1
484 vshr.u64 q11, q2, #1
485 veor q10, q10, q5
486 veor q11, q11, q7
487 vand q10, q10, q8
488 vand q11, q11, q8
489 veor q5, q5, q10
490 vshl.u64 q10, q10, #1
491 veor q7, q7, q11
492 vshl.u64 q11, q11, #1
493 veor q3, q3, q10
494 veor q2, q2, q11
495 vshr.u64 q10, q6, #1
496 vshr.u64 q11, q0, #1
497 veor q10, q10, q4
498 veor q11, q11, q1
499 vand q10, q10, q8
500 vand q11, q11, q8
501 veor q4, q4, q10
502 vshl.u64 q10, q10, #1
503 veor q1, q1, q11
504 vshl.u64 q11, q11, #1
505 veor q6, q6, q10
506 veor q0, q0, q11
507 vmov.i8 q8,#0x0f @ compose LBS2
508 vshr.u64 q10, q7, #2
509 vshr.u64 q11, q2, #2
510 veor q10, q10, q5
511 veor q11, q11, q3
512 vand q10, q10, q9
513 vand q11, q11, q9
514 veor q5, q5, q10
515 vshl.u64 q10, q10, #2
516 veor q3, q3, q11
517 vshl.u64 q11, q11, #2
518 veor q7, q7, q10
519 veor q2, q2, q11
520 vshr.u64 q10, q1, #2
521 vshr.u64 q11, q0, #2
522 veor q10, q10, q4
523 veor q11, q11, q6
524 vand q10, q10, q9
525 vand q11, q11, q9
526 veor q4, q4, q10
527 vshl.u64 q10, q10, #2
528 veor q6, q6, q11
529 vshl.u64 q11, q11, #2
530 veor q1, q1, q10
531 veor q0, q0, q11
532 vshr.u64 q10, q4, #4
533 vshr.u64 q11, q6, #4
534 veor q10, q10, q5
535 veor q11, q11, q3
536 vand q10, q10, q8
537 vand q11, q11, q8
538 veor q5, q5, q10
539 vshl.u64 q10, q10, #4
540 veor q3, q3, q11
541 vshl.u64 q11, q11, #4
542 veor q4, q4, q10
543 veor q6, q6, q11
544 vshr.u64 q10, q1, #4
545 vshr.u64 q11, q0, #4
546 veor q10, q10, q7
547 veor q11, q11, q2
548 vand q10, q10, q8
549 vand q11, q11, q8
550 veor q7, q7, q10
551 vshl.u64 q10, q10, #4
552 veor q2, q2, q11
553 vshl.u64 q11, q11, #4
554 veor q1, q1, q10
555 veor q0, q0, q11
556 vldmia r4, {q8} @ last round key
557 veor q6, q6, q8
558 veor q4, q4, q8
559 veor q2, q2, q8
560 veor q7, q7, q8
561 veor q3, q3, q8
562 veor q5, q5, q8
563 veor q0, q0, q8
564 veor q1, q1, q8
565 bx lr
566
567
568
569.align 6
570_bsaes_const:
571LM0ISR:@ InvShiftRows constants
572.quad 0x0a0e0206070b0f03, 0x0004080c0d010509
573LISR:
574.quad 0x0504070602010003, 0x0f0e0d0c080b0a09
575LISRM0:
576.quad 0x01040b0e0205080f, 0x0306090c00070a0d
577LM0SR:@ ShiftRows constants
578.quad 0x0a0e02060f03070b, 0x0004080c05090d01
579LSR:
580.quad 0x0504070600030201, 0x0f0e0d0c0a09080b
581LSRM0:
582.quad 0x0304090e00050a0f, 0x01060b0c0207080d
583LM0:
584.quad 0x02060a0e03070b0f, 0x0004080c0105090d
585LREVM0SR:
586.quad 0x090d01050c000408, 0x03070b0f060a0e02
587.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
588.align 2
589.align 6
590
591
592#ifdef __thumb2__
593.thumb_func _bsaes_encrypt8
594#endif
595.align 4
596_bsaes_encrypt8:
Robert Sloand5c22152017-11-13 09:22:12 -0800597 adr r6,.
Robert Sloan8ff03552017-06-14 12:40:58 -0700598 vldmia r4!, {q9} @ round 0 key
Robert Sloanab8b8882018-03-26 11:39:51 -0700599#if defined(__thumb2__) || defined(__APPLE__)
Robert Sloan8ff03552017-06-14 12:40:58 -0700600 adr r6,LM0SR
601#else
602 sub r6,r6,#_bsaes_encrypt8-LM0SR
603#endif
604
605 vldmia r6!, {q8} @ LM0SR
606_bsaes_encrypt8_alt:
607 veor q10, q0, q9 @ xor with round0 key
608 veor q11, q1, q9
609 vtbl.8 d0, {q10}, d16
610 vtbl.8 d1, {q10}, d17
611 veor q12, q2, q9
612 vtbl.8 d2, {q11}, d16
613 vtbl.8 d3, {q11}, d17
614 veor q13, q3, q9
615 vtbl.8 d4, {q12}, d16
616 vtbl.8 d5, {q12}, d17
617 veor q14, q4, q9
618 vtbl.8 d6, {q13}, d16
619 vtbl.8 d7, {q13}, d17
620 veor q15, q5, q9
621 vtbl.8 d8, {q14}, d16
622 vtbl.8 d9, {q14}, d17
623 veor q10, q6, q9
624 vtbl.8 d10, {q15}, d16
625 vtbl.8 d11, {q15}, d17
626 veor q11, q7, q9
627 vtbl.8 d12, {q10}, d16
628 vtbl.8 d13, {q10}, d17
629 vtbl.8 d14, {q11}, d16
630 vtbl.8 d15, {q11}, d17
631_bsaes_encrypt8_bitslice:
632 vmov.i8 q8,#0x55 @ compose LBS0
633 vmov.i8 q9,#0x33 @ compose LBS1
634 vshr.u64 q10, q6, #1
635 vshr.u64 q11, q4, #1
636 veor q10, q10, q7
637 veor q11, q11, q5
638 vand q10, q10, q8
639 vand q11, q11, q8
640 veor q7, q7, q10
641 vshl.u64 q10, q10, #1
642 veor q5, q5, q11
643 vshl.u64 q11, q11, #1
644 veor q6, q6, q10
645 veor q4, q4, q11
646 vshr.u64 q10, q2, #1
647 vshr.u64 q11, q0, #1
648 veor q10, q10, q3
649 veor q11, q11, q1
650 vand q10, q10, q8
651 vand q11, q11, q8
652 veor q3, q3, q10
653 vshl.u64 q10, q10, #1
654 veor q1, q1, q11
655 vshl.u64 q11, q11, #1
656 veor q2, q2, q10
657 veor q0, q0, q11
658 vmov.i8 q8,#0x0f @ compose LBS2
659 vshr.u64 q10, q5, #2
660 vshr.u64 q11, q4, #2
661 veor q10, q10, q7
662 veor q11, q11, q6
663 vand q10, q10, q9
664 vand q11, q11, q9
665 veor q7, q7, q10
666 vshl.u64 q10, q10, #2
667 veor q6, q6, q11
668 vshl.u64 q11, q11, #2
669 veor q5, q5, q10
670 veor q4, q4, q11
671 vshr.u64 q10, q1, #2
672 vshr.u64 q11, q0, #2
673 veor q10, q10, q3
674 veor q11, q11, q2
675 vand q10, q10, q9
676 vand q11, q11, q9
677 veor q3, q3, q10
678 vshl.u64 q10, q10, #2
679 veor q2, q2, q11
680 vshl.u64 q11, q11, #2
681 veor q1, q1, q10
682 veor q0, q0, q11
683 vshr.u64 q10, q3, #4
684 vshr.u64 q11, q2, #4
685 veor q10, q10, q7
686 veor q11, q11, q6
687 vand q10, q10, q8
688 vand q11, q11, q8
689 veor q7, q7, q10
690 vshl.u64 q10, q10, #4
691 veor q6, q6, q11
692 vshl.u64 q11, q11, #4
693 veor q3, q3, q10
694 veor q2, q2, q11
695 vshr.u64 q10, q1, #4
696 vshr.u64 q11, q0, #4
697 veor q10, q10, q5
698 veor q11, q11, q4
699 vand q10, q10, q8
700 vand q11, q11, q8
701 veor q5, q5, q10
702 vshl.u64 q10, q10, #4
703 veor q4, q4, q11
704 vshl.u64 q11, q11, #4
705 veor q1, q1, q10
706 veor q0, q0, q11
707 sub r5,r5,#1
708 b Lenc_sbox
709.align 4
710Lenc_loop:
711 vldmia r4!, {q8,q9,q10,q11}
712 veor q8, q8, q0
713 veor q9, q9, q1
714 vtbl.8 d0, {q8}, d24
715 vtbl.8 d1, {q8}, d25
716 vldmia r4!, {q8}
717 veor q10, q10, q2
718 vtbl.8 d2, {q9}, d24
719 vtbl.8 d3, {q9}, d25
720 vldmia r4!, {q9}
721 veor q11, q11, q3
722 vtbl.8 d4, {q10}, d24
723 vtbl.8 d5, {q10}, d25
724 vldmia r4!, {q10}
725 vtbl.8 d6, {q11}, d24
726 vtbl.8 d7, {q11}, d25
727 vldmia r4!, {q11}
728 veor q8, q8, q4
729 veor q9, q9, q5
730 vtbl.8 d8, {q8}, d24
731 vtbl.8 d9, {q8}, d25
732 veor q10, q10, q6
733 vtbl.8 d10, {q9}, d24
734 vtbl.8 d11, {q9}, d25
735 veor q11, q11, q7
736 vtbl.8 d12, {q10}, d24
737 vtbl.8 d13, {q10}, d25
738 vtbl.8 d14, {q11}, d24
739 vtbl.8 d15, {q11}, d25
740Lenc_sbox:
741 veor q2, q2, q1
742 veor q5, q5, q6
743 veor q3, q3, q0
744 veor q6, q6, q2
745 veor q5, q5, q0
746
747 veor q6, q6, q3
748 veor q3, q3, q7
749 veor q7, q7, q5
750 veor q3, q3, q4
751 veor q4, q4, q5
752
753 veor q2, q2, q7
754 veor q3, q3, q1
755 veor q1, q1, q5
756 veor q11, q7, q4
757 veor q10, q1, q2
758 veor q9, q5, q3
759 veor q13, q2, q4
760 vmov q8, q10
761 veor q12, q6, q0
762
763 vorr q10, q10, q9
764 veor q15, q11, q8
765 vand q14, q11, q12
766 vorr q11, q11, q12
767 veor q12, q12, q9
768 vand q8, q8, q9
769 veor q9, q3, q0
770 vand q15, q15, q12
771 vand q13, q13, q9
772 veor q9, q7, q1
773 veor q12, q5, q6
774 veor q11, q11, q13
775 veor q10, q10, q13
776 vand q13, q9, q12
777 vorr q9, q9, q12
778 veor q11, q11, q15
779 veor q8, q8, q13
780 veor q10, q10, q14
781 veor q9, q9, q15
782 veor q8, q8, q14
783 vand q12, q2, q3
784 veor q9, q9, q14
785 vand q13, q4, q0
786 vand q14, q1, q5
787 vorr q15, q7, q6
788 veor q11, q11, q12
789 veor q9, q9, q14
790 veor q8, q8, q15
791 veor q10, q10, q13
792
793 @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
794
795 @ new smaller inversion
796
797 vand q14, q11, q9
798 vmov q12, q8
799
800 veor q13, q10, q14
801 veor q15, q8, q14
802 veor q14, q8, q14 @ q14=q15
803
804 vbsl q13, q9, q8
805 vbsl q15, q11, q10
806 veor q11, q11, q10
807
808 vbsl q12, q13, q14
809 vbsl q8, q14, q13
810
811 vand q14, q12, q15
812 veor q9, q9, q8
813
814 veor q14, q14, q11
815 veor q12, q6, q0
816 veor q8, q5, q3
817 veor q10, q15, q14
818 vand q10, q10, q6
819 veor q6, q6, q5
820 vand q11, q5, q15
821 vand q6, q6, q14
822 veor q5, q11, q10
823 veor q6, q6, q11
824 veor q15, q15, q13
825 veor q14, q14, q9
826 veor q11, q15, q14
827 veor q10, q13, q9
828 vand q11, q11, q12
829 vand q10, q10, q0
830 veor q12, q12, q8
831 veor q0, q0, q3
832 vand q8, q8, q15
833 vand q3, q3, q13
834 vand q12, q12, q14
835 vand q0, q0, q9
836 veor q8, q8, q12
837 veor q0, q0, q3
838 veor q12, q12, q11
839 veor q3, q3, q10
840 veor q6, q6, q12
841 veor q0, q0, q12
842 veor q5, q5, q8
843 veor q3, q3, q8
844
845 veor q12, q7, q4
846 veor q8, q1, q2
847 veor q11, q15, q14
848 veor q10, q13, q9
849 vand q11, q11, q12
850 vand q10, q10, q4
851 veor q12, q12, q8
852 veor q4, q4, q2
853 vand q8, q8, q15
854 vand q2, q2, q13
855 vand q12, q12, q14
856 vand q4, q4, q9
857 veor q8, q8, q12
858 veor q4, q4, q2
859 veor q12, q12, q11
860 veor q2, q2, q10
861 veor q15, q15, q13
862 veor q14, q14, q9
863 veor q10, q15, q14
864 vand q10, q10, q7
865 veor q7, q7, q1
866 vand q11, q1, q15
867 vand q7, q7, q14
868 veor q1, q11, q10
869 veor q7, q7, q11
870 veor q7, q7, q12
871 veor q4, q4, q12
872 veor q1, q1, q8
873 veor q2, q2, q8
874 veor q7, q7, q0
875 veor q1, q1, q6
876 veor q6, q6, q0
877 veor q4, q4, q7
878 veor q0, q0, q1
879
880 veor q1, q1, q5
881 veor q5, q5, q2
882 veor q2, q2, q3
883 veor q3, q3, q5
884 veor q4, q4, q5
885
886 veor q6, q6, q3
887 subs r5,r5,#1
888 bcc Lenc_done
889 vext.8 q8, q0, q0, #12 @ x0 <<< 32
890 vext.8 q9, q1, q1, #12
891 veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
892 vext.8 q10, q4, q4, #12
893 veor q1, q1, q9
894 vext.8 q11, q6, q6, #12
895 veor q4, q4, q10
896 vext.8 q12, q3, q3, #12
897 veor q6, q6, q11
898 vext.8 q13, q7, q7, #12
899 veor q3, q3, q12
900 vext.8 q14, q2, q2, #12
901 veor q7, q7, q13
902 vext.8 q15, q5, q5, #12
903 veor q2, q2, q14
904
905 veor q9, q9, q0
906 veor q5, q5, q15
907 vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
908 veor q10, q10, q1
909 veor q8, q8, q5
910 veor q9, q9, q5
911 vext.8 q1, q1, q1, #8
912 veor q13, q13, q3
913 veor q0, q0, q8
914 veor q14, q14, q7
915 veor q1, q1, q9
916 vext.8 q8, q3, q3, #8
917 veor q12, q12, q6
918 vext.8 q9, q7, q7, #8
919 veor q15, q15, q2
920 vext.8 q3, q6, q6, #8
921 veor q11, q11, q4
922 vext.8 q7, q5, q5, #8
923 veor q12, q12, q5
924 vext.8 q6, q2, q2, #8
925 veor q11, q11, q5
926 vext.8 q2, q4, q4, #8
927 veor q5, q9, q13
928 veor q4, q8, q12
929 veor q3, q3, q11
930 veor q7, q7, q15
931 veor q6, q6, q14
932 @ vmov q4, q8
933 veor q2, q2, q10
934 @ vmov q5, q9
935 vldmia r6, {q12} @ LSR
936 ite eq @ Thumb2 thing, samity check in ARM
937 addeq r6,r6,#0x10
938 bne Lenc_loop
939 vldmia r6, {q12} @ LSRM0
940 b Lenc_loop
941.align 4
942Lenc_done:
943 vmov.i8 q8,#0x55 @ compose LBS0
944 vmov.i8 q9,#0x33 @ compose LBS1
945 vshr.u64 q10, q2, #1
946 vshr.u64 q11, q3, #1
947 veor q10, q10, q5
948 veor q11, q11, q7
949 vand q10, q10, q8
950 vand q11, q11, q8
951 veor q5, q5, q10
952 vshl.u64 q10, q10, #1
953 veor q7, q7, q11
954 vshl.u64 q11, q11, #1
955 veor q2, q2, q10
956 veor q3, q3, q11
957 vshr.u64 q10, q4, #1
958 vshr.u64 q11, q0, #1
959 veor q10, q10, q6
960 veor q11, q11, q1
961 vand q10, q10, q8
962 vand q11, q11, q8
963 veor q6, q6, q10
964 vshl.u64 q10, q10, #1
965 veor q1, q1, q11
966 vshl.u64 q11, q11, #1
967 veor q4, q4, q10
968 veor q0, q0, q11
969 vmov.i8 q8,#0x0f @ compose LBS2
970 vshr.u64 q10, q7, #2
971 vshr.u64 q11, q3, #2
972 veor q10, q10, q5
973 veor q11, q11, q2
974 vand q10, q10, q9
975 vand q11, q11, q9
976 veor q5, q5, q10
977 vshl.u64 q10, q10, #2
978 veor q2, q2, q11
979 vshl.u64 q11, q11, #2
980 veor q7, q7, q10
981 veor q3, q3, q11
982 vshr.u64 q10, q1, #2
983 vshr.u64 q11, q0, #2
984 veor q10, q10, q6
985 veor q11, q11, q4
986 vand q10, q10, q9
987 vand q11, q11, q9
988 veor q6, q6, q10
989 vshl.u64 q10, q10, #2
990 veor q4, q4, q11
991 vshl.u64 q11, q11, #2
992 veor q1, q1, q10
993 veor q0, q0, q11
994 vshr.u64 q10, q6, #4
995 vshr.u64 q11, q4, #4
996 veor q10, q10, q5
997 veor q11, q11, q2
998 vand q10, q10, q8
999 vand q11, q11, q8
1000 veor q5, q5, q10
1001 vshl.u64 q10, q10, #4
1002 veor q2, q2, q11
1003 vshl.u64 q11, q11, #4
1004 veor q6, q6, q10
1005 veor q4, q4, q11
1006 vshr.u64 q10, q1, #4
1007 vshr.u64 q11, q0, #4
1008 veor q10, q10, q7
1009 veor q11, q11, q3
1010 vand q10, q10, q8
1011 vand q11, q11, q8
1012 veor q7, q7, q10
1013 vshl.u64 q10, q10, #4
1014 veor q3, q3, q11
1015 vshl.u64 q11, q11, #4
1016 veor q1, q1, q10
1017 veor q0, q0, q11
1018 vldmia r4, {q8} @ last round key
1019 veor q4, q4, q8
1020 veor q6, q6, q8
1021 veor q3, q3, q8
1022 veor q7, q7, q8
1023 veor q2, q2, q8
1024 veor q5, q5, q8
1025 veor q0, q0, q8
1026 veor q1, q1, q8
1027 bx lr
1028
1029#ifdef __thumb2__
1030.thumb_func _bsaes_key_convert
1031#endif
1032.align 4
1033_bsaes_key_convert:
Robert Sloand5c22152017-11-13 09:22:12 -08001034 adr r6,.
Robert Sloan8ff03552017-06-14 12:40:58 -07001035 vld1.8 {q7}, [r4]! @ load round 0 key
Robert Sloanab8b8882018-03-26 11:39:51 -07001036#if defined(__thumb2__) || defined(__APPLE__)
Robert Sloan8ff03552017-06-14 12:40:58 -07001037 adr r6,LM0
1038#else
1039 sub r6,r6,#_bsaes_key_convert-LM0
1040#endif
1041 vld1.8 {q15}, [r4]! @ load round 1 key
1042
1043 vmov.i8 q8, #0x01 @ bit masks
1044 vmov.i8 q9, #0x02
1045 vmov.i8 q10, #0x04
1046 vmov.i8 q11, #0x08
1047 vmov.i8 q12, #0x10
1048 vmov.i8 q13, #0x20
1049 vldmia r6, {q14} @ LM0
1050
1051#ifdef __ARMEL__
1052 vrev32.8 q7, q7
1053 vrev32.8 q15, q15
1054#endif
1055 sub r5,r5,#1
1056 vstmia r12!, {q7} @ save round 0 key
1057 b Lkey_loop
1058
1059.align 4
1060Lkey_loop:
1061 vtbl.8 d14,{q15},d28
1062 vtbl.8 d15,{q15},d29
1063 vmov.i8 q6, #0x40
1064 vmov.i8 q15, #0x80
1065
1066 vtst.8 q0, q7, q8
1067 vtst.8 q1, q7, q9
1068 vtst.8 q2, q7, q10
1069 vtst.8 q3, q7, q11
1070 vtst.8 q4, q7, q12
1071 vtst.8 q5, q7, q13
1072 vtst.8 q6, q7, q6
1073 vtst.8 q7, q7, q15
1074 vld1.8 {q15}, [r4]! @ load next round key
1075 vmvn q0, q0 @ "pnot"
1076 vmvn q1, q1
1077 vmvn q5, q5
1078 vmvn q6, q6
1079#ifdef __ARMEL__
1080 vrev32.8 q15, q15
1081#endif
1082 subs r5,r5,#1
1083 vstmia r12!,{q0,q1,q2,q3,q4,q5,q6,q7} @ write bit-sliced round key
1084 bne Lkey_loop
1085
1086 vmov.i8 q7,#0x63 @ compose L63
1087 @ don't save last round key
1088 bx lr
1089
Robert Sloan8ff03552017-06-14 12:40:58 -07001090.globl _bsaes_cbc_encrypt
1091.private_extern _bsaes_cbc_encrypt
1092#ifdef __thumb2__
1093.thumb_func _bsaes_cbc_encrypt
1094#endif
1095.align 5
1096_bsaes_cbc_encrypt:
Robert Sloan9d5d1a72019-03-18 09:32:50 -07001097 @ In OpenSSL, this function had a fallback to aes_nohw_cbc_encrypt for
1098 @ short inputs. We patch this out, using bsaes for all input sizes.
Robert Sloan8ff03552017-06-14 12:40:58 -07001099
1100 @ it is up to the caller to make sure we are called with enc == 0
1101
1102 mov ip, sp
1103 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
1104 VFP_ABI_PUSH
1105 ldr r8, [ip] @ IV is 1st arg on the stack
1106 mov r2, r2, lsr#4 @ len in 16 byte blocks
1107 sub sp, #0x10 @ scratch space to carry over the IV
1108 mov r9, sp @ save sp
1109
1110 ldr r10, [r3, #240] @ get # of rounds
1111#ifndef BSAES_ASM_EXTENDED_KEY
1112 @ allocate the key schedule on the stack
1113 sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
1114 add r12, #96 @ sifze of bit-slices key schedule
1115
1116 @ populate the key schedule
1117 mov r4, r3 @ pass key
1118 mov r5, r10 @ pass # of rounds
1119 mov sp, r12 @ sp is sp
1120 bl _bsaes_key_convert
1121 vldmia sp, {q6}
1122 vstmia r12, {q15} @ save last round key
1123 veor q7, q7, q6 @ fix up round 0 key
1124 vstmia sp, {q7}
1125#else
1126 ldr r12, [r3, #244]
1127 eors r12, #1
1128 beq 0f
1129
1130 @ populate the key schedule
1131 str r12, [r3, #244]
1132 mov r4, r3 @ pass key
1133 mov r5, r10 @ pass # of rounds
1134 add r12, r3, #248 @ pass key schedule
1135 bl _bsaes_key_convert
1136 add r4, r3, #248
1137 vldmia r4, {q6}
1138 vstmia r12, {q15} @ save last round key
1139 veor q7, q7, q6 @ fix up round 0 key
1140 vstmia r4, {q7}
1141
1142.align 2
1143
1144#endif
1145
1146 vld1.8 {q15}, [r8] @ load IV
1147 b Lcbc_dec_loop
1148
1149.align 4
1150Lcbc_dec_loop:
1151 subs r2, r2, #0x8
1152 bmi Lcbc_dec_loop_finish
1153
1154 vld1.8 {q0,q1}, [r0]! @ load input
1155 vld1.8 {q2,q3}, [r0]!
1156#ifndef BSAES_ASM_EXTENDED_KEY
1157 mov r4, sp @ pass the key
1158#else
1159 add r4, r3, #248
1160#endif
1161 vld1.8 {q4,q5}, [r0]!
1162 mov r5, r10
1163 vld1.8 {q6,q7}, [r0]
1164 sub r0, r0, #0x60
1165 vstmia r9, {q15} @ put aside IV
1166
1167 bl _bsaes_decrypt8
1168
1169 vldmia r9, {q14} @ reload IV
1170 vld1.8 {q8,q9}, [r0]! @ reload input
1171 veor q0, q0, q14 @ ^= IV
1172 vld1.8 {q10,q11}, [r0]!
1173 veor q1, q1, q8
1174 veor q6, q6, q9
1175 vld1.8 {q12,q13}, [r0]!
1176 veor q4, q4, q10
1177 veor q2, q2, q11
1178 vld1.8 {q14,q15}, [r0]!
1179 veor q7, q7, q12
1180 vst1.8 {q0,q1}, [r1]! @ write output
1181 veor q3, q3, q13
1182 vst1.8 {q6}, [r1]!
1183 veor q5, q5, q14
1184 vst1.8 {q4}, [r1]!
1185 vst1.8 {q2}, [r1]!
1186 vst1.8 {q7}, [r1]!
1187 vst1.8 {q3}, [r1]!
1188 vst1.8 {q5}, [r1]!
1189
1190 b Lcbc_dec_loop
1191
1192Lcbc_dec_loop_finish:
1193 adds r2, r2, #8
1194 beq Lcbc_dec_done
1195
Robert Sloan9d5d1a72019-03-18 09:32:50 -07001196 @ Set up most parameters for the _bsaes_decrypt8 call.
Robert Sloan8ff03552017-06-14 12:40:58 -07001197#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
Robert Sloan9d5d1a72019-03-18 09:32:50 -07001204
1205 vld1.8 {q0}, [r0]! @ load input
1206 cmp r2, #2
1207 blo Lcbc_dec_one
1208 vld1.8 {q1}, [r0]!
Robert Sloan8ff03552017-06-14 12:40:58 -07001209 beq Lcbc_dec_two
1210 vld1.8 {q2}, [r0]!
1211 cmp r2, #4
1212 blo Lcbc_dec_three
1213 vld1.8 {q3}, [r0]!
1214 beq Lcbc_dec_four
1215 vld1.8 {q4}, [r0]!
1216 cmp r2, #6
1217 blo Lcbc_dec_five
1218 vld1.8 {q5}, [r0]!
1219 beq Lcbc_dec_six
1220 vld1.8 {q6}, [r0]!
1221 sub r0, r0, #0x70
1222
1223 bl _bsaes_decrypt8
1224
1225 vldmia r9, {q14} @ reload IV
1226 vld1.8 {q8,q9}, [r0]! @ reload input
1227 veor q0, q0, q14 @ ^= IV
1228 vld1.8 {q10,q11}, [r0]!
1229 veor q1, q1, q8
1230 veor q6, q6, q9
1231 vld1.8 {q12,q13}, [r0]!
1232 veor q4, q4, q10
1233 veor q2, q2, q11
1234 vld1.8 {q15}, [r0]!
1235 veor q7, q7, q12
1236 vst1.8 {q0,q1}, [r1]! @ write output
1237 veor q3, q3, q13
1238 vst1.8 {q6}, [r1]!
1239 vst1.8 {q4}, [r1]!
1240 vst1.8 {q2}, [r1]!
1241 vst1.8 {q7}, [r1]!
1242 vst1.8 {q3}, [r1]!
1243 b Lcbc_dec_done
1244.align 4
1245Lcbc_dec_six:
1246 sub r0, r0, #0x60
1247 bl _bsaes_decrypt8
1248 vldmia r9,{q14} @ reload IV
1249 vld1.8 {q8,q9}, [r0]! @ reload input
1250 veor q0, q0, q14 @ ^= IV
1251 vld1.8 {q10,q11}, [r0]!
1252 veor q1, q1, q8
1253 veor q6, q6, q9
1254 vld1.8 {q12}, [r0]!
1255 veor q4, q4, q10
1256 veor q2, q2, q11
1257 vld1.8 {q15}, [r0]!
1258 veor q7, q7, q12
1259 vst1.8 {q0,q1}, [r1]! @ write output
1260 vst1.8 {q6}, [r1]!
1261 vst1.8 {q4}, [r1]!
1262 vst1.8 {q2}, [r1]!
1263 vst1.8 {q7}, [r1]!
1264 b Lcbc_dec_done
1265.align 4
1266Lcbc_dec_five:
1267 sub r0, r0, #0x50
1268 bl _bsaes_decrypt8
1269 vldmia r9, {q14} @ reload IV
1270 vld1.8 {q8,q9}, [r0]! @ reload input
1271 veor q0, q0, q14 @ ^= IV
1272 vld1.8 {q10,q11}, [r0]!
1273 veor q1, q1, q8
1274 veor q6, q6, q9
1275 vld1.8 {q15}, [r0]!
1276 veor q4, q4, q10
1277 vst1.8 {q0,q1}, [r1]! @ write output
1278 veor q2, q2, q11
1279 vst1.8 {q6}, [r1]!
1280 vst1.8 {q4}, [r1]!
1281 vst1.8 {q2}, [r1]!
1282 b Lcbc_dec_done
1283.align 4
1284Lcbc_dec_four:
1285 sub r0, r0, #0x40
1286 bl _bsaes_decrypt8
1287 vldmia r9, {q14} @ reload IV
1288 vld1.8 {q8,q9}, [r0]! @ reload input
1289 veor q0, q0, q14 @ ^= IV
1290 vld1.8 {q10}, [r0]!
1291 veor q1, q1, q8
1292 veor q6, q6, q9
1293 vld1.8 {q15}, [r0]!
1294 veor q4, q4, q10
1295 vst1.8 {q0,q1}, [r1]! @ write output
1296 vst1.8 {q6}, [r1]!
1297 vst1.8 {q4}, [r1]!
1298 b Lcbc_dec_done
1299.align 4
1300Lcbc_dec_three:
1301 sub r0, r0, #0x30
1302 bl _bsaes_decrypt8
1303 vldmia r9, {q14} @ reload IV
1304 vld1.8 {q8,q9}, [r0]! @ reload input
1305 veor q0, q0, q14 @ ^= IV
1306 vld1.8 {q15}, [r0]!
1307 veor q1, q1, q8
1308 veor q6, q6, q9
1309 vst1.8 {q0,q1}, [r1]! @ write output
1310 vst1.8 {q6}, [r1]!
1311 b Lcbc_dec_done
1312.align 4
1313Lcbc_dec_two:
1314 sub r0, r0, #0x20
1315 bl _bsaes_decrypt8
1316 vldmia r9, {q14} @ reload IV
1317 vld1.8 {q8}, [r0]! @ reload input
1318 veor q0, q0, q14 @ ^= IV
1319 vld1.8 {q15}, [r0]! @ reload input
1320 veor q1, q1, q8
1321 vst1.8 {q0,q1}, [r1]! @ write output
1322 b Lcbc_dec_done
1323.align 4
1324Lcbc_dec_one:
1325 sub r0, r0, #0x10
Robert Sloan9d5d1a72019-03-18 09:32:50 -07001326 bl _bsaes_decrypt8
1327 vldmia r9, {q14} @ reload IV
1328 vld1.8 {q15}, [r0]! @ reload input
1329 veor q0, q0, q14 @ ^= IV
1330 vst1.8 {q0}, [r1]! @ write output
Robert Sloan8ff03552017-06-14 12:40:58 -07001331
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
Robert Sloan8ff03552017-06-14 12:40:58 -07001348.globl _bsaes_ctr32_encrypt_blocks
1349.private_extern _bsaes_ctr32_encrypt_blocks
1350#ifdef __thumb2__
1351.thumb_func _bsaes_ctr32_encrypt_blocks
1352#endif
1353.align 5
1354_bsaes_ctr32_encrypt_blocks:
Robert Sloan9d5d1a72019-03-18 09:32:50 -07001355 @ In OpenSSL, short inputs fall back to aes_nohw_* here. We patch this
1356 @ out to retain a constant-time implementation.
Robert Sloan8ff03552017-06-14 12:40:58 -07001357 mov ip, sp
1358 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
1359 VFP_ABI_PUSH
1360 ldr r8, [ip] @ ctr is 1st arg on the stack
1361 sub sp, sp, #0x10 @ scratch space to carry over the ctr
1362 mov r9, sp @ save sp
1363
1364 ldr r10, [r3, #240] @ get # of rounds
1365#ifndef BSAES_ASM_EXTENDED_KEY
1366 @ allocate the key schedule on the stack
1367 sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
1368 add r12, #96 @ size of bit-sliced key schedule
1369
1370 @ populate the key schedule
1371 mov r4, r3 @ pass key
1372 mov r5, r10 @ pass # of rounds
1373 mov sp, r12 @ sp is sp
1374 bl _bsaes_key_convert
1375 veor q7,q7,q15 @ fix up last round key
1376 vstmia r12, {q7} @ save last round key
1377
1378 vld1.8 {q0}, [r8] @ load counter
1379#ifdef __APPLE__
1380 mov r8, #:lower16:(LREVM0SR-LM0)
1381 add r8, r6, r8
1382#else
1383 add r8, r6, #LREVM0SR-LM0 @ borrow r8
1384#endif
1385 vldmia sp, {q4} @ load round0 key
1386#else
1387 ldr r12, [r3, #244]
1388 eors r12, #1
1389 beq 0f
1390
1391 @ populate the key schedule
1392 str r12, [r3, #244]
1393 mov r4, r3 @ pass key
1394 mov r5, r10 @ pass # of rounds
1395 add r12, r3, #248 @ pass key schedule
1396 bl _bsaes_key_convert
1397 veor q7,q7,q15 @ fix up last round key
1398 vstmia r12, {q7} @ save last round key
1399
1400.align 2
1401 add r12, r3, #248
1402 vld1.8 {q0}, [r8] @ load counter
1403 adrl r8, LREVM0SR @ borrow r8
1404 vldmia r12, {q4} @ load round0 key
1405 sub sp, #0x10 @ place for adjusted round0 key
1406#endif
1407
1408 vmov.i32 q8,#1 @ compose 1<<96
1409 veor q9,q9,q9
1410 vrev32.8 q0,q0
1411 vext.8 q8,q9,q8,#4
1412 vrev32.8 q4,q4
1413 vadd.u32 q9,q8,q8 @ compose 2<<96
1414 vstmia sp, {q4} @ save adjusted round0 key
1415 b Lctr_enc_loop
1416
1417.align 4
1418Lctr_enc_loop:
1419 vadd.u32 q10, q8, q9 @ compose 3<<96
1420 vadd.u32 q1, q0, q8 @ +1
1421 vadd.u32 q2, q0, q9 @ +2
1422 vadd.u32 q3, q0, q10 @ +3
1423 vadd.u32 q4, q1, q10
1424 vadd.u32 q5, q2, q10
1425 vadd.u32 q6, q3, q10
1426 vadd.u32 q7, q4, q10
1427 vadd.u32 q10, q5, q10 @ next counter
1428
1429 @ Borrow prologue from _bsaes_encrypt8 to use the opportunity
1430 @ to flip byte order in 32-bit counter
1431
1432 vldmia sp, {q9} @ load round0 key
1433#ifndef BSAES_ASM_EXTENDED_KEY
1434 add r4, sp, #0x10 @ pass next round key
1435#else
1436 add r4, r3, #264
1437#endif
1438 vldmia r8, {q8} @ LREVM0SR
1439 mov r5, r10 @ pass rounds
1440 vstmia r9, {q10} @ save next counter
1441#ifdef __APPLE__
1442 mov r6, #:lower16:(LREVM0SR-LSR)
1443 sub r6, r8, r6
1444#else
1445 sub r6, r8, #LREVM0SR-LSR @ pass constants
1446#endif
1447
1448 bl _bsaes_encrypt8_alt
1449
1450 subs r2, r2, #8
1451 blo Lctr_enc_loop_done
1452
1453 vld1.8 {q8,q9}, [r0]! @ load input
1454 vld1.8 {q10,q11}, [r0]!
1455 veor q0, q8
1456 veor q1, q9
1457 vld1.8 {q12,q13}, [r0]!
1458 veor q4, q10
1459 veor q6, q11
1460 vld1.8 {q14,q15}, [r0]!
1461 veor q3, q12
1462 vst1.8 {q0,q1}, [r1]! @ write output
1463 veor q7, q13
1464 veor q2, q14
1465 vst1.8 {q4}, [r1]!
1466 veor q5, q15
1467 vst1.8 {q6}, [r1]!
1468 vmov.i32 q8, #1 @ compose 1<<96
1469 vst1.8 {q3}, [r1]!
1470 veor q9, q9, q9
1471 vst1.8 {q7}, [r1]!
1472 vext.8 q8, q9, q8, #4
1473 vst1.8 {q2}, [r1]!
1474 vadd.u32 q9,q8,q8 @ compose 2<<96
1475 vst1.8 {q5}, [r1]!
1476 vldmia r9, {q0} @ load counter
1477
1478 bne Lctr_enc_loop
1479 b Lctr_enc_done
1480
1481.align 4
1482Lctr_enc_loop_done:
1483 add r2, r2, #8
1484 vld1.8 {q8}, [r0]! @ load input
1485 veor q0, q8
1486 vst1.8 {q0}, [r1]! @ write output
1487 cmp r2, #2
1488 blo Lctr_enc_done
1489 vld1.8 {q9}, [r0]!
1490 veor q1, q9
1491 vst1.8 {q1}, [r1]!
1492 beq Lctr_enc_done
1493 vld1.8 {q10}, [r0]!
1494 veor q4, q10
1495 vst1.8 {q4}, [r1]!
1496 cmp r2, #4
1497 blo Lctr_enc_done
1498 vld1.8 {q11}, [r0]!
1499 veor q6, q11
1500 vst1.8 {q6}, [r1]!
1501 beq Lctr_enc_done
1502 vld1.8 {q12}, [r0]!
1503 veor q3, q12
1504 vst1.8 {q3}, [r1]!
1505 cmp r2, #6
1506 blo Lctr_enc_done
1507 vld1.8 {q13}, [r0]!
1508 veor q7, q13
1509 vst1.8 {q7}, [r1]!
1510 beq Lctr_enc_done
1511 vld1.8 {q14}, [r0]
1512 veor q2, q14
1513 vst1.8 {q2}, [r1]!
1514
1515Lctr_enc_done:
1516 vmov.i32 q0, #0
1517 vmov.i32 q1, #0
1518#ifndef BSAES_ASM_EXTENDED_KEY
1519Lctr_enc_bzero:@ wipe key schedule [if any]
1520 vstmia sp!, {q0,q1}
1521 cmp sp, r9
1522 bne Lctr_enc_bzero
1523#else
1524 vstmia sp, {q0,q1}
1525#endif
1526
1527 mov sp, r9
1528 add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
1529 VFP_ABI_POP
1530 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
1531
Robert Sloan9d5d1a72019-03-18 09:32:50 -07001532 @ OpenSSL contains aes_nohw_* fallback code here. We patch this
1533 @ out to retain a constant-time implementation.
Robert Sloan8ff03552017-06-14 12:40:58 -07001534
Robert Sloan8ff03552017-06-14 12:40:58 -07001535#endif
Robert Sloan726e9d12018-09-11 11:45:04 -07001536#endif // !OPENSSL_NO_ASM