diff --git a/src/ssl.c b/src/ssl.c index 5f20d9812..f1b5f1067 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -24729,6 +24729,8 @@ int wolfSSL_HMAC_CTX_copy(WOLFSSL_HMAC_CTX* des, WOLFSSL_HMAC_CTX* src) des->hmac.heap = src->hmac.heap; des->hmac.macType = src->hmac.macType; des->hmac.innerHashKeyed = src->hmac.innerHashKeyed; + des->save_len = src->save_len; + XMEMCPY(des->save_key, src->save_key, src->save_len); #ifdef WOLFSSL_ASYNC_CRYPT XMEMCPY(des->hmac.asyncDev, src->hmac.asyncDev, sizeof(WC_ASYNC_DEV)); diff --git a/tests/api.c b/tests/api.c index b53d719a3..c40a76cf7 100644 --- a/tests/api.c +++ b/tests/api.c @@ -16058,6 +16058,48 @@ static int test_HMAC_CTX_helper(const EVP_MD* type, unsigned char* digest) AssertIntEQ(digestSz, digestSz2); AssertIntEQ(XMEMCMP(digest, digest2, digestSz), 0); + /* test HMAC_Init with NULL key */ + printf("test HMAC_Init with NULL key (1)\n"); + HMAC_CTX_init(&ctx1); + AssertIntEQ(HMAC_Init(&ctx1, (const void*)key, keySz, type), SSL_SUCCESS); + AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + AssertIntEQ(HMAC_CTX_copy(&ctx2, &ctx1), SSL_SUCCESS); + + AssertIntEQ(HMAC_Init(&ctx1, NULL, 0, NULL), SSL_SUCCESS); + + AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + AssertIntEQ(HMAC_Final(&ctx1, digest, &digestSz), SSL_SUCCESS); + + AssertIntEQ(HMAC_Init(&ctx2, NULL, 0, NULL), SSL_SUCCESS); + + AssertIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); + AssertIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); + AssertIntEQ(HMAC_Final(&ctx2, digest, &digestSz), SSL_SUCCESS); + + HMAC_CTX_cleanup(&ctx2); + AssertIntEQ(digestSz, digestSz2); + AssertIntEQ(XMEMCMP(digest, digest2, digestSz), 0); + + printf("test HMAC_Init with NULL key (2)\n"); + HMAC_CTX_init(&ctx1); + AssertIntEQ(HMAC_Init(&ctx1, (const void*)key, keySz, type), SSL_SUCCESS); + AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + AssertIntEQ(HMAC_Init(&ctx1, NULL, 0, NULL), SSL_SUCCESS); + AssertIntEQ(HMAC_CTX_copy(&ctx2, &ctx1), SSL_SUCCESS); + + AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + AssertIntEQ(HMAC_Final(&ctx1, digest, &digestSz), SSL_SUCCESS); + + AssertIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); + AssertIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); + AssertIntEQ(HMAC_Final(&ctx2, digest, &digestSz), SSL_SUCCESS); + + HMAC_CTX_cleanup(&ctx2); + AssertIntEQ(digestSz, digestSz2); + AssertIntEQ(XMEMCMP(digest, digest2, digestSz), 0); + return digestSz; } #endif /* defined(OPENSSL_EXTRA) && !defined(NO_HMAC) */