Botan
1.11.15
|
00001 /* 00002 * HKDF 00003 * (C) 2013,2015 Jack Lloyd 00004 * 00005 * Botan is released under the Simplified BSD License (see license.txt) 00006 */ 00007 00008 #include <botan/internal/kdf_utils.h> 00009 #include <botan/hkdf.h> 00010 00011 namespace Botan { 00012 00013 BOTAN_REGISTER_NAMED_T(KDF, "HKDF", HKDF, HKDF::make); 00014 00015 HKDF* HKDF::make(const Spec& spec) 00016 { 00017 if(auto mac = make_a<MessageAuthenticationCode>(spec.arg(0))) 00018 return new HKDF(mac); 00019 00020 if(auto mac = make_a<MessageAuthenticationCode>("HMAC(" + spec.arg(0) + ")")) 00021 return new HKDF(mac); 00022 00023 return nullptr; 00024 } 00025 00026 size_t HKDF::kdf(byte out[], size_t out_len, 00027 const byte secret[], size_t secret_len, 00028 const byte salt[], size_t salt_len) const 00029 { 00030 m_prf->set_key(secret, secret_len); 00031 00032 byte counter = 1; 00033 secure_vector<byte> h; 00034 size_t offset = 0; 00035 00036 while(offset != out_len && counter != 0) 00037 { 00038 m_prf->update(h); 00039 m_prf->update(salt, salt_len); 00040 m_prf->update(counter++); 00041 m_prf->final(h); 00042 00043 const size_t written = std::min(h.size(), out_len - offset); 00044 copy_mem(&out[offset], &h[0], written); 00045 offset += written; 00046 } 00047 00048 return offset; 00049 } 00050 00051 }