Archivos WAD
Se hacen referencias a be8, be16, be32 y be64. Esto indica que se deben usar estas funciones para convertir de big endian (PowerPC/Wii) a little endian (x86/PC).
Cabecera:
Longitud: Normalmente 0x20 (32) bytes
| Comienzo | Longitud (bytes) | Descripcion | 
| 0x0000 | 4 | Longitud de la cabecera (Usualmente 0x20 (32 bytes)) | 
| 0x0004 | 4 | Tipo de cabecera (be32) (Debe valer 0x49730000 o 0x69620000) | 
| 0x0008 | 4 | Longitud del certificado (be32) | 
| 0x000C | 4 | Valor = 0x00000000 | 
| 0x0010 | 4 | Longitud del Ticket (be32) | 
| 0x0014 | 4 | Longitud del TMD (be32) | 
| 0x0018 | 4 | Longitud del APP (be32) | 
| 0x001C | 4 | Longitud del Trailer (be32) | 
-- Alineamiento a 64 bytes --
Certificado
No doc
-- Alineamiento a 64 bytes --
Ticket
Start: 0x01bf Long: 16 bytes Title KEY cifrada con la master key (AES128)
Start: 0x01dc Long: 8 bytes IV (los otros 8 bytes son 0x00)
| Comienzo | Longitud (bytes) | Descripcion | 
| 0x0000 | 4 | Tipo de firma (siempre 0x10001 para RSA-2048 (por confirmar)) | 
| 0x0005 | 256 | Firma por una clave de certificado (todo despues de esto está cubierto por esta firma) | 
| 0x0140 | 64 | Sig Issuer | 
| 0x01BF | 16 | Clave de titulo cifrada (AES128-CBC) (Descifrar con master key + IV del siguiente campo) | 
| 0x01DC | 8 | Title ID / IV (AES128-CBC) (los 8 bytes restantes son 0) | 
| 0x0222 | 32 | Todos los bytes a 0xFF | 
-- Alineamiento a 64 bytes --
TMD
Tabla TMD
| Comienzo | Longitud (bytes) | Descripcion | 
| 0x0000 | 4 | Tipo de firma (0x00010001 para RSA 2048 y 0x00010000 para RSA 4096) (be32) | 
| 0x0004 | 256 | Firma (RSA2048) | 
| 0x0104 | 60 | Fill1 | 
| 0x0140 | 64 | Signature Issuer (Root-CA%08x-CP%08x) | 
| 0x0180 | 1 | Version (be8) | 
| 0x0181 | 1 | CA Control Version (be8) | 
| 0x0182 | 1 | Signer Control Version (be8) | 
| 0x0183 | 1 | Fill2 (be8) | 
| 0x0184 | 8 | System Version (be64) | 
| 0x018C | 8 | ID de titulo (title id) (be64) | 
| 0x0194 | 4 | Tipo de titulo (title type) (be32) | 
| 0x0198 | 2 | Group ID (Publicante/publisher) (be16) | 
| 0x019A | 62 | Reservado ? (Modificar para la firma trucha?) | 
| 0x01D8 | 4 | Derechos de acceso (access rights) (be32) | 
| 0x01DC | 2 | Version del titulo (be16) | 
| 0x01DE | 2 | Numero de ficheros (be16) | 
| 0x01E0 | 2 | Indice de arranque (boot index) (indice de fichero de arranque la aplicacion/canal?) (be16) | 
| 0x01E2 | 2 | Fill3 (be16) | 
Subtablas TMD para cada fichero que contenga el WAD (Offesets desde el principio de la TMD):
| Comienzo | Longitud (bytes) | Descripcion | 
| 0x01E4 + 0x24*n | 4 | Cid (be32) | 
| 0x01E8 + 0x24*n | 2 | Indice (be16) (AES128 IV, los otros 14 bytes son 0) | 
| 0x01EA+ 0x24*n | 2 | Tipo (be16) | 
| 0x01EC+ 0x24*n | 8 | Longitud del fichero (be64) | 
| 0x01F4+ 0x24*n | 20 | Hash SHA1 del fichero desencriptado | 
-- Alineamiento a 64 bytes --
APP
Eston son los ficheros xxxxxxxx.app y, en el WAD van cifrados con AES128-CBC y clave de titulo(Ticket) junto con el IV (TMD).
Van despues del TMD uno detras del otro (por el mismo orden que en la TMD) alineados a 0x40 (64 bytes).
Utilizar round_up(longitud_archivo, 0x40) para obtener el tamaño del fichero cifrado. El tamaño del fichero descifrado esta en el campo “Longitud del fichero” en la correspondiente subtabla de la TMD.
-- Alineamiento a 64 bytes --
Trailer
El mismo archivo que el primero de la seccion APPS sin cifrar.