Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Side by Side Diff: third_party/boringssl/linux-arm/crypto/aes/bsaes-armv7.S

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

Powered by Google App Engine
This is Rietveld 408576698