8#include <botan/internal/sp800_108.h>
9#include <botan/internal/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);
61 const uint8_t secret[],
size_t secret_len,
62 const uint8_t salt[],
size_t salt_len,
63 const uint8_t label[],
size_t label_len)
const
65 const uint32_t length =
static_cast<uint32_t
>(key_len * 8);
66 const std::size_t prf_len = m_prf->output_length();
67 const std::size_t iv_len = (
salt_len >= prf_len ? prf_len : 0);
68 const uint8_t delim = 0;
70 const uint64_t blocks_required = (key_len + prf_len - 1) / prf_len;
72 if(blocks_required > 0xFFFFFFFF)
77 uint8_t be_len[4] = { 0 };
82 m_prf->set_key(secret, secret_len);
84 while(p < key + key_len)
86 const std::size_t to_copy = std::min< std::size_t >(key + key_len - p, prf_len);
87 uint8_t be_cnt[4] = { 0 };
92 m_prf->update(be_cnt,4);
93 m_prf->update(label,label_len);
96 m_prf->update(be_len,4);
109 const uint8_t secret[],
size_t secret_len,
110 const uint8_t salt[],
size_t salt_len,
111 const uint8_t label[],
size_t label_len)
const
113 const uint32_t length =
static_cast<uint32_t
>(key_len * 8);
114 const std::size_t prf_len = m_prf->output_length();
115 const uint8_t delim = 0;
117 const uint64_t blocks_required = (key_len + prf_len - 1) / prf_len;
119 if(blocks_required > 0xFFFFFFFF)
123 uint32_t counter = 1;
124 uint8_t be_len[4] = { 0 };
128 m_prf->set_key(secret,secret_len);
131 std::copy(label,label + label_len,std::back_inserter(ai));
132 ai.emplace_back(delim);
133 std::copy(salt,salt +
salt_len,std::back_inserter(ai));
134 std::copy(be_len,be_len + 4,std::back_inserter(ai));
136 while(p < key + key_len)
143 const std::size_t to_copy = std::min< std::size_t >(key + key_len - p, prf_len);
144 uint8_t be_cnt[4] = { 0 };
149 m_prf->update(be_cnt,4);
150 m_prf->update(label, label_len);
151 m_prf->update(delim);
153 m_prf->update(be_len,4);
#define BOTAN_ASSERT(expr, assertion_made)
void 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 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 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
constexpr void copy_mem(T *out, const T *in, size_t n)
constexpr void store_be(uint16_t in, uint8_t out[2])
std::vector< T, secure_allocator< T > > secure_vector