diff options
| author | 2023-08-25 18:02:32 -0400 | |
|---|---|---|
| committer | 2023-08-26 00:02:32 +0200 | |
| commit | 234cc45192cc854a2b1897bd90af86a66ff59ae4 (patch) | |
| tree | fd3fbed6573a2ab7c55dd71aab3c2ac86353cded /src | |
| parent | registered_cache: create fake CNMT entries for program updates of multiprogra... (diff) | |
| download | yuzu-234cc45192cc854a2b1897bd90af86a66ff59ae4.tar.gz yuzu-234cc45192cc854a2b1897bd90af86a66ff59ae4.tar.xz yuzu-234cc45192cc854a2b1897bd90af86a66ff59ae4.zip | |
ssl: tolerate handshake without hostname set (#11328)
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/ssl/ssl.cpp | 10 | ||||
| -rw-r--r-- | src/core/hle/service/ssl/ssl_backend_openssl.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/service/ssl/ssl_backend_schannel.cpp | 25 |
3 files changed, 14 insertions, 24 deletions
diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp index 2cba9e5c9..6c8427b0d 100644 --- a/src/core/hle/service/ssl/ssl.cpp +++ b/src/core/hle/service/ssl/ssl.cpp | |||
| @@ -139,7 +139,6 @@ private: | |||
| 139 | bool do_not_close_socket = false; | 139 | bool do_not_close_socket = false; |
| 140 | bool get_server_cert_chain = false; | 140 | bool get_server_cert_chain = false; |
| 141 | std::shared_ptr<Network::SocketBase> socket; | 141 | std::shared_ptr<Network::SocketBase> socket; |
| 142 | bool did_set_host_name = false; | ||
| 143 | bool did_handshake = false; | 142 | bool did_handshake = false; |
| 144 | 143 | ||
| 145 | Result SetSocketDescriptorImpl(s32* out_fd, s32 fd) { | 144 | Result SetSocketDescriptorImpl(s32* out_fd, s32 fd) { |
| @@ -174,11 +173,7 @@ private: | |||
| 174 | Result SetHostNameImpl(const std::string& hostname) { | 173 | Result SetHostNameImpl(const std::string& hostname) { |
| 175 | LOG_DEBUG(Service_SSL, "called. hostname={}", hostname); | 174 | LOG_DEBUG(Service_SSL, "called. hostname={}", hostname); |
| 176 | ASSERT(!did_handshake); | 175 | ASSERT(!did_handshake); |
| 177 | Result res = backend->SetHostName(hostname); | 176 | return backend->SetHostName(hostname); |
| 178 | if (res == ResultSuccess) { | ||
| 179 | did_set_host_name = true; | ||
| 180 | } | ||
| 181 | return res; | ||
| 182 | } | 177 | } |
| 183 | 178 | ||
| 184 | Result SetVerifyOptionImpl(u32 option) { | 179 | Result SetVerifyOptionImpl(u32 option) { |
| @@ -208,9 +203,6 @@ private: | |||
| 208 | 203 | ||
| 209 | Result DoHandshakeImpl() { | 204 | Result DoHandshakeImpl() { |
| 210 | ASSERT_OR_EXECUTE(!did_handshake && socket, { return ResultNoSocket; }); | 205 | ASSERT_OR_EXECUTE(!did_handshake && socket, { return ResultNoSocket; }); |
| 211 | ASSERT_OR_EXECUTE_MSG( | ||
| 212 | did_set_host_name, { return ResultInternalError; }, | ||
| 213 | "Expected SetHostName before DoHandshake"); | ||
| 214 | Result res = backend->DoHandshake(); | 206 | Result res = backend->DoHandshake(); |
| 215 | did_handshake = res.IsSuccess(); | 207 | did_handshake = res.IsSuccess(); |
| 216 | return res; | 208 | return res; |
diff --git a/src/core/hle/service/ssl/ssl_backend_openssl.cpp b/src/core/hle/service/ssl/ssl_backend_openssl.cpp index b2dd37cd4..5714e6f3c 100644 --- a/src/core/hle/service/ssl/ssl_backend_openssl.cpp +++ b/src/core/hle/service/ssl/ssl_backend_openssl.cpp | |||
| @@ -167,9 +167,8 @@ public: | |||
| 167 | } | 167 | } |
| 168 | 168 | ||
| 169 | ~SSLConnectionBackendOpenSSL() { | 169 | ~SSLConnectionBackendOpenSSL() { |
| 170 | // these are null-tolerant: | 170 | // this is null-tolerant: |
| 171 | SSL_free(ssl); | 171 | SSL_free(ssl); |
| 172 | BIO_free(bio); | ||
| 173 | } | 172 | } |
| 174 | 173 | ||
| 175 | static void KeyLogCallback(const SSL* ssl, const char* line) { | 174 | static void KeyLogCallback(const SSL* ssl, const char* line) { |
diff --git a/src/core/hle/service/ssl/ssl_backend_schannel.cpp b/src/core/hle/service/ssl/ssl_backend_schannel.cpp index bda12b761..d834a0c1f 100644 --- a/src/core/hle/service/ssl/ssl_backend_schannel.cpp +++ b/src/core/hle/service/ssl/ssl_backend_schannel.cpp | |||
| @@ -31,9 +31,9 @@ CredHandle cred_handle; | |||
| 31 | static void OneTimeInit() { | 31 | static void OneTimeInit() { |
| 32 | schannel_cred.dwVersion = SCHANNEL_CRED_VERSION; | 32 | schannel_cred.dwVersion = SCHANNEL_CRED_VERSION; |
| 33 | schannel_cred.dwFlags = | 33 | schannel_cred.dwFlags = |
| 34 | SCH_USE_STRONG_CRYPTO | // don't allow insecure protocols | 34 | SCH_USE_STRONG_CRYPTO | // don't allow insecure protocols |
| 35 | SCH_CRED_AUTO_CRED_VALIDATION | // validate certs | 35 | SCH_CRED_NO_SERVERNAME_CHECK | // don't validate server names |
| 36 | SCH_CRED_NO_DEFAULT_CREDS; // don't automatically present a client certificate | 36 | SCH_CRED_NO_DEFAULT_CREDS; // don't automatically present a client certificate |
| 37 | // ^ I'm assuming that nobody would want to connect Yuzu to a | 37 | // ^ I'm assuming that nobody would want to connect Yuzu to a |
| 38 | // service that requires some OS-provided corporate client | 38 | // service that requires some OS-provided corporate client |
| 39 | // certificate, and presenting one to some arbitrary server | 39 | // certificate, and presenting one to some arbitrary server |
| @@ -227,16 +227,15 @@ public: | |||
| 227 | ciphertext_read_buf.size()); | 227 | ciphertext_read_buf.size()); |
| 228 | } | 228 | } |
| 229 | 229 | ||
| 230 | const SECURITY_STATUS ret = | 230 | char* hostname_ptr = hostname ? const_cast<char*>(hostname->c_str()) : nullptr; |
| 231 | InitializeSecurityContextA(&cred_handle, initial_call_done ? &ctxt : nullptr, | 231 | const SECURITY_STATUS ret = InitializeSecurityContextA( |
| 232 | // Caller ensured we have set a hostname: | 232 | &cred_handle, initial_call_done ? &ctxt : nullptr, hostname_ptr, req, |
| 233 | const_cast<char*>(hostname.value().c_str()), req, | 233 | 0, // Reserved1 |
| 234 | 0, // Reserved1 | 234 | 0, // TargetDataRep not used with Schannel |
| 235 | 0, // TargetDataRep not used with Schannel | 235 | initial_call_done ? &input_desc : nullptr, |
| 236 | initial_call_done ? &input_desc : nullptr, | 236 | 0, // Reserved2 |
| 237 | 0, // Reserved2 | 237 | initial_call_done ? nullptr : &ctxt, &output_desc, &attr, |
| 238 | initial_call_done ? nullptr : &ctxt, &output_desc, &attr, | 238 | nullptr); // ptsExpiry |
| 239 | nullptr); // ptsExpiry | ||
| 240 | 239 | ||
| 241 | if (output_buffers[0].pvBuffer) { | 240 | if (output_buffers[0].pvBuffer) { |
| 242 | const std::span span(static_cast<u8*>(output_buffers[0].pvBuffer), | 241 | const std::span span(static_cast<u8*>(output_buffers[0].pvBuffer), |