mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-09-18 10:27:45 +02:00
A .sprx from one of these packages is an NPDRM "\0PSPEDAT" container: a 0x90-byte header, then an ordinary ~PSP PRX. The loader only ever saw the EDAT magic and gave up with SCE_KERNEL_ERROR_UNSUPPORTED_PRX_TYPE. Step over the header, then derive the key the PRX inside is really encrypted against: sceNpDrmGetFixedKey() over the content ID, XOR in the licensee key the game handed us through sceNpDrmSetLicenseeKey(), then AES under a module key that had to be added. Both halves of that were already lying around unused - sceNpDrmGetFixedKey() had no callers at all, and the licensee key was being kept and never read. The rest of it is a fixed XOR that the PRX header's decrypt_mode selects rather than its tag, so it's applied on the mode the way JPCSP does it and the tag table is left alone - tag 0x407810F0 carries no seed of its own there either, so ours was never wrong about it. pspDecryptType5() already had a slot for both XORs; no new decryption logic was needed. Decryption is only half of it: these modules are KL4E-compressed rather than gzipped, so they also need Core/Util/KL4E.cpp, which is already there for the firmware modules that use the same compression. With both halves Shiren 4 Plus loads its one big .sprx and runs. God Eater 2 needed one further fix that isn't in this commit - the type-B relocation bug in ElfReader::LoadRelocations2, issue #8075 - and then plays. docs/pkg_notes.md has the container layout and the key derivation. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>