… | |
… | |
37 | #include <openssl/hmac.h> |
37 | #include <openssl/hmac.h> |
38 | |
38 | |
39 | #include "util.h" |
39 | #include "util.h" |
40 | #include "hkdf.h" |
40 | #include "hkdf.h" |
41 | |
41 | |
42 | hkdf::hkdf (const void *salt, int len, const EVP_MD *hash) |
42 | hkdf::hkdf (const void *salt, int len, const EVP_MD *xtr_hash) |
43 | { |
43 | { |
44 | HMAC_CTX_init (&ctx); |
44 | HMAC_CTX_init (&ctx); |
45 | |
45 | |
46 | if (!salt) |
46 | if (!salt) |
47 | { |
47 | { |
48 | memset (prk, 0, sizeof prk); |
48 | memset (prk, 0, sizeof prk); |
49 | salt = prk; |
49 | salt = prk; |
50 | len = EVP_MD_size (hash); |
50 | len = EVP_MD_size (xtr_hash); |
51 | } |
51 | } |
52 | |
52 | |
53 | require (HMAC_Init_ex (&ctx, salt, len, hash, 0)); |
53 | require (HMAC_Init_ex (&ctx, salt, len, xtr_hash, 0)); |
54 | } |
54 | } |
55 | |
55 | |
56 | hkdf::~hkdf () |
56 | hkdf::~hkdf () |
57 | { |
57 | { |
58 | HMAC_CTX_cleanup (&ctx); |
58 | HMAC_CTX_cleanup (&ctx); |
… | |
… | |
63 | { |
63 | { |
64 | require (HMAC_Update (&ctx, (u8 *)ikm, len)); |
64 | require (HMAC_Update (&ctx, (u8 *)ikm, len)); |
65 | } |
65 | } |
66 | |
66 | |
67 | void |
67 | void |
68 | hkdf::extract_done () |
68 | hkdf::extract_done (const EVP_MD *prf_hash) |
69 | { |
69 | { |
70 | require (HMAC_Final (&ctx, prk, 0)); |
70 | require (HMAC_Final (&ctx, prk, 0)); |
|
|
71 | require (HMAC_Init_ex (&ctx, 0, 0, prf_hash, 0)); |
71 | } |
72 | } |
72 | |
73 | |
73 | void |
74 | void |
74 | hkdf::expand (void *okm, int len, const void *info, int infolen) |
75 | hkdf::expand (void *okm, int len, const void *info, int infolen) |
75 | { |
76 | { |