Line 3:
Line 3:
== Nintendo Wii Title-Metadata (tmd) file structure ==
== 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.)
+
A "title" is a standalone entity -- a game, a channel, etc. Titles can be made up of multiple "contents".
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.
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.
Line 9:
Line 9:
=== TMD file structure ===
=== TMD file structure ===
==== Header ====
==== Header ====
−
{| style="border-collapse: collapse; padding: 0.2em 0.2em 0.2em 0.2em;"
+
{| class="wikitable"
|- style="background-color: #ddd;"
|- style="background-color: #ddd;"
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #cdc;" | '''Start'''
+
! Start
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ccc;" | '''Length'''
+
! Length
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dcc;" | '''Description'''
+
! Description
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x000
+
| 0x000
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4
+
| 4
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Signature type
+
| Signature type
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x004
+
| 0x004
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 256
+
| 256
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Signature
+
| Signature
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x104
+
| 0x104
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 60
+
| 60
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Padding modulo 64
+
| Padding modulo 64
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x140
+
| 0x140
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 64
+
| 64
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Issuer
+
| Issuer
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x180
+
| 0x180
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 1
+
| 1
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Version
+
| Version
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x181
+
| 0x181
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 1
+
| 1
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | ca_crl_version
+
| ca_crl_version
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x182
+
| 0x182
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 1
+
| 1
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | signer_crl_version
+
| signer_crl_version
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x183
+
| 0x183
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 1
+
| 1
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Padding modulo 64
+
| Padding modulo 64
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x184
+
| 0x184
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 8
+
| 8
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | System Version
+
| System Version
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x18C
+
| 0x18C
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 8
+
| 8
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Title ID
+
| Title ID
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x194
+
| 0x194
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4
+
| 4
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Title type
+
| Title type
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x198
+
| 0x198
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 2
+
| 2
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Group ID
+
| Group ID
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x19A
+
| 0x19A
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 62
+
| 62
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | reserved
+
| reserved
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x1D8
+
| 0x1D8
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4
+
| 4
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Access rights
+
| Access rights
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x1DC
+
| 0x1DC
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 2
+
| 2
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Title version
+
| Title version
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x1DE
+
| 0x1DE
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 2
+
| 2
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Number of contents (nbr_cont)
+
| Number of contents (nbr_cont)
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x1E0
+
| 0x1E0
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 2
+
| 2
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | boot index
+
| boot index
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x1E2
+
| 0x1E2
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 2
+
| 2
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Padding modulo 64
+
| Padding modulo 64
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x1E4
+
| 0x1E4
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 36*nbr_cont
+
| 36*nbr_cont
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Contents
+
| Contents
|}
|}
==== Content ====
==== Content ====
−
{| style="border-collapse: collapse; padding: 0.2em 0.2em 0.2em 0.2em;"
+
{| class="wikitable"
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #cdc;" | '''Start'''
+
! Start
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ccc;" | '''Length'''
+
! Length
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dcc;" | '''Description'''
+
! Description
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x00
+
| 0x00
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4
+
| 4
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Content ID
+
| Content ID
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x04
+
| 0x04
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 2
+
| 2
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Index
+
| Index
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x06
+
| 0x06
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 2
+
| 2
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Type
+
| Type
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x08
+
| 0x08
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 8
+
| 8
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Size
+
| Size
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x10
+
| 0x10
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 20
+
| 20
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | SHA1 hash
+
| SHA1 hash
|}
|}
+
==== Certificates ====
==== Certificates ====
−
{| style="border-collapse: collapse; padding: 0.2em 0.2em 0.2em 0.2em;"
+
{| class="wikitable"
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #cdc;" | '''Start'''
+
! Start
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ccc;" | '''Length'''
+
! Length
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dcc;" | '''Description'''
+
! Description
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x000
+
| 0x000
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4
+
| 4
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Signature type
+
| Signature type
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x004
+
| 0x004
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 256
+
| 256
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Signature
+
| Signature
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x104
+
| 0x104
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 32
+
| 32
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Issuer
+
| Issuer
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x124
+
| 0x124
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4
+
| 4
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Tag
+
| Tag
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x128
+
| 0x128
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 64
+
| 64
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Name
+
| Name
−
|- style="background-color: #ddd;"
+
|-
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x168
+
| 0x168
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" |
+
|
−
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Key
+
| Key
|}
|}