Line 1: |
Line 1: |
| [[Category:File formats]] | | [[Category:File formats]] |
− | '''Title metadata''' is a format used to store information about a title (a single standalone game, channel, etc.) and all its installed contents, including which contents they consist of and their SHA1 hashes. | + | '''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. |
| | | |
| [http://git.daifukkat.su/?p=3dshax.git Code is available] by trap15 to parse the available information from the 3DS format of TMDs. | | [http://git.daifukkat.su/?p=3dshax.git Code is available] by trap15 to parse the available information from the 3DS format of TMDs. |
Line 6: |
Line 6: |
| == Structure == | | == Structure == |
| | | |
− | All the data in the file represented in Big Endian. | + | All the data in the file represented in Big Endian. |
| | | |
− | === Header ===
| |
| {| class="wikitable" | | {| class="wikitable" |
| | align="center" style="background:#f0f0f0;"|'''Offset''' | | | align="center" style="background:#f0f0f0;"|'''Offset''' |
− | | align="center" style="background:#f0f0f0;"|''' '''
| |
| | align="center" style="background:#f0f0f0;"|'''Size''' | | | align="center" style="background:#f0f0f0;"|'''Size''' |
| | align="center" style="background:#f0f0f0;"|'''Description''' | | | align="center" style="background:#f0f0f0;"|'''Description''' |
| |- | | |- |
− | | ''RSA 2048''||''RSA 4096''|||| | + | | 0x0||Y||Signature Data |
| |- | | |- |
− | | 0x000||0x000||4||Signature type | + | | Y ||0xC4||Header |
| |- | | |- |
− | | 0x004||0x004||256 / 512||Signature | + | | 0xC4 + Y||0x24*64||Content Info Records. |
| |- | | |- |
− | | 0x104||0x204||60||Padding modulo 64 | + | | 0x9C4 + Y||0x30*ContentCount||Content Chunk Records. |
| + | |} |
| + | |
| + | === Signature Data === |
| + | The total size of this section is referred to as "Y" in the overall TMD structure. 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''' |
| |- | | |- |
− | | 0x140||0x240||64||Issuer | + | | 0x0||0x4||Signature Type |
| |- | | |- |
− | | 0x180||0x280||1||Version | + | | 0x4 ||X||Signature |
| |- | | |- |
− | | 0x181||0x281||1||ca_crl_version | + | | 0x4 + X|| ||Padding Aligning the signature data to 0x40 bytes |
| + | |} |
| + | |
| + | ==== Signature Type ==== |
| + | {| class="wikitable" |
| |- | | |- |
− | | 0x182||0x282||1||signer_crl_version
| + | ! Value |
| + | ! Signature Method |
| + | ! Signature Size (X) |
| |- | | |- |
− | | 0x183||0x283||1||Padding modulo 64 | + | | 0x010000 |
| + | | RSA_4096 SHA1 |
| + | | 0x200 |
| |- | | |- |
− | | 0x184||0x284||8||System Version | + | | 0x010001 |
| + | | RSA_2048 SHA1 |
| + | | 0x100 |
| |- | | |- |
− | | 0x18C||0x28C||8||Title ID | + | | 0x010002 |
| + | | Elliptic Curve |
| + | | 0x40 |
| |- | | |- |
− | | 0x194||0x294||4||Title type | + | | 0x010003 |
| + | | RSA_4096 SHA256 |
| + | | 0x200 |
| |- | | |- |
− | | 0x198||0x298||2||Group ID | + | | 0x010004 |
| + | | RSA_2048 SHA256 |
| + | | 0x100 |
| + | |} |
| + | |
| + | === 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 |
| |- | | |- |
− | | 0x19A||0x29A||62||reserved | + | | 0x54||0x4||Title Type |
| |- | | |- |
− | | 0x1D8||0x2D8||4||Access rights | + | | 0x58||0x2||Group ID |
| |- | | |- |
− | | 0x1DC||0x2DC||2||Title version | + | | 0x5A||0x3C||Reserved |
| |- | | |- |
− | | 0x1DE||0x2DE||2||Number of contents (contcount) | + | | 0x98||0x4||Access Rights |
| |- | | |- |
− | | 0x1E0||0x2E0||2||Boot content | + | | 0x9C||0x2||Title Version |
| |- | | |- |
− | | 0x1E2||0x2E2||2||Padding | + | | 0x9E||0x02||Content Count |
| |- | | |- |
− | | 0x1E4||0x2E4||32||SHA-256 hash of the 36*64 byte long content info record blob (next field) | + | | 0xA0||0x2||Boot Content |
| |- | | |- |
− | | 0x204||0x304||36*64||Content info records | + | | 0xA2||0x2||Padding |
| |- | | |- |
− | | 0xB04||0xC04||48*contcount|| Content chunk records | + | | 0xA4||0x20||SHA-256 Hash of the Content Info Records |
| |} | | |} |
| | | |
− | === Content info records === | + | === Content Info Records === |
| + | |
| + | There are 64 of these records, usually only the first is used. |
| + | |
| {| class="wikitable" | | {| class="wikitable" |
| |- | | |- |
Line 81: |
Line 128: |
| | | |
| === 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 153: |
| |- | | |- |
| | 0x10 | | | 0x10 |
− | | 32 | + | | 0x20 |
| | SHA-256 hash | | | SHA-256 hash |
| |} | | |} |
− | === Content Index === | + | ==== Content Index ==== |
| | | |
| This indicates the content type: | | This indicates the content type: |
Line 126: |
Line 175: |
| |} | | |} |
| | | |
− | === Content Type flags === | + | ==== Content Type flags ==== |
| {| class="wikitable" | | {| class="wikitable" |
| |- | | |- |