From bbeb7dd56b189f80ce4a51fe07d405353784b1b4 Mon Sep 17 00:00:00 2001 From: Maufeat Date: Sun, 27 Jul 2025 22:06:22 +0200 Subject: [PATCH] [ssl] add and unstub alpn option + functions (#142) Should fix Jackbox 7,8,9,10 unable to connect to server errors. (See discord issues) Co-authored-by: Maufeat Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/142 Co-authored-by: Maufeat Co-committed-by: Maufeat --- src/core/hle/service/ssl/ssl.cpp | 87 ++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 4 deletions(-) diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp index 67e37e0823..2d10bd04d2 100644 --- a/src/core/hle/service/ssl/ssl.cpp +++ b/src/core/hle/service/ssl/ssl.cpp @@ -41,6 +41,8 @@ enum class IoMode : u32 { enum class OptionType : u32 { DoNotCloseSocket = 0, GetServerCertChain = 1, + SkipDefaultVerify = 2, + EnableAlpn = 3, }; // This is nn::ssl::sf::SslVersion @@ -93,11 +95,11 @@ public: {20, nullptr, "SetRenegotiationMode"}, {21, nullptr, "GetRenegotiationMode"}, {22, &ISslConnection::SetOption, "SetOption"}, - {23, nullptr, "GetOption"}, + {23, &ISslConnection::GetOption, "GetOption"}, {24, nullptr, "GetVerifyCertErrors"}, {25, nullptr, "GetCipherInfo"}, - {26, nullptr, "SetNextAlpnProto"}, - {27, nullptr, "GetNextAlpnProto"}, + {26, &ISslConnection::SetNextAlpnProto, "SetNextAlpnProto"}, + {27, &ISslConnection::GetNextAlpnProto, "GetNextAlpnProto"}, {28, nullptr, "SetDtlsSocketDescriptor"}, {29, nullptr, "GetDtlsHandshakeTimeout"}, {30, nullptr, "SetPrivateOption"}, @@ -140,7 +142,10 @@ private: std::optional fd_to_close; bool do_not_close_socket = false; bool get_server_cert_chain = false; + bool skip_default_verify = false; + bool enable_alpn = false; std::shared_ptr socket; + std::vector next_alpn_proto; bool did_handshake = false; Result SetSocketDescriptorImpl(s32* out_fd, s32 fd) { @@ -381,6 +386,12 @@ private: case OptionType::GetServerCertChain: get_server_cert_chain = static_cast(parameters.value); break; + case OptionType::SkipDefaultVerify: + skip_default_verify = static_cast(parameters.value); + break; + case OptionType::EnableAlpn: + enable_alpn = static_cast(parameters.value); + break; default: LOG_WARNING(Service_SSL, "Unknown option={}, value={}", parameters.option, parameters.value); @@ -389,6 +400,63 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } + + void GetOption(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + const auto option = rp.PopRaw(); + + u8 value = 0; + + switch (option) { + case OptionType::DoNotCloseSocket: + value = static_cast(do_not_close_socket); + break; + case OptionType::GetServerCertChain: + value = static_cast(get_server_cert_chain); + break; + case OptionType::SkipDefaultVerify: + value = static_cast(skip_default_verify); + break; + case OptionType::EnableAlpn: + value = static_cast(enable_alpn); + break; + default: + LOG_WARNING(Service_SSL, "Unknown option={}", option); + value = 0; + break; + } + + LOG_DEBUG(Service_SSL, "GetOption called, option={}, ret value={}", option, value); + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(value); + } + + void SetNextAlpnProto(HLERequestContext& ctx) { + const auto data = ctx.ReadBuffer(0); + next_alpn_proto.assign(data.begin(), data.end()); + + LOG_DEBUG(Service_SSL, "SetNextAlpnProto called, size={}", next_alpn_proto.size()); + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); + } + + void GetNextAlpnProto(HLERequestContext& ctx) { + const size_t writable = ctx.GetWriteBufferSize(); + const size_t to_write = std::min(next_alpn_proto.size(), writable); + + if (to_write != 0) { + ctx.WriteBuffer(std::span(next_alpn_proto.data(), to_write)); + } + + LOG_DEBUG(Service_SSL, "GetNextAlpnProto called, size={}", to_write); + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(static_cast(to_write)); + } }; class ISslContext final : public ServiceFramework { @@ -398,7 +466,7 @@ public: shared_data{std::make_shared()} { static const FunctionInfo functions[] = { {0, &ISslContext::SetOption, "SetOption"}, - {1, nullptr, "GetOption"}, + {1, &ISslContext::GetOption, "GetOption"}, {2, &ISslContext::CreateConnection, "CreateConnection"}, {3, &ISslContext::GetConnectionCount, "GetConnectionCount"}, {4, &ISslContext::ImportServerPki, "ImportServerPki"}, @@ -434,6 +502,17 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); + + } + + void GetOption(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + const auto parameters = rp.PopRaw(); + + LOG_WARNING(Service_SSL, "(STUBBED) called. option={}", parameters); + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); } void CreateConnection(HLERequestContext& ctx) {