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