9#include <botan/sp800_56a.h>
10#include <botan/scan_name.h>
11#include <botan/exceptn.h>
17template<
class AuxiliaryFunction_t>
19 AuxiliaryFunction_t& auxfunc,
20 uint8_t key[],
size_t key_len,
21 const uint8_t secret[],
size_t secret_len,
22 const uint8_t label[],
size_t label_len)
24 const uint64_t kRepsUpperBound = (1ULL << 32);
26 const size_t digest_len = auxfunc.output_length();
28 const size_t reps = key_len / digest_len + ((key_len % digest_len) ? 1 : 0);
30 if (reps >= kRepsUpperBound)
33 throw Invalid_Argument(
"SP800-56A KDF requested output too large");
37 secure_vector<uint8_t> result;
38 for(
size_t i = 0; i < reps; i++)
40 auxfunc.update_be(counter++);
41 auxfunc.update(secret, secret_len);
42 auxfunc.update(label, label_len);
43 auxfunc.final(result);
45 const size_t offset = digest_len * i;
46 const size_t len = std::min(result.size(), key_len - offset);
47 copy_mem(&key[offset], result.data(), len);
56 const uint8_t secret[],
size_t secret_len,
57 const uint8_t salt[],
size_t salt_len,
58 const uint8_t label[],
size_t label_len)
const
67 return SP800_56A_kdf(*m_hash, key, key_len, secret, secret_len, label, label_len);
81 const uint8_t secret[],
size_t secret_len,
82 const uint8_t salt[],
size_t salt_len,
83 const uint8_t label[],
size_t label_len)
const
93 return SP800_56A_kdf(*m_mac, key, key_len, secret, secret_len, label, label_len);
#define BOTAN_UNUSED(...)
const std::string & algo_name() const
size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override
SP800_56A_HMAC(MessageAuthenticationCode *mac)
size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override
void copy_mem(T *out, const T *in, size_t n)