Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * sha512-neon-glue.c - accelerated SHA-384/512 for ARM NEON
0004  *
0005  * Copyright (C) 2015 Linaro Ltd <ard.biesheuvel@linaro.org>
0006  */
0007 
0008 #include <crypto/internal/hash.h>
0009 #include <crypto/internal/simd.h>
0010 #include <crypto/sha2.h>
0011 #include <crypto/sha512_base.h>
0012 #include <linux/crypto.h>
0013 #include <linux/module.h>
0014 
0015 #include <asm/simd.h>
0016 #include <asm/neon.h>
0017 
0018 #include "sha512.h"
0019 
0020 MODULE_ALIAS_CRYPTO("sha384-neon");
0021 MODULE_ALIAS_CRYPTO("sha512-neon");
0022 
0023 asmlinkage void sha512_block_data_order_neon(u64 *state, u8 const *src,
0024                          int blocks);
0025 
0026 static int sha512_neon_update(struct shash_desc *desc, const u8 *data,
0027                   unsigned int len)
0028 {
0029     struct sha512_state *sctx = shash_desc_ctx(desc);
0030 
0031     if (!crypto_simd_usable() ||
0032         (sctx->count[0] % SHA512_BLOCK_SIZE) + len < SHA512_BLOCK_SIZE)
0033         return sha512_arm_update(desc, data, len);
0034 
0035     kernel_neon_begin();
0036     sha512_base_do_update(desc, data, len,
0037         (sha512_block_fn *)sha512_block_data_order_neon);
0038     kernel_neon_end();
0039 
0040     return 0;
0041 }
0042 
0043 static int sha512_neon_finup(struct shash_desc *desc, const u8 *data,
0044                  unsigned int len, u8 *out)
0045 {
0046     if (!crypto_simd_usable())
0047         return sha512_arm_finup(desc, data, len, out);
0048 
0049     kernel_neon_begin();
0050     if (len)
0051         sha512_base_do_update(desc, data, len,
0052             (sha512_block_fn *)sha512_block_data_order_neon);
0053     sha512_base_do_finalize(desc,
0054         (sha512_block_fn *)sha512_block_data_order_neon);
0055     kernel_neon_end();
0056 
0057     return sha512_base_finish(desc, out);
0058 }
0059 
0060 static int sha512_neon_final(struct shash_desc *desc, u8 *out)
0061 {
0062     return sha512_neon_finup(desc, NULL, 0, out);
0063 }
0064 
0065 struct shash_alg sha512_neon_algs[] = { {
0066     .init           = sha384_base_init,
0067     .update         = sha512_neon_update,
0068     .final          = sha512_neon_final,
0069     .finup          = sha512_neon_finup,
0070     .descsize       = sizeof(struct sha512_state),
0071     .digestsize     = SHA384_DIGEST_SIZE,
0072     .base           = {
0073         .cra_name       = "sha384",
0074         .cra_driver_name    = "sha384-neon",
0075         .cra_priority       = 300,
0076         .cra_blocksize      = SHA384_BLOCK_SIZE,
0077         .cra_module     = THIS_MODULE,
0078 
0079     }
0080 },  {
0081     .init           = sha512_base_init,
0082     .update         = sha512_neon_update,
0083     .final          = sha512_neon_final,
0084     .finup          = sha512_neon_finup,
0085     .descsize       = sizeof(struct sha512_state),
0086     .digestsize     = SHA512_DIGEST_SIZE,
0087     .base           = {
0088         .cra_name       = "sha512",
0089         .cra_driver_name    = "sha512-neon",
0090         .cra_priority       = 300,
0091         .cra_blocksize      = SHA512_BLOCK_SIZE,
0092         .cra_module     = THIS_MODULE,
0093     }
0094 } };