xref: /linux/crypto/sha3.c (revision 5abe8d8efc022cc78b6273d01e4a453242b9f4d8)
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 
crypto_sha3_224_init(struct shash_desc * desc)13 static int crypto_sha3_224_init(struct shash_desc *desc)
14 {
15 	sha3_224_init(SHA3_CTX(desc));
16 	return 0;
17 }
18 
crypto_sha3_256_init(struct shash_desc * desc)19 static int crypto_sha3_256_init(struct shash_desc *desc)
20 {
21 	sha3_256_init(SHA3_CTX(desc));
22 	return 0;
23 }
24 
crypto_sha3_384_init(struct shash_desc * desc)25 static int crypto_sha3_384_init(struct shash_desc *desc)
26 {
27 	sha3_384_init(SHA3_CTX(desc));
28 	return 0;
29 }
30 
crypto_sha3_512_init(struct shash_desc * desc)31 static int crypto_sha3_512_init(struct shash_desc *desc)
32 {
33 	sha3_512_init(SHA3_CTX(desc));
34 	return 0;
35 }
36 
crypto_sha3_update(struct shash_desc * desc,const u8 * data,unsigned int len)37 static 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 
crypto_sha3_final(struct shash_desc * desc,u8 * out)44 static int crypto_sha3_final(struct shash_desc *desc, u8 *out)
45 {
46 	sha3_final(SHA3_CTX(desc), out);
47 	return 0;
48 }
49 
crypto_sha3_224_digest(struct shash_desc * desc,const u8 * data,unsigned int len,u8 * out)50 static 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 
crypto_sha3_256_digest(struct shash_desc * desc,const u8 * data,unsigned int len,u8 * out)57 static 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 
crypto_sha3_384_digest(struct shash_desc * desc,const u8 * data,unsigned int len,u8 * out)64 static 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 
crypto_sha3_512_digest(struct shash_desc * desc,const u8 * data,unsigned int len,u8 * out)71 static 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 
crypto_sha3_export_core(struct shash_desc * desc,void * out)78 static 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 
crypto_sha3_import_core(struct shash_desc * desc,const void * in)84 static 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 
90 static 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 
crypto_sha3_mod_init(void)144 static int __init crypto_sha3_mod_init(void)
145 {
146 	return crypto_register_shashes(algs, ARRAY_SIZE(algs));
147 }
148 module_init(crypto_sha3_mod_init);
149 
crypto_sha3_mod_exit(void)150 static void __exit crypto_sha3_mod_exit(void)
151 {
152 	crypto_unregister_shashes(algs, ARRAY_SIZE(algs));
153 }
154 module_exit(crypto_sha3_mod_exit);
155 
156 MODULE_LICENSE("GPL");
157 MODULE_DESCRIPTION("Crypto API support for SHA-3");
158 
159 MODULE_ALIAS_CRYPTO("sha3-224");
160 MODULE_ALIAS_CRYPTO("sha3-224-lib");
161 MODULE_ALIAS_CRYPTO("sha3-256");
162 MODULE_ALIAS_CRYPTO("sha3-256-lib");
163 MODULE_ALIAS_CRYPTO("sha3-384");
164 MODULE_ALIAS_CRYPTO("sha3-384-lib");
165 MODULE_ALIAS_CRYPTO("sha3-512");
166 MODULE_ALIAS_CRYPTO("sha3-512-lib");
167