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.