25 #ifndef CRYPTO3_OPENPGP_S2K_HPP
26 #define CRYPTO3_OPENPGP_S2K_HPP
54 template<
typename Hash>
61 constexpr
static const std::size_t
digest_bits = policy_type::digest_bits;
64 constexpr
static const std::size_t
salt_bits = policy_type::salt_bits;
68 size_t iterations, std::chrono::milliseconds msec)
const override {
69 if (iterations == 0 && msec.count() > 0) {
70 throw Not_Implemented(
"OpenPGP_S2K does not implemented timed KDF");
73 if (iterations > 1 && salt_len == 0) {
74 throw std::invalid_argument(
"OpenPGP_S2K requires a salt in iterated mode");
77 secure_vector<uint8_t> input_buf(salt_len + passphrase.size());
79 copy_mem(&input_buf[0], salt, salt_len);
81 if (passphrase.empty() ==
false) {
85 secure_vector<uint8_t> hash_buf(m_hash->output_length());
90 while (generated != output_len) {
91 const size_t output_this_pass =
std::min(hash_buf.size(), output_len - generated);
94 std::vector<uint8_t> zero_padding(pass);
95 m_hash->update(zero_padding);
98 if (input_buf.empty() ==
false) {
99 size_t left =
std::max(iterations, input_buf.size());
101 const size_t input_to_take =
std::min(left, input_buf.size());
102 m_hash->update(input_buf.data(), input_to_take);
103 left -= input_to_take;
107 m_hash->final(hash_buf.data());
108 copy_mem(output_buf + generated, hash_buf.data(), output_this_pass);
109 generated += output_this_pass;
117 template<
typename Hash>
OpenPGP's S2K.
Definition: pgp_s2k.hpp:55
std::size_t derive(digest_type &digest, const std::string &passphrase, const salt_type &salt, size_t iterations, std::chrono::milliseconds msec) const override
Definition: pgp_s2k.hpp:67
policy_type::hash_type hash_type
Definition: pgp_s2k.hpp:59
constexpr static const std::size_t salt_bits
Definition: pgp_s2k.hpp:64
constexpr static const std::size_t digest_bits
Definition: pgp_s2k.hpp:61
policy_type::digest_type digest_type
Definition: pgp_s2k.hpp:62
policy_type::salt_type salt_type
Definition: pgp_s2k.hpp:65
constexpr T min(const vector< T, N > &v)
computes the minimum valued element
Definition: algebra/include/nil/crypto3/algebra/vector/math.hpp:135
constexpr T max(const vector< T, N > &v)
computes the maximum valued element
Definition: algebra/include/nil/crypto3/algebra/vector/math.hpp:146
const uint8_t * cast_char_ptr_to_uint8(const char *s)
Definition: memory_operations.hpp:205
void copy_mem(T *out, const T *in, size_t n)
Definition: memory_operations.hpp:186
Definition: block/include/nil/crypto3/detail/digest.hpp:72
Definition: pgp_s2k_functions.hpp:35
pgp_s2k_policy< Hash >::hash_type hash_type
Definition: pgp_s2k_functions.hpp:36