7#include <botan/argon2fmt.h>
8#include <botan/pwdhash.h>
10#include <botan/base64.h>
11#include <botan/internal/parsing.h>
12#include <botan/internal/fmt.h>
18std::string strip_padding(std::string s)
20 while(!s.empty() && s[s.size()-1] ==
'=')
21 s.resize(s.size() - 1);
25std::string argon2_family(uint8_t
y)
34 throw Not_Implemented(
"Unknown Argon2 family type");
41 size_t p,
size_t M,
size_t t,
42 uint8_t
y,
size_t salt_len,
size_t output_len)
44 std::vector<uint8_t> salt(salt_len);
47 std::vector<uint8_t> output(output_len);
50 auto pwdhash = pwdhash_fam->from_params(M, t, p);
52 pwdhash->derive_key(output.data(), output.size(),
53 password, password_len,
54 salt.data(), salt.size());
59 const std::string argon2_mode = [&]() -> std::string
69 return fmt(
"$argon2{}$v=19$m={},t={},p={}${}${}",
71 enc_salt, enc_output);
75 std::string_view input_hash)
77 const std::vector<std::string> parts =
split_on(input_hash,
'$');
84 if(parts[0] ==
"argon2d")
86 else if(parts[0] ==
"argon2i")
88 else if(parts[0] ==
"argon2id")
93 if(parts[1] !=
"v=19")
96 const std::vector<std::string> params =
split_on(parts[2],
',');
98 if(params.size() != 3)
101 size_t M = 0, t = 0, p = 0;
103 for(
const auto& param_str : params)
105 const std::vector<std::string> param =
split_on(param_str,
'=');
107 if(param.size() != 2)
110 std::string_view key = param[0];
131 std::vector<uint8_t> generated(hash.size());
133 auto pwdhash = pwdhash_fam->from_params(M, t, p);
135 pwdhash->derive_key(generated.data(), generated.size(),
136 password, password_len,
137 salt.data(), salt.size());
static std::unique_ptr< PasswordHashFamily > create_or_throw(std::string_view algo_spec, std::string_view provider="")
void randomize(std::span< uint8_t > output)
uint32_t to_u32bit(std::string_view str_view)
std::string fmt(std::string_view format, const T &... args)
std::vector< std::string > split_on(std::string_view str, char delim)
size_t base64_encode(char out[], const uint8_t in[], size_t input_length, size_t &input_consumed, bool final_inputs)
size_t base64_decode(uint8_t out[], const char in[], size_t input_length, size_t &input_consumed, bool final_inputs, bool ignore_ws)
bool constant_time_compare(const uint8_t x[], const uint8_t y[], size_t len)
bool argon2_check_pwhash(const char *password, size_t password_len, std::string_view input_hash)
std::string argon2_generate_pwhash(const char *password, size_t password_len, RandomNumberGenerator &rng, size_t p, size_t M, size_t t, uint8_t y, size_t salt_len, size_t output_len)
size_t base64_decode_max_output(size_t input_length)