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