diff options
-rw-r--r-- | crypto/algapi.c | 8 | ||||
-rw-r--r-- | crypto/api.c | 31 | ||||
-rw-r--r-- | crypto/internal.h | 3 | ||||
-rw-r--r-- | include/crypto/algapi.h | 11 |
4 files changed, 40 insertions, 13 deletions
diff --git a/crypto/algapi.c b/crypto/algapi.c index 17a5fff8f777..2154815201a7 100644 --- a/crypto/algapi.c +++ b/crypto/algapi.c | |||
@@ -644,7 +644,9 @@ const char *crypto_attr_alg_name(struct rtattr *rta) | |||
644 | } | 644 | } |
645 | EXPORT_SYMBOL_GPL(crypto_attr_alg_name); | 645 | EXPORT_SYMBOL_GPL(crypto_attr_alg_name); |
646 | 646 | ||
647 | struct crypto_alg *crypto_attr_alg(struct rtattr *rta, u32 type, u32 mask) | 647 | struct crypto_alg *crypto_attr_alg2(struct rtattr *rta, |
648 | const struct crypto_type *frontend, | ||
649 | u32 type, u32 mask) | ||
648 | { | 650 | { |
649 | const char *name; | 651 | const char *name; |
650 | int err; | 652 | int err; |
@@ -654,9 +656,9 @@ struct crypto_alg *crypto_attr_alg(struct rtattr *rta, u32 type, u32 mask) | |||
654 | if (IS_ERR(name)) | 656 | if (IS_ERR(name)) |
655 | return ERR_PTR(err); | 657 | return ERR_PTR(err); |
656 | 658 | ||
657 | return crypto_alg_mod_lookup(name, type, mask); | 659 | return crypto_find_alg(name, frontend, type, mask); |
658 | } | 660 | } |
659 | EXPORT_SYMBOL_GPL(crypto_attr_alg); | 661 | EXPORT_SYMBOL_GPL(crypto_attr_alg2); |
660 | 662 | ||
661 | int crypto_attr_u32(struct rtattr *rta, u32 *num) | 663 | int crypto_attr_u32(struct rtattr *rta, u32 *num) |
662 | { | 664 | { |
diff --git a/crypto/api.c b/crypto/api.c index d5944f92b416..ba81221b3bef 100644 --- a/crypto/api.c +++ b/crypto/api.c | |||
@@ -503,6 +503,27 @@ out: | |||
503 | } | 503 | } |
504 | EXPORT_SYMBOL_GPL(crypto_create_tfm); | 504 | EXPORT_SYMBOL_GPL(crypto_create_tfm); |
505 | 505 | ||
506 | struct crypto_alg *crypto_find_alg(const char *alg_name, | ||
507 | const struct crypto_type *frontend, | ||
508 | u32 type, u32 mask) | ||
509 | { | ||
510 | struct crypto_alg *(*lookup)(const char *name, u32 type, u32 mask) = | ||
511 | crypto_alg_mod_lookup; | ||
512 | |||
513 | if (frontend) { | ||
514 | type &= frontend->maskclear; | ||
515 | mask &= frontend->maskclear; | ||
516 | type |= frontend->type; | ||
517 | mask |= frontend->maskset; | ||
518 | |||
519 | if (frontend->lookup) | ||
520 | lookup = frontend->lookup; | ||
521 | } | ||
522 | |||
523 | return lookup(alg_name, type, mask); | ||
524 | } | ||
525 | EXPORT_SYMBOL_GPL(crypto_find_alg); | ||
526 | |||
506 | /* | 527 | /* |
507 | * crypto_alloc_tfm - Locate algorithm and allocate transform | 528 | * crypto_alloc_tfm - Locate algorithm and allocate transform |
508 | * @alg_name: Name of algorithm | 529 | * @alg_name: Name of algorithm |
@@ -526,21 +547,13 @@ EXPORT_SYMBOL_GPL(crypto_create_tfm); | |||
526 | void *crypto_alloc_tfm(const char *alg_name, | 547 | void *crypto_alloc_tfm(const char *alg_name, |
527 | const struct crypto_type *frontend, u32 type, u32 mask) | 548 | const struct crypto_type *frontend, u32 type, u32 mask) |
528 | { | 549 | { |
529 | struct crypto_alg *(*lookup)(const char *name, u32 type, u32 mask); | ||
530 | void *tfm; | 550 | void *tfm; |
531 | int err; | 551 | int err; |
532 | 552 | ||
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 (;;) { | 553 | for (;;) { |
541 | struct crypto_alg *alg; | 554 | struct crypto_alg *alg; |
542 | 555 | ||
543 | alg = lookup(alg_name, type, mask); | 556 | alg = crypto_find_alg(alg_name, frontend, type, mask); |
544 | if (IS_ERR(alg)) { | 557 | if (IS_ERR(alg)) { |
545 | err = PTR_ERR(alg); | 558 | err = PTR_ERR(alg); |
546 | goto err; | 559 | goto err; |
diff --git a/crypto/internal.h b/crypto/internal.h index 95baaea21fbc..7efa4d0533ff 100644 --- a/crypto/internal.h +++ b/crypto/internal.h | |||
@@ -106,6 +106,9 @@ struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type, | |||
106 | u32 mask); | 106 | u32 mask); |
107 | void *crypto_create_tfm(struct crypto_alg *alg, | 107 | void *crypto_create_tfm(struct crypto_alg *alg, |
108 | const struct crypto_type *frontend); | 108 | const struct crypto_type *frontend); |
109 | struct crypto_alg *crypto_find_alg(const char *alg_name, | ||
110 | const struct crypto_type *frontend, | ||
111 | u32 type, u32 mask); | ||
109 | void *crypto_alloc_tfm(const char *alg_name, | 112 | void *crypto_alloc_tfm(const char *alg_name, |
110 | const struct crypto_type *frontend, u32 type, u32 mask); | 113 | const struct crypto_type *frontend, u32 type, u32 mask); |
111 | 114 | ||
diff --git a/include/crypto/algapi.h b/include/crypto/algapi.h index c9bff92a9e0e..1d15a926041e 100644 --- a/include/crypto/algapi.h +++ b/include/crypto/algapi.h | |||
@@ -136,7 +136,16 @@ static inline void crypto_set_spawn(struct crypto_spawn *spawn, | |||
136 | struct crypto_attr_type *crypto_get_attr_type(struct rtattr **tb); | 136 | struct crypto_attr_type *crypto_get_attr_type(struct rtattr **tb); |
137 | int crypto_check_attr_type(struct rtattr **tb, u32 type); | 137 | int crypto_check_attr_type(struct rtattr **tb, u32 type); |
138 | const char *crypto_attr_alg_name(struct rtattr *rta); | 138 | const char *crypto_attr_alg_name(struct rtattr *rta); |
139 | struct crypto_alg *crypto_attr_alg(struct rtattr *rta, u32 type, u32 mask); | 139 | struct crypto_alg *crypto_attr_alg2(struct rtattr *rta, |
140 | const struct crypto_type *frontend, | ||
141 | u32 type, u32 mask); | ||
142 | |||
143 | static inline struct crypto_alg *crypto_attr_alg(struct rtattr *rta, | ||
144 | u32 type, u32 mask) | ||
145 | { | ||
146 | return crypto_attr_alg2(rta, NULL, type, mask); | ||
147 | } | ||
148 | |||
140 | int crypto_attr_u32(struct rtattr *rta, u32 *num); | 149 | int crypto_attr_u32(struct rtattr *rta, u32 *num); |
141 | void *crypto_alloc_instance2(const char *name, struct crypto_alg *alg, | 150 | void *crypto_alloc_instance2(const char *name, struct crypto_alg *alg, |
142 | unsigned int head); | 151 | unsigned int head); |