mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-22 00:22:57 -05:00
Every unverified point of the libSceSsl debt entry was measured on a PS5 on system software 13.40 with a ps5-payload-dev payload against a TLS 1.2 test server presenting leaves issued by the test fixture root. The code follows the console where it differed: initial verify options 0x25 with the date checks off, bits outside 0x3F rejected, the verify callback called with the context id and the bitmask of failed checks and re-run from every later call after a negative return, sceSslRead flags 0 reading until the requested length, streams that end without close_notify reading as 0, resets reported with the libSceNet codes, receive timeouts as SSL_ERROR_WANT_POLLIN, a fatal alert ending the transport, sceSslClose as a repeatable no-op before the handshake, read and write before connect running the handshake, SSL_ERROR_INVALID_ID for unknown or deleted handles and terminated contexts, sceSslSetMinSslVersion accepting 2 to 5, an empty ALPN list rejected, long attribute names from sceSslGetNameEntryInfo and sceSslGetSerialNumber leaving the caller's length. The debt entries record the measured values and what stays unmeasured.
174 lines
7.6 KiB
C++
174 lines
7.6 KiB
C++
#include "prx/libc/include/general/VabiMacros.hpp"
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <cstdlib>
|
|
#include <exception>
|
|
|
|
extern "C" {
|
|
int APS5_VABI sceSslInit_nid_postfix(std::size_t);
|
|
int APS5_VABI sceSslTerm_nid_postfix(int);
|
|
int APS5_VABI sceSslGetCaCerts(int, void*);
|
|
int APS5_VABI sceSslFreeCaCerts(int, void*);
|
|
int APS5_VABI sceSslGetCaList(int, void*);
|
|
int APS5_VABI sceSslFreeCaList(int, void*);
|
|
int APS5_VABI sceSslUnloadCert(int);
|
|
int APS5_VABI sceSslCreateConnection(int, int, const char*);
|
|
int APS5_VABI sceSslDeleteConnection(int);
|
|
int APS5_VABI sceSslSetVerifyCallback(int, int (APS5_VABI *)(int, unsigned int, void**, int, void*), void*);
|
|
int APS5_VABI sceSslConnect(int);
|
|
int APS5_VABI sceSslRead(int, void*, std::size_t, int);
|
|
int APS5_VABI sceSslWrite(int, void*, std::size_t, int);
|
|
int APS5_VABI sceSslClose(int);
|
|
int APS5_VABI sceSslEnableVerifyOption(int, std::uint32_t);
|
|
int APS5_VABI sceSslDisableVerifyOption(int, std::uint32_t);
|
|
int APS5_VABI sceSslSetMinSslVersion(int, int);
|
|
int APS5_VABI sceSslSetAlpn(int, const char*);
|
|
const char* APS5_VABI sceSslGetAlpnSelected(int);
|
|
}
|
|
|
|
struct SslMemoryPoolStats {
|
|
std::size_t pool_size;
|
|
std::size_t max_inuse_size;
|
|
std::size_t current_inuse_size;
|
|
std::int32_t reserved;
|
|
};
|
|
|
|
extern "C" int APS5_VABI sceSslGetMemoryPoolStats(int, SslMemoryPoolStats*);
|
|
|
|
static void Require(bool value) { if (!value) std::abort(); }
|
|
|
|
template <typename TCall>
|
|
static bool Throws(TCall call) {
|
|
try {
|
|
call();
|
|
} catch (const std::exception&) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static int APS5_VABI VerifyCallback(int, unsigned int, void**, int, void*) { return 0; }
|
|
|
|
struct SslCaCerts {
|
|
void* certs;
|
|
std::size_t num;
|
|
void* pool;
|
|
};
|
|
|
|
struct SslCaList {
|
|
void** certs;
|
|
int num;
|
|
};
|
|
|
|
int main() {
|
|
constexpr int notFound = static_cast<int>(0x8095F004);
|
|
constexpr int invalidArg = static_cast<int>(0x8095177A);
|
|
int marker = 0;
|
|
const int context = sceSslInit_nid_postfix(0x10000);
|
|
Require(context > 0);
|
|
SslMemoryPoolStats stats{1, 1, 1, 1};
|
|
Require(sceSslGetMemoryPoolStats(context, &stats) == 0);
|
|
Require(stats.pool_size == 0x10000 && stats.max_inuse_size == 0 && stats.current_inuse_size == 0 && stats.reserved == 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);
|
|
|
|
Require(sceSslGetCaList(context, nullptr) == invalidArg);
|
|
Require(sceSslFreeCaList(context, nullptr) == invalidArg);
|
|
|
|
void* handle = ▮
|
|
SslCaList list{&handle, 3};
|
|
Require(sceSslGetCaList(context, &list) == notFound);
|
|
Require(list.certs == nullptr && list.num == 0);
|
|
Require(sceSslFreeCaList(context, &list) == 0);
|
|
Require(list.certs == nullptr && list.num == 0);
|
|
|
|
SslCaList foreign{&handle, 1};
|
|
Require(Throws([&] { sceSslFreeCaList(context, &foreign); }));
|
|
foreign = {nullptr, 1};
|
|
Require(Throws([&] { sceSslFreeCaList(context, &foreign); }));
|
|
foreign = {&handle, 0};
|
|
Require(Throws([&] { sceSslFreeCaList(context, &foreign); }));
|
|
|
|
Require(sceSslUnloadCert(context) == 0);
|
|
Require(sceSslGetCaList(context, &list) == notFound);
|
|
Require(list.certs == nullptr && list.num == 0);
|
|
|
|
constexpr int invalidId = static_cast<int>(0x8095F006);
|
|
constexpr int invalidValue = static_cast<int>(0x8095F007);
|
|
constexpr int badLength = static_cast<int>(0x80951773);
|
|
constexpr int badDescriptor = static_cast<int>(0x80410109);
|
|
Require(sceSslInit_nid_postfix(0) == static_cast<int>(0x80020016));
|
|
Require(sceSslCreateConnection(context, 0, nullptr) == invalidValue);
|
|
Require(sceSslCreateConnection(context + 1000, 0, "example.com") == invalidId);
|
|
|
|
const int connection = sceSslCreateConnection(context, 0, "example.com");
|
|
Require(connection > 0 && connection != context);
|
|
Require(sceSslSetVerifyCallback(connection, VerifyCallback, &marker) == 0);
|
|
Require(sceSslSetVerifyCallback(connection, nullptr, nullptr) == 0);
|
|
constexpr std::uint32_t serverVerify = 0x1;
|
|
constexpr std::uint32_t cnCheck = 0x4;
|
|
Require(sceSslEnableVerifyOption(connection, serverVerify | cnCheck) == 0);
|
|
Require(sceSslDisableVerifyOption(connection, cnCheck) == 0);
|
|
Require(sceSslDisableVerifyOption(connection, serverVerify | cnCheck) == 0);
|
|
Require(sceSslEnableVerifyOption(connection, 0x40) == invalidValue);
|
|
Require(sceSslDisableVerifyOption(connection, 0x1000) == invalidValue);
|
|
Require(sceSslSetMinSslVersion(connection, 0) == invalidValue);
|
|
Require(sceSslSetMinSslVersion(connection, 1) == invalidValue);
|
|
Require(sceSslSetMinSslVersion(connection, 2) == 0);
|
|
Require(sceSslSetMinSslVersion(connection, 5) == 0);
|
|
Require(sceSslSetMinSslVersion(connection, -1) == invalidValue);
|
|
Require(sceSslSetMinSslVersion(connection, 6) == invalidValue);
|
|
Require(sceSslGetAlpnSelected(connection) == nullptr);
|
|
Require(sceSslSetAlpn(connection, "http/1.1") == 0);
|
|
Require(sceSslSetAlpn(connection, "") == badLength);
|
|
Require(Throws([&] { sceSslSetAlpn(connection, nullptr); }));
|
|
Require(sceSslGetAlpnSelected(connection) == nullptr);
|
|
char buffer[4]{};
|
|
Require(sceSslConnect(connection) == badDescriptor);
|
|
Require(sceSslRead(connection, buffer, sizeof(buffer), 0) == badDescriptor);
|
|
Require(sceSslWrite(connection, buffer, sizeof(buffer), 0) == badDescriptor);
|
|
Require(sceSslWrite(connection, buffer, sizeof(buffer), 1) == invalidValue);
|
|
Require(sceSslClose(connection) == 0);
|
|
|
|
const int unknown = connection + 1000;
|
|
Require(sceSslSetVerifyCallback(unknown, nullptr, nullptr) == invalidId);
|
|
Require(sceSslEnableVerifyOption(unknown, serverVerify) == invalidId);
|
|
Require(sceSslDisableVerifyOption(unknown, serverVerify) == invalidId);
|
|
Require(sceSslSetMinSslVersion(unknown, 5) == invalidId);
|
|
Require(sceSslSetAlpn(unknown, "http/1.1") == invalidId);
|
|
Require(Throws([&] { sceSslGetAlpnSelected(unknown); }));
|
|
Require(sceSslConnect(unknown) == invalidId);
|
|
Require(sceSslRead(unknown, buffer, sizeof(buffer), 0) == invalidId);
|
|
Require(sceSslWrite(unknown, buffer, sizeof(buffer), 0) == invalidId);
|
|
Require(sceSslClose(unknown) == invalidId);
|
|
Require(sceSslDeleteConnection(unknown) == invalidId);
|
|
|
|
Require(sceSslTerm_nid_postfix(context) == 0);
|
|
Require(sceSslTerm_nid_postfix(context) == invalidId);
|
|
Require(sceSslSetVerifyCallback(connection, nullptr, nullptr) == invalidId);
|
|
Require(sceSslEnableVerifyOption(connection, serverVerify) == invalidId);
|
|
Require(sceSslDisableVerifyOption(connection, serverVerify) == invalidId);
|
|
Require(sceSslSetMinSslVersion(connection, 5) == invalidId);
|
|
Require(sceSslSetAlpn(connection, "http/1.1") == invalidId);
|
|
Require(Throws([&] { sceSslGetAlpnSelected(connection); }));
|
|
Require(sceSslConnect(connection) == invalidId);
|
|
Require(sceSslClose(connection) == invalidId);
|
|
Require(sceSslCreateConnection(context, 0, "example.com") == invalidId);
|
|
Require(sceSslDeleteConnection(connection) == invalidId);
|
|
|
|
Require(sceSslGetCaList(context, nullptr) == invalidArg);
|
|
Require(sceSslFreeCaList(context, nullptr) == invalidArg);
|
|
list = {&handle, 3};
|
|
Require(Throws([&] { sceSslGetCaList(context, &list); }));
|
|
Require(Throws([&] { sceSslFreeCaList(context, &list); }));
|
|
Require(Throws([&] { sceSslUnloadCert(context); }));
|
|
}
|