Difference between revisions of "Title metadata"
Jump to navigation
Jump to search
(fixed content record) |
|||
Line 5: | Line 5: | ||
A "title" is a standalone entity -- a game, a channel, etc. Titles can be made up of multiple "contents". (Don't ask me I just work here.) | A "title" is a standalone entity -- a game, a channel, etc. Titles can be made up of multiple "contents". (Don't ask me I just work here.) | ||
− | + | Many operations are done in terms of 64-byte blocks, which means you will often see padding out to the nearest 64-byte boundary at the end of a field. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
typedef unsigned char u8; | typedef unsigned char u8; | ||
Line 29: | Line 20: | ||
} content_record; // size: 0x30 bytes | } content_record; // size: 0x30 bytes | ||
− | typedef struct{ | + | enum sig_type { |
− | + | RSA_2048 = 0x00010001, | |
− | + | RSA_4096 = 0x00010000 | |
− | + | }; | |
− | + | ||
− | + | typedef struct { | |
− | + | u32 sig_type; | |
− | + | u8 sig[256]; | |
− | + | u8 fill1[60]; | |
− | + | u8 issuer[64]; // Root-CA%08x-CP%08x | |
− | + | u8 version; | |
− | + | u8 ca_crl_version; | |
− | + | u8 signer_crl_version; | |
− | + | u8 fill2; | |
− | + | u64 sys_version; | |
− | + | u64 title_id; | |
− | + | u32 title_type; | |
− | + | u16 group_id; // publisher | |
− | + | u8 reserved[62]; | |
− | + | u32 access_rights; | |
− | + | u16 title_version; | |
− | + | u16 num_contents; | |
− | + | u16 boot_index; | |
− | + | u16 fill3; | |
− | + | content_record contents[num_contents]; | |
− | + | } tmd; | |
− | + | ||
− | + | The tmd is then followed by a chain of certificates, where each certificate is of the general form | |
− | + | ||
− | + | u32 sig_type; // | |
− | + | u8 sig[256]; // 256 for RSA_2048, 512 for RSA_4096 | |
− | + | u8 issuer[32]; | |
− | + | u32 tag; // identifies what is being signed | |
− | + | u8 name[64]; // name of thing being signed | |
+ | u8 key[...]; |
Revision as of 13:31, 16 January 2008
Nintendo Wii Title-Metadata (tmd) file structure
A "title" is a standalone entity -- a game, a channel, etc. Titles can be made up of multiple "contents". (Don't ask me I just work here.)
Many operations are done in terms of 64-byte blocks, which means you will often see padding out to the nearest 64-byte boundary at the end of a field.
typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; typedef unsigned long u64;
typedef struct { u32 cid; // content id u16 index; // # number of the file u16 type; u64 size; u8 hash [20]; // SHA1 hash content } content_record; // size: 0x30 bytes
enum sig_type {
RSA_2048 = 0x00010001, RSA_4096 = 0x00010000
};
typedef struct { u32 sig_type; u8 sig[256]; u8 fill1[60]; u8 issuer[64]; // Root-CA%08x-CP%08x u8 version; u8 ca_crl_version; u8 signer_crl_version; u8 fill2; u64 sys_version; u64 title_id; u32 title_type; u16 group_id; // publisher u8 reserved[62]; u32 access_rights; u16 title_version; u16 num_contents; u16 boot_index; u16 fill3; content_record contents[num_contents];
} tmd;
The tmd is then followed by a chain of certificates, where each certificate is of the general form
u32 sig_type; // u8 sig[256]; // 256 for RSA_2048, 512 for RSA_4096 u8 issuer[32]; u32 tag; // identifies what is being signed u8 name[64]; // name of thing being signed u8 key[...];