| /* SPDX-License-Identifier: GPL-2.0 */ | |
| /* | |
| * Copyright (C) 2018 Linaro Ltd <ard.biesheuvel@linaro.org> | |
| * | |
| * This program is free software; you can redistribute it and/or modify | |
| * it under the terms of the GNU General Public License version 2 as | |
| * published by the Free Software Foundation. | |
| */ | |
| #include <asm/simd.h> | |
| #include <linux/cpufeature.h> | |
| static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_sha3); | |
| asmlinkage void sha3_ce_transform(struct sha3_state *state, const u8 *data, | |
| size_t nblocks, size_t block_size); | |
| static void sha3_absorb_blocks(struct sha3_state *state, const u8 *data, | |
| size_t nblocks, size_t block_size) | |
| { | |
| if (static_branch_likely(&have_sha3) && likely(may_use_simd())) { | |
| scoped_ksimd() | |
| sha3_ce_transform(state, data, nblocks, block_size); | |
| } else { | |
| sha3_absorb_blocks_generic(state, data, nblocks, block_size); | |
| } | |
| } | |
| static void sha3_keccakf(struct sha3_state *state) | |
| { | |
| if (static_branch_likely(&have_sha3) && likely(may_use_simd())) { | |
| /* | |
| * Passing zeroes into sha3_ce_transform() gives the plain | |
| * Keccak-f permutation, which is what we want here. Any | |
| * supported block size may be used. Use SHA3_512_BLOCK_SIZE | |
| * since it's the shortest. | |
| */ | |
| static const u8 zeroes[SHA3_512_BLOCK_SIZE]; | |
| scoped_ksimd() | |
| sha3_ce_transform(state, zeroes, 1, sizeof(zeroes)); | |
| } else { | |
| sha3_keccakf_generic(state); | |
| } | |
| } | |
| #define sha3_mod_init_arch sha3_mod_init_arch | |
| static void sha3_mod_init_arch(void) | |
| { | |
| if (cpu_have_named_feature(SHA3)) | |
| static_branch_enable(&have_sha3); | |
| } |