In memory of Ben “bushing” Byer, who passed away on Monday, February 8th, 2016.

Difference between revisions of "Title metadata"

From WiiBrew
Jump to navigation Jump to search
(fixed code areas)
Line 20: Line 20:
 
  } content_record; // size: 0x30 bytes
 
  } content_record; // size: 0x30 bytes
  
enum sig_type {
+
enum sig_type {
 
       RSA_2048 = 0x00010001,
 
       RSA_2048 = 0x00010001,
 
       RSA_4096 = 0x00010000
 
       RSA_4096 = 0x00010000
};
+
};
  
 
  typedef struct {
 
  typedef struct {
Line 45: Line 45:
 
         u16 fill3;
 
         u16 fill3;
 
         content_record contents[num_contents];
 
         content_record contents[num_contents];
} tmd;
+
} tmd;
  
 
The tmd is then followed by a chain of certificates, where each certificate is of the general form
 
The tmd is then followed by a chain of certificates, where each certificate is of the general form

Revision as of 19:13, 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[...];