Pending rewrite or deletion
moving to private research based on community feedback
moving to private research based on community feedback
Last edited by Deleted member 812305,
I have a PS5 on 1.02, coming in the mail. I plan to test it there mainly due to what I found/what you said "extraction of all the needed keys is only possible on low fw ps5." But it still might be possible on newer Firmware versions with Kernel R/W.My knowledge regarding different keys is not on your level.
But as I recall, extraction of all the needed keys is only possible on low fw ps5. Really low. Up to fw 3.xx max or something like that.
Maybe your script takes another approach than the script/way used on lower fw.
But I haven’t heard of a way to extract keys other than on the low ones.
Wow, nice! Really appreciate people like you, who seems to have the skills and sharingI have a PS5 on 1.02, coming in the mail. I plan to test it there mainly due to what I find/what you said "extraction of all the needed keys is only possible on low fw ps5." But it still might be possible on newer Firmware versions with Kernel R/W.


Hey, really appreciate the offer — that's exactly what this project needs!I'd be happy to run this on my fat disc PS5 running 13.60. It's currently only running relapse through the Y2JB application and have the one that combines byepervisor in to it ready to drop in and run. If you could maybe provide the compiled .elf file too that'd make things a lot easier, especially for the people who aren't quite up to the standards of being able to build the file themselves, like myself! I'm happy to run it though and pull the file, run it through the python script on my PC to see if it provides the key you need.
Thank you!Wow, nice! Really appreciate people like you, who seems to have the skills and sharing
Really good job so far![]()
Thank you, I will be upfront with you after even more research and the HV changes Sony made from 2.70 and up if the key extraction will probably not be possible via conventional means but I will dig through this and see what comes of it. I have a 1.02 model coming in the mail and plan to throw the "sink" at it.As promised, here's the file you need. As i'm new to the PS5 JB scene (not JB overall though, I go back years) I wasn't sure if running the .elf file directly on the PS5 made a difference so there's 2 files in the zip folder, the one with PS5Upload in the name is the one sent from my PC, the other one was ran directly on the PS5. Hope it helps, if you need any more info or help at all then i'm happy to help out if I can.
May I ask how you built this, if you seemingly dont have a JB console?I Built a PC-Based PS5 PUP Decrypt Tool — Need Someone to Dump the EncryptService Key So It Works Forever
TL;DR: I built a Python tool that can parse and partially decrypt PS5 PUP files on PC — no console needed. It handles BLS containers, PUP structure analysis, and inner firmware decryption with known keys. I confirmed PBKDF2-HMAC-SHA256 as the Layer 0 derivation algorithm (exact match to Titania Rev 2 master key). Then I exhaustively tested every known key and derivation chain against real PUPs from two different firmware versions (14.00 and 14.10) and hit a wall: the PUP container encryption key is not in the public key dump. It lives inside the Titania Security Processor, used by encsrv_decrypt_header(). The key is almost certainly burned into ROM or silicon — it's universal across all consoles and has been there since FW 1.0. That means extracting it once = permanent solution for every firmware version, past and future. I need someone with console access to either dump the EncryptService software or peek inside the Security Processor to find what key encsrv_decrypt_header() actually uses.
Background
After the PS5 bootrom key leak (Dec 31, 2025), a significant amount of key material became publicly documented — ROM key blocks, keyseeds (Key 2-9), OTP/KDF parameters, Titania master keys, and inner firmware AES keys. These are cataloged on psdevwiki.
The existing on-console tool (ps5-pup-decrypt) works by calling the PS5's EncryptService via ioctl, meaning it requires a jailbroken console. No PC-based PUP decryption tool existed publicly. I don't have a PS5, so I set out to build a tool that works entirely on PC — something designed to last. The architecture is modular: once the missing key is found, it drops into the tool and every PUP from every firmware version becomes decryptable without a console.
What I Built
A Python CLI tool (pup-decrypt-tool) that handles the layers we have keys for:
- BLS Parser — Parses the outer SLB2 container (magic 0x32424C53), extracts entry metadata
- PUP Parser — Reads the inner PUP structure (magic 0xEEF51454), segment table, flags
- Layer 3 Decryptor — AES-128-CBC decryption of inner firmware blobs using known static keys (EMC IPL header/body, EAP KBL, EAP Kernel, EAP Kernel SELF, Titania Rev 2)
- Key Derivation Module — PBKDF2 + KMB_AES chain replication for research
- Bruteforce Mode — Tries all known keys against unknown blobs, uses Shannon entropy to score results
Requires only Python 3 + pycryptodome. No console needed.
Finding 1: PBKDF2 Layer 0 Derivation Confirmed
The psdevwiki documents OTP_AES_ROOT, KDF_SALT1, and 1000 iterations as KDF parameters, but doesn't specify the hash function or output length.
I tested PBKDF2-HMAC with SHA-256, SHA-1, and SHA-512 at 16-byte and 32-byte output lengths:
Hash dklen Match? SHA-256 16 YES — exact match to Titania Rev 2 master key SHA-256 32 First 16 bytes match (as expected) SHA-1 16 No SHA-512 16 No
Conclusion: Layer 0 is PBKDF2-HMAC-SHA256 with 16-byte output. This is the algorithm that derives the Titania Rev 2 master key from OTP_AES_ROOT + KDF_SALT1.
Finding 2: Real PUP Structure (14.00 and 14.10)
Tested against two retail PS5UPDATE.PUP files:
- FW 14.00 — 1,260,600,832 bytes, BLS entry size 0x4B2339D5
- FW 14.10 — 1,261,408,256 bytes, BLS entry size 0x4B2F8A3D
BLS Container (plaintext):
- Both: Version 3, 1 inner entry (PS5UPDATE1.PUP), offset 0x400
PUP File Header (first 16 bytes — plaintext):
- Both firmwares have identicalplaintext headers:
- Magic: 0xEEF51454 (valid)
- Field at offset 0x04: 0x32010110 (likely format version, not firmware version)
- Header size: 0x5B0 (1456 bytes) — implies ~44 segments at 32 bytes each
- Hash/signature table size: 0xDE0 (3552 bytes)
Encrypted content comparison (14.00 vs 14.10):
- 256 out of 256 bytes differ in the encrypted extended header — completely different ciphertext
- Confirms: different firmware content, but same encryption scheme and key hierarchy
- All encrypted regions: ~7.15-7.29 bits/byte entropy (near max 8.0) — confirmed encryption, not compression
Finding 3: Layer 1 Gap — Exhaustive Negative Result (Both Firmwares)
This is the main research contribution. I replicated the KMB_AES derivation chain documented on psdevwiki and tested every resulting key against the encrypted PUP headers from both 14.00 and 14.10 simultaneously.
Derivation chain tested:
PBKDF2 master (slot 0) ──┬── CBC(KEY_4_KEYSEEDS) → slot 4
├── CBC(KEY_5_KEYSEEDS) → slot 5
├── CBC(KEY_7_KEYSEEDS) → slot 7
│ ├── ECB(KEY_8_KEYSEEDS) → slot 8
│ └── ECB(KEY_9_KEYSEEDS) → slot 9
└── CBC/ECB(KEY_2_KEYSEEDS) → slot 2
For each derived key, tested both first-16 and last-16 bytes of 32-byte results, in CBC, ECB, and CTR modes, with zeroed IV and all known Titania IVs.
Full 8-phase scan (all negative on BOTH firmwares):
- All 17 known static keys × 6 IV variants × 3 modes (CBC/ECB/CTR)
- KMB_AES derivation chain: slots 4, 5, 7, 8, 9 (both halves, key+IV combos)
- ROM key blocks: every 16-byte window + derived chains through key7 → key8/key9
- XOR combinations: master^OTP, master^SALT, OTP^SALT, master^ROM, master^K8/K9
- AES-256 with all 32-byte keys (ROM windows, PBKDF2-256, keyseeds raw)
- PBKDF2 variants: SHA-256/SHA-1/SHA-512, 16+32 byte output, header-mixed salts
- Sliding window: every possible 16-byte key from all keyseed material concatenated (257 windows × 2 PUPs × 2 modes)
- AES encrypt (reversed direction) with master, EMC header key, and K8 keyseed
Validation method: Decrypted the first 32 bytes of each PUP's extended header and checked if file_size falls within ~1MB of the known BLS entry size and segment_count is between 1-99.
Result: Zero matches across hundreds of combinations on both firmware versions.
What This Means
The PS5 crypto architecture has (at least) these distinct layers:
Layer Purpose Status 0 PBKDF2 master key derivation Solved — SHA-256, 16-byte output 1 PUP container encryption (header + segments) Blocked — key not in public dump 2 PUP segment-level encryption Blocked — depends on Layer 1 3 Inner firmware encryption (EMC, EAP, etc.) Solved — static keys known
The bootrom key leak provided Layer 0 parameters and Layer 3 static keys. The KMB_AES keyseeds (Key 2-9) appear to be for Layer 3 inner firmware operations, not for Layer 1 PUP container crypto.
The encsrv_decrypt_header() ioctl (0xC0184402) used by the on-console tool accesses a key that is:
- Universal (all consoles decrypt the same PUP, so it's not per-console)
- Not in the public key dump
- Likely locked in the security processor's CCP hardware key slots
- Separate from the bootrom key hierarchy
Why This Key Is the Nail in the Coffin
Here's why finding this one key is worth the effort:
The PUP container key is almost certainly burned into ROM or silicon. Every PS5 ever made — launch day consoles running FW 1.0 through the latest — must be able to decrypt every PUP Sony distributes. There's no per-console provisioning for system updates. The key has to be:
- Universal — identical on every console
- Permanent — present since the very first firmware, can't be rotated without bricking existing consoles
- Unpatchable — if it's in ROM/silicon (which the evidence strongly suggests), Sony can't change it even if they wanted to
Testing across two firmware versions (14.00 and 14.10) confirms this: both use identical plaintext header structures (unknown_04=0x32010110, header_size=0x5B0, hash_size=0xDE0) despite having completely different encrypted content. Same key hierarchy, same format — just different payloads.
Once extracted, this key works forever. It decrypts every past PUP and every future PUP. It's not like a signing key that can be rotated — it's a decryption key baked into hardware that already shipped. A PC tool with this key makes on-console decryption unnecessary for all time.
What I Need — The Ask
The tool is one key away from being a complete, permanent PC-based PUP decryptor. That key lives inside the Titania Security Processor and is used by encsrv_decrypt_header() (ioctl 0xC0184402). It's universal — every PS5 uses the same one — so it only needs to be extracted once.
If you have a jailbroken PS5, here's what would crack this open:
- Dump the EncryptService — Extract the code behind the /dev/pup_update0 ioctls so we can see how it selects and uses the PUP header key. Even a disassembly of the handler for 0xC0184402 would tell us which key slot it reads from.
- Peek inside the Security Processor during a PUP update — Dump the CCP LSB slot contents while encsrv_decrypt_header() is running. The key is loaded into a hardware slot before the AES operation — if we can read the slots at that moment, we have it.
- Reverse engineer the Titania firmware — The security processor firmware contains the key hierarchy. Deeper RE of how it handles PUP operations would reveal where the container key sits relative to the keys we already know.
Any one of these gives us the missing piece. Once that key is in the tool, it works for every PUP on every firmware — no console needed, forever.
I Already Built the Extraction Payload
To make this as easy as possible for anyone with a jailbroken 13.60 PS5, I wrote a ready-to-compile C payload (ps5_key_extract.c) that does all three of the above automatically. It implements four approaches:
- CCP LSB Key Slot Dump — Maps the AMD CCP v5 MMIO region via /dev/dmem0, reads all 128 hardware key slots (8 LSBs x 16 slots x 32 bytes each). If the PUP key is in any slot, this grabs it.
- EncryptService ioctl Handler Scan — Searches kernel memory for the pup_update0 device driver's cdevsw structure, follows the d_ioctl function pointer, and dumps 4KB of the handler code. Disassemble on PC with Ghidra/IDA to find which CCP key slot the decrypt function references.
- Instrumented PUP Decrypt — Snapshots all CCP LSB slots before and after a DecryptPupHeader ioctl call. Any slot that changes during the call = the key that was loaded for decryption.
- Kernel Memory Scan — Searches near strings like encsrv, decrypt_header, Titania, ccp_key and dumps surrounding context.
All operations are read-only — nothing is written to kernel or CCP state. Output goes to /data/pup_key_dump.bin, which you transfer to PC and run through the companion analyze_dump.py script. That script automatically tests every captured key candidate against encrypted PUP headers from FW 14.00 and 14.10.
Requirements: A PS5 on FW 13.60 or below with kernel R/W access (Byepervisor Reborn + Relapse + etaHEN or similar). Compile for FreeBSD 11 amd64 and load via payload loader. You'll need to plug in your framework's kernel_read64 / kernel_copyout functions.
Tool Availability
The tool works today for everything except the one missing key:
- Parse any PS5 PUP file's BLS container and show structure
- Estimate segment count from the plaintext header
- Decrypt inner firmware blobs if you have them extracted by other means
- Run the PBKDF2 derivation to verify/experiment with Layer 0
- Bruteforce-test unknown blobs against all known keys with entropy scoring
- Tested against real retail PUPs from FW 14.00 and FW 14.10
- Ready to accept the Layer 1 key — the crypto module just needs one more key added and the full pipeline connects
- Extraction payload ready — ps5_key_extract.c + analyze_dump.py for someone with console access
Source is published: TitaniaPy on git— drop in your PUP files and go. DMs open if you have console access and want to collaborate — this is a one-key problem with a permanent payoff.
All research conducted on personally owned hardware for educational purposes. No proprietary key values are reproduced in this post — all referenced keys are already publicly documented on psdevwiki. This work builds on research by the PS5 security community, the dayzerosec CCP architecture writeup, and fail0verflow's PS4 Aeolia documentation.
You didnt answer my questions at all....it sounds like you are just blindly guessing@TheStonedModder — To address your concern about safety and 'blind payloads,' the extraction tooling has actually been heavily updated (moving into V4/V5 and the new deep-extraction suite).
The architecture was built from the ground up and redefined to eliminate any risk of firmware corruption:
The complete source for both "ps5_key_extractV4.c" and "analyze_dump.py" (python analyze_dump.py pup_key_dump.bin --save-handlers) along with "ps5_key_dumpUpload.bin" is open for review if you want to look at the safety guardrails firsthand.
- Strictly Read-Only Analysis: Approaches 1–7 and 9 rely entirely on passive memory reads, kernel copyout, and MMIO telemetry sampling.
- CCP Queue Snooping: Rather than guessing keys, Approach 6 monitors tail-pointer advancements on CCP queues during live execution to capture exact command descriptors passively.
- Safe Idling Probes: The new deep-extraction tooling uses strict idle-queue checks and zero-length no-op validation to ensure zero state corruption.
TheStonedModder said:How did you come to these conclusions without a JB PS5? Sounds like blind guessing.
Bro, stop using AI and TALK TO me@TheStonedModder — First off, I apologize for any confusion. To answer your question: while I do not run a jailbroken console locally, a community member with hardware access volunteered to execute the extraction payload.
The primary focus and target for achieving CVE-2023-20599 are 2020 launch models running Firmware 1.02, because Sony was completely unaware of this hardware vulnerability at the time of launch. The data collection and testing on later revisions (such as FW 13.60) are strictly used as a baseline comparison to analyze how driver logic and firmware structures differ over time.
The architectural conclusions are backed by concrete engineering and verifiable telemetry:
1. Microarchitectural Parity (KytyPS5 & AnyPS5)
2. Application of CVE-2023-20599 on Firmware 1.02
- Translation layers and compatibility projects provide empirical proof that the console's custom Zen 2 "Oberon" SoC executes standard x86-64 instructions natively.
- Because AMD did not fundamentally alter the underlying physical gate logic of their security blocks for a semi-custom contract, the register structures for the AMD Secure Processor (ASP) and Crypto Co-Processor (CCP) remain structurally parallel to standard PC architecture.
3. Firmware Baseline Advantages
- Firmware 1.02 represents a pristine silicon architecture completely free of downstream microcode updates, runtime register lockouts, or hypervisor telemetry loops that Sony deployed in late-stage versions like Firmware 14.00+.
- This unmitigated baseline allows us to target improper register access control flaws within the ASP and CCP boundary isolation layers.
4. Structured Telemetry via Custom Tooling (Including 13.60 Diffing)
- Early environments feature an in-kernel hypervisor design.
- This design permits tight memory-mapped I/O (MMIO) mapping and unconstrained handler inspection compared to later restricted firmware architectures.
- Testing on environments like FW 13.60 is performed purely to map out changes and see how they differ from the 1.02 baseline.
- Conclusions are backed by the ps5_key_extract v4 extraction and injection harness built via the ps5-payload-dev SDK.
- Approach 6 (CCP Queue Snoop): Snapshots queue tail pointers before and after triggering DecryptHeader ioctls, diffing ring buffers to capture live hardware command descriptors.
- Approach 9 (Decrypt Oracle): Performs full BLS header validation (VERIFY_BLS) followed by 16KB-aligned ioctl attempts across command types to trace the decryption pipeline.
Be real with you how your responding and how you started out the reply to the post, I really don't wanna talk to ya. So hereBro, stop using AI and TALK TO me
If this is how the project is starting, respectfully you arent going to get these keys
First of all you just a CVE and low FW isnt enough(That CVE is also useless for you). Second you cant even answer the most basic questions. you have a long way to go.
You’re going to break someone’s consolebe rea
Be real with you how your responding and how you started out the reply to the post, I really don't wanna talk to ya. So here
@TheStonedModder — Fair feedback, and I appreciate the directness. If it sounded like guesswork earlier, that's entirely on me for fumbling the explanation of the extraction pipeline. Let's clear up how this is actually structured:
1. Why CVE-2023-20599 Isn't Treated as a "Magic Bullet"
2. Acknowledging the LSB Read-Protection Wall
- We aren't claiming a CVE and low firmware alone hand over keys on a silver platter. CVE-2023-20599 is specifically an improper register access control flaw (CWE-1262) within the AMD Secure Processor (ASP) and Crypto Co-Processor (CCP) boundary isolation layers.
- It requires absolute kernel/hypervisor (Ring -1) control to even interact with. Its sole purpose in our model is to bypass standard MMIO isolation by writing control values to internal configuration registers, forcing the hardware to expose key state or command queues that are otherwise locked down.
We know we have a long way to go, but this isn't built on blind luck—it's systematic hardware telemetry mapping on an unmitigated 1.02 baseline. If you've got technical corrections or see flaws in how we're handling the CCP queue descriptors or ioctl states, I'm all ears.
- You're entirely right that a basic MMIO scan of the 128 LSB slots doesn't just "grab" private keys out of thin air—silence from read-protection masks blocks direct CPU reads on private Secure Buffer slots.
Unknown
- That is precisely why Approach 1 is just read-only recon, and why we implemented Approach 8 (CCP PASSTHROUGH) and Approach 6 (Queue Snooping) into the harness: to command the CCP hardware internally to route slot data through DMA buffers or capture live hardware descriptor rings during a real decrypt cycle.
Unknown
I'll admit the Original post should have stated this is research, in the title and I will change it to reflect so.You’re going to break someone’s console
AI isn’t going to do this with you guessing
EDIT: To be clear I am not saying dont use AI, but you cant even respond to me without it. This is the unfortunate reality of the task at hand. It took me 4 months with the help of AI and not blindly guessing





