/* See LICENSE file for copyright and license details. */
#include "common.h"
#if defined(__GNUC__)
__attribute__((__pure__))
#endif
static int
equiv(const char *a, const char *b)
{
while (*a && *b) {
if (tolower(*a) == tolower(*b)) {
a++;
b++;
} else if (*b == '-') {
b++;
} else {
return 0;
}
}
return !*a && !*b;
}
int
libhashsum_init_hasher_from_string(struct libhashsum_hasher *this, const char *algorithm)
{
if (!strcasecmp(algorithm, "MD2"))
return libhashsum_init_md2_hasher(this);
if (!strcasecmp(algorithm, "MD4"))
return libhashsum_init_md4_hasher(this);
if (!strcasecmp(algorithm, "MD5"))
return libhashsum_init_md5_hasher(this);
if (equiv(algorithm, "RIPEMD-128"))
return libhashsum_init_ripemd_128_hasher(this);
if (equiv(algorithm, "RIPEMD-160"))
return libhashsum_init_ripemd_160_hasher(this);
if (equiv(algorithm, "RIPEMD-256"))
return libhashsum_init_ripemd_256_hasher(this);
if (equiv(algorithm, "RIPEMD-320"))
return libhashsum_init_ripemd_320_hasher(this);
if (equiv(algorithm, "SHA-0"))
return libhashsum_init_sha0_hasher(this);
if (equiv(algorithm, "SHA-1"))
return libhashsum_init_sha1_hasher(this);
if (equiv(algorithm, "SHA-224") || !strcasecmp(algorithm, "SHA2-224"))
return libhashsum_init_sha_224_hasher(this);
if (equiv(algorithm, "SHA-256") || !strcasecmp(algorithm, "SHA2-256"))
return libhashsum_init_sha_256_hasher(this);
if (equiv(algorithm, "SHA-384") || !strcasecmp(algorithm, "SHA2-384"))
return libhashsum_init_sha_384_hasher(this);
if (equiv(algorithm, "SHA-512") || !strcasecmp(algorithm, "SHA2-512"))
return libhashsum_init_sha_512_hasher(this);
if (equiv(algorithm, "SHA-512/224") || !strcasecmp(algorithm, "SHA2-512/224"))
return libhashsum_init_sha_512_224_hasher(this);
if (equiv(algorithm, "SHA-512/256") || !strcasecmp(algorithm, "SHA2-512/256"))
return libhashsum_init_sha_512_256_hasher(this);
errno = EINVAL;
return -1;
}