rpcs3/scetool/sce.h

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