Linux-libre 5.7.6-gnu
[librecmc/linux-libre.git] / arch / arm64 / crypto / aes-ce-core.S
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2013 - 2017 Linaro Ltd <ard.biesheuvel@linaro.org>
4  */
5
6 #include <linux/linkage.h>
7 #include <asm/assembler.h>
8
9         .arch           armv8-a+crypto
10
11 SYM_FUNC_START(__aes_ce_encrypt)
12         sub             w3, w3, #2
13         ld1             {v0.16b}, [x2]
14         ld1             {v1.4s}, [x0], #16
15         cmp             w3, #10
16         bmi             0f
17         bne             3f
18         mov             v3.16b, v1.16b
19         b               2f
20 0:      mov             v2.16b, v1.16b
21         ld1             {v3.4s}, [x0], #16
22 1:      aese            v0.16b, v2.16b
23         aesmc           v0.16b, v0.16b
24 2:      ld1             {v1.4s}, [x0], #16
25         aese            v0.16b, v3.16b
26         aesmc           v0.16b, v0.16b
27 3:      ld1             {v2.4s}, [x0], #16
28         subs            w3, w3, #3
29         aese            v0.16b, v1.16b
30         aesmc           v0.16b, v0.16b
31         ld1             {v3.4s}, [x0], #16
32         bpl             1b
33         aese            v0.16b, v2.16b
34         eor             v0.16b, v0.16b, v3.16b
35         st1             {v0.16b}, [x1]
36         ret
37 SYM_FUNC_END(__aes_ce_encrypt)
38
39 SYM_FUNC_START(__aes_ce_decrypt)
40         sub             w3, w3, #2
41         ld1             {v0.16b}, [x2]
42         ld1             {v1.4s}, [x0], #16
43         cmp             w3, #10
44         bmi             0f
45         bne             3f
46         mov             v3.16b, v1.16b
47         b               2f
48 0:      mov             v2.16b, v1.16b
49         ld1             {v3.4s}, [x0], #16
50 1:      aesd            v0.16b, v2.16b
51         aesimc          v0.16b, v0.16b
52 2:      ld1             {v1.4s}, [x0], #16
53         aesd            v0.16b, v3.16b
54         aesimc          v0.16b, v0.16b
55 3:      ld1             {v2.4s}, [x0], #16
56         subs            w3, w3, #3
57         aesd            v0.16b, v1.16b
58         aesimc          v0.16b, v0.16b
59         ld1             {v3.4s}, [x0], #16
60         bpl             1b
61         aesd            v0.16b, v2.16b
62         eor             v0.16b, v0.16b, v3.16b
63         st1             {v0.16b}, [x1]
64         ret
65 SYM_FUNC_END(__aes_ce_decrypt)
66
67 /*
68  * __aes_ce_sub() - use the aese instruction to perform the AES sbox
69  *                  substitution on each byte in 'input'
70  */
71 SYM_FUNC_START(__aes_ce_sub)
72         dup             v1.4s, w0
73         movi            v0.16b, #0
74         aese            v0.16b, v1.16b
75         umov            w0, v0.s[0]
76         ret
77 SYM_FUNC_END(__aes_ce_sub)
78
79 SYM_FUNC_START(__aes_ce_invert)
80         ld1             {v0.4s}, [x1]
81         aesimc          v1.16b, v0.16b
82         st1             {v1.4s}, [x0]
83         ret
84 SYM_FUNC_END(__aes_ce_invert)