In memory of Ben “bushing” Byer, who passed away on Monday, February 8th, 2016.

Difference between revisions of "Ticket"

From WiiBrew
Jump to navigation Jump to search
m (→‎File structure: linked certificate chain)
(Split ticket into ticket and ticket view (feel free to correct the offsets, I probably messed up at least one but the lengths are fine))
Line 11: Line 11:
 
! Description
 
! Description
 
|-
 
|-
| 0x0000
+
| 0x000
| 0x0003
+
| 0x003
| 0x04
+
| 0x004
 
| Signature type (always 0x10001 for RSA-2048)
 
| Signature type (always 0x10001 for RSA-2048)
 
|-
 
|-
| 0x0004
+
| 0x004
| 0x0103
+
| 0x103
 
| 0x100
 
| 0x100
| Signature by a [[certificate chain|certificate's]] key
+
| Signature of ticket view by a [[certificate chain|certificate's]] key
 
|-
 
|-
| 0x0104
+
| 0x104
| 0x013F
+
| 0x2A3
| 0x3C
+
| 0x19F
 +
| Ticket view
 +
|}
 +
 
 +
=== Ticket view ===
 +
{| class="wikitable"
 +
|-
 +
! Start
 +
! End
 +
! Length
 +
! Description
 +
|-
 +
| 0x000
 +
| 0x03B
 +
| 0x03C
 
| Padding (Always 0 - everything after this field is covered by the above signature)
 
| Padding (Always 0 - everything after this field is covered by the above signature)
 
|-
 
|-
| 0x0140
+
| 0x03C
| 0x017F
+
| 0x07B
| 0x40
+
| 0x040
 
| Signature issuer
 
| Signature issuer
 
|-
 
|-
| 0x0180
+
| 0x07B
| 0x01BB
+
| 0x0B7
| 0x3C
+
| 0x03C
 
| ECDH data, used to generate one-time key during install of console specific titles
 
| ECDH data, used to generate one-time key during install of console specific titles
 
|-
 
|-
| 0x01BC
+
| 0x0B7
| 0x01BE
+
| 0x0BA
| 0x03
+
| 0x003
 
| Unused/Padding
 
| Unused/Padding
 
|-
 
|-
| 0x01BF
+
| 0x0BA
| 0x01CE
+
| 0x0CA
| 0x10
+
| 0x010
 
| Title Key, encrypted by Common Key
 
| Title Key, encrypted by Common Key
 
|-
 
|-
| 0x01CF
+
| 0x0CA
| 0x01CF
+
| 0x0CA
| 0x01
+
| 0x001
 
| Unknown
 
| Unknown
 
|-
 
|-
| 0x01D0
+
| 0x0CA
| 0x01D7
+
| 0x0D2
| 0x08
+
| 0x008
 
| ticket_id (used as IV for title key decryption of console specific titles)
 
| ticket_id (used as IV for title key decryption of console specific titles)
 
 
|-
 
|-
| 0x01D8
+
| 0x0D2
| 0x01DB
+
| 0x0D6
| 0x04
+
| 0x004
 
| Console ID
 
| Console ID
 
|-
 
|-
| 0x01DC
+
| 0x0D6
| 0x01E3
+
| 0x0DE
| 0x08
+
| 0x008
 
| Title ID / [http://en.wikipedia.org/wiki/Initialization_Vector Initialization Vector] (IV) used for AES-[http://en.wikipedia.org/wiki/Cipher_Block_Chaining#Cipher-block_chaining_.28CBC.29 CBC] encryption
 
| Title ID / [http://en.wikipedia.org/wiki/Initialization_Vector Initialization Vector] (IV) used for AES-[http://en.wikipedia.org/wiki/Cipher_Block_Chaining#Cipher-block_chaining_.28CBC.29 CBC] encryption
 
|-
 
|-
| 0x01E4
+
| 0x0DE
| 0x01E5
+
| 0x0E0
| 0x02
+
| 0x002
 
| Unknown, mostly 0xFFFF
 
| Unknown, mostly 0xFFFF
 
|-
 
|-
| 0x01E6
+
| 0x0E0
| 0x01E7
+
| 0x0E2
| 0x02
+
| 0x002
 
| Ticket title version
 
| Ticket title version
 
|-
 
|-
| 0x01E8
+
| 0x0E2
| 0x01EB
+
| 0x0E4
| 0x04
+
| 0x002
 
| Permitted Titles Mask
 
| Permitted Titles Mask
 
|-
 
|-
| 0x01EC
+
| 0x0E4
| 0x01EF
+
| 0x0E8
| 0x04
+
| 0x004
 
| Permit mask. The current disc title is ANDed with the inverse of this mask to see if the result matches the Permitted Titles Mask.
 
| Permit mask. The current disc title is ANDed with the inverse of this mask to see if the result matches the Permitted Titles Mask.
 
|-
 
|-
| 0x01F0
+
| 0x0E8
| 0x01F0
+
| 0x0E9
| 0x01
+
| 0x001
 
| Title Export allowed using PRNG key (1 = allowed, 0 = not allowed)
 
| Title Export allowed using PRNG key (1 = allowed, 0 = not allowed)
 
|-
 
|-
| 0x01F1
+
| 0x0E9
| 0x01F1
+
| 0x0EA
| 0x01
+
| 0x001
 
| Common Key index (2 = [http://wiiubrew.org/wiki/WiiMode Wii U Wii mode], 1 = Korean Common key, 0 = "normal" Common key)
 
| Common Key index (2 = [http://wiiubrew.org/wiki/WiiMode Wii U Wii mode], 1 = Korean Common key, 0 = "normal" Common key)
 
|-
 
|-
| 0x01F2
+
| 0x0EB
| 0x0221
+
| 0x11B
| 0x30
+
| 0x030
 
| Unknown. Is all 0 for non-VC, for VC, all 0 except last byte is 1.
 
| Unknown. Is all 0 for non-VC, for VC, all 0 except last byte is 1.
 
|-
 
|-
| 0x0222
+
| 0x11B
| 0x0261
+
| 0x15B
| 0x40
+
| 0x040
 
| Content access permissions (one bit for each content)
 
| Content access permissions (one bit for each content)
 
|-
 
|-
| 0x0262
+
| 0x15B
| 0x0263
+
| 0x15D
| 0x02
+
| 0x002
 
| Padding (Always 0)
 
| Padding (Always 0)
 
|-
 
|-
| 0x0264
+
| 0x15D
| 0x0267
+
| 0x161
| 0x04
+
| 0x004
 
| Enable time limit (1 = Enabled, 0 = Disabled)
 
| Enable time limit (1 = Enabled, 0 = Disabled)
 
|-
 
|-
| 0x0268
+
| 0x161
| 0x026B
+
| 0x165
| 0x04
+
| 0x004
 
| Time limit (Seconds)
 
| Time limit (Seconds)
 
|-
 
|-
| 0x026C
+
| 0x165
| 0x02A3
+
| 0x19D
| 0x38
+
| 0x038
 
| 7 more time_limit structs as above ({int enable, seconds})
 
| 7 more time_limit structs as above ({int enable, seconds})
 
|}
 
|}

Revision as of 04:54, 21 July 2021

Tickets are found in many encrypted files used by the Wii (e.g. WAD Files or Wii Discs). Tickets for NAND titles are stored in /ticket, while tickets for discs are stored on the disc itself. Tickets contain the encrypted AES "title key" and the Title ID of the data and are signed by a certificate from a certificate chain (which usually is the same for all titles and stored somewhere on the NAND). So far only tickets with RSA-2048 signatures have been seen. Discs will only work with those signatures because the size of partition ticket is always 0x2a4.

While all Wii titles are available on NUS, most are encrypted with a key found in the ticket; this key is what is purchased with the Wii Shop Channel. Deleting a title using the data management feature of the System Menu leaves the ticket intact; this is responsible for allowing software to be redownloaded. However, tools such as AnyTitle Deleter delete tickets when they delete titles, which removes all traces of the title.

File structure

Start End Length Description
0x000 0x003 0x004 Signature type (always 0x10001 for RSA-2048)
0x004 0x103 0x100 Signature of ticket view by a certificate's key
0x104 0x2A3 0x19F Ticket view

Ticket view

Start End Length Description
0x000 0x03B 0x03C Padding (Always 0 - everything after this field is covered by the above signature)
0x03C 0x07B 0x040 Signature issuer
0x07B 0x0B7 0x03C ECDH data, used to generate one-time key during install of console specific titles
0x0B7 0x0BA 0x003 Unused/Padding
0x0BA 0x0CA 0x010 Title Key, encrypted by Common Key
0x0CA 0x0CA 0x001 Unknown
0x0CA 0x0D2 0x008 ticket_id (used as IV for title key decryption of console specific titles)
0x0D2 0x0D6 0x004 Console ID
0x0D6 0x0DE 0x008 Title ID / Initialization Vector (IV) used for AES-CBC encryption
0x0DE 0x0E0 0x002 Unknown, mostly 0xFFFF
0x0E0 0x0E2 0x002 Ticket title version
0x0E2 0x0E4 0x002 Permitted Titles Mask
0x0E4 0x0E8 0x004 Permit mask. The current disc title is ANDed with the inverse of this mask to see if the result matches the Permitted Titles Mask.
0x0E8 0x0E9 0x001 Title Export allowed using PRNG key (1 = allowed, 0 = not allowed)
0x0E9 0x0EA 0x001 Common Key index (2 = Wii U Wii mode, 1 = Korean Common key, 0 = "normal" Common key)
0x0EB 0x11B 0x030 Unknown. Is all 0 for non-VC, for VC, all 0 except last byte is 1.
0x11B 0x15B 0x040 Content access permissions (one bit for each content)
0x15B 0x15D 0x002 Padding (Always 0)
0x15D 0x161 0x004 Enable time limit (1 = Enabled, 0 = Disabled)
0x161 0x165 0x004 Time limit (Seconds)
0x165 0x19D 0x038 7 more time_limit structs as above ({int enable, seconds})

To get the title key decrypt the 16 bytes at offset 0x1bf with the Common Key using the Title ID (offset 0x1dc) as the initialization vector (the last 8 bytes of the IV should be zero).