diff --git a/core/libs/prx/libSceHttp2/Export.cpp b/core/libs/prx/libSceHttp2/Export.cpp index 95f07e60a..cadaea011 100644 --- a/core/libs/prx/libSceHttp2/Export.cpp +++ b/core/libs/prx/libSceHttp2/Export.cpp @@ -204,9 +204,9 @@ int APS5_VABI sceHttp2WaitAsync(int req_id, Http2AsyncResult* result, uint32_t* return ERROR_NETWORK; } -int APS5_VABI sceHttp2AbortRequest() { - NotImplemented_nid_no_patch(__func__); - return 0; +int APS5_VABI sceHttp2AbortRequest(int req_id) { + (void)req_id; + return 0; } } diff --git a/core/libs/prx/libSceSsl/CMakeLists.txt b/core/libs/prx/libSceSsl/CMakeLists.txt new file mode 100644 index 000000000..8433788ec --- /dev/null +++ b/core/libs/prx/libSceSsl/CMakeLists.txt @@ -0,0 +1,20 @@ +add_library(libSceSsl SHARED EXCLUDE_FROM_ALL Export.cpp) +target_include_directories(libSceSsl PRIVATE ${LIBS_INCLUDE_DIR}) +configure_windows_unwind(libSceSsl) + +if(MINGW) + foreach(runtimeLinkFlag IN ITEMS -static-libgcc -static-libstdc++ -static) + string(REPLACE "${runtimeLinkFlag}" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") + endforeach() +endif() + +if(BUILD_TESTING) + add_test_executable(guest_ssl_tests ${LIBS_INCLUDE_DIR}/tests/GuestSsl.cpp) + target_include_directories(guest_ssl_tests PRIVATE ${LIBS_INCLUDE_DIR}) + target_link_libraries(guest_ssl_tests PRIVATE libSceSsl) + add_test(NAME guest_ssl COMMAND guest_ssl_tests) + if(WIN32) + set_tests_properties(guest_ssl PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() +endif() diff --git a/core/libs/prx/libSceSsl/Export.cpp b/core/libs/prx/libSceSsl/Export.cpp index 9801185d6..bb8e8bf52 100644 --- a/core/libs/prx/libSceSsl/Export.cpp +++ b/core/libs/prx/libSceSsl/Export.cpp @@ -9,20 +9,38 @@ static constexpr int ERROR_NETWORK = static_cast(0x80435001); static std::atomic g_nextHandle{1}; +namespace { + +constexpr int ERROR_NOT_FOUND = static_cast(0x8095F004); +constexpr int ERROR_INVALID_ARG = static_cast(0x8095177A); + +struct SslData { + char* ptr; + size_t size; +}; + +struct SslCaCerts { + SslData* certs; + size_t num; + void* pool; +}; + +} + extern "C" { int APS5_VABI sceSslFreeCaCerts(int ssl_ctx_id, void* ca_certs) { - (void)ssl_ctx_id; - (void)ca_certs; - NotImplemented_nid_no_patch(__func__); - return 0; + (void)ssl_ctx_id; + if (!ca_certs) return ERROR_INVALID_ARG; + *static_cast(ca_certs) = {}; + return 0; } int APS5_VABI sceSslGetCaCerts(int ssl_ctx_id, void* ca_certs) { - (void)ssl_ctx_id; - (void)ca_certs; - NotImplemented_nid_no_patch(__func__); - return 0; + (void)ssl_ctx_id; + if (!ca_certs) return ERROR_INVALID_ARG; + *static_cast(ca_certs) = {}; + return ERROR_NOT_FOUND; } int APS5_VABI sceSslInit_nid_postfix(uint64_t pool_size) { diff --git a/core/libs/tests/GuestSsl.cpp b/core/libs/tests/GuestSsl.cpp new file mode 100644 index 000000000..ed5ea97fe --- /dev/null +++ b/core/libs/tests/GuestSsl.cpp @@ -0,0 +1,36 @@ +#include "prx/libc/include/general/VabiMacros.hpp" +#include +#include + +extern "C" { +int APS5_VABI sceSslInit_nid_postfix(std::size_t); +int APS5_VABI sceSslGetCaCerts(int, void*); +int APS5_VABI sceSslFreeCaCerts(int, void*); +} + +static void Require(bool value) { if (!value) std::abort(); } + +struct SslCaCerts { + void* certs; + std::size_t num; + void* pool; +}; + +int main() { + constexpr int notFound = static_cast(0x8095F004); + constexpr int invalidArg = static_cast(0x8095177A); + int marker = 0; + + const int context = sceSslInit_nid_postfix(0x10000); + Require(context > 0); + Require(sceSslGetCaCerts(context, nullptr) == invalidArg); + Require(sceSslFreeCaCerts(context, nullptr) == invalidArg); + + SslCaCerts certs{&marker, 3, &marker}; + Require(sceSslGetCaCerts(context, &certs) == notFound); + Require(certs.certs == nullptr && certs.num == 0 && certs.pool == nullptr); + + certs = {&marker, 3, &marker}; + Require(sceSslFreeCaCerts(context, &certs) == 0); + Require(certs.certs == nullptr && certs.num == 0 && certs.pool == nullptr); +} diff --git a/docs/dev/TechnicalDebt.md b/docs/dev/TechnicalDebt.md index 4f89d4097..95325cf68 100644 --- a/docs/dev/TechnicalDebt.md +++ b/docs/dev/TechnicalDebt.md @@ -29,6 +29,8 @@ Throughout the project, every function at every stage either **does exactly what - [sceLibcInternalBacktraceForGame](../../core/libs/prx/libc/src/HeapDiagnostics.cpp) (libSceLibcInternal, implemented in libc) - unknown signature - [sceLibcInternalHeapErrorReportForGame](../../core/libs/prx/libc/src/HeapDiagnostics.cpp) (libSceLibcInternal, implemented in libc) - unknown signature - [__progname](../../core/libs/prx/libkernel/System/src/Process.cpp) (libkernel) - unknown data export +- [sceSslClose](../../core/libs/prx/libSceSsl/Export.cpp) (libSceSsl) - unknown signature +- [sceSslGetSerialNumber](../../core/libs/prx/libSceSsl/Export.cpp) (libSceSsl) - unknown signature ### Functional