Line 60: |
Line 60: |
| Wrapper for [[SMC#LoadAesKey|LoadAesKey SMC]]. | | Wrapper for [[SMC#LoadAesKey|LoadAesKey SMC]]. |
| | | |
− | Takes an input u32 '''Keyslot''' , an input 16-byte '''AccessKey''' and an input 16-byte '''KeySource'''. | + | Takes an input u32 '''KeySlot''' , an input 16-byte '''AccessKey''' and an input 16-byte '''KeySource'''. |
| | | |
− | Sets the specified '''Keyslot''' with a key generated from '''AccessKey''' and '''KeySource'''. | + | Sets the specified '''KeySlot''' with a key generated from '''AccessKey''' and '''KeySource'''. |
| | | |
| [2.0.0+] Now verifies that the keyslot in use (0..3) is allocated by the current spl session, otherwise errors with 0xD21A. Previously, keyslot was hardcoded to 0. | | [2.0.0+] Now verifies that the keyslot in use (0..3) is allocated by the current spl session, otherwise errors with 0xD21A. Previously, keyslot was hardcoded to 0. |
Line 80: |
Line 80: |
| Only '''ConfigItem''' 13 (IsChargerHiZModeEnabled) can be set. | | Only '''ConfigItem''' 13 (IsChargerHiZModeEnabled) can be set. |
| | | |
− | == ImportLotusKey == | + | == DecryptAndStoreGcKey == |
| Wrapper for [[SMC#DecryptAndImportLotusKey|DecryptAndImportLotusKey SMC]]. | | Wrapper for [[SMC#DecryptAndImportLotusKey|DecryptAndImportLotusKey SMC]]. |
| | | |
Line 89: |
Line 89: |
| [5.0.0+] The '''Version''' argument was removed and this now calls the [[SMC#ReencryptDeviceUniqueData|ReencryptDeviceUniqueData SMC]] instead. | | [5.0.0+] The '''Version''' argument was removed and this now calls the [[SMC#ReencryptDeviceUniqueData|ReencryptDeviceUniqueData SMC]] instead. |
| | | |
− | == DecryptLotusMessage == | + | == DecryptGcMessage == |
| Takes 3 input type-0x9 buffers '''DataIn''', '''ModIn''' and '''LabelHashIn'''. | | Takes 3 input type-0x9 buffers '''DataIn''', '''ModIn''' and '''LabelHashIn'''. |
| | | |
− | Uses the [[SMC#ModularExponentiateByStorageKey|ModularExponentiateByStorageKey SMC]] to decrypt '''DataIn''' using the private key imported with [[#ImportLotusKey]] and the supplied '''ModIn''' and '''LabelHashIn'''. | + | Uses the [[SMC#ModularExponentiateByStorageKey|ModularExponentiateByStorageKey SMC]] to decrypt '''DataIn''' using the private key imported with [[#DecryptAndStoreGcKey]] and the supplied '''ModIn''' and '''LabelHashIn'''. |
| | | |
| == IsDevelopment == | | == IsDevelopment == |
Line 122: |
Line 122: |
| [2.0.0+] Introduced same keyslot allocation code as for [[#GenerateAesKey]]. | | [2.0.0+] Introduced same keyslot allocation code as for [[#GenerateAesKey]]. |
| | | |
− | == CryptAesCtr == | + | == ComputeCtr == |
− | Takes an output type-0x46 buffer '''DataOut''', an input u32 '''Keyslot''', an input type-0x45 buffer '''DataIn''' and an input 16-byte '''IvCtr'''. | + | Takes an output type-0x46 buffer '''DataOut''', an input u32 '''KeySlot''', an input type-0x45 buffer '''DataIn''' and an input 16-byte '''IvCtr'''. |
| | | |
− | Uses [[SMC#ComputeAes|ComputeAes SMC]] to decrypt '''DataIn''' into '''DataOut''' using the key set in the specified '''Keyslot'''. | + | Uses [[SMC#ComputeAes|ComputeAes SMC]] to decrypt '''DataIn''' into '''DataOut''' using the key set in the specified '''KeySlot'''. |
| | | |
| [2.0.0+] Verifies the keyslot was allocated by the current session. | | [2.0.0+] Verifies the keyslot was allocated by the current session. |
Line 132: |
Line 132: |
| Wrapper for [[SMC#ComputeCmac|ComputeCmac SMC]]. | | Wrapper for [[SMC#ComputeCmac|ComputeCmac SMC]]. |
| | | |
− | Takes an input type-0x9 buffer '''DataIn''' and an input u32 '''Keyslot'''. Returns an output 16-byte '''Cmac'''. | + | Takes an input type-0x9 buffer '''DataIn''' and an input u32 '''KeySlot'''. Returns an output 16-byte '''Cmac'''. |
| | | |
| [2.0.0+] Verifies the keyslot was allocated by the current session. | | [2.0.0+] Verifies the keyslot was allocated by the current session. |
| | | |
− | == ImportEsKey == | + | == LoadEsDeviceKey == |
| Wrapper for [[SMC#DecryptAndImportEsDeviceKey|DecryptAndImportEsDeviceKey SMC]]. | | Wrapper for [[SMC#DecryptAndImportEsDeviceKey|DecryptAndImportEsDeviceKey SMC]]. |
| | | |
Line 145: |
Line 145: |
| [5.0.0+] The '''Version''' argument was removed and this now calls the [[SMC#ReencryptDeviceUniqueData|ReencryptDeviceUniqueData SMC]] instead. | | [5.0.0+] The '''Version''' argument was removed and this now calls the [[SMC#ReencryptDeviceUniqueData|ReencryptDeviceUniqueData SMC]] instead. |
| | | |
− | == UnwrapTitleKey == | + | == PrepareEsTitleKey == |
| Wrapper for [[SMC#PrepareEsDeviceUniqueKey|PrepareEsDeviceUniqueKey SMC]]. | | Wrapper for [[SMC#PrepareEsDeviceUniqueKey|PrepareEsDeviceUniqueKey SMC]]. |
| | | |
Line 152: |
Line 152: |
| [3.0.0+] Now takes an input u32 '''Generation'''. | | [3.0.0+] Now takes an input u32 '''Generation'''. |
| | | |
− | Decrypts '''DataIn''' into '''DataOut''' using the private key imported with [[#ImportEsKey]] and the supplied '''ModIn'''. Afterwards, verifies RSA-OAEP encoding using '''LabelHashIn'''. | + | Decrypts '''DataIn''' into '''DataOut''' using the private key imported with [[#LoadEsDeviceKey]] and the supplied '''ModIn'''. Afterwards, verifies RSA-OAEP encoding using '''LabelHashIn'''. |
| | | |
− | == LoadTitleKey == | + | == LoadPreparedAesKey == |
| Wrapper for [[SMC#LoadPreparedAesKey|LoadPreparedAesKey SMC]]. | | Wrapper for [[SMC#LoadPreparedAesKey|LoadPreparedAesKey SMC]]. |
| | | |
− | Takes an input u32 '''Keyslot''' and an input 16-byte '''AccessKey'''. | + | Takes an input u32 '''KeySlot''' and an input 16-byte '''AccessKey'''. |
| | | |
| [2.0.0+] Verifies the keyslot was allocated in the current session. | | [2.0.0+] Verifies the keyslot was allocated in the current session. |
| | | |
− | == UnwrapCommonTitleKey == | + | == PrepareCommonEsTitleKey == |
| Wrapper for [[SMC#PrepareEsCommonKey|PrepareEsCommonKey SMC]]. | | Wrapper for [[SMC#PrepareEsCommonKey|PrepareEsCommonKey SMC]]. |
| | | |
Line 168: |
Line 168: |
| [3.0.0+] Now takes an input u32 '''Generation'''. | | [3.0.0+] Now takes an input u32 '''Generation'''. |
| | | |
− | == AllocateAesKeyslot == | + | == AllocateAesKeySlot == |
− | Returns an output u32 '''Keyslot'''. | + | Returns an output u32 '''KeySlot'''. |
| | | |
| Returns error 0xD01A if all keyslots are taken. | | Returns error 0xD01A if all keyslots are taken. |
| | | |
| == DeallocateAesKeySlot == | | == DeallocateAesKeySlot == |
− | Takes an input u32 '''Keyslot'''. | + | Takes an input u32 '''KeySlot'''. |
| | | |
| Returns error 0xD21A if the keyslot wasn't allocated by current session. | | Returns error 0xD21A if the keyslot wasn't allocated by current session. |
| | | |
− | == GetAesKeyslotAvailableEvent == | + | == GetAesKeySlotAvailableEvent == |
| Returns an output event handle for synchronizing with the AES keyslots. | | Returns an output event handle for synchronizing with the AES keyslots. |
| | | |
Line 190: |
Line 190: |
| | | |
| [4.0.0+] Returns 0xD61A if a value has not previously been set and unsets the value after getting it. | | [4.0.0+] Returns 0xD61A if a value has not previously been set and unsets the value after getting it. |
− |
| |
− | == LoadPreparedAesKey ==
| |
− | Same as [[#LoadTitleKey|LoadTitleKey]].
| |
| | | |
| = spl:mig = | | = spl:mig = |
Line 223: |
Line 220: |
| | 14 || [[#DecryptAesKey]] | | | 14 || [[#DecryptAesKey]] |
| |- | | |- |
− | | 15 || [[#CryptAesCtr]] | + | | 15 || [[#ComputeCtr]] |
| |- | | |- |
| | 16 || [[#ComputeCmac]] | | | 16 || [[#ComputeCmac]] |
| |- | | |- |
− | | 21 || [2.0.0+] [[#AllocateAesKeyslot]] | + | | 21 || [2.0.0+] [[#AllocateAesKeySlot]] |
| |- | | |- |
| | 22 || [2.0.0+] [[#DeallocateAesKeySlot]] | | | 22 || [2.0.0+] [[#DeallocateAesKeySlot]] |
| |- | | |- |
− | | 23 || [2.0.0+] [[#GetAesKeyslotAvailableEvent]] | + | | 23 || [2.0.0+] [[#GetAesKeySlotAvailableEvent]] |
| |} | | |} |
| | | |
Line 263: |
Line 260: |
| | 14 || [[#DecryptAesKey]] | | | 14 || [[#DecryptAesKey]] |
| |- | | |- |
− | | 15 || [[#CryptAesCtr]] | + | | 15 || [[#ComputeCtr]] |
| |- | | |- |
| | 16 || [[#ComputeCmac]] | | | 16 || [[#ComputeCmac]] |
| |- | | |- |
− | | 21 || [2.0.0+] [[#AllocateAesKeyslot]] | + | | 21 || [2.0.0+] [[#AllocateAesKeySlot]] |
| |- | | |- |
| | 22 || [2.0.0+] [[#DeallocateAesKeySlot]] | | | 22 || [2.0.0+] [[#DeallocateAesKeySlot]] |
| |- | | |- |
− | | 23 || [2.0.0+] [[#GetAesKeyslotAvailableEvent]] | + | | 23 || [2.0.0+] [[#GetAesKeySlotAvailableEvent]] |
| |- | | |- |
− | | 9 || [[#ImportLotusKey]] | + | | 9 || [[#DecryptAndStoreGcKey]] |
| |- | | |- |
− | | 10 || [[#DecryptLotusMessage]] | + | | 10 || [[#DecryptGcMessage]] |
| |- | | |- |
| | 12 || [[#GenerateSpecificAesKey]] | | | 12 || [[#GenerateSpecificAesKey]] |
| |- | | |- |
− | | 19 || [[#LoadTitleKey]] | + | | 19 || [[#LoadPreparedAesKey]] |
| |- | | |- |
| | 31 || [5.0.0+] GetPackage2Hash | | | 31 || [5.0.0+] GetPackage2Hash |
Line 313: |
Line 310: |
| | 14 || [[#DecryptAesKey]] | | | 14 || [[#DecryptAesKey]] |
| |- | | |- |
− | | 15 || [[#CryptAesCtr]] | + | | 15 || [[#ComputeCtr]] |
| |- | | |- |
| | 16 || [[#ComputeCmac]] | | | 16 || [[#ComputeCmac]] |
| |- | | |- |
− | | 21 || [2.0.0+] [[#AllocateAesKeyslot]] | + | | 21 || [2.0.0+] [[#AllocateAesKeySlot]] |
| |- | | |- |
| | 22 || [2.0.0+] [[#DeallocateAesKeySlot]] | | | 22 || [2.0.0+] [[#DeallocateAesKeySlot]] |
| |- | | |- |
− | | 23 || [2.0.0+] [[#GetAesKeyslotAvailableEvent]] | + | | 23 || [2.0.0+] [[#GetAesKeySlotAvailableEvent]] |
| |- | | |- |
| | 13 || [[#DecryptDeviceUniqueData]] | | | 13 || [[#DecryptDeviceUniqueData]] |
Line 359: |
Line 356: |
| | 14 || [[#DecryptAesKey]] | | | 14 || [[#DecryptAesKey]] |
| |- | | |- |
− | | 15 || [[#CryptAesCtr]] | + | | 15 || [[#ComputeCtr]] |
| |- | | |- |
| | 16 || [[#ComputeCmac]] | | | 16 || [[#ComputeCmac]] |
| |- | | |- |
− | | 21 || [2.0.0+] [[#AllocateAesKeyslot]] | + | | 21 || [2.0.0+] [[#AllocateAesKeySlot]] |
| |- | | |- |
| | 22 || [2.0.0+] [[#DeallocateAesKeySlot]] | | | 22 || [2.0.0+] [[#DeallocateAesKeySlot]] |
| |- | | |- |
− | | 23 || [2.0.0+] [[#GetAesKeyslotAvailableEvent]] | + | | 23 || [2.0.0+] [[#GetAesKeySlotAvailableEvent]] |
| |- | | |- |
| | 13 || [[#DecryptDeviceUniqueData]] | | | 13 || [[#DecryptDeviceUniqueData]] |
| |- | | |- |
− | | 17 || [[#ImportEsKey]] | + | | 17 || [[#LoadEsDeviceKey]] |
| |- | | |- |
− | | 18 || [[#UnwrapTitleKey]] | + | | 18 || [[#PrepareEsTitleKey]] |
| |- | | |- |
− | | 20 || [2.0.0+] [[#PrepareEsCommonKey]] | + | | 20 || [2.0.0+] [[#PrepareCommonEsTitleKey]] |
| |- | | |- |
| | 28 || [5.0.0+] DecryptAndStoreDrmDeviceCertKey | | | 28 || [5.0.0+] DecryptAndStoreDrmDeviceCertKey |
Line 417: |
Line 414: |
| | 14 || [[#DecryptAesKey]] | | | 14 || [[#DecryptAesKey]] |
| |- | | |- |
− | | 15 || [[#CryptAesCtr]] | + | | 15 || [[#ComputeCtr]] |
| |- | | |- |
| | 16 || [[#ComputeCmac]] | | | 16 || [[#ComputeCmac]] |
| |- | | |- |
− | | 21 || [2.0.0+] [[#AllocateAesKeyslot]] | + | | 21 || [2.0.0+] [[#AllocateAesKeySlot]] |
| |- | | |- |
| | 22 || [2.0.0+] [[#DeallocateAesKeySlot]] | | | 22 || [2.0.0+] [[#DeallocateAesKeySlot]] |
| |- | | |- |
− | | 23 || [2.0.0+] [[#GetAesKeyslotAvailableEvent]] | + | | 23 || [2.0.0+] [[#GetAesKeySlotAvailableEvent]] |
| |- | | |- |
| | 13 || [[#DecryptDeviceUniqueData]] | | | 13 || [[#DecryptDeviceUniqueData]] |