1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* |
3 | * Copyright (C) 2019 Linaro Ltd <ard.biesheuvel@linaro.org> |
4 | */ |
5 | |
6 | #include <asm/cpufeature.h> |
7 | #include <asm/neon.h> |
8 | |
9 | #include "aegis.h" |
10 | #include "aegis-neon.h" |
11 | |
12 | int aegis128_have_aes_insn __ro_after_init; |
13 | |
14 | bool crypto_aegis128_have_simd(void) |
15 | { |
16 | if (cpu_have_feature(cpu_feature(AES))) { |
17 | aegis128_have_aes_insn = 1; |
18 | return true; |
19 | } |
20 | return IS_ENABLED(CONFIG_ARM64); |
21 | } |
22 | |
23 | void crypto_aegis128_init_simd(struct aegis_state *state, |
24 | const union aegis_block *key, |
25 | const u8 *iv) |
26 | { |
27 | kernel_neon_begin(); |
28 | crypto_aegis128_init_neon(state, key, iv); |
29 | kernel_neon_end(); |
30 | } |
31 | |
32 | void crypto_aegis128_update_simd(struct aegis_state *state, const void *msg) |
33 | { |
34 | kernel_neon_begin(); |
35 | crypto_aegis128_update_neon(state, msg); |
36 | kernel_neon_end(); |
37 | } |
38 | |
39 | void crypto_aegis128_encrypt_chunk_simd(struct aegis_state *state, u8 *dst, |
40 | const u8 *src, unsigned int size) |
41 | { |
42 | kernel_neon_begin(); |
43 | crypto_aegis128_encrypt_chunk_neon(state, dst, src, size); |
44 | kernel_neon_end(); |
45 | } |
46 | |
47 | void crypto_aegis128_decrypt_chunk_simd(struct aegis_state *state, u8 *dst, |
48 | const u8 *src, unsigned int size) |
49 | { |
50 | kernel_neon_begin(); |
51 | crypto_aegis128_decrypt_chunk_neon(state, dst, src, size); |
52 | kernel_neon_end(); |
53 | } |
54 | |
55 | int crypto_aegis128_final_simd(struct aegis_state *state, |
56 | union aegis_block *tag_xor, |
57 | unsigned int assoclen, |
58 | unsigned int cryptlen, |
59 | unsigned int authsize) |
60 | { |
61 | int ret; |
62 | |
63 | kernel_neon_begin(); |
64 | ret = crypto_aegis128_final_neon(state, tag_xor, assoclen, cryptlen, |
65 | authsize); |
66 | kernel_neon_end(); |
67 | |
68 | return ret; |
69 | } |
70 | |