diff options
Diffstat (limited to 'crypto/api.c')
-rw-r--r-- | crypto/api.c | 54 |
1 files changed, 26 insertions, 28 deletions
diff --git a/crypto/api.c b/crypto/api.c index d5944f92b416..798526d90538 100644 --- a/crypto/api.c +++ b/crypto/api.c | |||
@@ -285,13 +285,6 @@ static int crypto_init_ops(struct crypto_tfm *tfm, u32 type, u32 mask) | |||
285 | switch (crypto_tfm_alg_type(tfm)) { | 285 | switch (crypto_tfm_alg_type(tfm)) { |
286 | case CRYPTO_ALG_TYPE_CIPHER: | 286 | case CRYPTO_ALG_TYPE_CIPHER: |
287 | return crypto_init_cipher_ops(tfm); | 287 | return crypto_init_cipher_ops(tfm); |
288 | |||
289 | case CRYPTO_ALG_TYPE_DIGEST: | ||
290 | if ((mask & CRYPTO_ALG_TYPE_HASH_MASK) != | ||
291 | CRYPTO_ALG_TYPE_HASH_MASK) | ||
292 | return crypto_init_digest_ops_async(tfm); | ||
293 | else | ||
294 | return crypto_init_digest_ops(tfm); | ||
295 | 288 | ||
296 | case CRYPTO_ALG_TYPE_COMPRESS: | 289 | case CRYPTO_ALG_TYPE_COMPRESS: |
297 | return crypto_init_compress_ops(tfm); | 290 | return crypto_init_compress_ops(tfm); |
@@ -318,11 +311,7 @@ static void crypto_exit_ops(struct crypto_tfm *tfm) | |||
318 | case CRYPTO_ALG_TYPE_CIPHER: | 311 | case CRYPTO_ALG_TYPE_CIPHER: |
319 | crypto_exit_cipher_ops(tfm); | 312 | crypto_exit_cipher_ops(tfm); |
320 | break; | 313 | break; |
321 | 314 | ||
322 | case CRYPTO_ALG_TYPE_DIGEST: | ||
323 | crypto_exit_digest_ops(tfm); | ||
324 | break; | ||
325 | |||
326 | case CRYPTO_ALG_TYPE_COMPRESS: | 315 | case CRYPTO_ALG_TYPE_COMPRESS: |
327 | crypto_exit_compress_ops(tfm); | 316 | crypto_exit_compress_ops(tfm); |
328 | break; | 317 | break; |
@@ -349,11 +338,7 @@ static unsigned int crypto_ctxsize(struct crypto_alg *alg, u32 type, u32 mask) | |||
349 | case CRYPTO_ALG_TYPE_CIPHER: | 338 | case CRYPTO_ALG_TYPE_CIPHER: |
350 | len += crypto_cipher_ctxsize(alg); | 339 | len += crypto_cipher_ctxsize(alg); |
351 | break; | 340 | break; |
352 | 341 | ||
353 | case CRYPTO_ALG_TYPE_DIGEST: | ||
354 | len += crypto_digest_ctxsize(alg); | ||
355 | break; | ||
356 | |||
357 | case CRYPTO_ALG_TYPE_COMPRESS: | 342 | case CRYPTO_ALG_TYPE_COMPRESS: |
358 | len += crypto_compress_ctxsize(alg); | 343 | len += crypto_compress_ctxsize(alg); |
359 | break; | 344 | break; |
@@ -472,7 +457,7 @@ void *crypto_create_tfm(struct crypto_alg *alg, | |||
472 | int err = -ENOMEM; | 457 | int err = -ENOMEM; |
473 | 458 | ||
474 | tfmsize = frontend->tfmsize; | 459 | tfmsize = frontend->tfmsize; |
475 | total = tfmsize + sizeof(*tfm) + frontend->extsize(alg, frontend); | 460 | total = tfmsize + sizeof(*tfm) + frontend->extsize(alg); |
476 | 461 | ||
477 | mem = kzalloc(total, GFP_KERNEL); | 462 | mem = kzalloc(total, GFP_KERNEL); |
478 | if (mem == NULL) | 463 | if (mem == NULL) |
@@ -481,7 +466,7 @@ void *crypto_create_tfm(struct crypto_alg *alg, | |||
481 | tfm = (struct crypto_tfm *)(mem + tfmsize); | 466 | tfm = (struct crypto_tfm *)(mem + tfmsize); |
482 | tfm->__crt_alg = alg; | 467 | tfm->__crt_alg = alg; |
483 | 468 | ||
484 | err = frontend->init_tfm(tfm, frontend); | 469 | err = frontend->init_tfm(tfm); |
485 | if (err) | 470 | if (err) |
486 | goto out_free_tfm; | 471 | goto out_free_tfm; |
487 | 472 | ||
@@ -503,6 +488,27 @@ out: | |||
503 | } | 488 | } |
504 | EXPORT_SYMBOL_GPL(crypto_create_tfm); | 489 | EXPORT_SYMBOL_GPL(crypto_create_tfm); |
505 | 490 | ||
491 | struct crypto_alg *crypto_find_alg(const char *alg_name, | ||
492 | const struct crypto_type *frontend, | ||
493 | u32 type, u32 mask) | ||
494 | { | ||
495 | struct crypto_alg *(*lookup)(const char *name, u32 type, u32 mask) = | ||
496 | crypto_alg_mod_lookup; | ||
497 | |||
498 | if (frontend) { | ||
499 | type &= frontend->maskclear; | ||
500 | mask &= frontend->maskclear; | ||
501 | type |= frontend->type; | ||
502 | mask |= frontend->maskset; | ||
503 | |||
504 | if (frontend->lookup) | ||
505 | lookup = frontend->lookup; | ||
506 | } | ||
507 | |||
508 | return lookup(alg_name, type, mask); | ||
509 | } | ||
510 | EXPORT_SYMBOL_GPL(crypto_find_alg); | ||
511 | |||
506 | /* | 512 | /* |
507 | * crypto_alloc_tfm - Locate algorithm and allocate transform | 513 | * crypto_alloc_tfm - Locate algorithm and allocate transform |
508 | * @alg_name: Name of algorithm | 514 | * @alg_name: Name of algorithm |
@@ -526,21 +532,13 @@ EXPORT_SYMBOL_GPL(crypto_create_tfm); | |||
526 | void *crypto_alloc_tfm(const char *alg_name, | 532 | void *crypto_alloc_tfm(const char *alg_name, |
527 | const struct crypto_type *frontend, u32 type, u32 mask) | 533 | const struct crypto_type *frontend, u32 type, u32 mask) |
528 | { | 534 | { |
529 | struct crypto_alg *(*lookup)(const char *name, u32 type, u32 mask); | ||
530 | void *tfm; | 535 | void *tfm; |
531 | int err; | 536 | int err; |
532 | 537 | ||
533 | type &= frontend->maskclear; | ||
534 | mask &= frontend->maskclear; | ||
535 | type |= frontend->type; | ||
536 | mask |= frontend->maskset; | ||
537 | |||
538 | lookup = frontend->lookup ?: crypto_alg_mod_lookup; | ||
539 | |||
540 | for (;;) { | 538 | for (;;) { |
541 | struct crypto_alg *alg; | 539 | struct crypto_alg *alg; |
542 | 540 | ||
543 | alg = lookup(alg_name, type, mask); | 541 | alg = crypto_find_alg(alg_name, frontend, type, mask); |
544 | if (IS_ERR(alg)) { | 542 | if (IS_ERR(alg)) { |
545 | err = PTR_ERR(alg); | 543 | err = PTR_ERR(alg); |
546 | goto err; | 544 | goto err; |