1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 #include <linux/linkage.h>
50
51 .text
52 .fpu neon
53 .align 5
54
55
56
57
58
59
60
61
62
63
64
65
66 chacha_permute:
67
68 adr ip, .Lrol8_table
69 vld1.8 {d10}, [ip, :64]
70
71 .Ldoubleround:
72
73 vadd.i32 q0, q0, q1
74 veor q3, q3, q0
75 vrev32.16 q3, q3
76
77
78 vadd.i32 q2, q2, q3
79 veor q4, q1, q2
80 vshl.u32 q1, q4, #12
81 vsri.u32 q1, q4, #20
82
83
84 vadd.i32 q0, q0, q1
85 veor q3, q3, q0
86 vtbl.8 d6, {d6}, d10
87 vtbl.8 d7, {d7}, d10
88
89
90 vadd.i32 q2, q2, q3
91 veor q4, q1, q2
92 vshl.u32 q1, q4, #7
93 vsri.u32 q1, q4, #25
94
95
96 vext.8 q1, q1, q1, #4
97
98 vext.8 q2, q2, q2, #8
99
100 vext.8 q3, q3, q3, #12
101
102
103 vadd.i32 q0, q0, q1
104 veor q3, q3, q0
105 vrev32.16 q3, q3
106
107
108 vadd.i32 q2, q2, q3
109 veor q4, q1, q2
110 vshl.u32 q1, q4, #12
111 vsri.u32 q1, q4, #20
112
113
114 vadd.i32 q0, q0, q1
115 veor q3, q3, q0
116 vtbl.8 d6, {d6}, d10
117 vtbl.8 d7, {d7}, d10
118
119
120 vadd.i32 q2, q2, q3
121 veor q4, q1, q2
122 vshl.u32 q1, q4, #7
123 vsri.u32 q1, q4, #25
124
125
126 vext.8 q1, q1, q1, #12
127
128 vext.8 q2, q2, q2, #8
129
130 vext.8 q3, q3, q3, #4
131
132 subs r3, r3, #2
133 bne .Ldoubleround
134
135 bx lr
136 ENDPROC(chacha_permute)
137
138 ENTRY(chacha_block_xor_neon)
139
140
141
142
143 push {lr}
144
145
146 add ip, r0, #0x20
147 vld1.32 {q0-q1}, [r0]
148 vld1.32 {q2-q3}, [ip]
149
150 vmov q8, q0
151 vmov q9, q1
152 vmov q10, q2
153 vmov q11, q3
154
155 bl chacha_permute
156
157 add ip, r2, #0x20
158 vld1.8 {q4-q5}, [r2]
159 vld1.8 {q6-q7}, [ip]
160
161
162 vadd.i32 q0, q0, q8
163 veor q0, q0, q4
164
165
166 vadd.i32 q1, q1, q9
167 veor q1, q1, q5
168
169
170 vadd.i32 q2, q2, q10
171 veor q2, q2, q6
172
173
174 vadd.i32 q3, q3, q11
175 veor q3, q3, q7
176
177 add ip, r1, #0x20
178 vst1.8 {q0-q1}, [r1]
179 vst1.8 {q2-q3}, [ip]
180
181 pop {pc}
182 ENDPROC(chacha_block_xor_neon)
183
184 ENTRY(hchacha_block_neon)
185
186
187
188 push {lr}
189
190 vld1.32 {q0-q1}, [r0]!
191 vld1.32 {q2-q3}, [r0]
192
193 mov r3, r2
194 bl chacha_permute
195
196 vst1.32 {q0}, [r1]!
197 vst1.32 {q3}, [r1]
198
199 pop {pc}
200 ENDPROC(hchacha_block_neon)
201
202 .align 4
203 .Lctrinc: .word 0, 1, 2, 3
204 .Lrol8_table: .byte 3, 0, 1, 2, 7, 4, 5, 6
205
206 .align 5
207 ENTRY(chacha_4block_xor_neon)
208 push {r4-r5}
209 mov r4, sp
210 sub ip, sp, #0x20
211 bic ip, ip, #0x1f
212 mov sp, ip
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228 add ip, r0, #0x20
229 vld1.32 {q0-q1}, [r0]
230 vld1.32 {q2-q3}, [ip]
231
232 adr r5, .Lctrinc
233 vdup.32 q15, d7[1]
234 vdup.32 q14, d7[0]
235 vld1.32 {q4}, [r5, :128]
236 vdup.32 q13, d6[1]
237 vdup.32 q12, d6[0]
238 vdup.32 q11, d5[1]
239 vdup.32 q10, d5[0]
240 vadd.u32 q12, q12, q4
241 vdup.32 q9, d4[1]
242 vdup.32 q8, d4[0]
243 vdup.32 q7, d3[1]
244 vdup.32 q6, d3[0]
245 vdup.32 q5, d2[1]
246 vdup.32 q4, d2[0]
247 vdup.32 q3, d1[1]
248 vdup.32 q2, d1[0]
249 vdup.32 q1, d0[1]
250 vdup.32 q0, d0[0]
251
252 adr ip, .Lrol8_table
253 b 1f
254
255 .Ldoubleround4:
256 vld1.32 {q8-q9}, [sp, :256]
257 1:
258
259
260
261
262 vadd.i32 q0, q0, q4
263 vadd.i32 q1, q1, q5
264 vadd.i32 q2, q2, q6
265 vadd.i32 q3, q3, q7
266
267 veor q12, q12, q0
268 veor q13, q13, q1
269 veor q14, q14, q2
270 veor q15, q15, q3
271
272 vrev32.16 q12, q12
273 vrev32.16 q13, q13
274 vrev32.16 q14, q14
275 vrev32.16 q15, q15
276
277
278
279
280
281 vadd.i32 q8, q8, q12
282 vadd.i32 q9, q9, q13
283 vadd.i32 q10, q10, q14
284 vadd.i32 q11, q11, q15
285
286 vst1.32 {q8-q9}, [sp, :256]
287
288 veor q8, q4, q8
289 veor q9, q5, q9
290 vshl.u32 q4, q8, #12
291 vshl.u32 q5, q9, #12
292 vsri.u32 q4, q8, #20
293 vsri.u32 q5, q9, #20
294
295 veor q8, q6, q10
296 veor q9, q7, q11
297 vshl.u32 q6, q8, #12
298 vshl.u32 q7, q9, #12
299 vsri.u32 q6, q8, #20
300 vsri.u32 q7, q9, #20
301
302
303
304
305
306 vld1.8 {d16}, [ip, :64]
307 vadd.i32 q0, q0, q4
308 vadd.i32 q1, q1, q5
309 vadd.i32 q2, q2, q6
310 vadd.i32 q3, q3, q7
311
312 veor q12, q12, q0
313 veor q13, q13, q1
314 veor q14, q14, q2
315 veor q15, q15, q3
316
317 vtbl.8 d24, {d24}, d16
318 vtbl.8 d25, {d25}, d16
319 vtbl.8 d26, {d26}, d16
320 vtbl.8 d27, {d27}, d16
321 vtbl.8 d28, {d28}, d16
322 vtbl.8 d29, {d29}, d16
323 vtbl.8 d30, {d30}, d16
324 vtbl.8 d31, {d31}, d16
325
326 vld1.32 {q8-q9}, [sp, :256]
327
328
329
330
331
332 vadd.i32 q8, q8, q12
333 vadd.i32 q9, q9, q13
334 vadd.i32 q10, q10, q14
335 vadd.i32 q11, q11, q15
336
337 vst1.32 {q8-q9}, [sp, :256]
338
339 veor q8, q4, q8
340 veor q9, q5, q9
341 vshl.u32 q4, q8, #7
342 vshl.u32 q5, q9, #7
343 vsri.u32 q4, q8, #25
344 vsri.u32 q5, q9, #25
345
346 veor q8, q6, q10
347 veor q9, q7, q11
348 vshl.u32 q6, q8, #7
349 vshl.u32 q7, q9, #7
350 vsri.u32 q6, q8, #25
351 vsri.u32 q7, q9, #25
352
353 vld1.32 {q8-q9}, [sp, :256]
354
355
356
357
358
359 vadd.i32 q0, q0, q5
360 vadd.i32 q1, q1, q6
361 vadd.i32 q2, q2, q7
362 vadd.i32 q3, q3, q4
363
364 veor q15, q15, q0
365 veor q12, q12, q1
366 veor q13, q13, q2
367 veor q14, q14, q3
368
369 vrev32.16 q15, q15
370 vrev32.16 q12, q12
371 vrev32.16 q13, q13
372 vrev32.16 q14, q14
373
374
375
376
377
378 vadd.i32 q10, q10, q15
379 vadd.i32 q11, q11, q12
380 vadd.i32 q8, q8, q13
381 vadd.i32 q9, q9, q14
382
383 vst1.32 {q8-q9}, [sp, :256]
384
385 veor q8, q7, q8
386 veor q9, q4, q9
387 vshl.u32 q7, q8, #12
388 vshl.u32 q4, q9, #12
389 vsri.u32 q7, q8, #20
390 vsri.u32 q4, q9, #20
391
392 veor q8, q5, q10
393 veor q9, q6, q11
394 vshl.u32 q5, q8, #12
395 vshl.u32 q6, q9, #12
396 vsri.u32 q5, q8, #20
397 vsri.u32 q6, q9, #20
398
399
400
401
402
403 vld1.8 {d16}, [ip, :64]
404 vadd.i32 q0, q0, q5
405 vadd.i32 q1, q1, q6
406 vadd.i32 q2, q2, q7
407 vadd.i32 q3, q3, q4
408
409 veor q15, q15, q0
410 veor q12, q12, q1
411 veor q13, q13, q2
412 veor q14, q14, q3
413
414 vtbl.8 d30, {d30}, d16
415 vtbl.8 d31, {d31}, d16
416 vtbl.8 d24, {d24}, d16
417 vtbl.8 d25, {d25}, d16
418 vtbl.8 d26, {d26}, d16
419 vtbl.8 d27, {d27}, d16
420 vtbl.8 d28, {d28}, d16
421 vtbl.8 d29, {d29}, d16
422
423 vld1.32 {q8-q9}, [sp, :256]
424
425
426
427
428
429 vadd.i32 q10, q10, q15
430 vadd.i32 q11, q11, q12
431 vadd.i32 q8, q8, q13
432 vadd.i32 q9, q9, q14
433
434 vst1.32 {q8-q9}, [sp, :256]
435
436 veor q8, q7, q8
437 veor q9, q4, q9
438 vshl.u32 q7, q8, #7
439 vshl.u32 q4, q9, #7
440 vsri.u32 q7, q8, #25
441 vsri.u32 q4, q9, #25
442
443 veor q8, q5, q10
444 veor q9, q6, q11
445 vshl.u32 q5, q8, #7
446 vshl.u32 q6, q9, #7
447 vsri.u32 q5, q8, #25
448 vsri.u32 q6, q9, #25
449
450 subs r3, r3, #2
451 bne .Ldoubleround4
452
453
454
455
456
457
458 vld1.32 {q8}, [r5, :128]
459 vzip.32 q0, q1
460 vzip.32 q2, q3
461 vzip.32 q4, q5
462 vzip.32 q6, q7
463 vadd.u32 q12, q8
464 vswp d1, d4
465 vswp d3, d6
466 vld1.32 {q8-q9}, [r0]!
467 vswp d9, d12
468 vswp d11, d14
469
470
471
472 vswp q1, q4
473
474
475
476
477 vadd.u32 q0, q0, q8
478 vadd.u32 q2, q2, q8
479 vadd.u32 q4, q4, q8
480 vadd.u32 q3, q3, q8
481
482
483 vadd.u32 q1, q1, q9
484 vadd.u32 q6, q6, q9
485 vadd.u32 q5, q5, q9
486 vadd.u32 q7, q7, q9
487
488
489 vld1.8 {q8-q9}, [r2]!
490 veor q8, q8, q0
491 veor q9, q9, q1
492 vst1.8 {q8-q9}, [r1]!
493
494
495 vld1.32 {q8-q9}, [sp, :256]
496 vzip.32 q12, q13
497 vzip.32 q14, q15
498 vzip.32 q8, q9
499 vzip.32 q10, q11
500 vld1.32 {q0-q1}, [r0]
501 vswp d25, d28
502 vswp d27, d30
503 vswp d17, d20
504 vswp d19, d22
505
506
507
508
509 vadd.u32 q8, q8, q0
510 vadd.u32 q10, q10, q0
511 vadd.u32 q9, q9, q0
512 vadd.u32 q11, q11, q0
513
514
515 vadd.u32 q12, q12, q1
516 vadd.u32 q14, q14, q1
517 vadd.u32 q13, q13, q1
518 vadd.u32 q15, q15, q1
519
520
521
522 vld1.8 {q0-q1}, [r2]!
523 veor q0, q0, q8
524 veor q1, q1, q12
525 vst1.8 {q0-q1}, [r1]!
526
527 vld1.8 {q0-q1}, [r2]!
528 veor q0, q0, q2
529 veor q1, q1, q6
530 vst1.8 {q0-q1}, [r1]!
531
532 vld1.8 {q0-q1}, [r2]!
533 veor q0, q0, q10
534 veor q1, q1, q14
535 vst1.8 {q0-q1}, [r1]!
536
537 vld1.8 {q0-q1}, [r2]!
538 veor q0, q0, q4
539 veor q1, q1, q5
540 vst1.8 {q0-q1}, [r1]!
541
542 vld1.8 {q0-q1}, [r2]!
543 veor q0, q0, q9
544 veor q1, q1, q13
545 vst1.8 {q0-q1}, [r1]!
546
547 vld1.8 {q0-q1}, [r2]!
548 veor q0, q0, q3
549 veor q1, q1, q7
550 vst1.8 {q0-q1}, [r1]!
551
552 vld1.8 {q0-q1}, [r2]
553 mov sp, r4
554 veor q0, q0, q11
555 veor q1, q1, q15
556 vst1.8 {q0-q1}, [r1]
557
558 pop {r4-r5}
559 bx lr
560 ENDPROC(chacha_4block_xor_neon)