Black Pharao Release Fix 5 - OpenSSL 3.x and modern Boost compatibility
Port codebase to build with OpenSSL 3.x and Boost 1.90+: - Rewrite bignum.h to use BIGNUM* pointer instead of inheriting from opaque BIGNUM - Fix ECDSA_SIG, EVP_CIPHER_CTX, HMAC_CTX opaque type access across key.cpp, crypter.cpp, smessage.cpp - Modernize Boost.Asio API (io_context, resolver, executor) in trianglesrpc.cpp - Remove embedded Tor v2 client (incompatible with OpenSSL 3.x), keep Tor v3 SOCKS5 approach - Update header logo to Cryptographic Triangles branding (300x63) - Replace Bittrex exchange link with Pinball (313.cash) across all locales - Fix MSYS2/MinGW64 build: linker flags, Boost library names, miniupnpc static linking Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
+26
-26
@@ -32,6 +32,7 @@ using namespace std;
|
||||
using namespace boost;
|
||||
using namespace boost::asio;
|
||||
using namespace json_spirit;
|
||||
namespace fs = boost::filesystem;
|
||||
|
||||
void ThreadRPCServer2(void* parg);
|
||||
|
||||
@@ -566,15 +567,14 @@ bool ClientAllowed(const boost::asio::ip::address& address)
|
||||
{
|
||||
// Make sure that IPv4-compatible and IPv4-mapped IPv6 addresses are treated as IPv4 addresses
|
||||
if (address.is_v6()
|
||||
&& (address.to_v6().is_v4_compatible()
|
||||
|| address.to_v6().is_v4_mapped()))
|
||||
return ClientAllowed(address.to_v6().to_v4());
|
||||
&& address.to_v6().is_v4_mapped())
|
||||
return ClientAllowed(make_address_v4(boost::asio::ip::v4_mapped, address.to_v6()));
|
||||
|
||||
if (address == asio::ip::address_v4::loopback()
|
||||
|| address == asio::ip::address_v6::loopback()
|
||||
|| (address.is_v4()
|
||||
// Check whether IPv4 addresses match 127.0.0.0/8 (loopback subnet)
|
||||
&& (address.to_v4().to_ulong() & 0xff000000) == 0x7f000000))
|
||||
&& (address.to_v4().to_uint() & 0xff000000) == 0x7f000000))
|
||||
return true;
|
||||
|
||||
const string strAddress = address.to_string();
|
||||
@@ -617,15 +617,15 @@ public:
|
||||
}
|
||||
bool connect(const std::string& server, const std::string& port)
|
||||
{
|
||||
ip::tcp::resolver resolver(stream.get_io_service());
|
||||
ip::tcp::resolver::query query(server.c_str(), port.c_str());
|
||||
ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
|
||||
ip::tcp::resolver::iterator end;
|
||||
ip::tcp::resolver resolver(stream.get_executor());
|
||||
auto results = resolver.resolve(server, port);
|
||||
boost::system::error_code error = asio::error::host_not_found;
|
||||
while (error && endpoint_iterator != end)
|
||||
for (const auto& ep : results)
|
||||
{
|
||||
stream.lowest_layer().close();
|
||||
stream.lowest_layer().connect(*endpoint_iterator++, error);
|
||||
stream.lowest_layer().connect(ep.endpoint(), error);
|
||||
if (!error)
|
||||
break;
|
||||
}
|
||||
if (error)
|
||||
return false;
|
||||
@@ -653,10 +653,10 @@ class AcceptedConnectionImpl : public AcceptedConnection
|
||||
{
|
||||
public:
|
||||
AcceptedConnectionImpl(
|
||||
asio::io_service& io_service,
|
||||
const boost::asio::any_io_executor& executor,
|
||||
ssl::context &context,
|
||||
bool fUseSSL) :
|
||||
sslStream(io_service, context),
|
||||
sslStream(executor, context),
|
||||
_d(sslStream, fUseSSL),
|
||||
_stream(_d)
|
||||
{
|
||||
@@ -723,7 +723,7 @@ static void RPCListen(boost::shared_ptr< basic_socket_acceptor<Protocol, SocketA
|
||||
const bool fUseSSL)
|
||||
{
|
||||
// Accept connection
|
||||
AcceptedConnectionImpl<Protocol>* conn = new AcceptedConnectionImpl<Protocol>(acceptor->get_io_service(), context, fUseSSL);
|
||||
AcceptedConnectionImpl<Protocol>* conn = new AcceptedConnectionImpl<Protocol>(acceptor->get_executor(), context, fUseSSL);
|
||||
|
||||
acceptor->async_accept(
|
||||
conn->sslStream.lowest_layer(),
|
||||
@@ -817,25 +817,25 @@ void ThreadRPCServer2(void* parg)
|
||||
|
||||
const bool fUseSSL = GetBoolArg("-rpcssl");
|
||||
|
||||
asio::io_service io_service;
|
||||
asio::io_context io_service;
|
||||
|
||||
ssl::context context(io_service, ssl::context::sslv23);
|
||||
ssl::context context(ssl::context::sslv23);
|
||||
if (fUseSSL)
|
||||
{
|
||||
context.set_options(ssl::context::no_sslv2);
|
||||
|
||||
filesystem::path pathCertFile(GetArg("-rpcsslcertificatechainfile", "server.cert"));
|
||||
if (!pathCertFile.is_complete()) pathCertFile = filesystem::path(GetDataDir()) / pathCertFile;
|
||||
if (filesystem::exists(pathCertFile)) context.use_certificate_chain_file(pathCertFile.string());
|
||||
fs::path pathCertFile(GetArg("-rpcsslcertificatechainfile", "server.cert"));
|
||||
if (!pathCertFile.is_absolute()) pathCertFile = fs::path(GetDataDir()) / pathCertFile;
|
||||
if (fs::exists(pathCertFile)) context.use_certificate_chain_file(pathCertFile.string());
|
||||
else printf("ThreadRPCServer ERROR: missing server certificate file %s\n", pathCertFile.string().c_str());
|
||||
|
||||
filesystem::path pathPKFile(GetArg("-rpcsslprivatekeyfile", "server.pem"));
|
||||
if (!pathPKFile.is_complete()) pathPKFile = filesystem::path(GetDataDir()) / pathPKFile;
|
||||
if (filesystem::exists(pathPKFile)) context.use_private_key_file(pathPKFile.string(), ssl::context::pem);
|
||||
fs::path pathPKFile(GetArg("-rpcsslprivatekeyfile", "server.pem"));
|
||||
if (!pathPKFile.is_absolute()) pathPKFile = fs::path(GetDataDir()) / pathPKFile;
|
||||
if (fs::exists(pathPKFile)) context.use_private_key_file(pathPKFile.string(), ssl::context::pem);
|
||||
else printf("ThreadRPCServer ERROR: missing server private key file %s\n", pathPKFile.string().c_str());
|
||||
|
||||
string strCiphers = GetArg("-rpcsslciphers", "TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH");
|
||||
SSL_CTX_set_cipher_list(context.impl(), strCiphers.c_str());
|
||||
SSL_CTX_set_cipher_list(context.native_handle(), strCiphers.c_str());
|
||||
}
|
||||
|
||||
// Try a dual IPv6/IPv4 socket, falling back to separate IPv4 and IPv6 sockets
|
||||
@@ -858,7 +858,7 @@ void ThreadRPCServer2(void* parg)
|
||||
acceptor->set_option(boost::asio::ip::v6_only(loopback), v6_only_error);
|
||||
|
||||
acceptor->bind(endpoint);
|
||||
acceptor->listen(socket_base::max_connections);
|
||||
acceptor->listen(socket_base::max_listen_connections);
|
||||
|
||||
RPCListen(acceptor, context, fUseSSL);
|
||||
// Cancel outstanding listen-requests for this acceptor when shutting down
|
||||
@@ -884,7 +884,7 @@ void ThreadRPCServer2(void* parg)
|
||||
acceptor->open(endpoint.protocol());
|
||||
acceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
|
||||
acceptor->bind(endpoint);
|
||||
acceptor->listen(socket_base::max_connections);
|
||||
acceptor->listen(socket_base::max_listen_connections);
|
||||
|
||||
RPCListen(acceptor, context, fUseSSL);
|
||||
// Cancel outstanding listen-requests for this acceptor when shutting down
|
||||
@@ -1129,8 +1129,8 @@ Object CallRPC(const string& strMethod, const Array& params)
|
||||
|
||||
// Connect to localhost
|
||||
bool fUseSSL = GetBoolArg("-rpcssl");
|
||||
asio::io_service io_service;
|
||||
ssl::context context(io_service, ssl::context::sslv23);
|
||||
asio::io_context io_service;
|
||||
ssl::context context(ssl::context::sslv23);
|
||||
context.set_options(ssl::context::no_sslv2);
|
||||
asio::ssl::stream<asio::ip::tcp::socket> sslStream(io_service, context);
|
||||
SSLIOStreamDevice<asio::ip::tcp> d(sslStream, fUseSSL);
|
||||
|
||||
Reference in New Issue
Block a user