mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-28 00:35:47 +00:00
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]>
52 lines
2.1 KiB
C++
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;
|
|
}
|