diff --git a/src/ssl.c b/src/ssl.c index d410f7cf8..41e1aba2d 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -13466,6 +13466,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) unsigned char* md, unsigned int* md_len) { int type; + int mdlen; unsigned char* ret = NULL; #ifdef WOLFSSL_SMALL_STACK Hmac* hmac = NULL; @@ -13481,19 +13482,45 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) } #ifndef NO_MD5 - if (XSTRNCMP(evp_md, "MD5", 3) == 0) + if (XSTRNCMP(evp_md, "MD5", 3) == 0) { type = WC_MD5; - else + mdlen = WC_MD5_DIGEST_SIZE; + } else +#endif +#ifdef WOLFSSL_SHA224 + if (XSTRNCMP(evp_md, "SHA224", 6) == 0) { + type = WC_SHA224; + mdlen = WC_SHA224_DIGEST_SIZE; + } else +#endif +#ifndef NO_SHA256 + if (XSTRNCMP(evp_md, "SHA256", 6) == 0) { + type = WC_SHA256; + mdlen = WC_SHA256_DIGEST_SIZE; + } else +#endif +#ifdef WOLFSSL_SHA512 +#ifdef WOLFSSL_SHA384 + if (XSTRNCMP(evp_md, "SHA384", 6) == 0) { + type = WC_SHA384; + mdlen = WC_SHA384_DIGEST_SIZE; + } else +#endif + if (XSTRNCMP(evp_md, "SHA512", 6) == 0) { + type = WC_SHA512; + mdlen = WC_SHA512_DIGEST_SIZE; + } else #endif #ifndef NO_SHA - if (XSTRNCMP(evp_md, "SHA", 3) == 0) + if (XSTRNCMP(evp_md, "SHA", 3) == 0) { type = WC_SHA; - else + mdlen = WC_SHA_DIGEST_SIZE; + } else #endif { return NULL; } - + #ifdef WOLFSSL_SMALL_STACK hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap, DYNAMIC_TYPE_HMAC); if (hmac == NULL) @@ -13505,8 +13532,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) if (wc_HmacUpdate(hmac, d, n) == 0) { if (wc_HmacFinal(hmac, md) == 0) { if (md_len) - *md_len = (type == WC_MD5) ? (int)WC_MD5_DIGEST_SIZE - : (int)WC_SHA_DIGEST_SIZE; + *md_len = mdlen; ret = md; } } diff --git a/tests/api.c b/tests/api.c index 59e9393f2..1698e4c57 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16842,9 +16842,31 @@ static void test_wolfSSL_HMAC(void) AssertIntEQ(len, (int)WC_SHA256_DIGEST_SIZE); HMAC_cleanup(&hmac); +#endif + +#if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) + len = 0; + AssertNotNull(HMAC(EVP_sha256(), key, (int)sizeof(key), NULL, 0, hash, &len)); + AssertIntEQ(len, (int)WC_SHA256_DIGEST_SIZE); +#endif +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA224) + len = 0; + AssertNotNull(HMAC(EVP_sha224(), key, (int)sizeof(key), NULL, 0, hash, &len)); + AssertIntEQ(len, (int)WC_SHA224_DIGEST_SIZE); +#endif +#if defined(OPENSSL_EXTRA) && (defined(WOLFSSL_SHA384) && defined(WOLFSSL_SHA512)) + len = 0; + AssertNotNull(HMAC(EVP_sha384(), key, (int)sizeof(key), NULL, 0, hash, &len)); + AssertIntEQ(len, (int)WC_SHA384_DIGEST_SIZE); +#endif +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA512) + len = 0; + AssertNotNull(HMAC(EVP_sha512(), key, (int)sizeof(key), NULL, 0, hash, &len)); + AssertIntEQ(len, (int)WC_SHA512_DIGEST_SIZE); +#endif printf(resultFmt, passed); - #endif + }