Botan  1.11.15
src/lib/kdf/hkdf/hkdf.cpp
Go to the documentation of this file.
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 }