From fedba5aaef6d980a57380c7caf9a545b4457b29e Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Wed, 6 Jan 2016 18:01:29 +0100 Subject: crypto: add digest_alloc_by_algo() In barebox the function digest_alloc() allocates a digest based on a string. When a subsystem already uses an integer value to identify a digest it makes no sense to create a string and pass it to digest_alloc(), where it is parsed again. This patch adds the possibility to get a digest by an enum. Signed-off-by: Sascha Hauer Signed-off-by: Marc Kleine-Budde Signed-off-by: Sascha Hauer --- crypto/digest.c | 43 ++++++++++++++++++++++++++++++++++++++++++- crypto/md5.c | 1 + crypto/sha1.c | 1 + crypto/sha2.c | 2 ++ crypto/sha4.c | 2 ++ 5 files changed, 48 insertions(+), 1 deletion(-) (limited to 'crypto') diff --git a/crypto/digest.c b/crypto/digest.c index a90e4ff79f..46600f246e 100644 --- a/crypto/digest.c +++ b/crypto/digest.c @@ -116,7 +116,27 @@ static struct digest_algo *digest_algo_get_by_name(const char *name) list_for_each_entry(tmp, &digests, list) { if (strcmp(tmp->base.name, name) != 0) continue; - + + if (tmp->base.priority <= priority) + continue; + + d = tmp; + priority = tmp->base.priority; + } + + return d; +} + +static struct digest_algo *digest_algo_get_by_algo(enum hash_algo algo) +{ + struct digest_algo *d = NULL; + struct digest_algo *tmp; + int priority = -1; + + list_for_each_entry(tmp, &digests, list) { + if (tmp->base.algo != algo) + continue; + if (tmp->base.priority <= priority) continue; @@ -160,6 +180,27 @@ struct digest *digest_alloc(const char *name) } EXPORT_SYMBOL_GPL(digest_alloc); +struct digest *digest_alloc_by_algo(enum hash_algo hash_algo) +{ + struct digest *d; + struct digest_algo *algo; + + algo = digest_algo_get_by_algo(hash_algo); + if (!algo) + return NULL; + + d = xzalloc(sizeof(*d)); + d->algo = algo; + d->ctx = xzalloc(algo->ctx_length); + if (d->algo->alloc(d)) { + digest_free(d); + return NULL; + } + + return d; +} +EXPORT_SYMBOL_GPL(digest_alloc_by_algo); + void digest_free(struct digest *d) { if (!d) diff --git a/crypto/md5.c b/crypto/md5.c index 23892babce..f8f52bf4a5 100644 --- a/crypto/md5.c +++ b/crypto/md5.c @@ -293,6 +293,7 @@ static struct digest_algo md5 = { .name = "md5", .driver_name = "md5-generic", .priority = 0, + .algo = HASH_ALGO_MD5, }, .init = digest_md5_init, .update = digest_md5_update, diff --git a/crypto/sha1.c b/crypto/sha1.c index a3de2719d8..cbde4d28e4 100644 --- a/crypto/sha1.c +++ b/crypto/sha1.c @@ -287,6 +287,7 @@ static struct digest_algo m = { .name = "sha1", .driver_name = "sha1-generic", .priority = 0, + .algo = HASH_ALGO_SHA1, }, .init = sha1_init, diff --git a/crypto/sha2.c b/crypto/sha2.c index 6ac5527028..df566c8a4b 100644 --- a/crypto/sha2.c +++ b/crypto/sha2.c @@ -327,6 +327,7 @@ static struct digest_algo m224 = { .name = "sha224", .driver_name = "sha224-generic", .priority = 0, + .algo = HASH_ALGO_SHA224, }, .init = sha224_init, @@ -352,6 +353,7 @@ static struct digest_algo m256 = { .name = "sha256", .driver_name = "sha256-generic", .priority = 0, + .algo = HASH_ALGO_SHA256, }, .init = sha256_init, diff --git a/crypto/sha4.c b/crypto/sha4.c index 187a91ef58..4ce37b73e4 100644 --- a/crypto/sha4.c +++ b/crypto/sha4.c @@ -246,6 +246,7 @@ static struct digest_algo m384 = { .name = "sha384", .driver_name = "sha384-generic", .priority = 0, + .algo = HASH_ALGO_SHA384, }, .init = sha384_init, @@ -272,6 +273,7 @@ static struct digest_algo m512 = { .name = "sha512", .driver_name = "sha512-generic", .priority = 0, + .algo = HASH_ALGO_SHA512, }, .init = sha512_init, -- cgit v1.2.3