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

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

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

Powered by Google App Engine
This is Rietveld 408576698