Files
AnyPS5/docs/dev/debt/libSceLibreSsl.md
T
JaceTheBlu 95643ecaab Merge feat/libressl-x509-lookup into feat/libressl-verify-param-host
# Conflicts:
#	core/libs/prx/libSceLibreSsl/Export.cpp
#	core/libs/prx/libSceLibreSsl/include/Api.hpp
#	core/libs/prx/libSceLibreSsl/src/X509Store.cpp
#	docs/dev/debt/libSceLibreSsl.md
2026-10-26 07:59:49 +00:00

12 KiB

libSceLibreSsl technical debt

Unknown function info

  • libSceLibreSsl pending exports - 334 named callable exports are listed in the PS5 3.20 export table and were cross-checked against the same module in PS5 firmware 13.60. Their signatures and behaviour are unverified; the declarations use the no-parameter unknown-signature convention and throw through NotImplemented_nid_no_patch.

  • MD4, MD5, SHA1, SHA224, SHA256, SHA384 and SHA512 Init/Update/Final and SHA256 (libSceLibreSsl) - signatures and context layouts follow the LibreSSL headers, and buffering and Final follow its sources; nothing is checked on the console. Null contexts, null input with a nonzero length, null digest buffers in the 32-bit Final functions and a buffered byte count that is not below the block size, which LibreSSL does not check, throw

  • DES_set_key, DES_ecb_encrypt, DES_set_odd_parity (libSceLibreSsl) - the 128-byte DES_key_schedule holds the 8-byte key followed by zeros instead of LibreSSL's precomputed subkeys, so a title reading its contents sees different bytes; DES_ecb_encrypt derives the subkeys through mbedtls on each call. Not compared with the console. Results follow LibreSSL des_key.c and des.c: DES_set_key skips the parity and weak-key checks and returns 0, as it does while DES_check_key is 0 (that variable is not in the PS5 export inventory), a nonzero enc encrypts, and DES_set_odd_parity sets each byte's low bit for odd parity. Null pointers throw where LibreSSL faults

  • X509_verify_cert_error_string - no console call is verified. The 64-bit argument, low-32-bit lookup, messages and shared numeric fallback follow LibreSSL 2.5.4, the version identified in published firmware 13.40 measurements. Console modifications and other firmware versions remain unverified. Unknown-code results share an overwritten static buffer and are not safe for concurrent use, as in that release; code 1 and codes above 54 use the numeric fallback.

  • RAND_add, RAND_bytes, RAND_status, RAND_load_file, RAND_file_name, CRYPTO_malloc, CRYPTO_free, CRYPTO_set_mem_functions (libSceLibreSsl) - follow LibreSSL's rand_lib.c, randfile.c and malloc-wrapper.c, which are the same in 2.6.5 (3.4.3 linked); nothing is checked on the console. RAND_bytes reads host entropy and CRYPTO_malloc and CRYPTO_free use the guest heap. CRYPTO_malloc returns null for a size of zero or less, as LibreSSL 2.5.4 to 3.4 do; later versions take a size_t size and call malloc. A null buffer with a positive length throws

  • AES_set_encrypt_key, AES_set_decrypt_key, AES_encrypt, AES_decrypt, AES_ecb_encrypt, AES_cbc_encrypt, AES_cfb128_encrypt, AES_ctr128_encrypt (libSceLibreSsl) - follow LibreSSL's aes.h and mode code. Nothing is checked on the console. Key setup follows LibreSSL 2.5.4's aes_core.c, the version the X509_verify_cert_error_string entry names: a null pointer returns -1 and a key length other than 128, 192 or 256 bits returns -2 before the key is written, and only the 44, 52 or 60 words the key length needs are written. The AES_KEY schedule uses that file's generic C layout (big-endian words, rounds 10, 12 or 14). The 2.5.4 amd64 build uses aes-x86_64 instead, which copies the key bytes without swapping, so each word is byte-reversed compared with the C layout (OpenSSL 3.0.13's x86-64 code gives the same schedules byte-reversed); the console's build options are unknown, so a schedule the title reads or fills is unverified. CTR leaves the last keystream block in ecount_buf even at a block boundary. Null pointers in the cipher and mode functions, other rounds values and a CFB or CTR position outside 0-15 throw

  • ERR_get_error, ERR_peek_error, ERR_clear_error, ERR_remove_thread_state (libSceLibreSsl) - no export of this library adds an error yet, so the queue stays empty for guest code. The per-thread queue of 16 slots holding 15 codes, its order and the ERR_PACK layout follow LibreSSL's err.c and err.h; the module's LibreSSL version is unknown and nothing is checked on the console. The queue keeps no file, line or data, as no export reads them. ERR_remove_thread_state with a thread id throws: that version asserts a null id, while older versions remove the state of the thread the id names

  • OCSP_response_status_str, OCSP_cert_status_str and OCSP_crl_reason_str (libSceLibreSsl) - the module's strings are not measured on the console. The tables follow LibreSSL ocsp_prn.c, unchanged from revision 1.8 (2015) to 1.12 (2025), with codes from ocsp.h; the argument is a 64-bit long and every value not in a table returns (UNKNOWN)

  • SSL_CIPHER_get_bits, SSL_CIPHER_get_name and SSL_CIPHER_get_version - the 88-byte guest cipher layout and these calls are not console-verified. They follow LibreSSL 2.5.4 ssl.h and ssl_ciph.c, matching the version in published firmware 13.40 measurements. Console modifications and other firmware layouts remain unverified. Protocol labels use the full 64-bit cipher ID, not the protocol flags; TLS 1.2 ciphers still report TLSv1/SSLv3, as in that release.

