root/arch/arm/crypto/sha256_neon_glue.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. crypto_sha256_neon_update
  2. crypto_sha256_neon_finup
  3. crypto_sha256_neon_final

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  * Glue code for the SHA256 Secure Hash Algorithm assembly implementation
   4  * using NEON instructions.
   5  *
   6  * Copyright © 2015 Google Inc.
   7  *
   8  * This file is based on sha512_neon_glue.c:
   9  *   Copyright © 2014 Jussi Kivilinna <jussi.kivilinna@iki.fi>
  10  */
  11 
  12 #include <crypto/internal/hash.h>
  13 #include <crypto/internal/simd.h>
  14 #include <linux/cryptohash.h>
  15 #include <linux/types.h>
  16 #include <linux/string.h>
  17 #include <crypto/sha.h>
  18 #include <crypto/sha256_base.h>
  19 #include <asm/byteorder.h>
  20 #include <asm/simd.h>
  21 #include <asm/neon.h>
  22 
  23 #include "sha256_glue.h"
  24 
  25 asmlinkage void sha256_block_data_order_neon(u32 *digest, const void *data,
  26                                              unsigned int num_blks);
  27 
  28 static int crypto_sha256_neon_update(struct shash_desc *desc, const u8 *data,
  29                                      unsigned int len)
  30 {
  31         struct sha256_state *sctx = shash_desc_ctx(desc);
  32 
  33         if (!crypto_simd_usable() ||
  34             (sctx->count % SHA256_BLOCK_SIZE) + len < SHA256_BLOCK_SIZE)
  35                 return crypto_sha256_arm_update(desc, data, len);
  36 
  37         kernel_neon_begin();
  38         sha256_base_do_update(desc, data, len,
  39                         (sha256_block_fn *)sha256_block_data_order_neon);
  40         kernel_neon_end();
  41 
  42         return 0;
  43 }
  44 
  45 static int crypto_sha256_neon_finup(struct shash_desc *desc, const u8 *data,
  46                                     unsigned int len, u8 *out)
  47 {
  48         if (!crypto_simd_usable())
  49                 return crypto_sha256_arm_finup(desc, data, len, out);
  50 
  51         kernel_neon_begin();
  52         if (len)
  53                 sha256_base_do_update(desc, data, len,
  54                         (sha256_block_fn *)sha256_block_data_order_neon);
  55         sha256_base_do_finalize(desc,
  56                         (sha256_block_fn *)sha256_block_data_order_neon);
  57         kernel_neon_end();
  58 
  59         return sha256_base_finish(desc, out);
  60 }
  61 
  62 static int crypto_sha256_neon_final(struct shash_desc *desc, u8 *out)
  63 {
  64         return crypto_sha256_neon_finup(desc, NULL, 0, out);
  65 }
  66 
  67 struct shash_alg sha256_neon_algs[] = { {
  68         .digestsize     =       SHA256_DIGEST_SIZE,
  69         .init           =       sha256_base_init,
  70         .update         =       crypto_sha256_neon_update,
  71         .final          =       crypto_sha256_neon_final,
  72         .finup          =       crypto_sha256_neon_finup,
  73         .descsize       =       sizeof(struct sha256_state),
  74         .base           =       {
  75                 .cra_name       =       "sha256",
  76                 .cra_driver_name =      "sha256-neon",
  77                 .cra_priority   =       250,
  78                 .cra_blocksize  =       SHA256_BLOCK_SIZE,
  79                 .cra_module     =       THIS_MODULE,
  80         }
  81 }, {
  82         .digestsize     =       SHA224_DIGEST_SIZE,
  83         .init           =       sha224_base_init,
  84         .update         =       crypto_sha256_neon_update,
  85         .final          =       crypto_sha256_neon_final,
  86         .finup          =       crypto_sha256_neon_finup,
  87         .descsize       =       sizeof(struct sha256_state),
  88         .base           =       {
  89                 .cra_name       =       "sha224",
  90                 .cra_driver_name =      "sha224-neon",
  91                 .cra_priority   =       250,
  92                 .cra_blocksize  =       SHA224_BLOCK_SIZE,
  93                 .cra_module     =       THIS_MODULE,
  94         }
  95 } };

/* [<][>][^][v][top][bottom][index][help] */