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