Line 40: |
Line 40: |
| | 0x0 | | | 0x0 |
| | 0x10 | | | 0x10 |
− | | Decrypted header's CTR. Also used to calculate the size of the entire package2 with the raw header: size = word2 ^ word3 ^ word0. | + | | Header's CTR, official code copies the pre-decryption CTR over the decrypted result. Also used as metadata. |
| |- | | |- |
| | 0x10 | | | 0x10 |
Line 129: |
Line 129: |
| Each section follows each other immediately and is encrypted with the same key used for encrypting the header. | | Each section follows each other immediately and is encrypted with the same key used for encrypting the header. |
| The section offsets are relative to a base, which is typically 0x80000000 pointing to the base of DRAM. | | The section offsets are relative to a base, which is typically 0x80000000 pointing to the base of DRAM. |
| + | |
| + | Before being decrypted, the encrypted header's CTR additionally encodes metadata used to validate package2's contents as follows: |
| + | * Size of the entire package2 with the raw header = ctr_word2 ^ ctr_word3 ^ ctr_word0 |
| + | * Metadata version field = ((ctr_word1 ^ (ctr_word1 >> 16)) & 0xFF) ^ (ctr_word1 >> 24) |
| + | |
| + | In [4.0.0], the metadata version field must be less or equal to 4. |
| | | |
| == Section 0 == | | == Section 0 == |
Line 135: |
Line 141: |
| == Section 1 == | | == Section 1 == |
| When decrypted, this section contains the built-in system modules encapsulated in a custom format. | | When decrypted, this section contains the built-in system modules encapsulated in a custom format. |
| + | |
| + | Note: On firmware [[8.0.0]] INI1 is contained within the Kernel and section 1 is empty with NULL SHA256 to match. |
| | | |
| === INI1 === | | === INI1 === |
Line 153: |
Line 161: |
| | 0x8 | | | 0x8 |
| | u32 | | | u32 |
− | | NumberProcesses | + | | NumberProcesses (Must be <0x51) |
| |- | | |- |
| | 0xC | | | 0xC |
Line 161: |
Line 169: |
| | | |
| ==== KIP1 ==== | | ==== KIP1 ==== |
− | Kernel internal process? | + | Kernel Initial Process. |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 199: |
Line 207: |
| | 0x1F | | | 0x1F |
| | u8 | | | u8 |
− | | Flags: bit0-2: compression-enable for each section, when set. Bit3: Is64Bit. Bit4: IsAddrSpace36Bit. Bit5: [2.0.0+] PoolPartitionId *. Bit6, Bit7: reserved (unused) | + | | Flags: bit0-2: compression-enable for each section, when set. Bit3: Is64Bit. Bit4: IsAddrSpace36Bit. Bit5: [2.0.0+] UseSystemPoolPartition (1: System, 0: Application). Bit6, Bit7: reserved (unused) |
| |- | | |- |
| | 0x20 | | | 0x20 |
Line 263: |
Line 271: |
| | 0x0205 | | | 0x0205 |
| |- | | |- |
− | | [[4.1.0]] | + | | [[3.0.0]] |
| + | | 0x4 |
| + | | 0x5 |
| + | | 0x0306 |
| + | |- |
| + | | [[3.0.2]] |
| + | | 0x5 |
| + | | 0x6 |
| + | | 0x0407 |
| + | |- |
| + | | [[4.0.0]] |
| | 0x6 | | | 0x6 |
| | 0x7 | | | 0x7 |
| | 0x0508 | | | 0x0508 |
| + | |- |
| + | | [[5.0.0]] |
| + | | 0x7 |
| + | | 0x8 |
| + | | 0x0609 |
| + | |- |
| + | | [[6.0.0]] |
| + | | 0x8 |
| + | | 0x9 |
| + | | 0x070A |
| + | |- |
| + | | [[6.2.0]] |
| + | | 0x9 |
| + | | 0xA |
| + | | 0x080B |
| + | |- |
| + | | [[7.0.0]] |
| + | | 0xA |
| + | | 0xB |
| + | | 0x090C |
| + | |- |
| + | | [[8.1.0]] |
| + | | 0xB |
| + | | 0xC |
| + | | 0x0A0D |
| + | |- |
| + | | [[9.0.0]] |
| + | | 0xC |
| + | | 0xD |
| + | | 0x0B0E |
| + | |- |
| + | | [[9.1.0]] |
| + | | 0xD |
| + | | 0xE |
| + | | 0x0C0F |
| |} | | |} |
| | | |