Merge tag 'v3.10.55' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / arch / arm / crypto / aes-armv8-bcm.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_v8_cbc_encrypt
11 # - aes_v8_cbc_decrypt
12
13 .align 5
14 rcon:
15 .long 0x00000001,0x00000001,0x00000001,0x00000001
16 .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d
17 .long 0x0000001b,0x0000001b,0x0000001b,0x0000001b
18
19 # void aes_v8_cbc_encrypt(u8 out[], u8 const in[], u8 const rk[],
20 # int rounds, int blocks, u8 iv[], int first);
21 .align 5
22 ENTRY(aes_v8_cbc_encrypt)
23 push {r4, r5, r6}
24 vpush {q4, q5, q6, q7}
25 ldr r4, [sp, #76] // blocks
26 ldr r5, [sp, #80] // iv
27 ldr r6, [sp, #84] // first
28
29 cmp r6, #0
30 beq .LcbcencDispatch
31 vld1.8 {d2-d3}, [r5]
32 .LcbcencDispatch:
33 cmp r3, #12
34 bhi .Lcbcenc256
35 beq .Lcbcenc192
36
37 .Lcbcenc128:
38 // Load round keys
39 vld1.8 {d4-d5}, [r2]!
40 vld1.8 {d6-d7}, [r2]!
41 vld1.8 {d8-d9}, [r2]!
42 vld1.8 {d10-d11}, [r2]!
43 vld1.8 {d12-d13}, [r2]!
44 vld1.8 {d14-d15}, [r2]!
45 vld1.8 {d16-d17}, [r2]!
46 vld1.8 {d18-d19}, [r2]!
47 vld1.8 {d20-d21}, [r2]!
48 vld1.8 {d22-d23}, [r2]!
49 vld1.8 {d24-d25}, [r2]
50 .Lcbcenc128Loop:
51 // load input 16 bytes, and eor with iv
52 vld1.8 {d0-d1}, [r1]!
53 veor.8 q0, q0, q1
54 pld [r1, #16]
55 // aes kernel
56 aese.8 q0, q2
57 aesmc.8 q0, q0
58 aese.8 q0, q3
59 aesmc.8 q0, q0
60 aese.8 q0, q4
61 aesmc.8 q0, q0
62 aese.8 q0, q5
63 aesmc.8 q0, q0
64 aese.8 q0, q6
65 aesmc.8 q0, q0
66 aese.8 q0, q7
67 aesmc.8 q0, q0
68 aese.8 q0, q8
69 aesmc.8 q0, q0
70 aese.8 q0, q9
71 aesmc.8 q0, q0
72 aese.8 q0, q10
73 aesmc.8 q0, q0
74 aese.8 q0, q11
75 veor.8 q1, q0, q12
76 // store output 16 bytes, and continue next round
77 vst1.8 {d2-d3}, [r0]!
78 subs r4, r4, #1
79 bne .Lcbcenc128Loop
80 .Lcbcenc128Done:
81 vpop {q4, q5, q6, q7}
82 pop {r4, r5, r6}
83 bx lr
84
85 .Lcbcenc192:
86 // Load round keys
87 vld1.8 {d4-d5}, [r2]!
88 vld1.8 {d6-d7}, [r2]!
89 vld1.8 {d8-d9}, [r2]!
90 vld1.8 {d10-d11}, [r2]!
91 vld1.8 {d12-d13}, [r2]!
92 vld1.8 {d14-d15}, [r2]!
93 vld1.8 {d16-d17}, [r2]!
94 vld1.8 {d18-d19}, [r2]!
95 vld1.8 {d20-d21}, [r2]!
96 vld1.8 {d22-d23}, [r2]!
97 vld1.8 {d24-d25}, [r2]!
98 vld1.8 {d26-d27}, [r2]!
99 vld1.8 {d28-d29}, [r2]
100 .Lcbcenc192Loop:
101 // load input 16 bytes, and eor with iv
102 vld1.8 {d0-d1}, [r1]!
103 veor.8 q0, q0, q1
104 pld [r1, #16]
105 // aes kernel
106 aese.8 q0, q2
107 aesmc.8 q0, q0
108 aese.8 q0, q3
109 aesmc.8 q0, q0
110 aese.8 q0, q4
111 aesmc.8 q0, q0
112 aese.8 q0, q5
113 aesmc.8 q0, q0
114 aese.8 q0, q6
115 aesmc.8 q0, q0
116 aese.8 q0, q7
117 aesmc.8 q0, q0
118 aese.8 q0, q8
119 aesmc.8 q0, q0
120 aese.8 q0, q9
121 aesmc.8 q0, q0
122 aese.8 q0, q10
123 aesmc.8 q0, q0
124 aese.8 q0, q11
125 aesmc.8 q0, q0
126 aese.8 q0, q12
127 aesmc.8 q0, q0
128 aese.8 q0, q13
129 veor.8 q1, q0, q14
130 // store output 16 bytes, and continue next round
131 vst1.8 {d2-d3}, [r0]!
132 subs r4, r4, #1
133 bne .Lcbcenc192Loop
134 .Lcbcenc192Done:
135 vpop {q4, q5, q6, q7}
136 pop {r4, r5, r6}
137 bx lr
138
139 .Lcbcenc256:
140 // Load round keys
141 vld1.8 {d4-d5}, [r2]!
142 vld1.8 {d6-d7}, [r2]!
143 vld1.8 {d8-d9}, [r2]!
144 vld1.8 {d10-d11}, [r2]!
145 vld1.8 {d12-d13}, [r2]!
146 vld1.8 {d14-d15}, [r2]!
147 vld1.8 {d16-d17}, [r2]!
148 vld1.8 {d18-d19}, [r2]!
149 vld1.8 {d20-d21}, [r2]!
150 vld1.8 {d22-d23}, [r2]!
151 vld1.8 {d24-d25}, [r2]!
152 vld1.8 {d26-d27}, [r2]!
153 vld1.8 {d28-d29}, [r2]!
154 mov r3, r2
155 .Lcbcenc256Loop:
156 // load input 16 bytes, and eor with iv
157 vld1.8 {d0-d1}, [r1]!
158 veor.8 q0, q0, q1
159 pld [r1, #16]
160 // aes kernel
161 aese.8 q0, q2
162 aesmc.8 q0, q0
163 aese.8 q0, q3
164 aesmc.8 q0, q0
165 vld1.8 {d30}, [r2]!
166 aese.8 q0, q4
167 aesmc.8 q0, q0
168 aese.8 q0, q5
169 aesmc.8 q0, q0
170 vld1.8 {d31}, [r2]!
171 aese.8 q0, q6
172 aesmc.8 q0, q0
173 aese.8 q0, q7
174 aesmc.8 q0, q0
175 aese.8 q0, q8
176 aesmc.8 q0, q0
177 aese.8 q0, q9
178 aesmc.8 q0, q0
179 aese.8 q0, q10
180 aesmc.8 q0, q0
181 aese.8 q0, q11
182 aesmc.8 q0, q0
183 aese.8 q0, q12
184 aesmc.8 q0, q0
185 aese.8 q0, q13
186 aesmc.8 q0, q0
187 aese.8 q0, q14
188 aesmc.8 q0, q0
189 aese.8 q0, q15
190 vld1.8 {d30-d31}, [r2]
191 veor.8 q1, q0, q15
192 mov r2, r3
193 // store output 16 bytes, and continue next round
194 vst1.8 {d2-d3}, [r0]!
195 subs r4, r4, #1
196 bne .Lcbcenc256Loop
197 .Lcbcenc256Done:
198 vpop {q4, q5, q6, q7}
199 pop {r4, r5, r6}
200 bx lr
201 ENDPROC(aes_v8_cbc_encrypt)
202
203
204 # void aes_v8_cbc_decrypt(u8 out[], u8 const in[], u8 const rk[],
205 # int rounds, int blocks, u8 iv[], int first);
206 .align 5
207 ENTRY(aes_v8_cbc_decrypt)
208 push {r4, r5, r6}
209 vpush {q4, q5, q6, q7}
210 ldr r4, [sp, #76] // blocks
211 ldr r5, [sp, #80] // iv
212 ldr r6, [sp, #84] // first
213
214 cmp r6, #0
215 beq .LcbcdecDispatch
216 vld1.8 {d4-d5}, [r5]
217 .LcbcdecDispatch:
218 cmp r3, #12
219 bhi .Lcbcdec256
220 beq .Lcbcdec192
221
222 .Lcbcdec128:
223 // Load round keys
224 vld1.8 {d10-d11}, [r2]!
225 vld1.8 {d12-d13}, [r2]!
226 vld1.8 {d14-d15}, [r2]!
227 vld1.8 {d16-d17}, [r2]!
228 vld1.8 {d18-d19}, [r2]!
229 vld1.8 {d20-d21}, [r2]!
230 vld1.8 {d22-d23}, [r2]!
231 vld1.8 {d24-d25}, [r2]!
232 vld1.8 {d26-d27}, [r2]!
233 vld1.8 {d28-d29}, [r2]!
234 vld1.8 {d30-d31}, [r2]!
235 // Sub by 2
236 subs r4, r4, #2
237 bmi .Lcbcdec128_1X
238 .Lcbcdec128_2XLoop:
239 // Load input 32 bytes
240 vld1.8 {d0-d3}, [r1]!
241 pld [r1, #32]
242 vmov q3, q0
243 vmov q4, q1
244 // aes kernel
245 aesd.8 q0, q5
246 aesimc.8 q0, q0
247 aesd.8 q1, q5
248 aesimc.8 q1, q1
249 aesd.8 q0, q6
250 aesimc.8 q0, q0
251 aesd.8 q1, q6
252 aesimc.8 q1, q1
253 aesd.8 q0, q7
254 aesimc.8 q0, q0
255 aesd.8 q1, q7
256 aesimc.8 q1, q1
257 aesd.8 q0, q8
258 aesimc.8 q0, q0
259 aesd.8 q1, q8
260 aesimc.8 q1, q1
261 aesd.8 q0, q9
262 aesimc.8 q0, q0
263 aesd.8 q1, q9
264 aesimc.8 q1, q1
265 aesd.8 q0, q10
266 aesimc.8 q0, q0
267 aesd.8 q1, q10
268 aesimc.8 q1, q1
269 aesd.8 q0, q11
270 aesimc.8 q0, q0
271 aesd.8 q1, q11
272 aesimc.8 q1, q1
273 aesd.8 q0, q12
274 aesimc.8 q0, q0
275 aesd.8 q1, q12
276 aesimc.8 q1, q1
277 aesd.8 q0, q13
278 aesimc.8 q0, q0
279 aesd.8 q1, q13
280 aesimc.8 q1, q1
281 aesd.8 q0, q14
282 aesd.8 q1, q14
283 veor.8 q0, q0, q15
284 veor.8 q1, q1, q15
285 veor.8 q0, q0, q2
286 veor.8 q1, q1, q3
287 vmov q2, q4
288 vst1.8 {d0-d1}, [r0]!
289 vst1.8 {d2-d3}, [r0]!
290 subs r4, r4, #2
291 bpl .Lcbcdec128_2XLoop
292 .Lcbcdec128_1X:
293 adds r4, r4, #2
294 bne .Lcbcdec128_FinalRound
295 vpop {q4, q5, q6, q7}
296 pop {r4, r5, r6}
297 bx lr
298 .Lcbcdec128_FinalRound:
299 // load input 16 bytes
300 vld1.8 {d0-d1}, [r1]!
301 // aes kernel
302 aesd.8 q0, q5
303 aesimc.8 q0, q0
304 aesd.8 q0, q6
305 aesimc.8 q0, q0
306 aesd.8 q0, q7
307 aesimc.8 q0, q0
308 aesd.8 q0, q8
309 aesimc.8 q0, q0
310 aesd.8 q0, q9
311 aesimc.8 q0, q0
312 aesd.8 q0, q10
313 aesimc.8 q0, q0
314 aesd.8 q0, q11
315 aesimc.8 q0, q0
316 aesd.8 q0, q12
317 aesimc.8 q0, q0
318 aesd.8 q0, q13
319 aesimc.8 q0, q0
320 aesd.8 q0, q14
321 veor.8 q0, q0, q15
322 veor.8 q0, q0, q2
323 vst1.8 {d0-d1}, [r0]!
324 vpop {q4, q5, q6, q7}
325 pop {r4, r5, r6}
326 bx lr
327
328 .Lcbcdec192:
329 // Load round keys
330 vld1.8 {d10-d11}, [r2]!
331 vld1.8 {d12-d13}, [r2]!
332 vld1.8 {d14-d15}, [r2]!
333 vld1.8 {d16-d17}, [r2]!
334 vld1.8 {d18-d19}, [r2]!
335 vld1.8 {d20-d21}, [r2]!
336 vld1.8 {d22-d23}, [r2]!
337 vld1.8 {d24-d25}, [r2]!
338 vld1.8 {d26-d27}, [r2]!
339 vld1.8 {d28-d29}, [r2]!
340 mov r3, r2
341 // Sub by 2
342 subs r4, r4, #2
343 bmi .Lcbcdec192_1X
344 .Lcbcdec192_2XLoop:
345 // Load input 32 bytes
346 vld1.8 {d0-d3}, [r1]!
347 pld [r1, #32]
348 vmov q3, q0
349 vmov q4, q1
350 // aes kernel
351 aesd.8 q0, q5
352 aesimc.8 q0, q0
353 aesd.8 q1, q5
354 aesimc.8 q1, q1
355 aesd.8 q0, q6
356 aesimc.8 q0, q0
357 aesd.8 q1, q6
358 aesimc.8 q1, q1
359 aesd.8 q0, q7
360 aesimc.8 q0, q0
361 aesd.8 q1, q7
362 aesimc.8 q1, q1
363 aesd.8 q0, q8
364 aesimc.8 q0, q0
365 aesd.8 q1, q8
366 aesimc.8 q1, q1
367 aesd.8 q0, q9
368 aesimc.8 q0, q0
369 aesd.8 q1, q9
370 aesimc.8 q1, q1
371 aesd.8 q0, q10
372 aesimc.8 q0, q0
373 aesd.8 q1, q10
374 aesimc.8 q1, q1
375 aesd.8 q0, q11
376 aesimc.8 q0, q0
377 aesd.8 q1, q11
378 aesimc.8 q1, q1
379 aesd.8 q0, q12
380 aesimc.8 q0, q0
381 aesd.8 q1, q12
382 aesimc.8 q1, q1
383 aesd.8 q0, q13
384 aesimc.8 q0, q0
385 aesd.8 q1, q13
386 aesimc.8 q1, q1
387 aesd.8 q0, q14
388 aesimc.8 q0, q0
389 aesd.8 q1, q14
390 aesimc.8 q1, q1
391 vld1.8 {d30-d31}, [r2]!
392 aesd.8 q0, q15
393 aesimc.8 q0, q0
394 aesd.8 q1, q15
395 aesimc.8 q1, q1
396 vld1.8 {d30-d31}, [r2]!
397 aesd.8 q0, q15
398 aesd.8 q1, q15
399 vld1.8 {d30-d31}, [r2]!
400 veor.8 q0, q0, q15
401 veor.8 q1, q1, q15
402 mov r2, r3
403 veor.8 q0, q0, q2
404 veor.8 q1, q1, q3
405 vmov q2, q4
406 vst1.8 {d0-d1}, [r0]!
407 vst1.8 {d2-d3}, [r0]!
408 subs r4, r4, #2
409 bpl .Lcbcdec192_2XLoop
410 .Lcbcdec192_1X:
411 adds r4, r4, #2
412 bne .Lcbcdec192_FinalRound
413 vpop {q4, q5, q6, q7}
414 pop {r4, r5, r6}
415 bx lr
416 .Lcbcdec192_FinalRound:
417 // load input 16 bytes
418 vld1.8 {d0-d1}, [r1]!
419 // aes kernel
420 aesd.8 q0, q5
421 aesimc.8 q0, q0
422 vld1.8 {d30}, [r2]!
423 aesd.8 q0, q6
424 aesimc.8 q0, q0
425 vld1.8 {d31}, [r2]!
426 aesd.8 q0, q7
427 aesimc.8 q0, q0
428 aesd.8 q0, q8
429 aesimc.8 q0, q0
430 aesd.8 q0, q9
431 aesimc.8 q0, q0
432 aesd.8 q0, q10
433 aesimc.8 q0, q0
434 aesd.8 q0, q11
435 aesimc.8 q0, q0
436 aesd.8 q0, q12
437 aesimc.8 q0, q0
438 aesd.8 q0, q13
439 aesimc.8 q0, q0
440 aesd.8 q0, q14
441 aesimc.8 q0, q0
442 aesd.8 q0, q15
443 aesimc.8 q0, q0
444 vld1.8 {d30-d31}, [r2]!
445 aesd.8 q0, q15
446 vld1.8 {d30-d31}, [r2]!
447 veor.8 q0, q0, q15
448 veor.8 q0, q0, q2
449 vst1.8 {d0-d1}, [r0]!
450 vpop {q4, q5, q6, q7}
451 pop {r4, r5, r6}
452 bx lr
453
454 .Lcbcdec256:
455 // Load round keys
456 vld1.8 {d10-d11}, [r2]!
457 vld1.8 {d12-d13}, [r2]!
458 vld1.8 {d14-d15}, [r2]!
459 vld1.8 {d16-d17}, [r2]!
460 vld1.8 {d18-d19}, [r2]!
461 vld1.8 {d20-d21}, [r2]!
462 vld1.8 {d22-d23}, [r2]!
463 vld1.8 {d24-d25}, [r2]!
464 vld1.8 {d26-d27}, [r2]!
465 vld1.8 {d28-d29}, [r2]!
466 mov r3, r2
467 // Sub by 2
468 subs r4, r4, #2
469 bmi .Lcbcdec256_1X
470 .Lcbcdec256_2XLoop:
471 // Load input 32 bytes
472 vld1.8 {d0-d3}, [r1]!
473 pld [r1, #32]
474 vmov q3, q0
475 vmov q4, q1
476 // aes kernel
477 aesd.8 q0, q5
478 aesimc.8 q0, q0
479 aesd.8 q1, q5
480 aesimc.8 q1, q1
481 aesd.8 q0, q6
482 aesimc.8 q0, q0
483 aesd.8 q1, q6
484 aesimc.8 q1, q1
485 aesd.8 q0, q7
486 aesimc.8 q0, q0
487 aesd.8 q1, q7
488 aesimc.8 q1, q1
489 aesd.8 q0, q8
490 aesimc.8 q0, q0
491 aesd.8 q1, q8
492 aesimc.8 q1, q1
493 aesd.8 q0, q9
494 aesimc.8 q0, q0
495 aesd.8 q1, q9
496 aesimc.8 q1, q1
497 aesd.8 q0, q10
498 aesimc.8 q0, q0
499 aesd.8 q1, q10
500 aesimc.8 q1, q1
501 aesd.8 q0, q11
502 aesimc.8 q0, q0
503 aesd.8 q1, q11
504 aesimc.8 q1, q1
505 aesd.8 q0, q12
506 aesimc.8 q0, q0
507 aesd.8 q1, q12
508 aesimc.8 q1, q1
509 aesd.8 q0, q13
510 aesimc.8 q0, q0
511 aesd.8 q1, q13
512 aesimc.8 q1, q1
513 aesd.8 q0, q14
514 aesimc.8 q0, q0
515 aesd.8 q1, q14
516 aesimc.8 q1, q1
517 vld1.8 {d30-d31}, [r2]!
518 aesd.8 q0, q15
519 aesimc.8 q0, q0
520 aesd.8 q1, q15
521 aesimc.8 q1, q1
522 vld1.8 {d30-d31}, [r2]!
523 aesd.8 q0, q15
524 aesimc.8 q0, q0
525 aesd.8 q1, q15
526 aesimc.8 q1, q1
527 vld1.8 {d30-d31}, [r2]!
528 aesd.8 q0, q15
529 aesimc.8 q0, q0
530 aesd.8 q1, q15
531 aesimc.8 q1, q1
532 vld1.8 {d30-d31}, [r2]!
533 aesd.8 q0, q15
534 aesd.8 q1, q15
535 vld1.8 {d30-d31}, [r2]!
536 veor.8 q0, q0, q15
537 veor.8 q1, q1, q15
538 mov r2, r3
539 veor.8 q0, q0, q2
540 veor.8 q1, q1, q3
541 vmov q2, q4
542 vst1.8 {d0-d1}, [r0]!
543 vst1.8 {d2-d3}, [r0]!
544 subs r4, r4, #2
545 bpl .Lcbcdec256_2XLoop
546 .Lcbcdec256_1X:
547 adds r4, r4, #2
548 bne .Lcbcdec256_FinalRound
549 vpop {q4, q5, q6, q7}
550 pop {r4, r5, r6}
551 bx lr
552 .Lcbcdec256_FinalRound:
553 // load input 16 bytes
554 vld1.8 {d0-d1}, [r1]!
555 // aes kernel
556 aesd.8 q0, q5
557 aesimc.8 q0, q0
558 vld1.8 {d30}, [r2]!
559 aesd.8 q0, q6
560 aesimc.8 q0, q0
561 vld1.8 {d31}, [r2]!
562 aesd.8 q0, q7
563 aesimc.8 q0, q0
564 aesd.8 q0, q8
565 aesimc.8 q0, q0
566 aesd.8 q0, q9
567 aesimc.8 q0, q0
568 aesd.8 q0, q10
569 aesimc.8 q0, q0
570 aesd.8 q0, q11
571 aesimc.8 q0, q0
572 aesd.8 q0, q12
573 aesimc.8 q0, q0
574 aesd.8 q0, q13
575 aesimc.8 q0, q0
576 aesd.8 q0, q14
577 aesimc.8 q0, q0
578 aesd.8 q0, q15
579 aesimc.8 q0, q0
580 vld1.8 {d30-d31}, [r2]!
581 aesd.8 q0, q15
582 aesimc.8 q0, q0
583 vld1.8 {d30-d31}, [r2]!
584 aesd.8 q0, q15
585 aesimc.8 q0, q0
586 vld1.8 {d30-d31}, [r2]!
587 aesd.8 q0, q15
588 vld1.8 {d30-d31}, [r2]!
589 veor.8 q0, q0, q15
590 veor.8 q0, q0, q2
591 vst1.8 {d0-d1}, [r0]!
592 vpop {q4, q5, q6, q7}
593 pop {r4, r5, r6}
594 bx lr
595
596 ENDPROC(aes_v8_cbc_decrypt)
597
598 #endif