--- gvpe/src/hkdf.C 2013/07/16 16:44:36 1.1 +++ gvpe/src/hkdf.C 2016/06/30 16:31:00 1.6 @@ -1,6 +1,6 @@ /* hkdf.C -- RFC 5869 HKDF implementation - Copyright (C) 2013 Marc Lehmann + Copyright (C) 2013,2016 Marc Lehmann This file is part of GVPE. @@ -33,41 +33,31 @@ #include +#include #include #include +#include "crypto.h" #include "util.h" #include "hkdf.h" -hkdf::hkdf (const void *salt, int len, const EVP_MD *hash) +hkdf::hkdf (const void *salt, int len, const EVP_MD *xtr_hash) +: salt (salt), salt_len (len) { - HMAC_CTX_init (&ctx); - - if (!salt) - { - memset (prk, 0, sizeof prk); - salt = prk; - len = EVP_MD_size (hash); - } - - require (HMAC_Init_ex (&ctx, salt, len, hash, 0)); -} - -hkdf::~hkdf () -{ - HMAC_CTX_cleanup (&ctx); + ctx.init (salt, salt_len, xtr_hash); } void hkdf::extract (const void *ikm, int len) { - require (HMAC_Update (&ctx, (u8 *)ikm, len)); + ctx.add (ikm, len); } void -hkdf::extract_done () +hkdf::extract_done (const EVP_MD *prf_hash) { - require (HMAC_Final (&ctx, prk, 0)); + ctx.digest (prk); + ctx.init (salt, salt_len, prf_hash); } void @@ -75,24 +65,22 @@ { u8 tn[sizeof prk]; u8 iter = 0; - int md_size = HMAC_size (&ctx); + int md_size = ctx.size (); while (len) { - require (HMAC_Init_ex (&ctx, prk, md_size, 0, 0)); + ctx.init (prk, md_size); if (iter) - require (HMAC_Update (&ctx, tn, md_size)); - - require (HMAC_Update (&ctx, (u8 *)info, infolen)); + ctx.add (tn, md_size); + ctx.add (info, infolen); ++iter; require (iter); - require (HMAC_Update (&ctx, &iter, 1)); - - require (HMAC_Final (&ctx, tn, 0)); + ctx.add (&iter, 1); + ctx.digest (tn); int ol = len > md_size ? md_size : len; @@ -119,13 +107,11 @@ unhex (const char *hs) { l = 0; - p = 0; + p = s; if (!hs) return; - p = s; - while (*hs) { int d1 = *hs >= '0' && *hs <= '9' ? *hs - '0' : *hs - 'a' + 10; ++hs;