Files
AnyPS5/core/libs/tests/GuestLibreSslCryptoLocks.cpp
mantavisualandClaude Opus 5.5 c15dce440a feat(libSceLibreSsl): implement the CRYPTO locking and thread id callbacks
CRYPTO_num_locks, CRYPTO_set_locking_callback, CRYPTO_set_add_lock_callback,
CRYPTO_THREADID_set_callback and CRYPTO_THREADID_set_numeric threw. They
now follow LibreSSL 2.5.4's cryptlib.c, the version identified in the
firmware 13.40 measurements: CRYPTO_num_locks returns 41, the setters
store their callbacks, CRYPTO_THREADID_set_callback keeps the first
non-null one and returns 0 once one is set, and
CRYPTO_THREADID_set_numeric clears the {ptr, val} structure and stores a
64-bit value. The callbacks are never called, because the module exports
none of CRYPTO_lock, CRYPTO_add_lock or CRYPTO_THREADID_current; the debt
entry records it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-25 15:03:25 +02:00

52 lines
2.1 KiB
C++

#include "prx/libSceLibreSsl/include/Api.hpp"
#include "prx/libc/include/general/VabiMacros.hpp"
#include <cstdint>
#include <cstdlib>
#include <cstring>
#include <stdexcept>
static void Require(bool value) { if (!value) std::abort(); }
template<typename TAction>
static void RequireThrows(TAction action) {
try { action(); } catch (const std::invalid_argument&) { return; }
std::abort();
}
static void APS5_VABI Locking(int, int, const char*, int) {}
static int APS5_VABI AddLock(int*, int, int, const char*, int) { return 0; }
static void APS5_VABI ThreadId(CryptoThreadId*) {}
static void APS5_VABI OtherThreadId(CryptoThreadId*) {}
static void CheckThreadIdCallback() {
Require(CRYPTO_THREADID_set_callback_nid_postfix(nullptr) == 1);
Require(CRYPTO_THREADID_set_callback_nid_postfix(nullptr) == 1);
Require(CRYPTO_THREADID_set_callback_nid_postfix(reinterpret_cast<void*>(&ThreadId)) == 1);
Require(CRYPTO_THREADID_set_callback_nid_postfix(reinterpret_cast<void*>(&OtherThreadId)) == 0);
Require(CRYPTO_THREADID_set_callback_nid_postfix(reinterpret_cast<void*>(&ThreadId)) == 0);
Require(CRYPTO_THREADID_set_callback_nid_postfix(nullptr) == 0);
}
static void CheckThreadIdNumeric() {
CryptoThreadId id{};
std::memset(&id, 0xaa, sizeof(id));
CRYPTO_THREADID_set_numeric_nid_postfix(&id, 0x1234567890abcdefull);
Require(id.ptr == nullptr && id.val == 0x1234567890abcdefull);
std::memset(&id, 0x55, sizeof(id));
CRYPTO_THREADID_set_numeric_nid_postfix(&id, 0);
unsigned char zero[sizeof(id)]{};
Require(std::memcmp(&id, zero, sizeof(id)) == 0);
RequireThrows([] { CRYPTO_THREADID_set_numeric_nid_postfix(nullptr, 1); });
}
int main() {
Require(CRYPTO_num_locks_nid_postfix() == 41);
CRYPTO_set_locking_callback_nid_postfix(reinterpret_cast<void*>(&Locking));
CRYPTO_set_locking_callback_nid_postfix(nullptr);
CRYPTO_set_add_lock_callback_nid_postfix(reinterpret_cast<void*>(&AddLock));
CRYPTO_set_add_lock_callback_nid_postfix(nullptr);
CheckThreadIdCallback();
CheckThreadIdNumeric();
return 0;
}