use generalise mac API for SSL key generation
This commit is contained in:
parent
46fc96d4ba
commit
e9be051f3a
2 changed files with 36 additions and 36 deletions
10
ssl/dtls1.h
10
ssl/dtls1.h
|
@ -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>
|
||||||
|
|
62
ssl/t1_enc.c
62
ssl/t1_enc.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue