Title metadata: Difference between revisions
| No edit summary |  note discrepancy in endianness | ||
| (12 intermediate revisions by 4 users not shown) | |||
| Line 1: | Line 1: | ||
| [[Category:File formats]] | [[Category:File formats]] | ||
| '''Title metadata''' is a format used to store information about a title ( | '''Title metadata''' is a format used to store information about a title (installed title, DLC, etc.) and all its installed contents, including which contents they consist of and their SHA256 hashes. | ||
| [ | [https://bitbucket.org/trap15/3dshax Code is available] by trap15 to parse the available information from the 3DS format of TMDs. | ||
| == Structure == | == Structure == | ||
| All the data in the file represented in Big Endian. | All the data in the file represented in Big Endian, unless otherwise noted. | ||
| {| class="wikitable" | {| class="wikitable" | ||
| | align="center" style="background:#f0f0f0;"|'''Offset''' | | align="center" style="background:#f0f0f0;"|'''Offset''' | ||
| | align="center" style="background:#f0f0f0;"|'''Size''' | | align="center" style="background:#f0f0f0;"|'''Size''' | ||
| | align="center" style="background:#f0f0f0;"|'''Description''' | | align="center" style="background:#f0f0f0;"|'''Description''' | ||
| |- | |- | ||
| | '' | | 0x0||Y||Signature Data | ||
| |- | |||
| | Y ||0xC4||Header | |||
| |- | |||
| | 0xC4 + Y||0x24*64||Content Info Records. | |||
| |- | |||
| | 0x9C4 + Y||0x30*ContentCount||Content Chunk Records. | |||
| |} | |||
| Y denotes the total size of the "Signature Data" section and depends on the signature type. | |||
| === Signature Data === | |||
| The signature is of the header of the TMD. | |||
| {| class="wikitable" | |||
| | align="center" style="background:#f0f0f0;"|'''Offset''' | |||
| | align="center" style="background:#f0f0f0;"|'''Size''' | |||
| | align="center" style="background:#f0f0f0;"|'''Description''' | |||
| |- | |||
| | 0x0||0x4||Signature Type | |||
| |- | |||
| | 0x4 ||X||Signature | |||
| |- | |- | ||
| |  | | 0x4 + X|| ||Padding Aligning the signature data to 0x40 bytes | ||
| |} | |||
| ==== Signature Type ==== | |||
| {{Signature Types}} | |||
| The hash for the signature, is calculated over the header of the TMD | |||
| === Header === | |||
| {| class="wikitable" | |||
| | align="center" style="background:#f0f0f0;"|'''Offset''' | |||
| | align="center" style="background:#f0f0f0;"|'''Size''' | |||
| | align="center" style="background:#f0f0f0;"|'''Description''' | |||
| |- | |- | ||
| |  | | 0x0||0x40||Signature Issuer | ||
| |- | |- | ||
| |  | | 0x40||0x1||Version | ||
| |- | |- | ||
| |  | | 0x41||0x1||ca_crl_version | ||
| |- | |- | ||
| |  | | 0x42||0x1||signer_crl_version  | ||
| |- | |- | ||
| |  | | 0x43||0x1||Reserved | ||
| |- | |- | ||
| |  | | 0x44||0x8||System Version | ||
| |- | |- | ||
| |  | | 0x4C||0x8||Title ID | ||
| |- | |- | ||
| |  | | 0x54||0x4||Title Type | ||
| |- | |- | ||
| |  | | 0x58||0x2||Group ID | ||
| |- | |- | ||
| |  | | 0x5A||0x4||Save Data Size in Little Endian (Bytes) (Also SRL Public Save Data Size) | ||
| |- | |- | ||
| |  | | 0x5E||0x4||SRL Private Save Data Size in Little Endian (Bytes) | ||
| |- | |- | ||
| |  | | 0x62||0x4||Reserved | ||
| |- | |- | ||
| |  | | 0x66||0x1||SRL Flag | ||
| |- | |- | ||
| |  | | 0x67||0x31||Reserved | ||
| |- | |- | ||
| |  | | 0x98||0x4||Access Rights | ||
| |- | |- | ||
| |  | | 0x9C||0x2||Title Version | ||
| |- | |- | ||
| |  | | 0x9E||0x02||Content Count | ||
| |- | |- | ||
| |  | | 0xA0||0x2||Boot Content | ||
| |- | |- | ||
| |  | | 0xA2||0x2||Padding | ||
| |- | |- | ||
| |  | | 0xA4||0x20||SHA-256 Hash of the Content Info Records | ||
| |} | |} | ||
| === Content  | === Content Info Records === | ||
| There are 64 of these records, usually only the first is used. | |||
| {| class="wikitable" | {| class="wikitable" | ||
| |- | |- | ||
| Line 76: | Line 109: | ||
| |- | |- | ||
| | 0x04 | | 0x04 | ||
| |  | | 0x20 | ||
| | SHA-256 hash of the next k content records that have not been hashed yet | | SHA-256 hash of the next k content records that have not been hashed yet | ||
| |} | |} | ||
| === Content chunk records === | === Content chunk records === | ||
| There is one of these for each content contained in this title. (Determined by "Content Count" in the TMD Header). | |||
| {| class="wikitable" | {| class="wikitable" | ||
| |- | |- | ||
| Line 104: | Line 139: | ||
| |- | |- | ||
| | 0x10 | | 0x10 | ||
| |  | | 0x20 | ||
| | SHA-256 hash | | SHA-256 hash | ||
| |} | |} | ||
| === Content Index === | ==== Content Index ==== | ||
| This indicates the content type: | This indicates the content type: | ||
| Line 126: | Line 161: | ||
| |} | |} | ||
| === Content Type flags === | This does not apply to DLC. | ||
| ==== Content Type flags ==== | |||
| {| class="wikitable" | {| class="wikitable" | ||
| |- | |- | ||
| Line 149: | Line 186: | ||
| == Certificate Chain == | == Certificate Chain == | ||
| If the TMD file is obtained from Nintendo's CDN, then it will have two certificates appended at the end of the file: | If the TMD file is obtained from Nintendo's CDN, then it will have two [[Certificates|certificates]] appended at the end of the file: | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||