--- gvpe/src/hkdf.C 2014/09/12 10:20:08 1.4 +++ 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. @@ -37,46 +37,27 @@ #include #include +#include "crypto.h" #include "util.h" #include "hkdf.h" -// openssl 0.9.8 compatibility -#if OPENSSL_VERSION_NUMBER < 0x10100000 - #define require101(exp) exp -#else - #define require101(exp) require (exp) -#endif - 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 (xtr_hash); - } - - require101 (HMAC_Init_ex (&ctx, salt, len, xtr_hash, 0)); -} - -hkdf::~hkdf () -{ - HMAC_CTX_cleanup (&ctx); + ctx.init (salt, salt_len, xtr_hash); } void hkdf::extract (const void *ikm, int len) { - require101 (HMAC_Update (&ctx, (u8 *)ikm, len)); + ctx.add (ikm, len); } void hkdf::extract_done (const EVP_MD *prf_hash) { - require101 (HMAC_Final (&ctx, prk, 0)); - require101 (HMAC_Init_ex (&ctx, 0, 0, prf_hash, 0)); + ctx.digest (prk); + ctx.init (salt, salt_len, prf_hash); } void @@ -84,23 +65,22 @@ { u8 tn[sizeof prk]; u8 iter = 0; - int md_size = HMAC_size (&ctx); + int md_size = ctx.size (); while (len) { - require101 (HMAC_Init_ex (&ctx, prk, md_size, 0, 0)); + ctx.init (prk, md_size); if (iter) - require101 (HMAC_Update (&ctx, tn, md_size)); + ctx.add (tn, md_size); - require101 (HMAC_Update (&ctx, (u8 *)info, infolen)); + ctx.add (info, infolen); ++iter; require (iter); - require101 (HMAC_Update (&ctx, &iter, 1)); - - require101 (HMAC_Final (&ctx, tn, 0)); + ctx.add (&iter, 1); + ctx.digest (tn); int ol = len > md_size ? md_size : len; @@ -127,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;