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