aboutsummaryrefslogtreecommitdiff
path: root/src/core/hle/service/ssl/ssl.cpp
diff options
context:
space:
mode:
authorMaufeat <maufeat@eden-emu.dev>2025-07-27 22:06:22 +0200
committercrueter <crueter@eden-emu.dev>2025-07-27 22:06:22 +0200
commitbbeb7dd56b189f80ce4a51fe07d405353784b1b4 (patch)
tree114cc2155333b6c87d37bcb6afa93ebbd59ada8c /src/core/hle/service/ssl/ssl.cpp
parenteeb68768d6c74007f18052f3082c136ebde95c30 (diff)
[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 <sahyno1996@gmail.com> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/142 Co-authored-by: Maufeat <maufeat@eden-emu.dev> Co-committed-by: Maufeat <maufeat@eden-emu.dev>
Diffstat (limited to 'src/core/hle/service/ssl/ssl.cpp')
-rw-r--r--src/core/hle/service/ssl/ssl.cpp87
1 files 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<int> 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<Network::SocketBase> socket;
+ std::vector<u8> 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<bool>(parameters.value);
break;
+ case OptionType::SkipDefaultVerify:
+ skip_default_verify = static_cast<bool>(parameters.value);
+ break;
+ case OptionType::EnableAlpn:
+ enable_alpn = static_cast<bool>(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<OptionType>();
+
+ u8 value = 0;
+
+ switch (option) {
+ case OptionType::DoNotCloseSocket:
+ value = static_cast<u8>(do_not_close_socket);
+ break;
+ case OptionType::GetServerCertChain:
+ value = static_cast<u8>(get_server_cert_chain);
+ break;
+ case OptionType::SkipDefaultVerify:
+ value = static_cast<u8>(skip_default_verify);
+ break;
+ case OptionType::EnableAlpn:
+ value = static_cast<u8>(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<u8>(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<const u8>(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<u32>(static_cast<u32>(to_write));
+ }
};
class ISslContext final : public ServiceFramework<ISslContext> {
@@ -398,7 +466,7 @@ public:
shared_data{std::make_shared<SslContextSharedData>()} {
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<OptionType>();
+
+ LOG_WARNING(Service_SSL, "(STUBBED) called. option={}", parameters);
+
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
}
void CreateConnection(HLERequestContext& ctx) {