mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-20 22:05:12 +00:00
- Removed all scetool dependencies; - Implemented a key vault to manage PS3 keys internally; - Implemented SELF decryption; - Improved PKG handling. Notes: - NPDRM SELF files (EBOOT.BIN) can also be decrypted. A valid matching RAP file must be placed under the dev_usb000 folder. - The source code is considerably commented and several debugging functions were also added in order to aid anyone who wishes to contribute to the engine.
111 lines
No EOL
2.8 KiB
C++
111 lines
No EOL
2.8 KiB
C++
#pragma once
|
|
#include "aes.h"
|
|
#include "utils.h"
|
|
|
|
enum SELF_KEY_TYPE {
|
|
KEY_LV0 = 1,
|
|
KEY_LV1,
|
|
KEY_LV2,
|
|
KEY_APP,
|
|
KEY_ISO,
|
|
KEY_LDR,
|
|
KEY_UNK7,
|
|
KEY_NPDRM
|
|
};
|
|
|
|
struct SELF_KEY {
|
|
u64 version;
|
|
u16 revision;
|
|
u32 self_type;
|
|
u8 erk[0x20];
|
|
u8 riv[0x10];
|
|
u8 pub[0x28];
|
|
u8 priv[0x15];
|
|
u32 curve_type;
|
|
|
|
SELF_KEY(u64 ver, u16 rev, u32 type, wxString e, wxString r, wxString pb, wxString pr, u32 ct)
|
|
{
|
|
version = ver;
|
|
revision = rev;
|
|
self_type = type;
|
|
hex_to_bytes(erk, e.c_str());
|
|
hex_to_bytes(riv, r.c_str());
|
|
hex_to_bytes(pub, pb.c_str());
|
|
hex_to_bytes(priv, pr.c_str());
|
|
curve_type = ct;
|
|
}
|
|
};
|
|
|
|
static const u8 PKG_AES_KEY[0x10] = {
|
|
0x2e, 0x7b, 0x71, 0xd7, 0xc9, 0xc9, 0xa1, 0x4e, 0xa3, 0x22, 0x1f, 0x18, 0x88, 0x28, 0xb8, 0xf8
|
|
};
|
|
|
|
static const u8 NP_IDPS[0x10] = {
|
|
0x5E, 0x06, 0xE0, 0x4F, 0xD9, 0x4A, 0x71, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
|
|
};
|
|
|
|
static const u8 NP_KLIC_FREE[0x10] = {
|
|
0x72, 0xF9, 0x90, 0x78, 0x8F, 0x9C, 0xFF, 0x74, 0x57, 0x25, 0xF0, 0x8E, 0x4C, 0x12, 0x83, 0x87
|
|
};
|
|
|
|
static const u8 NP_KLIC_KEY[0x10] = {
|
|
0xF2, 0xFB, 0xCA, 0x7A, 0x75, 0xB0, 0x4E, 0xDC, 0x13, 0x90, 0x63, 0x8C, 0xCD, 0xFD, 0xD1, 0xEE
|
|
};
|
|
|
|
static const u8 NP_RIF_KEY[0x10] = {
|
|
0xDA, 0x7D, 0x4B, 0x5E, 0x49, 0x9A, 0x4F, 0x53, 0xB1, 0xC1, 0xA1, 0x4A, 0x74, 0x84, 0x44, 0x3B
|
|
};
|
|
|
|
static const u8 RAP_KEY[0x10] = {
|
|
0x86, 0x9F, 0x77, 0x45, 0xC1, 0x3F, 0xD8, 0x90, 0xCC, 0xF2, 0x91, 0x88, 0xE3, 0xCC, 0x3E, 0xDF
|
|
};
|
|
|
|
static const u8 RAP_PBOX[0x10] = {
|
|
0x0C, 0x03, 0x06, 0x04, 0x01, 0x0B, 0x0F, 0x08, 0x02, 0x07, 0x00, 0x05, 0x0A, 0x0E, 0x0D, 0x09
|
|
};
|
|
|
|
static const u8 RAP_E1[0x10] = {
|
|
0xA9, 0x3E, 0x1F, 0xD6, 0x7C, 0x55, 0xA3, 0x29, 0xB7, 0x5F, 0xDD, 0xA6, 0x2A, 0x95, 0xC7, 0xA5
|
|
};
|
|
|
|
static const u8 RAP_E2[0x10] = {
|
|
0x67, 0xD4, 0x5D, 0xA3, 0x29, 0x6D, 0x00, 0x6A, 0x4E, 0x7C, 0x53, 0x7B, 0xF5, 0x53, 0x8C, 0x74
|
|
};
|
|
|
|
class KeyVault
|
|
{
|
|
Array<SELF_KEY> sk_LV0_arr;
|
|
Array<SELF_KEY> sk_LV1_arr;
|
|
Array<SELF_KEY> sk_LV2_arr;
|
|
Array<SELF_KEY> sk_APP_arr;
|
|
Array<SELF_KEY> sk_ISO_arr;
|
|
Array<SELF_KEY> sk_LDR_arr;
|
|
Array<SELF_KEY> sk_UNK7_arr;
|
|
Array<SELF_KEY> sk_NPDRM_arr;
|
|
u8 klicensee_key[0x10];
|
|
|
|
public:
|
|
KeyVault();
|
|
SELF_KEY FindSelfKey(u32 type, u16 revision, u64 version);
|
|
void SetKlicenseeKey(u8 *key);
|
|
u8 *GetKlicenseeKey();
|
|
void RapToRif(unsigned char* rap, unsigned char* rif);
|
|
|
|
private:
|
|
void LoadSelfLV0Keys();
|
|
void LoadSelfLDRKeys();
|
|
void LoadSelfLV1Keys();
|
|
void LoadSelfLV2Keys();
|
|
void LoadSelfISOKeys();
|
|
void LoadSelfAPPKeys();
|
|
void LoadSelfUNK7Keys();
|
|
void LoadSelfNPDRMKeys();
|
|
SELF_KEY GetSelfLV0Key();
|
|
SELF_KEY GetSelfLDRKey();
|
|
SELF_KEY GetSelfLV1Key(u64 version);
|
|
SELF_KEY GetSelfLV2Key(u64 version);
|
|
SELF_KEY GetSelfISOKey(u16 revision, u64 version);
|
|
SELF_KEY GetSelfAPPKey(u16 revision);
|
|
SELF_KEY GetSelfUNK7Key(u64 version);
|
|
SELF_KEY GetSelfNPDRMKey(u16 revision);
|
|
}; |