diff options
author | comex <comexk@gmail.com> | 2023-06-26 02:00:05 +0200 |
---|---|---|
committer | comex <comexk@gmail.com> | 2023-06-26 02:06:57 +0200 |
commit | ac939f08a4c116b6a38978358b667b1fa0c51ef9 (patch) | |
tree | d056a56751a46f31b2b4f8e2d7b0de31fc5de1db /src | |
parent | ssl: fix compatibility with OpenSSL 1.1.1 (diff) | |
download | yuzu-ac939f08a4c116b6a38978358b667b1fa0c51ef9.tar yuzu-ac939f08a4c116b6a38978358b667b1fa0c51ef9.tar.gz yuzu-ac939f08a4c116b6a38978358b667b1fa0c51ef9.tar.bz2 yuzu-ac939f08a4c116b6a38978358b667b1fa0c51ef9.tar.lz yuzu-ac939f08a4c116b6a38978358b667b1fa0c51ef9.tar.xz yuzu-ac939f08a4c116b6a38978358b667b1fa0c51ef9.tar.zst yuzu-ac939f08a4c116b6a38978358b667b1fa0c51ef9.zip |
Diffstat (limited to 'src')
-rw-r--r-- | src/core/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/core/hle/service/sockets/sfdnsres.cpp | 4 | ||||
-rw-r--r-- | src/core/hle/service/ssl/ssl_backend_schannel.cpp | 49 | ||||
-rw-r--r-- | src/core/internal_network/network.cpp | 4 | ||||
-rw-r--r-- | src/core/internal_network/network.h | 4 |
5 files changed, 35 insertions, 28 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index d95d2fe01..4c53aed72 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -872,7 +872,7 @@ if(ENABLE_OPENSSL) elseif (WIN32) target_sources(core PRIVATE hle/service/ssl/ssl_backend_schannel.cpp) - target_link_libraries(core PRIVATE Secur32) + target_link_libraries(core PRIVATE secur32) else() target_sources(core PRIVATE hle/service/ssl/ssl_backend_none.cpp) diff --git a/src/core/hle/service/sockets/sfdnsres.cpp b/src/core/hle/service/sockets/sfdnsres.cpp index fb8798b42..c5eaec920 100644 --- a/src/core/hle/service/sockets/sfdnsres.cpp +++ b/src/core/hle/service/sockets/sfdnsres.cpp @@ -149,7 +149,7 @@ static std::pair<u32, GetAddrInfoError> GetHostByNameRequestImpl(HLERequestConte const std::string host = Common::StringFromBuffer(host_buffer); // For now, ignore options, which are in input buffer 1 for GetHostByNameRequestWithOptions. - auto res = Network::GetAddrInfo(host, /*service*/ std::nullopt); + auto res = Network::GetAddressInfo(host, /*service*/ std::nullopt); if (!res.has_value()) { return {0, Translate(res.error())}; } @@ -249,7 +249,7 @@ static std::pair<u32, GetAddrInfoError> GetAddrInfoRequestImpl(HLERequestContext // Serialized hints are also passed in a buffer, but are ignored for now. - auto res = Network::GetAddrInfo(host, service); + auto res = Network::GetAddressInfo(host, service); if (!res.has_value()) { return {0, Translate(res.error())}; } diff --git a/src/core/hle/service/ssl/ssl_backend_schannel.cpp b/src/core/hle/service/ssl/ssl_backend_schannel.cpp index 0a326b536..92b2dddaa 100644 --- a/src/core/hle/service/ssl/ssl_backend_schannel.cpp +++ b/src/core/hle/service/ssl/ssl_backend_schannel.cpp @@ -12,29 +12,31 @@ #include <mutex> +namespace { + +// These includes are inside the namespace to avoid a conflict on MinGW where +// the headers define an enum containing Network and Service as enumerators +// (which clash with the correspondingly named namespaces). #define SECURITY_WIN32 -#include <Security.h> +#include <security.h> #include <schnlsp.h> -namespace { - std::once_flag one_time_init_flag; bool one_time_init_success = false; -SCHANNEL_CRED schannel_cred{ - .dwVersion = SCHANNEL_CRED_VERSION, - .dwFlags = SCH_USE_STRONG_CRYPTO | // don't allow insecure protocols - SCH_CRED_AUTO_CRED_VALIDATION | // validate certs - SCH_CRED_NO_DEFAULT_CREDS, // don't automatically present a client certificate +SCHANNEL_CRED schannel_cred{}; +CredHandle cred_handle; + +static void OneTimeInit() { + schannel_cred.dwVersion = SCHANNEL_CRED_VERSION; + schannel_cred.dwFlags = SCH_USE_STRONG_CRYPTO | // don't allow insecure protocols + SCH_CRED_AUTO_CRED_VALIDATION | // validate certs + SCH_CRED_NO_DEFAULT_CREDS; // don't automatically present a client certificate // ^ I'm assuming that nobody would want to connect Yuzu to a // service that requires some OS-provided corporate client // certificate, and presenting one to some arbitrary server // might be a privacy concern? Who knows, though. -}; - -CredHandle cred_handle; -static void OneTimeInit() { SECURITY_STATUS ret = AcquireCredentialsHandle(nullptr, const_cast<LPTSTR>(UNISP_NAME), SECPKG_CRED_OUTBOUND, nullptr, &schannel_cred, nullptr, nullptr, &cred_handle, nullptr); @@ -179,15 +181,21 @@ public: // [1] (will be replaced by SECBUFFER_MISSING when SEC_E_INCOMPLETE_MESSAGE is // returned, or SECBUFFER_EXTRA when SEC_E_CONTINUE_NEEDED is returned if the // whole buffer wasn't used) + .cbBuffer = 0, .BufferType = SECBUFFER_EMPTY, + .pvBuffer = nullptr, }, }}; std::array<SecBuffer, 2> output_buffers{{ { + .cbBuffer = 0, .BufferType = SECBUFFER_TOKEN, + .pvBuffer = nullptr, }, // [0] { + .cbBuffer = 0, .BufferType = SECBUFFER_ALERT, + .pvBuffer = nullptr, }, // [1] }}; SecBufferDesc input_desc{ @@ -299,21 +307,20 @@ public: return read_size; } if (!ciphertext_read_buf_.empty()) { + SecBuffer empty{ + .cbBuffer = 0, + .BufferType = SECBUFFER_EMPTY, + .pvBuffer = nullptr, + }; std::array<SecBuffer, 5> buffers{{ { .cbBuffer = static_cast<unsigned long>(ciphertext_read_buf_.size()), .BufferType = SECBUFFER_DATA, .pvBuffer = ciphertext_read_buf_.data(), }, - { - .BufferType = SECBUFFER_EMPTY, - }, - { - .BufferType = SECBUFFER_EMPTY, - }, - { - .BufferType = SECBUFFER_EMPTY, - }, + empty, + empty, + empty, }}; ASSERT_OR_EXECUTE_MSG( buffers[0].cbBuffer == ciphertext_read_buf_.size(), diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp index 0164d12eb..40e451526 100644 --- a/src/core/internal_network/network.cpp +++ b/src/core/internal_network/network.cpp @@ -493,9 +493,7 @@ u32 IPv4AddressToInteger(IPv4Address ip_addr) { static_cast<u32>(ip_addr[2]) << 8 | static_cast<u32>(ip_addr[3]); } -#undef GetAddrInfo // Windows defines it as a macro - -Common::Expected<std::vector<AddrInfo>, GetAddrInfoError> GetAddrInfo( +Common::Expected<std::vector<AddrInfo>, GetAddrInfoError> GetAddressInfo( const std::string& host, const std::optional<std::string>& service) { addrinfo hints{}; hints.ai_family = AF_INET; // Switch only supports IPv4. diff --git a/src/core/internal_network/network.h b/src/core/internal_network/network.h index 96319bfc8..badcb8369 100644 --- a/src/core/internal_network/network.h +++ b/src/core/internal_network/network.h @@ -5,6 +5,7 @@ #include <array> #include <optional> +#include <vector> #include "common/common_funcs.h" #include "common/common_types.h" @@ -113,7 +114,8 @@ std::optional<IPv4Address> GetHostIPv4Address(); std::string IPv4AddressToString(IPv4Address ip_addr); u32 IPv4AddressToInteger(IPv4Address ip_addr); -Common::Expected<std::vector<AddrInfo>, GetAddrInfoError> GetAddrInfo( +// named to avoid name collision with Windows macro +Common::Expected<std::vector<AddrInfo>, GetAddrInfoError> GetAddressInfo( const std::string& host, const std::optional<std::string>& service); } // namespace Network |