From f355f85e6f7bea4a4f68c7880b2b995a3c225882 Mon Sep 17 00:00:00 2001 From: Lee *!* Clagett Date: Thu, 12 Mar 2026 17:43:04 -0400 Subject: Harden HTTP client auth --- contrib/epee/src/http_auth.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'contrib/epee/src/http_auth.cpp') 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 #include #include +#include #include #include @@ -296,13 +297,21 @@ namespace std::array nc{{}}; boost::copy(out, nc.data()); + + std::array 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}; + index = boost::fusion::size(digest_algorithms); else { for (auto elem = boost::make_split_iterator(request.qop, boost::token_finder(http_list_separator)); -- cgit v1.2.3