1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-25 12:12:50 +01:00
rpcs3/scetool/sce.h
Alexandro Sánchez Bach f1b420eb3b SELF decrypter improves & About... dialog added
SELF decrypter improved:
The files 'scetool.exe' and 'zlib1.dll' are no longer needed. Everything
needed is now included in the rpsc3 project. So the only thing you need
in order to load SELF files are the keys. More information about this
matter in my last commit: c1565e55

Warning for devs! There is a lot of spaghetti code in /scetool/. I
fucked up things a bit while trying to include scetool in rpcs3. There
is a lot of unused code there and I need to make sure that everything is
working properly. In any case, the code seems to work stable so
end-users shouldn't be worried about this warning. ;-)

'About...' dialog added:
Well, I have nothing more to say here. I wish you all a nice day!
2013-10-21 23:02:43 +02:00

617 lines
14 KiB
C

/*
* Copyright (c) 2011-2013 by naehrwert
* This file is released under the GPLv2.
*/
#ifndef _SCE_H_
#define _SCE_H_
#include <stdio.h>
#include <string.h>
#include "types.h"
#include "list.h"
/*! SCE file align. */
#define SCE_ALIGN 0x10
/*! Header align. */
#define HEADER_ALIGN 0x80
/*! SCE header magic value ("SCE\0"). */
#define SCE_HEADER_MAGIC 0x53434500
/*! SCE header versions. */
/*! Header version 2. */
#define SCE_HEADER_VERSION_2 2
/*! Key revisions. */
#define KEY_REVISION_0 0x00
#define KEY_REVISION_092_330 0x01
#define KEY_REVISION_1 0x02
//#define KEY_REVISION_ 0x03
#define KEY_REVISION_340_342 0x04
//#define KEY_REVISION_ 0x05
//#define KEY_REVISION_ 0x06
#define KEY_REVISION_350 0x07
//#define KEY_REVISION_ 0x08
//#define KEY_REVISION_ 0x09
#define KEY_REVISION_355 0x0a
//#define KEY_REVISION_ 0x0b
//#define KEY_REVISION_ 0x0c
#define KEY_REVISION_356 0x0d
//#define KEY_REVISION_ 0x0e
//#define KEY_REVISION_ 0x0f
#define KEY_REVISION_360_361 0x10
//#define KEY_REVISION_ 0x11
//#define KEY_REVISION_ 0x12
#define KEY_REVISION_365 0x13
//#define KEY_REVISION_ 0x14
//#define KEY_REVISION_ 0x15
#define KEY_REVISION_370_373 0x16
//#define KEY_REVISION_ 0x17
//#define KEY_REVISION_ 0x18
#define KEY_REVISION_DEBUG 0x8000
/*! SCE header types. */
/*! SELF header. */
#define SCE_HEADER_TYPE_SELF 1
/*! RVK header. */
#define SCE_HEADER_TYPE_RVK 2
/*! PKG header. */
#define SCE_HEADER_TYPE_PKG 3
/*! SPP header. */
#define SCE_HEADER_TYPE_SPP 4
/*! Sub header types. */
/*! SCE version header. */
#define SUB_HEADER_TYPE_SCEVERSION 1
/*! SELF header. */
#define SUB_HEADER_TYPE_SELF 3
/*! Control info types. */
/*! Control flags. */
#define CONTROL_INFO_TYPE_FLAGS 1
/*! Digest. */
#define CONTROL_INFO_TYPE_DIGEST 2
/*! NPDRM block. */
#define CONTROL_INFO_TYPE_NPDRM 3
/*! Optional header types. */
/*! Capability flags header. */
#define OPT_HEADER_TYPE_CAP_FLAGS 1
/*! Individuals seed header. */
#define OPT_HEADER_TYPE_INDIV_SEED 2
/*! Metadata key/iv lengths. */
#define METADATA_INFO_KEYBITS 128
#define METADATA_INFO_KEY_LEN 16
#define METADATA_INFO_KEYPAD_LEN 16
#define METADATA_INFO_IV_LEN 16
#define METADATA_INFO_IVPAD_LEN 16
/*! Metadata section types. */
/*! Segment header. */
#define METADATA_SECTION_TYPE_SHDR 1
/*! Program header. */
#define METADATA_SECTION_TYPE_PHDR 2
/*! Unknown header type 3. */
#define METADATA_SECTION_TYPE_UNK_3 3
/*! Section is hashed. */
#define METADATA_SECTION_HASHED 2
/*! Section is not encrypted. */
#define METADATA_SECTION_NOT_ENCRYPTED 1
/*! Section is encrypted. */
#define METADATA_SECTION_ENCRYPTED 3
/*! Section is not compressed. */
#define METADATA_SECTION_NOT_COMPRESSED 1
/*! Section is compressed. */
#define METADATA_SECTION_COMPRESSED 2
/*! Signature sizes. */
/*! Signature S part size. */
#define SIGNATURE_S_SIZE 21
/*! Signature R part size. */
#define SIGNATURE_R_SIZE 21
/*! Compressed. */
#define SECTION_INFO_COMPRESSED 2
/*! Not compressed. */
#define SECTION_INFO_NOT_COMPRESSED 1
/*! SCE version not present. */
#define SCE_VERSION_NOT_PRESENT 0
/*! SCE version present. */
#define SCE_VERSION_PRESENT 1
/*! SELF types. */
/*! lv0. */
#define SELF_TYPE_LV0 1
/*! lv1. */
#define SELF_TYPE_LV1 2
/*! lv2. */
#define SELF_TYPE_LV2 3
/*! Application. */
#define SELF_TYPE_APP 4
/*! Isolated SPU module. */
#define SELF_TYPE_ISO 5
/*! Secure loader. */
#define SELF_TYPE_LDR 6
/*! Unknown type 7. */
#define SELF_TYPE_UNK_7 7
/*! NPDRM application. */
#define SELF_TYPE_NPDRM 8
/*! NPDRM control info magic value ("NPD\0"). */
#define NP_CI_MAGIC 0x4E504400
/*! NPDRM license types. */
#define NP_LICENSE_NETWORK 1
#define NP_LICENSE_LOCAL 2
#define NP_LICENSE_FREE 3
/*! NPDRM application types. */
#define NP_TYPE_UPDATE 0x20
#define NP_TYPE_SPRX 0
#define NP_TYPE_EXEC 1
#define NP_TYPE_USPRX (NP_TYPE_UPDATE | NP_TYPE_SPRX)
#define NP_TYPE_UEXEC (NP_TYPE_UPDATE | NP_TYPE_EXEC)
/*! SCE header. */
typedef struct _sce_header
{
/*! Magic value. */
scetool::u32 magic;
/*! Header version .*/
scetool::u32 version;
/*! Key revision. */
scetool::u16 key_revision;
/*! Header type. */
scetool::u16 header_type;
/*! Metadata offset. */
scetool::u32 metadata_offset;
/*! Header length. */
scetool::u64 header_len;
/*! Length of encapsulated data. */
scetool::u64 data_len;
} sce_header_t;
/*! SELF header. */
typedef struct _self_header
{
/*! Header type. */
scetool::u64 header_type;
/*! Application info offset. */
scetool::u64 app_info_offset;
/*! ELF offset. */
scetool::u64 elf_offset;
/*! Program headers offset. */
scetool::u64 phdr_offset;
/*! Section headers offset. */
scetool::u64 shdr_offset;
/*! Section info offset. */
scetool::u64 section_info_offset;
/*! SCE version offset. */
scetool::u64 sce_version_offset;
/*! Control info offset. */
scetool::u64 control_info_offset;
/*! Control info size. */
scetool::u64 control_info_size;
/*! Padding. */
scetool::u64 padding;
} self_header_t;
/*! Metadata info. */
typedef struct _metadata_info
{
/*! Key. */
scetool::u8 key[METADATA_INFO_KEY_LEN];
/*! Key padding. */
scetool::u8 key_pad[METADATA_INFO_KEYPAD_LEN];
/*! IV. */
scetool::u8 iv[METADATA_INFO_IV_LEN];
/*! IV padding. */
scetool::u8 iv_pad[METADATA_INFO_IVPAD_LEN];
} metadata_info_t;
typedef struct _metadata_header
{
/*! Signature input length. */
scetool::u64 sig_input_length;
scetool::u32 unknown_0;
/*! Section count. */
scetool::u32 section_count;
/*! Key count. */
scetool::u32 key_count;
/*! Optional header size. */
scetool::u32 opt_header_size;
scetool::u32 unknown_1;
scetool::u32 unknown_2;
} metadata_header_t;
/*! Metadata section header. */
typedef struct _metadata_section_header
{
/*! Data offset. */
scetool::u64 data_offset;
/*! Data size. */
scetool::u64 data_size;
/*! Type. */
scetool::u32 type;
/*! Index. */
scetool::u32 index;
/*! Hashed. */
scetool::u32 hashed;
/*! SHA1 index. */
scetool::u32 sha1_index;
/*! Encrypted. */
scetool::u32 encrypted;
/*! Key index. */
scetool::u32 key_index;
/*! IV index. */
scetool::u32 iv_index;
/*! Compressed. */
scetool::u32 compressed;
} metadata_section_header_t;
/*! SCE file signature. */
typedef struct _signature
{
scetool::u8 r[SIGNATURE_R_SIZE];
scetool::u8 s[SIGNATURE_S_SIZE];
scetool::u8 padding[6];
} signature_t;
/*! Section info. */
typedef struct _section_info
{
scetool::u64 offset;
scetool::u64 size;
scetool::u32 compressed;
scetool::u32 unknown_0;
scetool::u32 unknown_1;
scetool::u32 encrypted;
} section_info_t;
/*! SCE version. */
typedef struct _sce_version
{
/*! Header type. */
scetool::u32 header_type;
/*! SCE version section present? */
scetool::u32 present;
/*! Size. */
scetool::u32 size;
scetool::u32 unknown_3;
} sce_version_t;
/*! SCE version data 0x30. */
typedef struct _sce_version_data_30
{
scetool::u16 unknown_1; //Dunno.
scetool::u16 unknown_2; //0x0001
scetool::u32 unknown_3; //Padding?
scetool::u32 unknown_4; //Number of sections?
scetool::u32 unknown_5; //Padding?
/*! Data offset. */
scetool::u64 offset;
/*! Data size. */
scetool::u64 size;
} sce_version_data_30_t;
//(auth_id & AUTH_ONE_MASK) has to be 0x1000000000000000
#define AUTH_ONE_MASK 0xF000000000000000
#define AUTH_TERRITORY_MASK 0x0FF0000000000000
#define VENDOR_TERRITORY_MASK 0xFF000000
#define VENDOR_ID_MASK 0x00FFFFFF
/*! Application info. */
typedef struct _app_info
{
/*! Auth ID. */
scetool::u64 auth_id;
/*! Vendor ID. */
scetool::u32 vendor_id;
/*! SELF type. */
scetool::u32 self_type;
/*! Version. */
scetool::u64 version;
/*! Padding. */
scetool::u64 padding;
} app_info_t;
/*! Control info. */
typedef struct _control_info
{
/*! Control info type. */
scetool::u32 type;
/*! Size of following data. */
scetool::u32 size;
/*! Next flag (1 if another info follows). */
scetool::u64 next;
} control_info_t;
#define CI_FLAG_00_80 0x80
#define CI_FLAG_00_40 0x40 //root access
#define CI_FLAG_00_20 0x20 //kernel access
#define CI_FLAG_17_01 0x01
#define CI_FLAG_17_02 0x02
#define CI_FLAG_17_04 0x04
#define CI_FLAG_17_08 0x08
#define CI_FLAG_17_10 0x10
//1B:
//bdj 0x01, 0x09
//psp_emu 0x08
//psp_transl 0x0C
#define CI_FLAG_1B_01 0x01 //may use shared mem?
#define CI_FLAG_1B_02 0x02
#define CI_FLAG_1B_04 0x04
#define CI_FLAG_1B_08 0x08 //ss
#define CI_FLAG_1F_SHAREABLE 0x01
#define CI_FLAG_1F_02 0x02 //internal?
#define CI_FLAG_1F_FACTORY 0x04
#define CI_FLAG_1F_08 0x08 //???
/*! Control info data flags. */
typedef struct _ci_data_flags
{
scetool::u8 data[0x20];
} ci_data_flags_t;
/*! Control info data digest 0x30. */
typedef struct _ci_data_digest_30
{
scetool::u8 digest[20];
scetool::u64 unknown_0;
} ci_data_digest_30_t;
/*! Control info data digest 0x40. */
typedef struct _ci_data_digest_40
{
scetool::u8 digest1[20];
scetool::u8 digest2[20];
scetool::u64 fw_version;
} ci_data_digest_40_t;
/*! Control info data NPDRM. */
typedef struct _ci_data_npdrm
{
/*! Magic. */
scetool::u32 magic;
scetool::u32 unknown_0;
/*! License type. */
scetool::u32 license_type;
/*! Application type. */
scetool::u32 app_type;
/*! Content ID. */
scetool::u8 content_id[0x30];
/*! Random padding. */
scetool::u8 rndpad[0x10];
/*! ContentID_FileName hash. */
scetool::u8 hash_cid_fname[0x10];
/*! Control info hash. */
scetool::u8 hash_ci[0x10];
scetool::u64 unknown_1;
scetool::u64 unknown_2;
} ci_data_npdrm_t;
/*! Optional header. */
typedef struct _opt_header
{
/*! Type. */
scetool::u32 type;
/*! Size. */
scetool::u32 size;
/*! Next flag (1 if another header follows). */
scetool::u64 next;
} opt_header_t;
/*! Capability flags. */
#define CAP_FLAG_1 0x01 //only seen in PPU selfs
#define CAP_FLAG_2 0x02 //only seen in PPU selfs
#define CAP_FLAG_4 0x04 //only seen in bdj PPU self
#define CAP_FLAG_REFTOOL 0x08
#define CAP_FLAG_DEBUG 0x10
#define CAP_FLAG_RETAIL 0x20
#define CAP_FLAG_SYSDBG 0x40
#define UNK7_2000 0x2000 //hddbind?
#define UNK7_20000 0x20000 //flashbind?
#define UNK7_40000 0x40000 //discbind?
#define UNK7_80000 0x80000
#define UNK7_PS3SWU 0x116000 //dunno...
/*! SCE file capability flags. */
typedef struct _oh_data_cap_flags
{
scetool::u64 unk3; //0
scetool::u64 unk4; //0
/*! Flags. */
scetool::u64 flags;
scetool::u32 unk6;
scetool::u32 unk7;
} oh_data_cap_flags_t;
/*! Section context. */
typedef struct _sce_section_ctxt
{
/*! Data buffer. */
void *buffer;
/*! Size. */
scetool::u32 size;
/*! Offset. */
scetool::u32 offset;
/*! May be compressed. */
BOOL may_compr;
} sce_section_ctxt_t;
typedef struct _makeself_ctxt
{
/*! ELF file buffer (for ELF -> SELF). */
scetool::u8 *elf;
/*! ELF file length. */
scetool::u32 elf_len;
/*! ELF header. */
void *ehdr;
/*! ELF header size. */
scetool::u32 ehsize;
/*! Program headers. */
void *phdrs;
/*! Program headers size. */
scetool::u32 phsize;
/*! Section headers. */
void *shdrs;
/*! Section headers size. */
scetool::u32 shsize;
/*! Section info count. */
scetool::u32 si_cnt;
/*! Number of section infos that are present as data sections. */
scetool::u32 si_sec_cnt;
} makeself_ctxt_t;
/*! SCE file buffer context. */
typedef struct _sce_buffer_ctxt
{
/*! SCE file buffer. */
scetool::u8 *scebuffer;
/*! SCE header. */
sce_header_t *sceh;
/*! File type dependent header. */
union
{
struct
{
/*! SELF header. */
self_header_t *selfh;
/*! Application info. */
app_info_t *ai;
/*! Section info. */
section_info_t *si;
/*! SCE version. */
sce_version_t *sv;
/*! Control infos. */
list_t *cis;
/*! Optional headers. */
list_t *ohs;
} self;
};
/*! Metadata info. */
metadata_info_t *metai;
/*! Metadata header. */
metadata_header_t *metah;
/*! Metadata section headers. */
metadata_section_header_t *metash;
/*! SCE file keys. */
scetool::u8 *keys;
/*! Keys length. */
scetool::u32 keys_len;
/*! Signature. */
signature_t *sig;
/*! Metadata decrypted? */
BOOL mdec;
/*! Data layout. */
/*! SCE header offset. */
scetool::u32 off_sceh;
union
{
struct
{
/*! SELF header offset. */
scetool::u32 off_selfh;
/*! Application info offset. */
scetool::u32 off_ai;
/*! ELF header offset. */
scetool::u32 off_ehdr;
/*! Program header offset. */
scetool::u32 off_phdr;
/*! Section info offset. */
scetool::u32 off_si;
/*! SCE version offset. */
scetool::u32 off_sv;
/*! Control infos offset. */
scetool::u32 off_cis;
/*! Optional headers offset. */
scetool::u32 off_ohs;
} off_self;
};
/*! Metadata info offset. */
scetool::u32 off_metai;
/*! Metadata header offset. */
scetool::u32 off_metah;
/*! Metadata section headers offset. */
scetool::u32 off_metash;
/*! Keys offset. */
scetool::u32 off_keys;
/*! Signature offset. */
scetool::u32 off_sig;
/*! Header padding end offset. */
scetool::u32 off_hdrpad;
/*! File creation type dependent data. */
union
{
/*! ELF -> SELF. */
makeself_ctxt_t *makeself;
};
/*! Data sections. */
list_t *secs;
} sce_buffer_ctxt_t;
/*! Create SCE file context from SCE file buffer. */
sce_buffer_ctxt_t *sce_create_ctxt_from_buffer(scetool::u8 *scebuffer);
/*! Create SCE file context for SELF creation. */
sce_buffer_ctxt_t *sce_create_ctxt_build_self(scetool::u8 *elf, scetool::u32 elf_len);
/*! Add data section to SCE context. */
void sce_add_data_section(sce_buffer_ctxt_t *ctxt, void *buffer, scetool::u32 size, BOOL may_compr);
/*! Set metadata section header. */
void sce_set_metash(sce_buffer_ctxt_t *ctxt, scetool::u32 type, BOOL encrypted, scetool::u32 idx);
/*! Compress data. */
void sce_compress_data(sce_buffer_ctxt_t *ctxt);
/*! Layout offsets for SCE file creation. */
void sce_layout_ctxt(sce_buffer_ctxt_t *ctxt);
/*! Encrypt context. */
BOOL sce_encrypt_ctxt(sce_buffer_ctxt_t *ctxt, scetool::u8 *keyset);
/*! Write context to file. */
BOOL sce_write_ctxt(sce_buffer_ctxt_t *ctxt, scetool::s8 *fname);
/*! Decrypt header (use passed metadata_into if not NULL). */
BOOL sce_decrypt_header(sce_buffer_ctxt_t *ctxt, scetool::u8 *metadata_info, scetool::u8 *keyset);
/*! Decrypt data. */
BOOL sce_decrypt_data(sce_buffer_ctxt_t *ctxt);
/*! Print SCE file info. */
void sce_print_info(FILE *fp, sce_buffer_ctxt_t *ctxt);
/*! Get version string from version. */
scetool::s8 *sce_version_to_str(scetool::u64 version);
/*! Get version from version string. */
scetool::u64 sce_str_to_version(scetool::s8 *version);
/*! Convert hex version to dec version. */
scetool::u64 sce_hexver_to_decver(scetool::u64 version);
/*! Get control info. */
control_info_t *sce_get_ctrl_info(sce_buffer_ctxt_t *ctxt, scetool::u32 type);
/*! Get optional header. */
opt_header_t *sce_get_opt_header(sce_buffer_ctxt_t *ctxt, scetool::u32 type);
#endif