Line 153: |
Line 153: |
| The order of the DIFI blobs is the order of the partitions in the image. | | The order of the DIFI blobs is the order of the partitions in the image. |
| | | |
− | '''DISA'''
| + | ==== DISA ==== |
| | | |
| * This is located @ 0x100 in the image, following the MAC header. | | * This is located @ 0x100 in the image, following the MAC header. |
Line 235: |
Line 235: |
| | | |
| * The hash in the DISA hashes the Active Table (starting from tables's offset to tables's offset + table length) with SHA256. | | * The hash in the DISA hashes the Active Table (starting from tables's offset to tables's offset + table length) with SHA256. |
− |
| |
| * The partition offsets are absolute offsets in the image. | | * The partition offsets are absolute offsets in the image. |
− |
| |
| * The SAVE partition offset is usually 0x1000. The SAVE/DATA partitions begins with the DPFS partitions, the relative offset for the IVFC partition data is specified by the DPFS header. | | * The SAVE partition offset is usually 0x1000. The SAVE/DATA partitions begins with the DPFS partitions, the relative offset for the IVFC partition data is specified by the DPFS header. |
| | | |
Line 244: |
Line 242: |
| The second table is for backup. | | The second table is for backup. |
| | | |
− | '''DIFF'''
| + | ==== DIFF ==== |
| | | |
| * This is the [[extdata]] equivalent of DISA, for extdata which use FS. DIFF is only used for extdata. | | * This is the [[extdata]] equivalent of DISA, for extdata which use FS. DIFF is only used for extdata. |
− |
| |
| * When the active-table field low 8-bits is non-zero, the primary partition is used. Otherwise, the secondary partition is used. | | * When the active-table field low 8-bits is non-zero, the primary partition is used. Otherwise, the secondary partition is used. |
| | | |
Line 293: |
Line 290: |
| |} | | |} |
| | | |
− | '''DIFI'''
| + | ==== DIFI ==== |
| | | |
| These 0x12C-byte blobs describe the partitions. Following each partition is an unused 0xFFFFFFFF cleartext word in the raw image. Every DIFI blob describes a partition. Partitions are catted together, so after the end of one partition is the beginning of the next. | | These 0x12C-byte blobs describe the partitions. Following each partition is an unused 0xFFFFFFFF cleartext word in the raw image. Every DIFI blob describes a partition. Partitions are catted together, so after the end of one partition is the beginning of the next. |
Line 300: |
Line 297: |
| | | |
| * 2 Partitions means that the files inside the SAVE partition is on the other partition (we would call it DATA partition). | | * 2 Partitions means that the files inside the SAVE partition is on the other partition (we would call it DATA partition). |
− |
| |
| * The DISA/DIFF headers support a maximum of 2 partitions. | | * The DISA/DIFF headers support a maximum of 2 partitions. |
| | | |
Line 350: |
Line 346: |
| |} | | |} |
| | | |
− | '''IVFC'''
| + | ==== IVFC ==== |
| | | |
| {| class="wikitable" | | {| class="wikitable" |
Line 367: |
Line 363: |
| |- | | |- |
| | 0x08 | | | 0x08 |
− | | 8 | + | | 0x8 |
− | | Unknown (0x20?) | + | | Master hash size |
| |- | | |- |
| | 0x10 | | | 0x10 |
− | | 8 | + | | 0x8 |
− | | First Hash Offset | + | | Level 1 logical offset |
| |- | | |- |
| | 0x18 | | | 0x18 |
− | | 8 | + | | 0x8 |
− | | First Hash Length | + | | Level 1 hashdata size |
| |- | | |- |
| | 0x20 | | | 0x20 |
− | | 8 | + | | 0x4 |
− | | First Hash Block Size (1<<value) | + | | Level 1 block size, in log2 |
| + | |- |
| + | | 0x24 |
| + | | 0x4 |
| + | | Reserved |
| |- | | |- |
| | 0x28 | | | 0x28 |
− | | 8 | + | | 0x8 |
− | | Second Hash Offset | + | | Level 2 logical offset |
| |- | | |- |
| | 0x30 | | | 0x30 |
− | | 8 | + | | 0x8 |
− | | Second Hash Length | + | | Level 2 hashdata size |
| |- | | |- |
| | 0x38 | | | 0x38 |
− | | 8 | + | | 0x4 |
− | | Second Hash Block Size (1<<value) | + | | Level 2 block size, in log2. |
| + | |- |
| + | | 0x3C |
| + | | 0x4 |
| + | | Reserved |
| |- | | |- |
| | 0x40 | | | 0x40 |
− | | 8 | + | | 0x8 |
− | | HashTable Offset | + | | Level 3 logical offset |
| |- | | |- |
| | 0x48 | | | 0x48 |
− | | 8 | + | | 0x8 |
− | | HashTable Length | + | | Level 3 hashdata size |
| |- | | |- |
| | 0x50 | | | 0x50 |
− | | 8 | + | | 0x4 |
− | | HashTable Block Size (1<<value) | + | | Level 3 block size, in log2. |
| + | |- |
| + | | 0x54 |
| + | | 0x4 |
| + | | Reserved |
| |- | | |- |
| | 0x58 | | | 0x58 |
| | 8 | | | 8 |
− | | FileSystem Offset | + | | Level 4 filesystem offset |
| |- | | |- |
| | 0x60 | | | 0x60 |
| | 8 | | | 8 |
− | | FileSystem Length | + | | Level 4 filesystem size |
| |- | | |- |
| | 0x68 | | | 0x68 |
| | 8 | | | 8 |
− | | FileSystem Block Size (1<<value) | + | | Level 4 filesystem block size, in log2. |
| |- | | |- |
| | 0x70 | | | 0x70 |
Line 424: |
Line 432: |
| |} | | |} |
| | | |
− | * The first-hash is a SHA256 hash over the second-hash, with the buffer which is hashed aligned to the second-hash 1<<x block-size.(Since the second-hash size is usually 0x20 and the 1<<block-size normally is 0x200, the final buffer size for second-hash is usually 0x200) | + | * This savegame IVFC is almost identical to the [[RomFS]] IVFC, except for the additional filesystem level. Exactly like RomFS, each level except level4 is a hash-table where each hash entry hashes the data in the next level, padded to the log2 block size. |
− | * The second-hash is a SHA256 hash over the hash-table, with the buffer which is hashed aligned to the hash-table 1<<x block-size.
| |
| | | |
− | '''DPFS'''
| + | ==== DPFS ==== |
| | | |
| {| class="wikitable" | | {| class="wikitable" |
Line 482: |
Line 489: |
| | | |
| * Every block this table point to is written twice (concatenated). You can see that the offset to the next block is twice the length (except the data which always begin after 0x1000). | | * Every block this table point to is written twice (concatenated). You can see that the offset to the next block is twice the length (except the data which always begin after 0x1000). |
− |
| |
| * The offsets contained in the DPFS and IVFC are relative to the partition offset in the DISA/DIFF. The offsets from the IVFC are additionally added with the IVFC partition offset from the DPFS. | | * The offsets contained in the DPFS and IVFC are relative to the partition offset in the DISA/DIFF. The offsets from the IVFC are additionally added with the IVFC partition offset from the DPFS. |
| | | |
Line 491: |
Line 497: |
| '''DIFI Hash''' | | '''DIFI Hash''' |
| | | |
− | The last 0x20-bytes of the partition following the DIFI, IVFC and DPFS is a SHA256 hash. The offset to this hash is stored in the DIFI. This hashes the IVFC first-hash, with the buffer which is hashed aligned to the first-hash 1<<x block-size. | + | The last 0x20-bytes of the partition following the DIFI, IVFC and DPFS is a SHA256 hash. The offset to this hash is stored in the DIFI. This hashes the IVFC level 1, with the buffer which is hashed aligned to the IVFC level 1 log2 block-size. |
| | | |
| '''Summary Drawing''' | | '''Summary Drawing''' |