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; |
