use generalise mac API for SSL key generation

This commit is contained in:
Dr. Stephen Henson 2010-11-24 13:16:59 +00:00
parent 46fc96d4ba
commit e9be051f3a
2 changed files with 36 additions and 36 deletions

View file

@ -57,14 +57,8 @@
* *
*/ */
#ifndef HEADER_DTLS1_H #ifndef HEADER_DTLS1_H
#define HEADER_DTLS1_H #define HEADER_DTLS1_H
/* Unless _XOPEN_SOURCE_EXTENDED is defined, struct timeval will not be
properly defined with DEC C, at least on VMS */
#if defined(__DECC) || defined(__DECCXX)
#define _XOPEN_SOURCE_EXTENDED
#endif
#include <openssl/buffer.h> #include <openssl/buffer.h>
#include <openssl/pqueue.h> #include <openssl/pqueue.h>

View file

@ -159,68 +159,73 @@ static int tls1_P_hash(const EVP_MD *md, const unsigned char *sec,
unsigned char *out, int olen) unsigned char *out, int olen)
{ {
int chunk; int chunk;
unsigned int j; size_t j;
HMAC_CTX ctx; EVP_MD_CTX ctx, ctx_tmp;
HMAC_CTX ctx_tmp; EVP_PKEY *mac_key;
unsigned char A1[EVP_MAX_MD_SIZE]; unsigned char A1[EVP_MAX_MD_SIZE];
unsigned int A1_len; size_t A1_len;
int ret = 0; int ret = 0;
chunk=EVP_MD_size(md); chunk=EVP_MD_size(md);
OPENSSL_assert(chunk >= 0); OPENSSL_assert(chunk >= 0);
HMAC_CTX_init(&ctx); EVP_MD_CTX_init(&ctx);
HMAC_CTX_init(&ctx_tmp); EVP_MD_CTX_init(&ctx_tmp);
if (!HMAC_Init_ex(&ctx,sec,sec_len,md, NULL)) mac_key = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, sec, sec_len);
if (!mac_key)
goto err; goto err;
if (!HMAC_Init_ex(&ctx_tmp,sec,sec_len,md, NULL)) if (!EVP_DigestSignInit(&ctx,NULL,md, NULL, mac_key))
goto err; goto err;
if (seed1 != NULL && !HMAC_Update(&ctx,seed1,seed1_len)) if (!EVP_DigestSignInit(&ctx_tmp,NULL,md, NULL, mac_key))
goto err; goto err;
if (seed2 != NULL && !HMAC_Update(&ctx,seed2,seed2_len)) if (seed1 && !EVP_DigestSignUpdate(&ctx,seed1,seed1_len))
goto err; goto err;
if (seed3 != NULL && !HMAC_Update(&ctx,seed3,seed3_len)) if (seed2 && !EVP_DigestSignUpdate(&ctx,seed2,seed2_len))
goto err; goto err;
if (seed4 != NULL && !HMAC_Update(&ctx,seed4,seed4_len)) if (seed3 && !EVP_DigestSignUpdate(&ctx,seed3,seed3_len))
goto err; goto err;
if (seed5 != NULL && !HMAC_Update(&ctx,seed5,seed5_len)) if (seed4 && !EVP_DigestSignUpdate(&ctx,seed4,seed4_len))
goto err; goto err;
if (!HMAC_Final(&ctx,A1,&A1_len)) if (seed5 && !EVP_DigestSignUpdate(&ctx,seed5,seed5_len))
goto err;
if (!EVP_DigestSignFinal(&ctx,A1,&A1_len))
goto err; goto err;
for (;;) for (;;)
{ {
if (!HMAC_Init_ex(&ctx,NULL,0,NULL,NULL)) /* re-init */ /* Reinit mac contexts */
if (!EVP_DigestSignInit(&ctx,NULL,md, NULL, mac_key))
goto err; goto err;
if (!HMAC_Init_ex(&ctx_tmp,NULL,0,NULL,NULL)) /* re-init */ if (!EVP_DigestSignInit(&ctx_tmp,NULL,md, NULL, mac_key))
goto err; goto err;
if (!HMAC_Update(&ctx,A1,A1_len)) if (!EVP_DigestSignUpdate(&ctx,A1,A1_len))
goto err; goto err;
if (!HMAC_Update(&ctx_tmp,A1,A1_len)) if (!EVP_DigestSignUpdate(&ctx_tmp,A1,A1_len))
goto err; goto err;
if (seed1 != NULL && !HMAC_Update(&ctx,seed1,seed1_len)) if (seed1 && !EVP_DigestSignUpdate(&ctx,seed1,seed1_len))
goto err; goto err;
if (seed2 != NULL && !HMAC_Update(&ctx,seed2,seed2_len)) if (seed2 && !EVP_DigestSignUpdate(&ctx,seed2,seed2_len))
goto err; goto err;
if (seed3 != NULL && !HMAC_Update(&ctx,seed3,seed3_len)) if (seed3 && !EVP_DigestSignUpdate(&ctx,seed3,seed3_len))
goto err; goto err;
if (seed4 != NULL && !HMAC_Update(&ctx,seed4,seed4_len)) if (seed4 && !EVP_DigestSignUpdate(&ctx,seed4,seed4_len))
goto err; goto err;
if (seed5 != NULL && !HMAC_Update(&ctx,seed5,seed5_len)) if (seed5 && !EVP_DigestSignUpdate(&ctx,seed5,seed5_len))
goto err; goto err;
if (olen > chunk) if (olen > chunk)
{ {
if (!HMAC_Final(&ctx,out,&j)) if (!EVP_DigestSignFinal(&ctx,out,&j))
goto err; goto err;
out+=j; out+=j;
olen-=j; olen-=j;
if (!HMAC_Final(&ctx_tmp,A1,&A1_len)) /* calc the next A1 value */ /* calc the next A1 value */
if (!EVP_DigestSignFinal(&ctx_tmp,A1,&A1_len))
goto err; goto err;
} }
else /* last one */ else /* last one */
{ {
if (!HMAC_Final(&ctx,A1,&A1_len)) if (!EVP_DigestSignFinal(&ctx,A1,&A1_len))
goto err; goto err;
memcpy(out,A1,olen); memcpy(out,A1,olen);
break; break;
@ -228,8 +233,9 @@ static int tls1_P_hash(const EVP_MD *md, const unsigned char *sec,
} }
ret = 1; ret = 1;
err: err:
HMAC_CTX_cleanup(&ctx); EVP_PKEY_free(mac_key);
HMAC_CTX_cleanup(&ctx_tmp); EVP_MD_CTX_cleanup(&ctx);
EVP_MD_CTX_cleanup(&ctx_tmp);
OPENSSL_cleanse(A1,sizeof(A1)); OPENSSL_cleanse(A1,sizeof(A1));
return ret; return ret;
} }