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.