Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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");