From: Michael Tremer Date: Sat, 1 Oct 2022 13:07:15 +0000 (+0000) Subject: digests: Add function to return the type from string X-Git-Tag: 0.9.28~289 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f7dd99ab20dd928bfde10ff84283194e6db25d30;p=pakfire.git digests: Add function to return the type from string Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/digest.c b/src/libpakfire/digest.c index b73646007..3ea348491 100644 --- a/src/libpakfire/digest.c +++ b/src/libpakfire/digest.c @@ -31,6 +31,40 @@ #include #include +int pakfire_digest_get_by_name(const char* name) { + static const struct _pakfire_digest_name { + const char* name; + int type; + } names[] = { + // SHA-2 + { "sha2-512", PAKFIRE_DIGEST_SHA2_512, }, + { "sha2-256", PAKFIRE_DIGEST_SHA2_256, }, + + // BLAKE2 + { "blake2b512", PAKFIRE_DIGEST_BLAKE2B512, }, + { "blake2s256", PAKFIRE_DIGEST_BLAKE2S256, }, + + // SHA-3 + { "sha3-512", PAKFIRE_DIGEST_SHA3_512, }, + { "sha3-256", PAKFIRE_DIGEST_SHA3_256, }, + + { NULL, 0, }, + }; + + // Check that name is not NULL + if (!name) { + errno = EINVAL; + return 0; + } + + for (const struct _pakfire_digest_name* n = names; n->name; n++) { + if (strcmp(n->name, name) == 0) + return n->type; + } + + return 0; +} + size_t pakfire_digest_length(const enum pakfire_digest_types digest) { switch (digest) { case PAKFIRE_DIGEST_SHA3_512: diff --git a/src/libpakfire/include/pakfire/digest.h b/src/libpakfire/include/pakfire/digest.h index c0ac04e54..db34f96e2 100644 --- a/src/libpakfire/include/pakfire/digest.h +++ b/src/libpakfire/include/pakfire/digest.h @@ -85,6 +85,8 @@ struct pakfire_digests { .sha2_256 = 0, \ } +int pakfire_digest_get_by_name(const char* name); + size_t pakfire_digest_length(const enum pakfire_digest_types digest); #define pakfire_digest_set(digest) __pakfire_digest_set(digest, sizeof(digest)) diff --git a/tests/libpakfire/digest.c b/tests/libpakfire/digest.c index 12b7c1759..eab91c9ec 100644 --- a/tests/libpakfire/digest.c +++ b/tests/libpakfire/digest.c @@ -85,9 +85,29 @@ FAIL: return r; } +static int test_get_by_name(const struct test* t) { + // Positive cases + ASSERT(pakfire_digest_get_by_name("sha2-512") == PAKFIRE_DIGEST_SHA2_512); + ASSERT(pakfire_digest_get_by_name("sha2-256") == PAKFIRE_DIGEST_SHA2_256); + ASSERT(pakfire_digest_get_by_name("blake2b512") == PAKFIRE_DIGEST_BLAKE2B512); + ASSERT(pakfire_digest_get_by_name("blake2s256") == PAKFIRE_DIGEST_BLAKE2S256); + ASSERT(pakfire_digest_get_by_name("sha3-512") == PAKFIRE_DIGEST_SHA3_512); + ASSERT(pakfire_digest_get_by_name("sha3-256") == PAKFIRE_DIGEST_SHA3_256); + + // Negative cases + ASSERT(pakfire_digest_get_by_name("XXX") == 0); + ASSERT(pakfire_digest_get_by_name(NULL) == 0); + + return EXIT_SUCCESS; + +FAIL: + return EXIT_FAILURE; +} + int main(int argc, const char* argv[]) { testsuite_add_test(test_init); testsuite_add_test(test_random); + testsuite_add_test(test_get_by_name); return testsuite_run(argc, argv); }