8 #include <botan/pbkdf2.h>
9 #include <botan/loadstor.h>
10 #include <botan/internal/rounding.h>
18 const std::string& passphrase,
19 const uint8_t salt[],
size_t salt_len,
21 std::chrono::milliseconds msec)
30 prf.
set_key(reinterpret_cast<const uint8_t*>(passphrase.data()), passphrase.size());
35 " cannot accept passphrases of length " +
42 const size_t blocks_needed =
round_up(out_len, prf_sz) / prf_sz;
44 std::chrono::microseconds usec_per_block =
45 std::chrono::duration_cast<std::chrono::microseconds>(msec) / blocks_needed;
50 const size_t prf_output = std::min<size_t>(prf_sz, out_len);
52 prf.
update(salt, salt_len);
56 xor_buf(out, U.data(), prf_output);
65 const auto start = std::chrono::high_resolution_clock::now();
73 xor_buf(out, U.data(), prf_output);
81 if(iterations % 10000 == 0)
83 auto time_taken = std::chrono::high_resolution_clock::now() - start;
84 auto usec_taken = std::chrono::duration_cast<std::chrono::microseconds>(time_taken);
85 if(usec_taken > usec_per_block)
92 for(
size_t i = 1; i != iterations; ++i)
96 xor_buf(out, U.data(), prf_output);
100 out_len -= prf_output;
109 const std::string& passphrase,
110 const uint8_t salt[],
size_t salt_len,
112 std::chrono::milliseconds msec)
const
114 return pbkdf2(*m_mac.get(), key, key_len, passphrase, salt, salt_len, iterations, msec);
void xor_buf(T out[], const T in[], size_t length)
void clear_mem(T *ptr, size_t n)
std::string to_string(const BER_Object &obj)
void final(uint8_t out[])
std::vector< T, secure_allocator< T >> secure_vector
void set_key(const SymmetricKey &key)
virtual std::string name() const =0
size_t pbkdf2(MessageAuthenticationCode &prf, uint8_t out[], size_t out_len, const std::string &passphrase, const uint8_t salt[], size_t salt_len, size_t iterations, std::chrono::milliseconds msec)
size_t pbkdf(uint8_t output_buf[], size_t output_len, const std::string &passphrase, const uint8_t salt[], size_t salt_len, size_t iterations, std::chrono::milliseconds msec) const override
void update(const uint8_t in[], size_t length)
void update_be(const T in)
size_t round_up(size_t n, size_t align_to)
virtual size_t output_length() const =0