Commit | Line | Data |
---|---|---|
6fa3eb70 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 |