--- gvpe/src/hkdf.C 2014/09/12 10:20:08 1.4 +++ gvpe/src/hkdf.C 2016/06/30 11:43:38 1.5 @@ -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,21 @@ #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) -{ - 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); -} - 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 (0, 0, prf_hash); } void @@ -84,23 +59,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;