at master 4.4 kB view raw
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Crypto API support for SHA-3 4 * (https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf) 5 */ 6#include <crypto/internal/hash.h> 7#include <crypto/sha3.h> 8#include <linux/kernel.h> 9#include <linux/module.h> 10 11#define SHA3_CTX(desc) ((struct sha3_ctx *)shash_desc_ctx(desc)) 12 13static int crypto_sha3_224_init(struct shash_desc *desc) 14{ 15 sha3_224_init(SHA3_CTX(desc)); 16 return 0; 17} 18 19static int crypto_sha3_256_init(struct shash_desc *desc) 20{ 21 sha3_256_init(SHA3_CTX(desc)); 22 return 0; 23} 24 25static int crypto_sha3_384_init(struct shash_desc *desc) 26{ 27 sha3_384_init(SHA3_CTX(desc)); 28 return 0; 29} 30 31static int crypto_sha3_512_init(struct shash_desc *desc) 32{ 33 sha3_512_init(SHA3_CTX(desc)); 34 return 0; 35} 36 37static int crypto_sha3_update(struct shash_desc *desc, const u8 *data, 38 unsigned int len) 39{ 40 sha3_update(SHA3_CTX(desc), data, len); 41 return 0; 42} 43 44static int crypto_sha3_final(struct shash_desc *desc, u8 *out) 45{ 46 sha3_final(SHA3_CTX(desc), out); 47 return 0; 48} 49 50static int crypto_sha3_224_digest(struct shash_desc *desc, 51 const u8 *data, unsigned int len, u8 *out) 52{ 53 sha3_224(data, len, out); 54 return 0; 55} 56 57static int crypto_sha3_256_digest(struct shash_desc *desc, 58 const u8 *data, unsigned int len, u8 *out) 59{ 60 sha3_256(data, len, out); 61 return 0; 62} 63 64static int crypto_sha3_384_digest(struct shash_desc *desc, 65 const u8 *data, unsigned int len, u8 *out) 66{ 67 sha3_384(data, len, out); 68 return 0; 69} 70 71static int crypto_sha3_512_digest(struct shash_desc *desc, 72 const u8 *data, unsigned int len, u8 *out) 73{ 74 sha3_512(data, len, out); 75 return 0; 76} 77 78static int crypto_sha3_export_core(struct shash_desc *desc, void *out) 79{ 80 memcpy(out, SHA3_CTX(desc), sizeof(struct sha3_ctx)); 81 return 0; 82} 83 84static int crypto_sha3_import_core(struct shash_desc *desc, const void *in) 85{ 86 memcpy(SHA3_CTX(desc), in, sizeof(struct sha3_ctx)); 87 return 0; 88} 89 90static struct shash_alg algs[] = { { 91 .digestsize = SHA3_224_DIGEST_SIZE, 92 .init = crypto_sha3_224_init, 93 .update = crypto_sha3_update, 94 .final = crypto_sha3_final, 95 .digest = crypto_sha3_224_digest, 96 .export_core = crypto_sha3_export_core, 97 .import_core = crypto_sha3_import_core, 98 .descsize = sizeof(struct sha3_ctx), 99 .base.cra_name = "sha3-224", 100 .base.cra_driver_name = "sha3-224-lib", 101 .base.cra_blocksize = SHA3_224_BLOCK_SIZE, 102 .base.cra_module = THIS_MODULE, 103}, { 104 .digestsize = SHA3_256_DIGEST_SIZE, 105 .init = crypto_sha3_256_init, 106 .update = crypto_sha3_update, 107 .final = crypto_sha3_final, 108 .digest = crypto_sha3_256_digest, 109 .export_core = crypto_sha3_export_core, 110 .import_core = crypto_sha3_import_core, 111 .descsize = sizeof(struct sha3_ctx), 112 .base.cra_name = "sha3-256", 113 .base.cra_driver_name = "sha3-256-lib", 114 .base.cra_blocksize = SHA3_256_BLOCK_SIZE, 115 .base.cra_module = THIS_MODULE, 116}, { 117 .digestsize = SHA3_384_DIGEST_SIZE, 118 .init = crypto_sha3_384_init, 119 .update = crypto_sha3_update, 120 .final = crypto_sha3_final, 121 .digest = crypto_sha3_384_digest, 122 .export_core = crypto_sha3_export_core, 123 .import_core = crypto_sha3_import_core, 124 .descsize = sizeof(struct sha3_ctx), 125 .base.cra_name = "sha3-384", 126 .base.cra_driver_name = "sha3-384-lib", 127 .base.cra_blocksize = SHA3_384_BLOCK_SIZE, 128 .base.cra_module = THIS_MODULE, 129}, { 130 .digestsize = SHA3_512_DIGEST_SIZE, 131 .init = crypto_sha3_512_init, 132 .update = crypto_sha3_update, 133 .final = crypto_sha3_final, 134 .digest = crypto_sha3_512_digest, 135 .export_core = crypto_sha3_export_core, 136 .import_core = crypto_sha3_import_core, 137 .descsize = sizeof(struct sha3_ctx), 138 .base.cra_name = "sha3-512", 139 .base.cra_driver_name = "sha3-512-lib", 140 .base.cra_blocksize = SHA3_512_BLOCK_SIZE, 141 .base.cra_module = THIS_MODULE, 142} }; 143 144static int __init crypto_sha3_mod_init(void) 145{ 146 return crypto_register_shashes(algs, ARRAY_SIZE(algs)); 147} 148module_init(crypto_sha3_mod_init); 149 150static void __exit crypto_sha3_mod_exit(void) 151{ 152 crypto_unregister_shashes(algs, ARRAY_SIZE(algs)); 153} 154module_exit(crypto_sha3_mod_exit); 155 156MODULE_LICENSE("GPL"); 157MODULE_DESCRIPTION("Crypto API support for SHA-3"); 158 159MODULE_ALIAS_CRYPTO("sha3-224"); 160MODULE_ALIAS_CRYPTO("sha3-224-lib"); 161MODULE_ALIAS_CRYPTO("sha3-256"); 162MODULE_ALIAS_CRYPTO("sha3-256-lib"); 163MODULE_ALIAS_CRYPTO("sha3-384"); 164MODULE_ALIAS_CRYPTO("sha3-384-lib"); 165MODULE_ALIAS_CRYPTO("sha3-512"); 166MODULE_ALIAS_CRYPTO("sha3-512-lib");