From WiiBrew
Structure d'un fichier Nintendo Wii Title-Metadata (tmd)
Un "title" est une entité autonome - un jeu, une chaîne, etc... Les "titles" peuvent être composés de plusieurs "contenus".
Structure du fichier TMD
| *
| Longueur
| Description
|
| 0x000
| 4
| Type de la signature
|
| 0x004
| 256
| Signature
|
| 0x104
| 60
| Padding modulo 64
|
| 0x140
| 64
| Émetteur
|
| 0x180
| 1
| Version
|
| 0x181
| 1
| ca_crl_version
|
| 0x182
| 1
| signer_crl_version
|
| 0x183
| 1
| Padding modulo 64
|
| 0x184
| 8
| Version du système
|
| 0x18C
| 8
| ID du "title"
|
| 0x194
| 4
| Type du "title"
|
| 0x198
| 2
| ID du groupe
|
| 0x19A
| 62
| Reservé
|
| 0x1D8
| 4
| Droits d'accès
|
| 0x1DC
| 2
| Version du "title"
|
| 0x1DE
| 2
| Nombre de contenus (nbr_cont)
|
| 0x1E0
| 2
| index du boot
|
| 0x1E2
| 2
| Padding modulo 64
|
| 0x1E4
| 36*nbr_cont
| Contenus
|
Contenu
| *
| Longueur
| Description
|
| 0x00
| 4
| ID du contenu
|
| 0x04
| 2
| Index
|
| 0x06
| 2
| Type
|
| 0x08
| 8
| Taille
|
| 0x10
| 20
| SHA1 hash
|
Certificats
| *
| Longueur
| Description
|
| 0x000
| 4
| Type de signature
|
| 0x004
| 256
| Signature
|
| 0x104
| 32
| Émetteur
|
| 0x124
| 4
| Tag
|
| 0x128
| 64
| Nom
|
| 0x168
|
| Clé
|
Code d'application en C
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
/* Sur un système 32 bits, LONG vaut seulement 4 bytes */
typedef unsigned long u64;
typedef struct {
u32 cid; // ID du contenu
u16 index; // # Numéro du fichier
u16 type;
u64 size;
u8 hash [20]; // SHA1 hash content
} content_record; // size: 0x24 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; // éditeur
u8 reserved[62];
u32 access_rights;
u16 title_version;
u16 num_contents;
u16 boot_index;
u16 fill3;
content_record contents[num_contents];
} tmd;
Le TMD est suivi par une chaîne de certificats, où chaque certificat est de la forme générale.
u32 sig_type; //
u8 sig[256]; // 256 for RSA_2048, 512 for RSA_4096
u8 issuer[32];
u32 tag; // identifie ce qui est signé
u8 name[64]; // nom qui est signé
u8 key[...];