Merge tag 'v3.10.55' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / arch / arm / crypto / aes-armv8-aarch32.S
1 #define __ARM_ARCH__ __LINUX_ARM_ARCH__
2
3 #include <linux/linkage.h>
4
5 #if __ARM_ARCH__>=7
6
7 .text
8
9 # AES assembly implementation for ARMv8 AArch32
10 # - AES_encrypt
11 # - AES_decrypt
12 # - private_AES_set_encrypt_key
13 # - private_AES_set_decrypt_key
14
15 # void AES_encrypt(const unsigned char *in, unsigned char *out,
16 # const AES_KEY *key) {
17 .align 5
18 ENTRY(AES_encrypt)
19 vld1.8 {d24-d25}, [r2]!
20 vld1.8 {d0-d1}, [r0]
21 ldr r3, [r2, #240-16]
22 vld1.8 {d26-d27}, [r2]!
23 aese.8 q0, q12
24 aesmc.8 q0, q0
25 sub r3, r3, #4
26 vld1.8 {d28-d29}, [r2]!
27 .LPrivateEncLoop:
28 subs r3, r3, #2
29 aese.8 q0, q13
30 aesmc.8 q0, q0
31 vld1.8 {d26-d27}, [r2]!
32 aese.8 q0, q14
33 aesmc.8 q0, q0
34 vld1.8 {d28-d29}, [r2]!
35 bpl .LPrivateEncLoop
36 aese.8 q0, q13
37 veor.8 q0, q0, q14
38 vst1.8 {d0-d1}, [r1]
39 bx lr
40 ENDPROC(AES_encrypt)
41
42 # void AES_decrypt(const unsigned char *in, unsigned char *out,
43 # const AES_KEY *key) {
44 .align 5
45 ENTRY(AES_decrypt)
46 vld1.8 {d24-d25}, [r2]!
47 vld1.8 {d0-d1}, [r0]
48 ldr r3, [r2, #240-16]
49 vld1.8 {d26-d27}, [r2]!
50 aesd.8 q0, q12
51 aesimc.8 q0, q0
52 sub r3, r3, #4
53 vld1.8 {d28-d29}, [r2]!
54 .LPrivateDecLoop:
55 subs r3, r3, #2
56 aesd.8 q0, q13
57 aesimc.8 q0, q0
58 vld1.8 {d26-d27}, [r2]!
59 aesd.8 q0, q14
60 aesimc.8 q0, q0
61 vld1.8 {d28-d29}, [r2]!
62 bpl .LPrivateDecLoop
63 aesd.8 q0, q13
64 veor.8 q0, q0, q14
65 vst1.8 {d0-d1}, [r1]
66 bx lr
67 ENDPROC(AES_decrypt)
68
69
70 .align 5
71 private_rcon:
72 .long 0x00000001,0x00000001,0x00000001,0x00000001
73 .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d
74 .long 0x0000001b,0x0000001b,0x0000001b,0x0000001b
75
76
77 # int private_AES_set_encrypt_key(const unsigned char *userKey, const int bits,
78 # AES_KEY *key) {
79 .align 5
80 ENTRY(private_AES_set_encrypt_key)
81 adr r3, private_rcon
82 cmp r1, #192
83 veor q0, q0, q0
84 vld1.8 {q8},[r0]!
85 mov r1, #8
86 vld1.32 {q1,q2},[r3]!
87 beq .LPrivateExpandEnc192
88 bgt .LPrivateExpandEnc256
89 .LPrivateExpandEnc128:
90 .LPrivateLoopEnc128:
91 vst1.32 {q8},[r2]!
92 vtbl.8 d6, {q8},d4
93 vtbl.8 d7, {q8},d5
94 vext.8 q14, q0, q8, #12
95 veor q15, q8, q14
96 vext.8 q14, q0, q14, #12
97 veor q15, q15, q14
98 vext.8 q14, q0, q14, #12
99 veor q15, q15, q14
100 aese.8 q3, q0
101 subs r1, r1, #1
102 veor q3, q3, q1
103 vshl.u8 q1, q1, #1
104 veor q8, q3, q15
105 bne .LPrivateLoopEnc128
106 vld1.32 {q1},[r3]
107 vst1.32 {q8},[r2]!
108 vtbl.8 d6, {q8},d4
109 vtbl.8 d7, {q8},d5
110 vext.8 q14, q0, q8, #12
111 veor q15, q8, q14
112 vext.8 q14, q0, q14, #12
113 veor q15, q15, q14
114 vext.8 q14, q0, q14, #12
115 veor q15, q15, q14
116 aese.8 q3, q0
117 veor q3, q3, q1
118 vshl.u8 q1, q1, #1
119 veor q8, q3, q15
120 vst1.32 {q8},[r2]!
121 vtbl.8 d6, {q8},d4
122 vtbl.8 d7, {q8},d5
123 vext.8 q14, q0, q8, #12
124 veor q15, q8, q14
125 vext.8 q14, q0, q14, #12
126 veor q15, q15, q14
127 vext.8 q14, q0, q14, #12
128 veor q15, q15, q14
129 aese.8 q3, q0
130 veor q3, q3, q1
131 veor q8, q3, q15
132 vst1.32 {q8},[r2]
133 add r2, r2, #0x50
134 mov r12, #10
135 str r12, [r2]
136 eor r0, r0, r0
137 bx lr
138
139 .align 4
140 .LPrivateExpandEnc192:
141 vld1.8 {d18},[r0]
142 vmov.i8 q3, #8
143 vst1.32 {q8},[r2]!
144 vsub.i8 q2, q2, q3
145 vst1.32 {d18},[r2]!
146 vext.8 q14, q0, q8, #12
147 veor q15, q8, q14
148 vtbl.8 d6, {q9},d4
149 vtbl.8 d7, {q9},d5
150 vext.8 q14, q0, q14, #12
151 veor q15, q15, q14
152 vext.8 q14, q0, q14, #12
153 veor q15, q15, q14
154 aese.8 q3, q0
155 mov r1, #3
156 veor q3, q3, q1
157 vshl.u8 q1, q1, #1
158 veor q8, q3, q15
159 vdup.32 q15, d31[1]
160 veor q15, q15, q9
161 vext.8 q14, q0, q9, #12
162 veor q15, q15, q14
163 vst1.32 {q8},[r2]!
164 veor q9, q3, q15
165 vst1.32 {d18},[r2]!
166 .LPrivateLoopEnc192:
167 vext.8 q14, q0, q8, #12
168 veor q15, q8, q14
169 vtbl.8 d6, {q9},d4
170 vtbl.8 d7, {q9},d5
171 vext.8 q14, q0, q14, #12
172 veor q15, q15, q14
173 vext.8 q14, q0, q14, #12
174 veor q15, q15, q14
175 aese.8 q3, q0
176 subs r1, r1, #1
177 veor q3, q3, q1
178 vshl.u8 q1, q1, #1
179 veor q10, q3, q15
180 vdup.32 q15, d31[1]
181 veor q15, q15, q9
182 vext.8 q14, q0, q9, #12
183 veor q15, q15, q14
184 vst1.32 {q10},[r2]!
185 veor q11, q3, q15
186 vst1.32 {d22},[r2]!
187 vext.8 q14, q0, q10, #12
188 veor q15, q10, q14
189 vtbl.8 d6, {q11},d4
190 vtbl.8 d7, {q11},d5
191 vext.8 q14, q0, q14, #12
192 veor q15, q15, q14
193 vext.8 q14, q0, q14, #12
194 veor q15, q15, q14
195 aese.8 q3, q0
196 veor q3, q3, q1
197 vshl.u8 q1, q1, #1
198 veor q8, q3, q15
199 vdup.32 q15, d31[1]
200 veor q15, q15, q11
201 vext.8 q14, q0, q11, #12
202 veor q15, q15, q14
203 vst1.32 {q8},[r2]!
204 veor q9, q3, q15
205 vst1.32 {d18},[r2]!
206 bne .LPrivateLoopEnc192
207 vext.8 q14, q0, q8, #12
208 veor q15, q8, q14
209 vtbl.8 d6, {q9},d4
210 vtbl.8 d7, {q9},d5
211 vext.8 q14, q0, q14, #12
212 veor q15, q15, q14
213 vext.8 q14, q0, q14, #12
214 veor q15, q15, q14
215 aese.8 q3, q0
216 veor q3, q3, q1
217 veor q8, q3, q15
218 vst1.32 {q8},[r2]!
219 mov r12, #12
220 add r2, r2, #0x20
221 str r12, [r2]
222 eor r0, r0, r0
223 bx lr
224
225 .align 4
226 .LPrivateExpandEnc256:
227 vld1.8 {q9},[r0]
228 mov r1, #6
229 .LPrivateLoopEnc256:
230 vext.8 q14, q0, q8, #12
231 veor q15, q8, q14
232 vst1.32 {q8},[r2]!
233 vtbl.8 d6, {q9},d4
234 vst1.32 {q9},[r2]!
235 vtbl.8 d7, {q9},d5
236 vext.8 q14, q0, q14, #12
237 veor q15, q15, q14
238 vext.8 q14, q0, q14, #12
239 veor q15, q15, q14
240 aese.8 q3, q0
241 subs r1, r1, #1
242 veor q3, q3, q1
243 vshl.u8 q1, q1, #1
244 veor q8, q3, q15
245 vext.8 q14, q0, q9, #12
246 veor q15, q9, q14
247 vdup.32 q3, d17[1]
248 vext.8 q14, q0, q14, #12
249 veor q15, q15, q14
250 vext.8 q14, q0, q14, #12
251 veor q15, q15, q14
252 aese.8 q3, q0
253 veor q9, q3, q15
254 bne .LPrivateLoopEnc256
255 vst1.32 {q8},[r2]!
256 vtbl.8 d6, {q9},d4
257 vst1.32 {q9},[r2]!
258 vtbl.8 d7, {q9},d5
259 vext.8 q14, q0, q8, #12
260 veor q15, q8, q14
261 vext.8 q14, q0, q14, #12
262 veor q15, q15, q14
263 vext.8 q14, q0, q14, #12
264 veor q15, q15, q14
265 aese.8 q3, q0
266 veor q3, q3, q1
267 veor q8, q3, q15
268 vst1.32 {q8},[r2]!
269 mov r12, #14
270 str r12, [r2]
271 eor r0, r0, r0
272 bx lr
273 ENDPROC(private_AES_set_encrypt_key)
274
275
276 # int private_AES_set_decrypt_key(const unsigned char *userKey, const int bits,
277 # AES_KEY *key) {
278 .align 5
279 ENTRY(private_AES_set_decrypt_key)
280 adr r3, private_rcon
281 cmp r1, #192
282 veor q0, q0, q0
283 vld1.8 {q8},[r0]!
284 add r2, r2, #160
285 vld1.32 {q1,q2},[r3]!
286 beq .LPrivateExpandDec192
287 bgt .LPrivateExpandDec256
288 .LPrivateExpandDec128:
289 vst1.32 {q8},[r2]
290 vtbl.8 d6, {q8},d4
291 vtbl.8 d7, {q8},d5
292 vext.8 q14, q0, q8, #12
293 veor q15, q8, q14
294 vext.8 q14, q0, q14, #12
295 veor q15, q15, q14
296 vext.8 q14, q0, q14, #12
297 veor q15, q15, q14
298 sub r2, r2, #16
299 aese.8 q3, q0
300 mov r1, #7
301 veor q3, q3, q1
302 vshl.u8 q1, q1, #1
303 veor q8, q3, q15
304 aesimc.8 q12, q8
305 .LPrivateLoopDec128:
306 vst1.32 {q12},[r2]
307 vtbl.8 d6, {q8},d4
308 vtbl.8 d7, {q8},d5
309 vext.8 q14, q0, q8, #12
310 veor q15, q8, q14
311 vext.8 q14, q0, q14, #12
312 veor q15, q15, q14
313 vext.8 q14, q0, q14, #12
314 veor q15, q15, q14
315 sub r2, r2, #16
316 aese.8 q3, q0
317 subs r1, r1, #1
318 veor q3, q3, q1
319 vshl.u8 q1, q1, #1
320 veor q8, q3, q15
321 aesimc.8 q12, q8
322 bne .LPrivateLoopDec128
323 vld1.32 {q1},[r3]
324 vst1.32 {q12},[r2]
325 vtbl.8 d6, {q8},d4
326 vtbl.8 d7, {q8},d5
327 vext.8 q14, q0, q8, #12
328 veor q15, q8, q14
329 vext.8 q14, q0, q14, #12
330 veor q15, q15, q14
331 vext.8 q14, q0, q14, #12
332 veor q15, q15, q14
333 sub r2, r2, #16
334 aese.8 q3, q0
335 veor q3, q3, q1
336 vshl.u8 q1, q1, #1
337 veor q8, q3, q15
338 aesimc.8 q12, q8
339 vst1.32 {q12},[r2]
340 vtbl.8 d6, {q8},d4
341 vtbl.8 d7, {q8},d5
342 vext.8 q14, q0, q8, #12
343 veor q15, q8, q14
344 vext.8 q14, q0, q14, #12
345 veor q15, q15, q14
346 vext.8 q14, q0, q14, #12
347 veor q15, q15, q14
348 sub r2, r2, #16
349 aese.8 q3, q0
350 veor q3, q3, q1
351 veor q8, q3, q15
352 vst1.32 {q8},[r2]
353 add r2, r2, #240
354 mov r12, #10
355 str r12, [r2]
356 eor r0, r0, r0
357 bx lr
358
359 .align 4
360 .LPrivateExpandDec192:
361 vld1.8 {d18},[r0]
362 add r2, r2, #32
363 vmov.i8 q3, #8
364 mov r1, #3
365 vst1.32 {q8},[r2]
366 sub r2, r2, #16
367 vsub.i8 q2, q2, q3
368 vext.8 q14, q0, q8, #12
369 veor q15, q8, q14
370 vtbl.8 d6, {q9},d4
371 vtbl.8 d7, {q9},d5
372 vext.8 q14, q0, q14, #12
373 veor q15, q15, q14
374 vext.8 q14, q0, q14, #12
375 veor q15, q15, q14
376 aese.8 q3, q0
377 vmov d26, d18
378 veor q3, q3, q1
379 vshl.u8 q1, q1, #1
380 veor q8, q3, q15
381 vdup.32 q15, d31[1]
382 vmov d27, d16
383 veor q15, q15, q9
384 aesimc.8 q13, q13
385 vmov d24, d17
386 vext.8 q14, q0, q9, #12
387 veor q15, q15, q14
388 vst1.32 {q13},[r2]
389 sub r2, r2, #16
390 veor q9, q3, q15
391 vmov d25, d18
392 .LPrivateLoopDec192:
393 vext.8 q14, q0, q8, #12
394 veor q15, q8, q14
395 aesimc.8 q12, q12
396 vtbl.8 d6, {q9},d4
397 vtbl.8 d7, {q9},d5
398 vst1.32 {q12},[r2]
399 sub r2, r2, #16
400 vext.8 q14, q0, q14, #12
401 veor q15, q15, q14
402 vext.8 q14, q0, q14, #12
403 veor q15, q15, q14
404 aese.8 q3, q0
405 subs r1, r1, #1
406 veor q3, q3, q1
407 vshl.u8 q1, q1, #1
408 veor q10, q3, q15
409 vdup.32 q15, d31[1]
410 veor q15, q15, q9
411 aesimc.8 q12, q10
412 vext.8 q14, q0, q9, #12
413 veor q15, q15, q14
414 vst1.32 {q12},[r2]
415 sub r2, r2, #16
416 veor q11, q3, q15
417 vext.8 q14, q0, q10, #12
418 veor q15, q10, q14
419 vtbl.8 d6, {q11},d4
420 vtbl.8 d7, {q11},d5
421 vext.8 q14, q0, q14, #12
422 veor q15, q15, q14
423 vext.8 q14, q0, q14, #12
424 veor q15, q15, q14
425 aese.8 q3, q0
426 vmov d26, d22
427 veor q3, q3, q1
428 vshl.u8 q1, q1, #1
429 veor q8, q3, q15
430 vdup.32 q15, d31[1]
431 vmov d27, d16
432 veor q15, q15, q11
433 aesimc.8 q13, q13
434 vmov d24, d17
435 vext.8 q14, q0, q11, #12
436 veor q15, q15, q14
437 vst1.32 {q13},[r2]
438 sub r2, r2, #16
439 veor q9, q3, q15
440 vmov d25, d18
441 bne .LPrivateLoopDec192
442 vext.8 q14, q0, q8, #12
443 veor q15, q8, q14
444 aesimc.8 q12, q12
445 vtbl.8 d6, {q9},d4
446 vtbl.8 d7, {q9},d5
447 vst1.32 {q12},[r2]
448 sub r2, r2, #16
449 vext.8 q14, q0, q14, #12
450 veor q15, q15, q14
451 vext.8 q14, q0, q14, #12
452 veor q15, q15, q14
453 aese.8 q3, q0
454 veor q3, q3, q1
455 veor q8, q3, q15
456 vst1.32 {q8},[r2]
457 add r2, r2, #240
458 mov r12, #12
459 str r12, [r2]
460 eor r0, r0, r0
461 bx lr
462
463 .align 4
464 .LPrivateExpandDec256:
465 vld1.8 {q9},[r0]
466 add r2, r2, #80
467 vmov q12, q8
468 mov r1, #14
469 str r1, [r2]
470 sub r2, r2, #16
471 mov r1, #6
472 .LPrivateLoopDec256:
473 vext.8 q14, q0, q8, #12
474 veor q15, q8, q14
475 aesimc.8 q13, q9
476 vst1.32 {q12},[r2]
477 sub r2, r2, #16
478 vtbl.8 d6, {q9},d4
479 vst1.32 {q13},[r2]
480 sub r2, r2, #16
481 vtbl.8 d7, {q9},d5
482 vext.8 q14, q0, q14, #12
483 veor q15, q15, q14
484 vext.8 q14, q0, q14, #12
485 veor q15, q15, q14
486 aese.8 q3, q0
487 subs r1, r1, #1
488 veor q3, q3, q1
489 vshl.u8 q1, q1, #1
490 veor q8, q3, q15
491 vext.8 q14, q0, q9, #12
492 veor q15, q9, q14
493 aesimc.8 q12, q8
494 vdup.32 q3, d17[1]
495 vext.8 q14, q0, q14, #12
496 veor q15, q15, q14
497 vext.8 q14, q0, q14, #12
498 veor q15, q15, q14
499 aese.8 q3, q0
500 veor q9, q3, q15
501 bne .LPrivateLoopDec256
502 aesimc.8 q13, q9
503 vst1.32 {q12},[r2]
504 sub r2, r2, #16
505 vtbl.8 d6, {q9},d4
506 vst1.32 {q13},[r2]
507 sub r2, r2, #16
508 vtbl.8 d7, {q9},d5
509 vext.8 q14, q0, q8, #12
510 veor q15, q8, q14
511 vext.8 q14, q0, q14, #12
512 veor q15, q15, q14
513 vext.8 q14, q0, q14, #12
514 veor q15, q15, q14
515 aese.8 q3, q0
516 veor q3, q3, q1
517 veor q8, q3, q15
518 vst1.32 {q8},[r2]
519 eor r0, r0, r0
520 bx lr
521 ENDPROC(private_AES_set_decrypt_key)
522
523 .align 2
524
525 #endif