Functional

  • ASN1_INTEGER_get has no console verification for nonpositive lengths. It follows LibreSSL 2.5.4: valid integer types return zero without reading data when length is zero or negative; invalid types return -1 first. Later LibreSSL versions reject negative lengths through ASN1_INTEGER_get_int64; that later contract is not used for this library.

  • ASN1_INTEGER_get and ASN1_STRING_data/length/type/to_UTF8 are unverified on PS5. Signatures, the 24-byte guest string layout and conversions follow LibreSSL 2.5.4's ASN.1 sources, the version reported for firmware 13.40 in discussion #8981. Null accessor inputs, null conversion outputs, missing nonempty data, oversized converted output and unrepresentable signed integer values throw where the source has undefined behaviour. Malformed encodings and allocation failure throw until ASN.1 error-queue reporting is implemented. Conversion buffers use the guest libc allocator and can be released with guest free.

  • X509_STORE_new, X509_STORE_free and X509_STORE_set_flags are unverified on PS5. The 136-byte store, 64-byte verify parameters, 56-byte parameter identity, 32-byte stacks and the results follow LibreSSL 2.5.4 x509_lu.c and x509_vpm.c, the version in firmware 13.40 measurements. No export adds a certificate, CRL or policy object, so X509_STORE_free throws instead of freeing one and the object cache's comparator throws. A null store or verify parameters, and a null element array behind a positive count, throw where LibreSSL faults

  • X509_VERIFY_PARAM_set_hostflags and X509_VERIFY_PARAM_set1_ip_asc are unverified on PS5. They follow LibreSSL 2.5.4 x509_vpm.c and the a2i_ipadd parser of its v3_utl.c, unchanged in 2.7, the first release whose symbols include X509_VERIFY_PARAM_set1_host, which the module also exports; IPv4 parts are read with the guest sscanf as the module would. LibreSSL 2.8 appends a poisoned field to the parameter identity, which these layouts lack. A null address text, and null verify parameters or identity once an address is accepted, throw where LibreSSL faults

  • X509_LOOKUP_file and X509_STORE_add_lookup are unverified on PS5. The 80-byte method, the 32-byte lookup, the stack growth and the results follow LibreSSL 2.5.4 by_file.c, x509_lu.c and stack.c, unchanged in 2.7. The file method's ctrl, which loads PEM certificates and CRLs, throws: there is no certificate model. Callbacks of a guest-supplied method (new_item, shutdown, free) throw instead of being called, and a null store, method or listed lookup throws where LibreSSL faults

  • X509_VERIFY_PARAM_set1_host is unverified on PS5. It follows int_x509_param_set_hosts of LibreSSL 2.7, the first release with this export, and copies the name with the guest strndup. LibreSSL 2.8 also marks the parameters as poisoned when the call fails, through a field the 2.5.4 to 2.7 layout lacks, so a failed call leaves no mark. Null verify parameters or identity throw where LibreSSL faults