SPL services: Difference between revisions
No edit summary |
No edit summary |
||
(3 intermediate revisions by the same user not shown) | |||
Line 16: | Line 16: | ||
== GenerateRandomBytes == | == GenerateRandomBytes == | ||
Takes an output type-0xA buffer and fills it with random data from [[SMC# | Takes an output type-0xA buffer and fills it with random data from [[SMC#GenerateRandomBytes|GenerateRandomBytes SMC]]. Same command for "spl:" and "csrng" services, except for buffer-type. | ||
= spl: = | = spl: = | ||
Line 27: | Line 27: | ||
| 0 || [[#GetConfig]] | | 0 || [[#GetConfig]] | ||
|- | |- | ||
| 1 || [[# | | 1 || [[#ModularExponentiate]] | ||
|- | |- | ||
| 5 || [[#SetConfig]] | | 5 || [[#SetConfig]] | ||
Line 39: | Line 39: | ||
| 25 || [3.0.0+] [[#GetBootReason]] | | 25 || [3.0.0+] [[#GetBootReason]] | ||
|} | |} | ||
== GetConfig == | |||
Wrapper for [[SMC#GetConfig|GetConfig SMC]]. | |||
Takes an input u32 '''ConfigItem'''. Returns one or more output u64s '''ConfigValue'''. | |||
== ModularExponentiate == | |||
Wrapper for [[SMC#ModularExponentiate|ModularExponentiate SMC]]. | |||
Takes an output type-0xA buffer '''DataOut''' and 3 input type-0x9 buffers '''DataIn''', '''ExpIn''' and '''ModIn'''. | |||
Performs asymmetric crypto with user supplied modulus and exponent. | |||
== GenerateAesKek == | |||
Wrapper for [[SMC#GenerateAesKek|GenerateAesKek SMC]]. | |||
Takes an input 16-byte '''KeySource''' and two input u32s '''Generation''' and '''Option'''. Returns an output 16-byte '''AccessKey'''. | |||
== LoadAesKey == | |||
Wrapper for [[SMC#LoadAesKey|LoadAesKey SMC]]. | |||
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'''. | |||
[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. | |||
== GenerateAesKey == | |||
Takes an input 16-byte '''AccessKey''' and an input 16-byte '''KeySource'''. Returns an output 16-byte '''AesKey'''. | |||
Generates a new key by decrypting (AES-ECB) '''KeySource''' with a key generated from the supplied '''AccessKey''' and the key set with [[SMC#LoadAesKey|LoadAesKey SMC]]. | |||
[2.0.0+] Previously, it always used keyslot 0. Now it tries to allocate a keyslot to be used and returns 0xD01A if they're all busy. When the command is done, the keyslot is released. | |||
== SetConfig == | |||
Wrapper for [[SMC#SetConfig|SetConfig SMC]]. | |||
Takes an input u32 '''ConfigItem''' and an input u64 '''ConfigValue'''. | |||
Only '''ConfigItem''' 13 (IsChargerHiZModeEnabled) can be set. | |||
== DecryptAndStoreGcKey == | |||
Wrapper for [[SMC#DecryptAndImportLotusKey|DecryptAndImportLotusKey SMC]]. | |||
Takes an input type-0x9 buffer '''DataIn''', an input 16-byte '''AccessKey''', an input 16-byte '''KeySource''' and an input u32 '''Version''' (0 for normal keys or 1 for extended keys). | |||
Decrypts '''DataIn''' with a key generated from '''AccessKey''' and '''KeySource''' and imports it for later usage. | |||
[5.0.0+] The '''Version''' argument was removed and this now calls the [[SMC#ReencryptDeviceUniqueData|ReencryptDeviceUniqueData SMC]] instead. | |||
== DecryptGcMessage == | |||
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 [[#DecryptAndStoreGcKey]] and the supplied '''ModIn''' and '''LabelHashIn'''. | |||
== IsDevelopment == | |||
No input. Returns an output u8 bool. | |||
Uses [[#GetConfig]] internally. | |||
== GenerateSpecificAesKey == | |||
Wrapper for [[SMC#GenerateSpecificAesKey|GenerateSpecificAesKey SMC]]. | |||
Takes an input 16-byte '''KeySource''' and two input u32s '''Generation''' and '''Option'''. Returns an output 16-byte '''AesKey'''. | |||
== DecryptDeviceUniqueData == | |||
Wrapper for [[SMC#DecryptDeviceUniqueData|DecryptDeviceUniqueData SMC]]. | |||
Takes an output type-0xA buffer '''DataOut''', an input type-0x9 '''DataIn''', an input 16-byte '''AccessKey''', an input 16-byte '''KeySource''' and an input u32 '''Version''' (0 for normal keys or 1 for extended keys). | |||
Decrypts '''DataIn''' into '''DataOut''' with a key generated from '''AccessKey''' and '''KeySource'''. | |||
Used by [[SSL_services|SSL]] for TLS client-privk. | |||
[5.0.0+] The '''Version''' argument was removed. | |||
== DecryptAesKey == | |||
Takes an input 16-byte '''KeySource''' and two input u32s '''Generation''' and '''Option'''. Returns an output 16-byte '''AesKey'''. | |||
Decrypts (AES-ECB) '''KeySource''' with a key set with [[SMC#LoadAesKey|LoadAesKey SMC]]. | |||
[2.0.0+] Introduced same keyslot allocation code as for [[#GenerateAesKey]]. | |||
== ComputeCtr == | |||
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'''. | |||
[2.0.0+] Verifies the keyslot was allocated by the current session. | |||
== ComputeCmac == | |||
Wrapper for [[SMC#ComputeCmac|ComputeCmac SMC]]. | |||
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. | |||
== LoadEsDeviceKey == | |||
Wrapper for [[SMC#DecryptAndImportEsDeviceKey|DecryptAndImportEsDeviceKey SMC]]. | |||
Takes an input type-0x9 buffer '''DataIn''', an input 16-byte '''AccessKey''', an input 16-byte '''KeySource''' and an input u32 '''Version''' (0 for normal keys or 1 for extended keys). | |||
Decrypts '''DataIn''' with a key generated from '''AccessKey''' and '''KeySource''' and imports it for later usage. | |||
[5.0.0+] The '''Version''' argument was removed and this now calls the [[SMC#ReencryptDeviceUniqueData|ReencryptDeviceUniqueData SMC]] instead. | |||
== PrepareEsTitleKey == | |||
Wrapper for [[SMC#PrepareEsDeviceUniqueKey|PrepareEsDeviceUniqueKey SMC]]. | |||
Takes an output type-0xA buffer '''DataOut''' and 3 input type-0x9 buffers '''DataIn''', '''ModIn''' and '''LabelHashIn'''. Returns an output u32 '''DataOutSize'''. | |||
[3.0.0+] Now takes an input u32 '''Generation'''. | |||
Decrypts '''DataIn''' into '''DataOut''' using the private key imported with [[#LoadEsDeviceKey]] and the supplied '''ModIn'''. Afterwards, verifies RSA-OAEP encoding using '''LabelHashIn'''. | |||
== LoadPreparedAesKey == | |||
Wrapper for [[SMC#LoadPreparedAesKey|LoadPreparedAesKey SMC]]. | |||
Takes an input u32 '''KeySlot''' and an input 16-byte '''AccessKey'''. | |||
[2.0.0+] Verifies the keyslot was allocated in the current session. | |||
== PrepareCommonEsTitleKey == | |||
Wrapper for [[SMC#PrepareEsCommonKey|PrepareEsCommonKey SMC]]. | |||
Takes an input 16-byte '''KeySource'''. Returns an output 16-byte '''AccessKey'''. | |||
[3.0.0+] Now takes an input u32 '''Generation'''. | |||
== AllocateAesKeySlot == | |||
Returns an output u32 '''KeySlot'''. | |||
Returns error 0xD01A if all keyslots are taken. | |||
== DeallocateAesKeySlot == | |||
Takes an input u32 '''KeySlot'''. | |||
Returns error 0xD21A if the keyslot wasn't allocated by current session. | |||
== GetAesKeySlotAvailableEvent == | |||
Returns an output event handle for synchronizing with the AES keyslots. | |||
== SetBootReason == | |||
Takes an input u32 '''BootReason'''. | |||
[4.0.0+] Returns 0xD41A if a value has been previously set without being [[#GetBootReason|gotten]]. | |||
== GetBootReason == | |||
Returns an output u32 '''BootReason'''. | |||
[4.0.0+] Returns 0xD61A if a value has not previously been set and unsets the value after getting it. | |||
= spl:mig = | = spl:mig = | ||
Line 49: | Line 200: | ||
| 0 || [[#GetConfig]] | | 0 || [[#GetConfig]] | ||
|- | |- | ||
| 1 || [[# | | 1 || [[#ModularExponentiate]] | ||
|- | |- | ||
| 5 || [[#SetConfig]] | | 5 || [[#SetConfig]] | ||
Line 69: | Line 220: | ||
| 14 || [[#DecryptAesKey]] | | 14 || [[#DecryptAesKey]] | ||
|- | |- | ||
| 15 || [[# | | 15 || [[#ComputeCtr]] | ||
|- | |- | ||
| 16 || [[#ComputeCmac]] | | 16 || [[#ComputeCmac]] | ||
|- | |- | ||
| 21 || [2.0.0+] [[# | | 21 || [2.0.0+] [[#AllocateAesKeySlot]] | ||
|- | |- | ||
| 22 || [2.0.0+] [[# | | 22 || [2.0.0+] [[#DeallocateAesKeySlot]] | ||
|- | |- | ||
| 23 || [2.0.0+] [[# | | 23 || [2.0.0+] [[#GetAesKeySlotAvailableEvent]] | ||
|} | |} | ||
Line 89: | Line 240: | ||
| 0 || [[#GetConfig]] | | 0 || [[#GetConfig]] | ||
|- | |- | ||
| 1 || [[# | | 1 || [[#ModularExponentiate]] | ||
|- | |- | ||
| 5 || [[#SetConfig]] | | 5 || [[#SetConfig]] | ||
Line 109: | Line 260: | ||
| 14 || [[#DecryptAesKey]] | | 14 || [[#DecryptAesKey]] | ||
|- | |- | ||
| 15 || [[# | | 15 || [[#ComputeCtr]] | ||
|- | |- | ||
| 16 || [[#ComputeCmac]] | | 16 || [[#ComputeCmac]] | ||
|- | |- | ||
| 21 || [2.0.0+] [[# | | 21 || [2.0.0+] [[#AllocateAesKeySlot]] | ||
|- | |- | ||
| 22 || [2.0.0+] [[# | | 22 || [2.0.0+] [[#DeallocateAesKeySlot]] | ||
|- | |- | ||
| 23 || [2.0.0+] [[# | | 23 || [2.0.0+] [[#GetAesKeySlotAvailableEvent]] | ||
|- | |- | ||
| 9 || [[# | | 9 || [[#DecryptAndStoreGcKey]] | ||
|- | |- | ||
| 10 || [[# | | 10 || [[#DecryptGcMessage]] | ||
|- | |- | ||
| 12 || [[#GenerateSpecificAesKey]] | | 12 || [[#GenerateSpecificAesKey]] | ||
|- | |- | ||
| 19 || [[# | | 19 || [[#LoadPreparedAesKey]] | ||
|- | |- | ||
| 31 || [5.0.0+] GetPackage2Hash | | 31 || [5.0.0+] GetPackage2Hash | ||
Line 139: | Line 290: | ||
| 0 || [[#GetConfig]] | | 0 || [[#GetConfig]] | ||
|- | |- | ||
| 1 || [[# | | 1 || [[#ModularExponentiate]] | ||
|- | |- | ||
| 5 || [[#SetConfig]] | | 5 || [[#SetConfig]] | ||
Line 159: | Line 310: | ||
| 14 || [[#DecryptAesKey]] | | 14 || [[#DecryptAesKey]] | ||
|- | |- | ||
| 15 || [[# | | 15 || [[#ComputeCtr]] | ||
|- | |- | ||
| 16 || [[#ComputeCmac]] | | 16 || [[#ComputeCmac]] | ||
|- | |- | ||
| 21 || [2.0.0+] [[# | | 21 || [2.0.0+] [[#AllocateAesKeySlot]] | ||
|- | |- | ||
| 22 || [2.0.0+] [[# | | 22 || [2.0.0+] [[#DeallocateAesKeySlot]] | ||
|- | |- | ||
| 23 || [2.0.0+] [[# | | 23 || [2.0.0+] [[#GetAesKeySlotAvailableEvent]] | ||
|- | |- | ||
| 13 || [[# | | 13 || [[#DecryptDeviceUniqueData]] | ||
|- | |- | ||
| 26 || [5.0.0+] | | 26 || [5.0.0+] DecryptAndStoreSslClientCertKey | ||
|- | |- | ||
| 27 || [5.0.0+] | | 27 || [5.0.0+] ModularExponentiateWithSslClientCertKey | ||
|} | |} | ||
Line 185: | Line 336: | ||
| 0 || [[#GetConfig]] | | 0 || [[#GetConfig]] | ||
|- | |- | ||
| 1 || [[# | | 1 || [[#ModularExponentiate]] | ||
|- | |- | ||
| 5 || [[#SetConfig]] | | 5 || [[#SetConfig]] | ||
Line 205: | Line 356: | ||
| 14 || [[#DecryptAesKey]] | | 14 || [[#DecryptAesKey]] | ||
|- | |- | ||
| 15 || [[# | | 15 || [[#ComputeCtr]] | ||
|- | |- | ||
| 16 || [[#ComputeCmac]] | | 16 || [[#ComputeCmac]] | ||
|- | |- | ||
| 21 || [2.0.0+] [[# | | 21 || [2.0.0+] [[#AllocateAesKeySlot]] | ||
|- | |||
| 22 || [2.0.0+] [[#DeallocateAesKeySlot]] | |||
|- | |- | ||
| | | 23 || [2.0.0+] [[#GetAesKeySlotAvailableEvent]] | ||
|- | |- | ||
| | | 13 || [[#DecryptDeviceUniqueData]] | ||
|- | |- | ||
| | | 17 || [[#LoadEsDeviceKey]] | ||
|- | |- | ||
| | | 18 || [[#PrepareEsTitleKey]] | ||
|- | |- | ||
| | | 20 || [2.0.0+] [[#PrepareCommonEsTitleKey]] | ||
|- | |- | ||
| | | 28 || [5.0.0+] DecryptAndStoreDrmDeviceCertKey | ||
|- | |- | ||
| | | 29 || [5.0.0+] ModularExponentiateWithDrmDeviceCertKey | ||
|- | |- | ||
| | | 31 || [6.0.0+] PrepareEsArchiveKey | ||
|- | |- | ||
| | | 32 || [6.0.0+] [[#LoadPreparedAesKey]] | ||
|- | |- | ||
| | | 33 || [18.0.0+] | ||
|} | |} | ||
Line 241: | Line 394: | ||
| 0 || [[#GetConfig]] | | 0 || [[#GetConfig]] | ||
|- | |- | ||
| 1 || [[# | | 1 || [[#ModularExponentiate]] | ||
|- | |- | ||
| 5 || [[#SetConfig]] | | 5 || [[#SetConfig]] | ||
Line 261: | Line 414: | ||
| 14 || [[#DecryptAesKey]] | | 14 || [[#DecryptAesKey]] | ||
|- | |- | ||
| 15 || [[# | | 15 || [[#ComputeCtr]] | ||
|- | |- | ||
| 16 || [[#ComputeCmac]] | | 16 || [[#ComputeCmac]] | ||
|- | |- | ||
| 21 || [2.0.0+] [[# | | 21 || [2.0.0+] [[#AllocateAesKeySlot]] | ||
|- | |- | ||
| 22 || [2.0.0+] [[# | | 22 || [2.0.0+] [[#DeallocateAesKeySlot]] | ||
|- | |- | ||
| 23 || [2.0.0+] [[# | | 23 || [2.0.0+] [[#GetAesKeySlotAvailableEvent]] | ||
|- | |- | ||
| 13 || [[# | | 13 || [[#DecryptDeviceUniqueData]] | ||
|- | |- | ||
| 30 || [5.0.0+] | | 30 || [5.0.0+] ReencryptDeviceUniqueData | ||
|} | |} | ||
[[Category:Services]] | [[Category:Services]] |