Blame view
crypto/shash.c
15.5 KB
2874c5fd2 treewide: Replace... |
1 |
// SPDX-License-Identifier: GPL-2.0-or-later |
7b5a080b3 crypto: hash - Ad... |
2 3 4 5 |
/* * Synchronous Cryptographic Hash operations. * * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> |
7b5a080b3 crypto: hash - Ad... |
6 |
*/ |
3b2f6df08 crypto: hash - Ex... |
7 |
#include <crypto/scatterwalk.h> |
7b5a080b3 crypto: hash - Ad... |
8 9 10 11 12 13 |
#include <crypto/internal/hash.h> #include <linux/err.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/seq_file.h> |
f4d663ce6 crypto: Add users... |
14 15 |
#include <linux/cryptouser.h> #include <net/netlink.h> |
d8c34b949 crypto: Replaced ... |
16 |
#include <linux/compiler.h> |
7b5a080b3 crypto: hash - Ad... |
17 |
|
3b2f6df08 crypto: hash - Ex... |
18 |
#include "internal.h" |
3f683d617 crypto: api - Fix... |
19 |
static const struct crypto_type crypto_shash_type; |
22ca9f4aa crypto: shash - a... |
20 21 |
static int shash_no_setkey(struct crypto_shash *tfm, const u8 *key, unsigned int keylen) |
57cfe44bc crypto: shash - M... |
22 23 24 |
{ return -ENOSYS; } |
22ca9f4aa crypto: shash - a... |
25 26 27 28 29 30 31 32 33 34 35 36 37 |
/* * Check whether an shash algorithm has a setkey function. * * For CFI compatibility, this must not be an inline function. This is because * when CFI is enabled, modules won't get the same address for shash_no_setkey * (if it were exported, which inlining would require) as the core kernel will. */ bool crypto_shash_alg_has_setkey(struct shash_alg *alg) { return alg->setkey != shash_no_setkey; } EXPORT_SYMBOL_GPL(crypto_shash_alg_has_setkey); |
57cfe44bc crypto: shash - M... |
38 |
|
7b5a080b3 crypto: hash - Ad... |
39 40 41 42 43 44 45 46 |
static int shash_setkey_unaligned(struct crypto_shash *tfm, const u8 *key, unsigned int keylen) { struct shash_alg *shash = crypto_shash_alg(tfm); unsigned long alignmask = crypto_shash_alignmask(tfm); unsigned long absize; u8 *buffer, *alignbuffer; int err; |
18eb8ea6e crypto: shash - R... |
47 |
absize = keylen + (alignmask & ~(crypto_tfm_ctx_alignment() - 1)); |
9039f3ef4 crypto: shash - F... |
48 |
buffer = kmalloc(absize, GFP_ATOMIC); |
7b5a080b3 crypto: hash - Ad... |
49 50 51 52 53 54 |
if (!buffer) return -ENOMEM; alignbuffer = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1); memcpy(alignbuffer, key, keylen); err = shash->setkey(tfm, alignbuffer, keylen); |
453431a54 mm, treewide: ren... |
55 |
kfree_sensitive(buffer); |
7b5a080b3 crypto: hash - Ad... |
56 57 |
return err; } |
ba7d7433a crypto: hash - se... |
58 59 |
static void shash_set_needkey(struct crypto_shash *tfm, struct shash_alg *alg) { |
c28817895 crypto: shash - a... |
60 |
if (crypto_shash_alg_needs_key(alg)) |
ba7d7433a crypto: hash - se... |
61 62 |
crypto_shash_set_flags(tfm, CRYPTO_TFM_NEED_KEY); } |
7b5a080b3 crypto: hash - Ad... |
63 64 65 66 67 |
int crypto_shash_setkey(struct crypto_shash *tfm, const u8 *key, unsigned int keylen) { struct shash_alg *shash = crypto_shash_alg(tfm); unsigned long alignmask = crypto_shash_alignmask(tfm); |
9fa68f620 crypto: hash - pr... |
68 |
int err; |
7b5a080b3 crypto: hash - Ad... |
69 70 |
if ((unsigned long)key & alignmask) |
9fa68f620 crypto: hash - pr... |
71 72 73 |
err = shash_setkey_unaligned(tfm, key, keylen); else err = shash->setkey(tfm, key, keylen); |
ba7d7433a crypto: hash - se... |
74 75 |
if (unlikely(err)) { shash_set_needkey(tfm, shash); |
9fa68f620 crypto: hash - pr... |
76 |
return err; |
ba7d7433a crypto: hash - se... |
77 |
} |
7b5a080b3 crypto: hash - Ad... |
78 |
|
9fa68f620 crypto: hash - pr... |
79 80 |
crypto_shash_clear_flags(tfm, CRYPTO_TFM_NEED_KEY); return 0; |
7b5a080b3 crypto: hash - Ad... |
81 82 |
} EXPORT_SYMBOL_GPL(crypto_shash_setkey); |
7b5a080b3 crypto: hash - Ad... |
83 84 85 86 87 88 89 90 |
static int shash_update_unaligned(struct shash_desc *desc, const u8 *data, unsigned int len) { struct crypto_shash *tfm = desc->tfm; struct shash_alg *shash = crypto_shash_alg(tfm); unsigned long alignmask = crypto_shash_alignmask(tfm); unsigned int unaligned_len = alignmask + 1 - ((unsigned long)data & alignmask); |
f3569fd61 crypto: shash - R... |
91 92 93 94 95 |
/* * We cannot count on __aligned() working for large values: * https://patchwork.kernel.org/patch/9507697/ */ u8 ubuf[MAX_ALGAPI_ALIGNMASK * 2]; |
0e2d3a126 crypto: shash - F... |
96 |
u8 *buf = PTR_ALIGN(&ubuf[0], alignmask + 1); |
8c32c516e crypto: hash - Za... |
97 |
int err; |
7b5a080b3 crypto: hash - Ad... |
98 |
|
f3569fd61 crypto: shash - R... |
99 100 |
if (WARN_ON(buf + unaligned_len > ubuf + sizeof(ubuf))) return -EINVAL; |
f4f689933 crypto: shash - F... |
101 102 |
if (unaligned_len > len) unaligned_len = len; |
7b5a080b3 crypto: hash - Ad... |
103 |
memcpy(buf, data, unaligned_len); |
8c32c516e crypto: hash - Za... |
104 105 |
err = shash->update(desc, buf, unaligned_len); memset(buf, 0, unaligned_len); |
7b5a080b3 crypto: hash - Ad... |
106 |
|
8c32c516e crypto: hash - Za... |
107 |
return err ?: |
7b5a080b3 crypto: hash - Ad... |
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
shash->update(desc, data + unaligned_len, len - unaligned_len); } int crypto_shash_update(struct shash_desc *desc, const u8 *data, unsigned int len) { struct crypto_shash *tfm = desc->tfm; struct shash_alg *shash = crypto_shash_alg(tfm); unsigned long alignmask = crypto_shash_alignmask(tfm); if ((unsigned long)data & alignmask) return shash_update_unaligned(desc, data, len); return shash->update(desc, data, len); } EXPORT_SYMBOL_GPL(crypto_shash_update); static int shash_final_unaligned(struct shash_desc *desc, u8 *out) { struct crypto_shash *tfm = desc->tfm; unsigned long alignmask = crypto_shash_alignmask(tfm); struct shash_alg *shash = crypto_shash_alg(tfm); unsigned int ds = crypto_shash_digestsize(tfm); |
f3569fd61 crypto: shash - R... |
131 132 133 134 135 |
/* * We cannot count on __aligned() working for large values: * https://patchwork.kernel.org/patch/9507697/ */ u8 ubuf[MAX_ALGAPI_ALIGNMASK + HASH_MAX_DIGESTSIZE]; |
0e2d3a126 crypto: shash - F... |
136 |
u8 *buf = PTR_ALIGN(&ubuf[0], alignmask + 1); |
7b5a080b3 crypto: hash - Ad... |
137 |
int err; |
f3569fd61 crypto: shash - R... |
138 139 |
if (WARN_ON(buf + ds > ubuf + sizeof(ubuf))) return -EINVAL; |
7b5a080b3 crypto: hash - Ad... |
140 |
err = shash->final(desc, buf); |
8c32c516e crypto: hash - Za... |
141 142 |
if (err) goto out; |
7b5a080b3 crypto: hash - Ad... |
143 |
memcpy(out, buf, ds); |
8c32c516e crypto: hash - Za... |
144 145 146 |
out: memset(buf, 0, ds); |
7b5a080b3 crypto: hash - Ad... |
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
return err; } int crypto_shash_final(struct shash_desc *desc, u8 *out) { struct crypto_shash *tfm = desc->tfm; struct shash_alg *shash = crypto_shash_alg(tfm); unsigned long alignmask = crypto_shash_alignmask(tfm); if ((unsigned long)out & alignmask) return shash_final_unaligned(desc, out); return shash->final(desc, out); } EXPORT_SYMBOL_GPL(crypto_shash_final); static int shash_finup_unaligned(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *out) { return crypto_shash_update(desc, data, len) ?: crypto_shash_final(desc, out); } int crypto_shash_finup(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *out) { struct crypto_shash *tfm = desc->tfm; struct shash_alg *shash = crypto_shash_alg(tfm); unsigned long alignmask = crypto_shash_alignmask(tfm); |
8267adab9 crypto: shash - M... |
176 |
if (((unsigned long)data | (unsigned long)out) & alignmask) |
7b5a080b3 crypto: hash - Ad... |
177 178 179 180 181 182 183 184 185 186 |
return shash_finup_unaligned(desc, data, len, out); return shash->finup(desc, data, len, out); } EXPORT_SYMBOL_GPL(crypto_shash_finup); static int shash_digest_unaligned(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *out) { return crypto_shash_init(desc) ?: |
f88ad8de2 crypto: shash - U... |
187 |
crypto_shash_finup(desc, data, len, out); |
7b5a080b3 crypto: hash - Ad... |
188 189 190 191 192 193 194 195 |
} int crypto_shash_digest(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *out) { struct crypto_shash *tfm = desc->tfm; struct shash_alg *shash = crypto_shash_alg(tfm); unsigned long alignmask = crypto_shash_alignmask(tfm); |
9fa68f620 crypto: hash - pr... |
196 197 |
if (crypto_shash_get_flags(tfm) & CRYPTO_TFM_NEED_KEY) return -ENOKEY; |
8267adab9 crypto: shash - M... |
198 |
if (((unsigned long)data | (unsigned long)out) & alignmask) |
7b5a080b3 crypto: hash - Ad... |
199 200 201 202 203 |
return shash_digest_unaligned(desc, data, len, out); return shash->digest(desc, data, len, out); } EXPORT_SYMBOL_GPL(crypto_shash_digest); |
822a98b86 crypto: hash - in... |
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
int crypto_shash_tfm_digest(struct crypto_shash *tfm, const u8 *data, unsigned int len, u8 *out) { SHASH_DESC_ON_STACK(desc, tfm); int err; desc->tfm = tfm; err = crypto_shash_digest(desc, data, len, out); shash_desc_zero(desc); return err; } EXPORT_SYMBOL_GPL(crypto_shash_tfm_digest); |
f592682f9 crypto: shash - R... |
219 |
static int shash_default_export(struct shash_desc *desc, void *out) |
dec8b7860 crypto: hash - Ad... |
220 |
{ |
f592682f9 crypto: shash - R... |
221 222 |
memcpy(out, shash_desc_ctx(desc), crypto_shash_descsize(desc->tfm)); return 0; |
99d27e1c5 crypto: shash - E... |
223 |
} |
dec8b7860 crypto: hash - Ad... |
224 |
|
f592682f9 crypto: shash - R... |
225 |
static int shash_default_import(struct shash_desc *desc, const void *in) |
99d27e1c5 crypto: shash - E... |
226 |
{ |
f592682f9 crypto: shash - R... |
227 228 |
memcpy(shash_desc_ctx(desc), in, crypto_shash_descsize(desc->tfm)); return 0; |
dec8b7860 crypto: hash - Ad... |
229 |
} |
dec8b7860 crypto: hash - Ad... |
230 |
|
3b2f6df08 crypto: hash - Ex... |
231 232 233 234 235 236 237 238 239 240 241 242 243 244 |
static int shash_async_setkey(struct crypto_ahash *tfm, const u8 *key, unsigned int keylen) { struct crypto_shash **ctx = crypto_ahash_ctx(tfm); return crypto_shash_setkey(*ctx, key, keylen); } static int shash_async_init(struct ahash_request *req) { struct crypto_shash **ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req)); struct shash_desc *desc = ahash_request_ctx(req); desc->tfm = *ctx; |
3b2f6df08 crypto: hash - Ex... |
245 246 247 |
return crypto_shash_init(desc); } |
7eddf95ec crypto: shash - E... |
248 |
int shash_ahash_update(struct ahash_request *req, struct shash_desc *desc) |
3b2f6df08 crypto: hash - Ex... |
249 |
{ |
3b2f6df08 crypto: hash - Ex... |
250 251 252 253 254 255 256 257 258 |
struct crypto_hash_walk walk; int nbytes; for (nbytes = crypto_hash_walk_first(req, &walk); nbytes > 0; nbytes = crypto_hash_walk_done(&walk, nbytes)) nbytes = crypto_shash_update(desc, walk.data, nbytes); return nbytes; } |
7eddf95ec crypto: shash - E... |
259 260 261 262 263 264 |
EXPORT_SYMBOL_GPL(shash_ahash_update); static int shash_async_update(struct ahash_request *req) { return shash_ahash_update(req, ahash_request_ctx(req)); } |
3b2f6df08 crypto: hash - Ex... |
265 266 267 268 269 |
static int shash_async_final(struct ahash_request *req) { return crypto_shash_final(ahash_request_ctx(req), req->result); } |
66f6ce5e5 crypto: ahash - A... |
270 271 272 273 |
int shash_ahash_finup(struct ahash_request *req, struct shash_desc *desc) { struct crypto_hash_walk walk; int nbytes; |
cbc86b916 crypto: shash - F... |
274 275 276 277 278 |
nbytes = crypto_hash_walk_first(req, &walk); if (!nbytes) return crypto_shash_final(desc, req->result); do { |
66f6ce5e5 crypto: ahash - A... |
279 280 281 282 |
nbytes = crypto_hash_walk_last(&walk) ? crypto_shash_finup(desc, walk.data, nbytes, req->result) : crypto_shash_update(desc, walk.data, nbytes); |
cbc86b916 crypto: shash - F... |
283 284 |
nbytes = crypto_hash_walk_done(&walk, nbytes); } while (nbytes > 0); |
66f6ce5e5 crypto: ahash - A... |
285 286 287 288 289 290 291 292 293 294 295 |
return nbytes; } EXPORT_SYMBOL_GPL(shash_ahash_finup); static int shash_async_finup(struct ahash_request *req) { struct crypto_shash **ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req)); struct shash_desc *desc = ahash_request_ctx(req); desc->tfm = *ctx; |
66f6ce5e5 crypto: ahash - A... |
296 297 298 |
return shash_ahash_finup(req, desc); } |
7eddf95ec crypto: shash - E... |
299 |
int shash_ahash_digest(struct ahash_request *req, struct shash_desc *desc) |
3b2f6df08 crypto: hash - Ex... |
300 |
{ |
3b2f6df08 crypto: hash - Ex... |
301 |
unsigned int nbytes = req->nbytes; |
b61907bb4 crypto: shash - F... |
302 303 |
struct scatterlist *sg; unsigned int offset; |
3b2f6df08 crypto: hash - Ex... |
304 |
int err; |
b61907bb4 crypto: shash - F... |
305 306 |
if (nbytes && (sg = req->src, offset = sg->offset, |
67cb60e4e crypto: shash - f... |
307 |
nbytes <= min(sg->length, ((unsigned int)(PAGE_SIZE)) - offset))) { |
3b2f6df08 crypto: hash - Ex... |
308 |
void *data; |
f0dfc0b0b crypto: remove th... |
309 |
data = kmap_atomic(sg_page(sg)); |
3b2f6df08 crypto: hash - Ex... |
310 311 |
err = crypto_shash_digest(desc, data + offset, nbytes, req->result); |
f0dfc0b0b crypto: remove th... |
312 |
kunmap_atomic(data); |
7eddf95ec crypto: shash - E... |
313 314 |
} else err = crypto_shash_init(desc) ?: |
66f6ce5e5 crypto: ahash - A... |
315 |
shash_ahash_finup(req, desc); |
3b2f6df08 crypto: hash - Ex... |
316 |
|
7eddf95ec crypto: shash - E... |
317 318 319 |
return err; } EXPORT_SYMBOL_GPL(shash_ahash_digest); |
3b2f6df08 crypto: hash - Ex... |
320 |
|
7eddf95ec crypto: shash - E... |
321 322 323 324 |
static int shash_async_digest(struct ahash_request *req) { struct crypto_shash **ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req)); struct shash_desc *desc = ahash_request_ctx(req); |
3b2f6df08 crypto: hash - Ex... |
325 |
|
7eddf95ec crypto: shash - E... |
326 |
desc->tfm = *ctx; |
3b2f6df08 crypto: hash - Ex... |
327 |
|
7eddf95ec crypto: shash - E... |
328 |
return shash_ahash_digest(req, desc); |
3b2f6df08 crypto: hash - Ex... |
329 |
} |
66f6ce5e5 crypto: ahash - A... |
330 331 332 333 334 335 336 |
static int shash_async_export(struct ahash_request *req, void *out) { return crypto_shash_export(ahash_request_ctx(req), out); } static int shash_async_import(struct ahash_request *req, const void *in) { |
90246e79a crypto: hash - Fi... |
337 338 339 340 |
struct crypto_shash **ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req)); struct shash_desc *desc = ahash_request_ctx(req); desc->tfm = *ctx; |
90246e79a crypto: hash - Fi... |
341 342 |
return crypto_shash_import(desc, in); |
66f6ce5e5 crypto: ahash - A... |
343 |
} |
3b2f6df08 crypto: hash - Ex... |
344 345 346 347 348 349 |
static void crypto_exit_shash_ops_async(struct crypto_tfm *tfm) { struct crypto_shash **ctx = crypto_tfm_ctx(tfm); crypto_free_shash(*ctx); } |
88056ec34 crypto: ahash - C... |
350 |
int crypto_init_shash_ops_async(struct crypto_tfm *tfm) |
3b2f6df08 crypto: hash - Ex... |
351 352 |
{ struct crypto_alg *calg = tfm->__crt_alg; |
66f6ce5e5 crypto: ahash - A... |
353 |
struct shash_alg *alg = __crypto_shash_alg(calg); |
88056ec34 crypto: ahash - C... |
354 |
struct crypto_ahash *crt = __crypto_ahash_cast(tfm); |
3b2f6df08 crypto: hash - Ex... |
355 356 357 358 359 |
struct crypto_shash **ctx = crypto_tfm_ctx(tfm); struct crypto_shash *shash; if (!crypto_mod_get(calg)) return -EAGAIN; |
3f683d617 crypto: api - Fix... |
360 |
shash = crypto_create_tfm(calg, &crypto_shash_type); |
3b2f6df08 crypto: hash - Ex... |
361 362 363 364 365 366 367 368 369 370 |
if (IS_ERR(shash)) { crypto_mod_put(calg); return PTR_ERR(shash); } *ctx = shash; tfm->exit = crypto_exit_shash_ops_async; crt->init = shash_async_init; crt->update = shash_async_update; |
66f6ce5e5 crypto: ahash - A... |
371 372 |
crt->final = shash_async_final; crt->finup = shash_async_finup; |
3b2f6df08 crypto: hash - Ex... |
373 |
crt->digest = shash_async_digest; |
ba7d7433a crypto: hash - se... |
374 375 |
if (crypto_shash_alg_has_setkey(alg)) crt->setkey = shash_async_setkey; |
00420a65f crypto: shash - F... |
376 |
|
9fa68f620 crypto: hash - pr... |
377 378 |
crypto_ahash_set_flags(crt, crypto_shash_get_flags(shash) & CRYPTO_TFM_NEED_KEY); |
66f6ce5e5 crypto: ahash - A... |
379 |
|
2b091e32a crypto: shash - r... |
380 381 |
crt->export = shash_async_export; crt->import = shash_async_import; |
3b2f6df08 crypto: hash - Ex... |
382 |
|
3b2f6df08 crypto: hash - Ex... |
383 384 385 386 |
crt->reqsize = sizeof(struct shash_desc) + crypto_shash_descsize(shash); return 0; } |
fbce6be5a crypto: shash - A... |
387 388 389 390 391 392 393 |
static void crypto_shash_exit_tfm(struct crypto_tfm *tfm) { struct crypto_shash *hash = __crypto_shash_cast(tfm); struct shash_alg *alg = crypto_shash_alg(hash); alg->exit_tfm(hash); } |
2ca33da1d crypto: api - Rem... |
394 |
static int crypto_shash_init_tfm(struct crypto_tfm *tfm) |
7b5a080b3 crypto: hash - Ad... |
395 |
{ |
113adefc7 crypto: shash - M... |
396 |
struct crypto_shash *hash = __crypto_shash_cast(tfm); |
9fa68f620 crypto: hash - pr... |
397 |
struct shash_alg *alg = crypto_shash_alg(hash); |
fbce6be5a crypto: shash - A... |
398 |
int err; |
9fa68f620 crypto: hash - pr... |
399 400 |
hash->descsize = alg->descsize; |
ba7d7433a crypto: hash - se... |
401 |
shash_set_needkey(hash, alg); |
113adefc7 crypto: shash - M... |
402 |
|
fbce6be5a crypto: shash - A... |
403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 |
if (alg->exit_tfm) tfm->exit = crypto_shash_exit_tfm; if (!alg->init_tfm) return 0; err = alg->init_tfm(hash); if (err) return err; /* ->init_tfm() may have increased the descsize. */ if (WARN_ON_ONCE(hash->descsize > HASH_MAX_DESCSIZE)) { if (alg->exit_tfm) alg->exit_tfm(hash); return -EINVAL; } |
7b5a080b3 crypto: hash - Ad... |
419 420 |
return 0; } |
48fb3e578 crypto: hash - ad... |
421 422 423 |
static void crypto_shash_free_instance(struct crypto_instance *inst) { struct shash_instance *shash = shash_instance(inst); |
48fb3e578 crypto: hash - ad... |
424 425 |
shash->free(shash); } |
3acc84739 crypto: algapi - ... |
426 |
#ifdef CONFIG_NET |
f4d663ce6 crypto: Add users... |
427 428 429 430 |
static int crypto_shash_report(struct sk_buff *skb, struct crypto_alg *alg) { struct crypto_report_hash rhash; struct shash_alg *salg = __crypto_shash_alg(alg); |
37db69e0b crypto: user - cl... |
431 432 433 |
memset(&rhash, 0, sizeof(rhash)); strscpy(rhash.type, "shash", sizeof(rhash.type)); |
9a5467bf7 crypto: user - fi... |
434 |
|
f4d663ce6 crypto: Add users... |
435 436 |
rhash.blocksize = alg->cra_blocksize; rhash.digestsize = salg->digestsize; |
37db69e0b crypto: user - cl... |
437 |
return nla_put(skb, CRYPTOCFGA_REPORT_HASH, sizeof(rhash), &rhash); |
f4d663ce6 crypto: Add users... |
438 |
} |
3acc84739 crypto: algapi - ... |
439 440 441 442 443 444 |
#else static int crypto_shash_report(struct sk_buff *skb, struct crypto_alg *alg) { return -ENOSYS; } #endif |
f4d663ce6 crypto: Add users... |
445 |
|
7b5a080b3 crypto: hash - Ad... |
446 |
static void crypto_shash_show(struct seq_file *m, struct crypto_alg *alg) |
d8c34b949 crypto: Replaced ... |
447 |
__maybe_unused; |
7b5a080b3 crypto: hash - Ad... |
448 449 450 451 452 453 454 455 456 457 |
static void crypto_shash_show(struct seq_file *m, struct crypto_alg *alg) { struct shash_alg *salg = __crypto_shash_alg(alg); seq_printf(m, "type : shash "); seq_printf(m, "blocksize : %u ", alg->cra_blocksize); seq_printf(m, "digestsize : %u ", salg->digestsize); |
7b5a080b3 crypto: hash - Ad... |
458 459 460 |
} static const struct crypto_type crypto_shash_type = { |
ac611680c crypto: shash - U... |
461 |
.extsize = crypto_alg_extsize, |
7b5a080b3 crypto: hash - Ad... |
462 |
.init_tfm = crypto_shash_init_tfm, |
48fb3e578 crypto: hash - ad... |
463 |
.free = crypto_shash_free_instance, |
7b5a080b3 crypto: hash - Ad... |
464 465 466 |
#ifdef CONFIG_PROC_FS .show = crypto_shash_show, #endif |
f4d663ce6 crypto: Add users... |
467 |
.report = crypto_shash_report, |
7b5a080b3 crypto: hash - Ad... |
468 469 470 471 472 |
.maskclear = ~CRYPTO_ALG_TYPE_MASK, .maskset = CRYPTO_ALG_TYPE_MASK, .type = CRYPTO_ALG_TYPE_SHASH, .tfmsize = offsetof(struct crypto_shash, base), }; |
fdfad1fff crypto: shash - i... |
473 474 475 476 477 478 479 480 |
int crypto_grab_shash(struct crypto_shash_spawn *spawn, struct crypto_instance *inst, const char *name, u32 type, u32 mask) { spawn->base.frontend = &crypto_shash_type; return crypto_grab_spawn(&spawn->base, inst, name, type, mask); } EXPORT_SYMBOL_GPL(crypto_grab_shash); |
7b5a080b3 crypto: hash - Ad... |
481 482 483 |
struct crypto_shash *crypto_alloc_shash(const char *alg_name, u32 type, u32 mask) { |
3f683d617 crypto: api - Fix... |
484 |
return crypto_alloc_tfm(alg_name, &crypto_shash_type, type, mask); |
7b5a080b3 crypto: hash - Ad... |
485 486 |
} EXPORT_SYMBOL_GPL(crypto_alloc_shash); |
619a6ebd2 crypto: shash - A... |
487 |
static int shash_prepare_alg(struct shash_alg *alg) |
7b5a080b3 crypto: hash - Ad... |
488 489 |
{ struct crypto_alg *base = &alg->base; |
b68a7ec1e crypto: hash - Re... |
490 491 492 |
if (alg->digestsize > HASH_MAX_DIGESTSIZE || alg->descsize > HASH_MAX_DESCSIZE || alg->statesize > HASH_MAX_STATESIZE) |
7b5a080b3 crypto: hash - Ad... |
493 |
return -EINVAL; |
41a2e94f8 crypto: shash - r... |
494 495 |
if ((alg->export && !alg->import) || (alg->import && !alg->export)) return -EINVAL; |
7b5a080b3 crypto: hash - Ad... |
496 497 498 |
base->cra_type = &crypto_shash_type; base->cra_flags &= ~CRYPTO_ALG_TYPE_MASK; base->cra_flags |= CRYPTO_ALG_TYPE_SHASH; |
99d27e1c5 crypto: shash - E... |
499 |
|
8267adab9 crypto: shash - M... |
500 501 502 503 |
if (!alg->finup) alg->finup = shash_finup_unaligned; if (!alg->digest) alg->digest = shash_digest_unaligned; |
f592682f9 crypto: shash - R... |
504 505 506 507 508 |
if (!alg->export) { alg->export = shash_default_export; alg->import = shash_default_import; alg->statesize = alg->descsize; } |
57cfe44bc crypto: shash - M... |
509 510 |
if (!alg->setkey) alg->setkey = shash_no_setkey; |
99d27e1c5 crypto: shash - E... |
511 |
|
619a6ebd2 crypto: shash - A... |
512 513 514 515 516 517 518 519 520 521 522 |
return 0; } int crypto_register_shash(struct shash_alg *alg) { struct crypto_alg *base = &alg->base; int err; err = shash_prepare_alg(alg); if (err) return err; |
7b5a080b3 crypto: hash - Ad... |
523 524 525 526 |
return crypto_register_alg(base); } EXPORT_SYMBOL_GPL(crypto_register_shash); |
c6d633a92 crypto: algapi - ... |
527 |
void crypto_unregister_shash(struct shash_alg *alg) |
7b5a080b3 crypto: hash - Ad... |
528 |
{ |
c6d633a92 crypto: algapi - ... |
529 |
crypto_unregister_alg(&alg->base); |
7b5a080b3 crypto: hash - Ad... |
530 531 |
} EXPORT_SYMBOL_GPL(crypto_unregister_shash); |
50fc3e8d2 crypto: add crypt... |
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 |
int crypto_register_shashes(struct shash_alg *algs, int count) { int i, ret; for (i = 0; i < count; i++) { ret = crypto_register_shash(&algs[i]); if (ret) goto err; } return 0; err: for (--i; i >= 0; --i) crypto_unregister_shash(&algs[i]); return ret; } EXPORT_SYMBOL_GPL(crypto_register_shashes); |
c6d633a92 crypto: algapi - ... |
551 |
void crypto_unregister_shashes(struct shash_alg *algs, int count) |
50fc3e8d2 crypto: add crypt... |
552 |
{ |
c6d633a92 crypto: algapi - ... |
553 |
int i; |
50fc3e8d2 crypto: add crypt... |
554 |
|
c6d633a92 crypto: algapi - ... |
555 556 |
for (i = count - 1; i >= 0; --i) crypto_unregister_shash(&algs[i]); |
50fc3e8d2 crypto: add crypt... |
557 558 |
} EXPORT_SYMBOL_GPL(crypto_unregister_shashes); |
619a6ebd2 crypto: shash - A... |
559 560 561 562 |
int shash_register_instance(struct crypto_template *tmpl, struct shash_instance *inst) { int err; |
d4fdc2dfa crypto: algapi - ... |
563 564 |
if (WARN_ON(!inst->free)) return -EINVAL; |
619a6ebd2 crypto: shash - A... |
565 566 567 568 569 570 571 |
err = shash_prepare_alg(&inst->alg); if (err) return err; return crypto_register_instance(tmpl, shash_crypto_instance(inst)); } EXPORT_SYMBOL_GPL(shash_register_instance); |
a39c66cc2 crypto: shash - c... |
572 |
void shash_free_singlespawn_instance(struct shash_instance *inst) |
2e4fddd8e crypto: shash - A... |
573 |
{ |
a39c66cc2 crypto: shash - c... |
574 575 |
crypto_drop_spawn(shash_instance_ctx(inst)); kfree(inst); |
2e4fddd8e crypto: shash - A... |
576 |
} |
a39c66cc2 crypto: shash - c... |
577 |
EXPORT_SYMBOL_GPL(shash_free_singlespawn_instance); |
2e4fddd8e crypto: shash - A... |
578 |
|
7b5a080b3 crypto: hash - Ad... |
579 580 |
MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Synchronous cryptographic hash type"); |