^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * BLAKE2b digest algorithm, NEON accelerated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright 2020 Google LLC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <crypto/internal/blake2b.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <crypto/internal/hash.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <crypto/internal/simd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/sizes.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <asm/neon.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <asm/simd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) asmlinkage void blake2b_compress_neon(struct blake2b_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) const u8 *block, size_t nblocks, u32 inc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) static void blake2b_compress_arch(struct blake2b_state *state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) const u8 *block, size_t nblocks, u32 inc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) if (!crypto_simd_usable()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) blake2b_compress_generic(state, block, nblocks, inc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) const size_t blocks = min_t(size_t, nblocks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) SZ_4K / BLAKE2B_BLOCK_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) kernel_neon_begin();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) blake2b_compress_neon(state, block, blocks, inc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) kernel_neon_end();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) nblocks -= blocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) block += blocks * BLAKE2B_BLOCK_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) } while (nblocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) static int crypto_blake2b_update_neon(struct shash_desc *desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) const u8 *in, unsigned int inlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) return crypto_blake2b_update(desc, in, inlen, blake2b_compress_arch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) static int crypto_blake2b_final_neon(struct shash_desc *desc, u8 *out)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) return crypto_blake2b_final(desc, out, blake2b_compress_arch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define BLAKE2B_ALG(name, driver_name, digest_size) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .base.cra_name = name, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) .base.cra_driver_name = driver_name, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) .base.cra_priority = 200, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) .base.cra_blocksize = BLAKE2B_BLOCK_SIZE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) .base.cra_ctxsize = sizeof(struct blake2b_tfm_ctx), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) .base.cra_module = THIS_MODULE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) .digestsize = digest_size, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) .setkey = crypto_blake2b_setkey, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) .init = crypto_blake2b_init, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) .update = crypto_blake2b_update_neon, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) .final = crypto_blake2b_final_neon, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) .descsize = sizeof(struct blake2b_state), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) static struct shash_alg blake2b_neon_algs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) BLAKE2B_ALG("blake2b-160", "blake2b-160-neon", BLAKE2B_160_HASH_SIZE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) BLAKE2B_ALG("blake2b-256", "blake2b-256-neon", BLAKE2B_256_HASH_SIZE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) BLAKE2B_ALG("blake2b-384", "blake2b-384-neon", BLAKE2B_384_HASH_SIZE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) BLAKE2B_ALG("blake2b-512", "blake2b-512-neon", BLAKE2B_512_HASH_SIZE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) static int __init blake2b_neon_mod_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) if (!(elf_hwcap & HWCAP_NEON))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) return crypto_register_shashes(blake2b_neon_algs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) ARRAY_SIZE(blake2b_neon_algs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) static void __exit blake2b_neon_mod_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) crypto_unregister_shashes(blake2b_neon_algs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) ARRAY_SIZE(blake2b_neon_algs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) module_init(blake2b_neon_mod_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) module_exit(blake2b_neon_mod_exit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) MODULE_DESCRIPTION("BLAKE2b digest algorithm, NEON accelerated");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) MODULE_AUTHOR("Eric Biggers <ebiggers@google.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) MODULE_ALIAS_CRYPTO("blake2b-160");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) MODULE_ALIAS_CRYPTO("blake2b-160-neon");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) MODULE_ALIAS_CRYPTO("blake2b-256");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) MODULE_ALIAS_CRYPTO("blake2b-256-neon");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) MODULE_ALIAS_CRYPTO("blake2b-384");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) MODULE_ALIAS_CRYPTO("blake2b-384-neon");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) MODULE_ALIAS_CRYPTO("blake2b-512");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) MODULE_ALIAS_CRYPTO("blake2b-512-neon");