~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/arm64/crypto/sha2-ce-glue.c

Version: ~ [ linux-6.0 ] ~ [ linux-5.19.12 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.71 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.146 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.215 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.260 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.295 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.330 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.302 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * sha2-ce-glue.c - SHA-224/SHA-256 using ARMv8 Crypto Extensions
  3  *
  4  * Copyright (C) 2014 Linaro Ltd <ard.biesheuvel@linaro.org>
  5  *
  6  * This program is free software; you can redistribute it and/or modify
  7  * it under the terms of the GNU General Public License version 2 as
  8  * published by the Free Software Foundation.
  9  */
 10 
 11 #include <asm/neon.h>
 12 #include <asm/unaligned.h>
 13 #include <crypto/internal/hash.h>
 14 #include <crypto/sha.h>
 15 #include <crypto/sha256_base.h>
 16 #include <linux/cpufeature.h>
 17 #include <linux/crypto.h>
 18 #include <linux/module.h>
 19 
 20 #define ASM_EXPORT(sym, val) \
 21         asm(".globl " #sym "; .set " #sym ", %0" :: "I"(val));
 22 
 23 MODULE_DESCRIPTION("SHA-224/SHA-256 secure hash using ARMv8 Crypto Extensions");
 24 MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
 25 MODULE_LICENSE("GPL v2");
 26 
 27 struct sha256_ce_state {
 28         struct sha256_state     sst;
 29         u32                     finalize;
 30 };
 31 
 32 asmlinkage void sha2_ce_transform(struct sha256_ce_state *sst, u8 const *src,
 33                                   int blocks);
 34 
 35 static int sha256_ce_update(struct shash_desc *desc, const u8 *data,
 36                             unsigned int len)
 37 {
 38         struct sha256_ce_state *sctx = shash_desc_ctx(desc);
 39 
 40         sctx->finalize = 0;
 41         kernel_neon_begin_partial(28);
 42         sha256_base_do_update(desc, data, len,
 43                               (sha256_block_fn *)sha2_ce_transform);
 44         kernel_neon_end();
 45 
 46         return 0;
 47 }
 48 
 49 static int sha256_ce_finup(struct shash_desc *desc, const u8 *data,
 50                            unsigned int len, u8 *out)
 51 {
 52         struct sha256_ce_state *sctx = shash_desc_ctx(desc);
 53         bool finalize = !sctx->sst.count && !(len % SHA256_BLOCK_SIZE);
 54 
 55         ASM_EXPORT(sha256_ce_offsetof_count,
 56                    offsetof(struct sha256_ce_state, sst.count));
 57         ASM_EXPORT(sha256_ce_offsetof_finalize,
 58                    offsetof(struct sha256_ce_state, finalize));
 59 
 60         /*
 61          * Allow the asm code to perform the finalization if there is no
 62          * partial data and the input is a round multiple of the block size.
 63          */
 64         sctx->finalize = finalize;
 65 
 66         kernel_neon_begin_partial(28);
 67         sha256_base_do_update(desc, data, len,
 68                               (sha256_block_fn *)sha2_ce_transform);
 69         if (!finalize)
 70                 sha256_base_do_finalize(desc,
 71                                         (sha256_block_fn *)sha2_ce_transform);
 72         kernel_neon_end();
 73         return sha256_base_finish(desc, out);
 74 }
 75 
 76 static int sha256_ce_final(struct shash_desc *desc, u8 *out)
 77 {
 78         struct sha256_ce_state *sctx = shash_desc_ctx(desc);
 79 
 80         sctx->finalize = 0;
 81         kernel_neon_begin_partial(28);
 82         sha256_base_do_finalize(desc, (sha256_block_fn *)sha2_ce_transform);
 83         kernel_neon_end();
 84         return sha256_base_finish(desc, out);
 85 }
 86 
 87 static struct shash_alg algs[] = { {
 88         .init                   = sha224_base_init,
 89         .update                 = sha256_ce_update,
 90         .final                  = sha256_ce_final,
 91         .finup                  = sha256_ce_finup,
 92         .descsize               = sizeof(struct sha256_ce_state),
 93         .digestsize             = SHA224_DIGEST_SIZE,
 94         .base                   = {
 95                 .cra_name               = "sha224",
 96                 .cra_driver_name        = "sha224-ce",
 97                 .cra_priority           = 200,
 98                 .cra_flags              = CRYPTO_ALG_TYPE_SHASH,
 99                 .cra_blocksize          = SHA256_BLOCK_SIZE,
100                 .cra_module             = THIS_MODULE,
101         }
102 }, {
103         .init                   = sha256_base_init,
104         .update                 = sha256_ce_update,
105         .final                  = sha256_ce_final,
106         .finup                  = sha256_ce_finup,
107         .descsize               = sizeof(struct sha256_ce_state),
108         .digestsize             = SHA256_DIGEST_SIZE,
109         .base                   = {
110                 .cra_name               = "sha256",
111                 .cra_driver_name        = "sha256-ce",
112                 .cra_priority           = 200,
113                 .cra_flags              = CRYPTO_ALG_TYPE_SHASH,
114                 .cra_blocksize          = SHA256_BLOCK_SIZE,
115                 .cra_module             = THIS_MODULE,
116         }
117 } };
118 
119 static int __init sha2_ce_mod_init(void)
120 {
121         return crypto_register_shashes(algs, ARRAY_SIZE(algs));
122 }
123 
124 static void __exit sha2_ce_mod_fini(void)
125 {
126         crypto_unregister_shashes(algs, ARRAY_SIZE(algs));
127 }
128 
129 module_cpu_feature_match(SHA2, sha2_ce_mod_init);
130 module_exit(sha2_ce_mod_fini);
131 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp