8#include <botan/sp800_108.h>
9#include <botan/loadstor.h>
10#include <botan/exceptn.h>
16 const uint8_t secret[],
size_t secret_len,
17 const uint8_t salt[],
size_t salt_len,
18 const uint8_t label[],
size_t label_len)
const
20 const std::size_t prf_len = m_prf->output_length();
22 const uint64_t blocks_required = (key_len + prf_len - 1) / prf_len;
24 if(blocks_required > 0xFFFFFFFF)
27 const uint8_t delim = 0;
28 const uint32_t length =
static_cast<uint32_t
>(key_len * 8);
32 uint8_t be_len[4] = { 0 };
36 m_prf->set_key(secret, secret_len);
38 while(p < key + key_len)
40 const std::size_t to_copy = std::min< std::size_t >(key + key_len - p, prf_len);
41 uint8_t be_cnt[4] = { 0 };
45 m_prf->update(be_cnt,4);
46 m_prf->update(label,label_len);
49 m_prf->update(be_len,4);
63 const uint8_t secret[],
size_t secret_len,
64 const uint8_t salt[],
size_t salt_len,
65 const uint8_t label[],
size_t label_len)
const
67 const uint32_t length =
static_cast<uint32_t
>(key_len * 8);
68 const std::size_t prf_len = m_prf->output_length();
69 const std::size_t iv_len = (
salt_len >= prf_len ? prf_len : 0);
70 const uint8_t delim = 0;
72 const uint64_t blocks_required = (key_len + prf_len - 1) / prf_len;
74 if(blocks_required > 0xFFFFFFFF)
79 uint8_t be_len[4] = { 0 };
84 m_prf->set_key(secret, secret_len);
86 while(p < key + key_len)
88 const std::size_t to_copy = std::min< std::size_t >(key + key_len - p, prf_len);
89 uint8_t be_cnt[4] = { 0 };
94 m_prf->update(be_cnt,4);
95 m_prf->update(label,label_len);
98 m_prf->update(be_len,4);
113 const uint8_t secret[],
size_t secret_len,
114 const uint8_t salt[],
size_t salt_len,
115 const uint8_t label[],
size_t label_len)
const
117 const uint32_t length =
static_cast<uint32_t
>(key_len * 8);
118 const std::size_t prf_len = m_prf->output_length();
119 const uint8_t delim = 0;
121 const uint64_t blocks_required = (key_len + prf_len - 1) / prf_len;
123 if(blocks_required > 0xFFFFFFFF)
127 uint32_t counter = 1;
128 uint8_t be_len[4] = { 0 };
132 m_prf->set_key(secret,secret_len);
135 std::copy(label,label + label_len,std::back_inserter(ai));
136 ai.emplace_back(delim);
137 std::copy(salt,salt +
salt_len,std::back_inserter(ai));
138 std::copy(be_len,be_len + 4,std::back_inserter(ai));
140 while(p < key + key_len)
147 const std::size_t to_copy = std::min< std::size_t >(key + key_len - p, prf_len);
148 uint8_t be_cnt[4] = { 0 };
153 m_prf->update(be_cnt,4);
154 m_prf->update(label, label_len);
155 m_prf->update(delim);
157 m_prf->update(be_len,4);
#define BOTAN_ASSERT(expr, assertion_made)
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
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
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 store_be(uint16_t in, uint8_t out[2])
void copy_mem(T *out, const T *in, size_t n)
std::vector< T, secure_allocator< T > > secure_vector