implement hmac ctx copy function

This commit is contained in:
Jacob Barthelmeh
2017-05-08 10:03:35 -06:00
parent b9001d3c4d
commit 982e9ab8ad
2 changed files with 142 additions and 22 deletions

146
src/ssl.c
View File

@@ -24171,16 +24171,16 @@ int wolfSSL_RSA_GenAdd(WOLFSSL_RSA* rsa)
}
#endif /* NO_RSA */
int wolfSSL_HMAC_CTX_init(WOLFSSL_HMAC_CTX* ctx)
int wolfSSL_HMAC_CTX_Init(WOLFSSL_HMAC_CTX* ctx)
{
WOLFSSL_MSG("wolfSSL_HMAC_CTX_init");
WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init");
if (ctx != NULL) {
/* wc_HmacSetKey sets up ctx->hmac */
XMEMSET(ctx, 0, sizeof(WOLFSSL_HMAC_CTX));
}
return SSL_SUCCESS;
return WOLFSSL_SUCCESS;
}
@@ -24195,6 +24195,101 @@ int wolfSSL_HMAC_Init_ex(WOLFSSL_HMAC_CTX* ctx, const void* key,
}
/* Deep copy of information from src to des structure
*
* des destination to copy information to
* src structure to get infromation from
*
* Returns SSL_SUCCESS on success and SSL_FAILURE on error
*/
int wolfSSL_HMAC_CTX_copy(WOLFSSL_HMAC_CTX* des, WOLFSSL_HMAC_CTX* src)
{
WOLFSSL_ENTER("wolfSSL_HMAC_CTX_copy");
if (des == NULL || src == NULL) {
return SSL_FAILURE;
}
if (wc_HmacInit(&des->hmac, src->hmac.heap, 0) != 0) {
WOLFSSL_MSG("Error initializing HMAC");
return SSL_FAILURE;
}
des->type = src->type;
/* requires that hash structures have no dynamic parts to them */
switch (src->hmac.macType) {
#ifndef NO_MD5
case MD5:
XMEMCPY(&des->hmac.hash.md5, &src->hmac.hash.md5, sizeof(Md5));
break;
#endif /* !NO_MD5 */
#ifndef NO_SHA
case SHA:
XMEMCPY(&des->hmac.hash.sha, &src->hmac.hash.sha, sizeof(Sha));
break;
#endif /* !NO_SHA */
#ifdef WOLFSSL_SHA224
case SHA224:
XMEMCPY(&des->hmac.hash.sha224, &src->hmac.hash.sha224,
sizeof(Sha224));
break;
#endif /* WOLFSSL_SHA224 */
#ifndef NO_SHA256
case SHA256:
XMEMCPY(&des->hmac.hash.sha256, &src->hmac.hash.sha256,
sizeof(Sha256));
break;
#endif /* !NO_SHA256 */
#ifdef WOLFSSL_SHA512
#ifdef WOLFSSL_SHA384
case SHA384:
XMEMCPY(&des->hmac.hash.sha384, &src->hmac.hash.sha384,
sizeof(Sha384));
break;
#endif /* WOLFSSL_SHA384 */
case SHA512:
XMEMCPY(&des->hmac.hash.sha512, &src->hmac.hash.sha512,
sizeof(Sha512));
break;
#endif /* WOLFSSL_SHA512 */
default:
WOLFSSL_MSG("Unknown or unsupported hash type");
return SSL_FAILURE;
}
XMEMCPY((byte*)des->hmac.ipad, (byte*)src->hmac.ipad, HMAC_BLOCK_SIZE);
XMEMCPY((byte*)des->hmac.opad, (byte*)src->hmac.opad, HMAC_BLOCK_SIZE);
XMEMCPY((byte*)des->hmac.innerHash, (byte*)src->hmac.innerHash,
MAX_DIGEST_SIZE);
des->hmac.heap = src->hmac.heap;
des->hmac.macType = src->hmac.macType;
des->hmac.innerHashKeyed = src->hmac.innerHashKeyed;
#ifdef WOLFSSL_ASYNC_CRYPT
XMEMCPY(des->hmac.asyncDev, src->hmac.asyncDev, sizeof(WC_ASYNC_DEV));
XMEMCPY(des->hmac.keyRaw, src->hmac.keyRaw, HMAC_BLOCK_SIZE);
des->hmac.keyLen = src->hmac.keyLen;
#ifdef HAVE_CAVIUM
des->hmac.data = (byte*)XMALLOC(src->hmac.dataLen, des->heap,
DYNAMIC_TYPE_HMAC);
if (des->hmac.data == NULL) {
return BUFFER_E;
}
XMEMCPY(des->hmac.data, src->hmac.data, src->hmac.dataLen);
des->hmac.dataLen = src->hmac.dataLen;
#endif /* HAVE_CAVIUM */
#endif /* WOLFSSL_ASYNC_CRYPT */
return SSL_SUCCESS;
}
int wolfSSL_HMAC_Init(WOLFSSL_HMAC_CTX* ctx, const void* key, int keylen,
const EVP_MD* type)
{
@@ -24214,10 +24309,22 @@ int wolfSSL_HMAC_Init(WOLFSSL_HMAC_CTX* ctx, const void* key, int keylen,
WOLFSSL_MSG("md5 hmac");
ctx->type = WC_MD5;
}
else if (XSTRNCMP(type, "SHA224", 6) == 0) {
WOLFSSL_MSG("sha224 hmac");
ctx->type = SHA224;
}
else if (XSTRNCMP(type, "SHA256", 6) == 0) {
WOLFSSL_MSG("sha256 hmac");
ctx->type = WC_SHA256;
}
else if (XSTRNCMP(type, "SHA384", 6) == 0) {
WOLFSSL_MSG("sha384 hmac");
ctx->type = SHA384;
}
else if (XSTRNCMP(type, "SHA512", 6) == 0) {
WOLFSSL_MSG("sha512 hmac");
ctx->type = SHA512;
}
/* has to be last since would pick or 256, 384, or 512 too */
else if (XSTRNCMP(type, "SHA", 3) == 0) {
@@ -24297,23 +24404,32 @@ int wolfSSL_HMAC_Final(WOLFSSL_HMAC_CTX* ctx, unsigned char* hash,
if (len) {
WOLFSSL_MSG("setting output len");
switch (ctx->type) {
case WC_MD5:
*len = WC_MD5_DIGEST_SIZE;
break;
case WC_MD5:
*len = WC_MD5_DIGEST_SIZE;
break;
case WC_SHA:
*len = WC_SHA_DIGEST_SIZE;
break;
case WC_SHA224:
*len = WC_SHA224_DIGEST_SIZE;
break;
case WC_SHA256:
*len = WC_SHA256_DIGEST_SIZE;
break;
case WC_SHA256:
*len = WC_SHA256_DIGEST_SIZE;
break;
default:
WOLFSSL_MSG("bad hmac type");
return WOLFSSL_FAILURE;
case WC_SHA384:
*len = WC_SHA384_DIGEST_SIZE;
break;
case WC_SHA512:
*len = WC_SHA512_DIGEST_SIZE;
break;
default:
WOLFSSL_MSG("bad hmac type");
return WOLFSSL_FAILURE;
}
}
return WOLFSSL_SUCCESS;
}

View File

@@ -55,7 +55,10 @@ typedef struct WOLFSSL_HMAC_CTX {
int type;
} WOLFSSL_HMAC_CTX;
WOLFSSL_API int wolfSSL_HMAC_CTX_init(WOLFSSL_HMAC_CTX* ctx);
WOLFSSL_API int wolfSSL_HMAC_CTX_Init(WOLFSSL_HMAC_CTX* ctx);
WOLFSSL_API int wolfSSL_HMAC_CTX_copy(WOLFSSL_HMAC_CTX* des,
WOLFSSL_HMAC_CTX* src);
WOLFSSL_API int wolfSSL_HMAC_Init(WOLFSSL_HMAC_CTX* ctx, const void* key,
int keylen, const EVP_MD* type);
WOLFSSL_API int wolfSSL_HMAC_Init_ex(WOLFSSL_HMAC_CTX* ctx, const void* key,
@@ -70,12 +73,13 @@ typedef struct WOLFSSL_HMAC_CTX HMAC_CTX;
#define HMAC(a,b,c,d,e,f,g) wolfSSL_HMAC((a),(b),(c),(d),(e),(f),(g))
#define HMAC_CTX_init wolfSSL_HMAC_CTX_init
#define HMAC_Init wolfSSL_HMAC_Init
#define HMAC_Init_ex wolfSSL_HMAC_Init_ex
#define HMAC_Update wolfSSL_HMAC_Update
#define HMAC_Final wolfSSL_HMAC_Final
#define HMAC_cleanup wolfSSL_HMAC_cleanup
#define HMAC_CTX_init wolfSSL_HMAC_CTX_Init
#define HMAC_CTX_copy wolfSSL_HMAC_CTX_copy
#define HMAC_Init_ex wolfSSL_HMAC_Init_ex
#define HMAC_Init wolfSSL_HMAC_Init
#define HMAC_Update wolfSSL_HMAC_Update
#define HMAC_Final wolfSSL_HMAC_Final
#define HMAC_cleanup wolfSSL_HMAC_cleanup
#ifdef __cplusplus