aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorLee *!* Clagett <code@leeclagett.com>2026-03-12 17:43:04 -0400
committerLee *!* Clagett <code@leeclagett.com>2026-03-13 13:37:28 -0400
commitf355f85e6f7bea4a4f68c7880b2b995a3c225882 (patch)
tree655ed616556684c97715e49c75a3f3cad5503297 /contrib
parent23b420a992417abb6131b3d152d7e32adf224351 (diff)
downloadmonzero-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.cpp13
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));