File Index
Files and directories
Sign in
FILE

sha3.c

File preview with syntax highlighting.

linux-6.19.14/crypto/sha3.c C
  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");
~/ Read-only file preview.