diff options
| author | Lee *!* Clagett <code@leeclagett.com> | 2026-03-12 17:43:04 -0400 |
|---|---|---|
| committer | Lee *!* Clagett <code@leeclagett.com> | 2026-03-13 13:37:28 -0400 |
| commit | f355f85e6f7bea4a4f68c7880b2b995a3c225882 (patch) | |
| tree | 655ed616556684c97715e49c75a3f3cad5503297 /contrib | |
| parent | 23b420a992417abb6131b3d152d7e32adf224351 (diff) | |
| download | monzero-core-f355f85e6f7bea4a4f68c7880b2b995a3c225882.tar.gz monzero-core-f355f85e6f7bea4a4f68c7880b2b995a3c225882.tar.xz monzero-core-f355f85e6f7bea4a4f68c7880b2b995a3c225882.zip | |
Harden HTTP client auth
Diffstat (limited to 'contrib')
| -rw-r--r-- | contrib/epee/src/http_auth.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/contrib/epee/src/http_auth.cpp b/contrib/epee/src/http_auth.cpp index 614004ffa..dfde408cb 100644 --- a/contrib/epee/src/http_auth.cpp +++ b/contrib/epee/src/http_auth.cpp @@ -64,6 +64,7 @@ #include <iterator> #include <limits> #include <openssl/evp.h> +#include <openssl/rand.h> #include <tuple> #include <type_traits> @@ -296,13 +297,21 @@ namespace std::array<char, 8> nc{{}}; boost::copy(out, nc.data()); + + std::array<uint8_t, 16> rbuf{{}}; + if (RAND_bytes(rbuf.data(), rbuf.size()) != 1) + return {}; + + const std::string cnonce = epee::string_encoding::base64_encode(rbuf.data(), rbuf.size()); const auto response = digest( - generate_a1(digest, user), u8":", user.server.nonce, u8":", nc, u8"::auth:", digest(method, u8":", uri) + generate_a1(digest, user), u8":", user.server.nonce, u8":", nc, u8":", cnonce, u8":auth:", digest(method, u8":", uri) ); + out.clear(); init_client_value(out, Digest::name, user, uri, response); add_field(out, u8"qop", ceref(u8"auth")); add_field(out, u8"nc", nc); + add_field(out, u8"cnonce", quoted_(cnonce)); return out; } @@ -592,7 +601,7 @@ namespace boost::equals((*digest).name, request.algorithm, ascii_iequal) ); if (request.qop.empty()) - value_generator = old_algorithm<digest_type>{*digest}; + index = boost::fusion::size(digest_algorithms); else { for (auto elem = boost::make_split_iterator(request.qop, boost::token_finder(http_list_separator)); |
