SPL services: Difference between revisions
From "nn::spl::DecryptAesKey" |
No edit summary |
||
Line 19: | Line 19: | ||
! Cmd || Name || Notes | ! Cmd || Name || Notes | ||
|- | |- | ||
| 0 || [[#GetConfig]] || | | 0 || [[#GetConfig]] || Wrapper for [[SMC#GetConfig|GetConfig]]. | ||
|- | |- | ||
| 1 || || | | 1 || [[#UserExpMod]] || User supplied modulus and exponent. | ||
|- | |- | ||
| 2 || [[#GenerateAesKek]] || | | 2 || [[#GenerateAesKek]] || Wrapper for [[SMC#KeygenAndSealX|KeygenAndSealX]]. | ||
|- | |- | ||
| 3 || [[#LoadAesKey]] || | | 3 || [[#LoadAesKey]] || Wrapper for [[SMC#SetKeyslotFromXY|SetKeyslotFromXY]]. | ||
|- | |- | ||
| 4 || [[#GenerateAesKey]] || | | 4 || [[#GenerateAesKey]] || Decrypts 0x10 bytes using AES ECB and uses [[SMC#SetKeyslotFromXY|SetKeyslotFromXY]] with a fixed Y. | ||
|- | |- | ||
| 5 || [[#SetConfig]] || | | 5 || [[#SetConfig]] || Wrapper for [[SMC#SetConfig|SetConfig]]. | ||
|- | |- | ||
| 7 || [[#GetRandomBytes]] || | | 7 || [[#GetRandomBytes]] || Uses [[SMC#PrngX931|PrngX931]]. | ||
|- | |- | ||
| 9 || || | | 9 || [[#DecryptImportPrivkForExpMod0]] || Wrapper for [[SMC#ImportParamsForFWithXY|ImportParamsForFWithXY]]. | ||
|- | |- | ||
| 10 || || | | 10 || [[#ExpMod0]] || Wrapper for [[SMC#ExpMod|ExpMod]]. | ||
|- | |- | ||
| 11 || [[#IsDevelopment]] || | | 11 || [[#IsDevelopment]] || | ||
|- | |- | ||
| 12 || GenerateSpecificAesKey || | | 12 || [[#GenerateSpecificAesKey]] || Wrapper for [[SMC#KeygenA|KeygenA]]. | ||
|- | |- | ||
| 13 || [[# | | 13 || [[#DecryptPrivk]] || Wrapper for [[SMC#DecryptExpModParamsWithXY|DecryptExpModParamsWithXY]]. | ||
|- | |- | ||
| 14 || [[#DecryptAesKey]] || | | 14 || [[#DecryptAesKey]] || Decrypts 0x10 bytes using AES ECB and uses [[SMC#SetKeyslotFromXY|SetKeyslotFromXY]] with fixed X and Y. | ||
|- | |- | ||
| 15 || [[#DecryptAesCtr]] || | | 15 || [[#DecryptAesCtr]] || Wrapper for [[SMC#SymmetricCrypto|SymmetricCrypto]]. | ||
|- | |- | ||
| 16 || [[#ComputeCmac]] || | | 16 || [[#ComputeCmac]] || Wrapper for [[SMC#CMAC|CMAC]]. | ||
|- | |- | ||
| 17 || || | | 17 || [[#DecryptImportPrivkForExpMod1]] || Wrapper for [[SMC#ImportParamsFor10WithXY|ImportParamsFor10WithXY]]. | ||
|- | |- | ||
| 18 || || | | 18 || [[#ExpMod1]] || Wrapper for [[SMC#ExpModAndKeygenAndSealZ|ExpModAndKeygenAndSealZ]]. | ||
|- | |- | ||
| 19 || [[# | | 19 || [[#LoadRsaKey]] || Wrapper for [[SMC#SetKeyslotFromZ|SetKeyslotFromZ]]. | ||
|- | |- | ||
| 20 || [ | | 20 || [[#GenerateRsaKek]] || Wrapper for [[SMC#KeygenAndSealZ|KeygenAndSealZ]]. [2.0.0+] only. | ||
|- | |- | ||
| 21 || [2.0.0+] | | 21 || [[#LockAesEngine]] || [2.0.0+] only. | ||
|- | |- | ||
| 22 || [2.0.0+] | | 22 || [[#UnlockAesEngine]] || [2.0.0+] only. | ||
|- | |- | ||
| 23 || [2.0.0+] | | 23 || [[#GetSplWaitEvent]] || [2.0.0+] only. | ||
|} | |} | ||
== GetConfig == | == GetConfig == | ||
Takes | Takes a u32 ('''ConfigItem'''), and returns a u64 ('''ConfigVal'''). | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 149: | Line 149: | ||
Kernel reads id12 when setting up memory-related code. If bit0 is set, it will memset various allocated memory-regions with 0x58, 0x59, 0x5A ('X', 'Y', 'Z') instead of zero. This allows Nintendo devs to find uninitialized memory bugs. If bit17-16 is 0b01, the kernel assumes 6GB of DRAM instead of 4GB. | Kernel reads id12 when setting up memory-related code. If bit0 is set, it will memset various allocated memory-regions with 0x58, 0x59, 0x5A ('X', 'Y', 'Z') instead of zero. This allows Nintendo devs to find uninitialized memory bugs. If bit17-16 is 0b01, the kernel assumes 6GB of DRAM instead of 4GB. | ||
== UserExpMod == | |||
Takes one type-10 (C descriptor) buffer ('''data_out_buf''') and 3 type-9 (X descriptor) buffers ('''data_in_buf''', '''exp_in_buf''' and '''mod_in_buf'''). | |||
Performs asymmetric crypto with user supplied modulus and exponent. | |||
== GenerateAesKek == | == GenerateAesKek == | ||
Takes a 16-byte | Takes a 16-byte EKS ('''Encryption Key Source''') and two words ('''KeyGeneration''' and '''option''') as input. | ||
KeyGeneration ranges from 0 to 2. | '''KeyGeneration''' ranges from 0 to 2. | ||
Returns an hardware scrambled sealed KEK ('''Key Encryption Key''' used as '''key_x'''). | |||
== LoadAesKey == | == LoadAesKey == | ||
[2.0.0+] Now verifies that the engine | Takes a u32 ('''keyslot''') and two 16-byte keys ('''key_x''' and '''key_y'''). | ||
Sets the specified '''keyslot''' with a key generated from '''key_x''' and '''key_y'''. | |||
[2.0.0+] Now verifies that the engine in use (0..3) is locked/owned by the current spl session, otherwise errors with 0xD21A. Previously engine was hardcoded to 0. | |||
== GenerateAesKey == | == GenerateAesKey == | ||
[2.0.0+] Previously it used engine 0 | Takes a 16-byte KEK ('''key_x''') and a 16-byte encrypted key ('''enc_key'''). | ||
Generates a new key by decrypting '''enc_key''' with a key generated from the supplied '''key_x''' and a fixed '''key_y'''. | |||
[2.0.0+] Previously, it always used engine 0. Now it tries to allocate an engine to be used and returns 0xD01A if they're all busy. When the command is done, the engine is released. | |||
== SetConfig == | == SetConfig == | ||
Takes | Takes a u32 ('''ConfigItem''') and a u64 ('''ConfigVal'''). | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 171: | Line 184: | ||
| 13 || BatteryProfile | | 13 || BatteryProfile | ||
|} | |} | ||
Any other '''ConfigItem''', besides 13, can't be set. | |||
== DecryptImportPrivkForExpMod0 == | |||
Takes one type-9 (X descriptor) buffer ('''enc_privk_in_buf'''), a 16-byte KEK ('''key_x'''), a 16-byte key ('''key_y''') and a u32 ('''version'''). | |||
'''version''' is 0 or 1. | |||
Decrypts '''enc_privk_in_buf''' with a key generated from '''key_x''' and '''key_y''' and imports it for later usage. | |||
== ExpMod0 == | |||
Takes one type-10 (C descriptor) buffer ('''data_out_buf''') and 3 type-9 (X descriptor) buffers ('''data_in_buf''', '''param0_in_buf''' and '''param1_in_buf'''). | |||
Decrypts '''data_in_buf''' into '''data_out_buf''' using the private key imported with [[#DecryptImportPrivkForExpMod0]] and the supplied buffers '''param0_in_buf''' and '''param1_in_buf'''. | |||
Returns and unknown u32. | |||
== IsDevelopment == | == IsDevelopment == | ||
Line 179: | Line 207: | ||
Returns an u8 flag for whether the system is devunit. Output flag is 0 on retail. | Returns an u8 flag for whether the system is devunit. Output flag is 0 on retail. | ||
== | == GenerateSpecificAesKey == | ||
Takes a 16-byte seed ('''key_seed''') and two words ('''KeyGeneration''' and '''option''') as input. | |||
'''KeyGeneration''' ranges from 0 to 2. | |||
Returns an hardware scrambled (unsealed?) key ('''key_a'''). | |||
== DecryptPrivk == | |||
Takes one type-10 (C descriptor) buffer ('''dec_privk_out_buf'''), one type-9 (X descriptor) buffer ('''enc_privk_in_buf'''), a 16-byte KEK ('''key_x'''), a 16-byte key ('''key_y''') and a u32 ('''version'''). | |||
'''version''' is 0 or 1. | |||
Decrypts '''enc_privk_in_buf''' into '''dec_privk_out_buf''' with a key generated from '''key_x''' and '''key_y'''. | |||
Used by [[SSL_services|SSL]]-sysmodule for TLS client-privk. | |||
== DecryptAesKey == | == DecryptAesKey == | ||
Takes a 16-byte encrypted key ('''enc_key''') and two words ('''KeyGeneration''' and '''option''') as input. | |||
'''KeyGeneration''' ranges from 0 to 2. | |||
Decrypts '''enc_key''' with a key generated from fixed '''key_x''' and '''key_y''' and returns a 16-byte decrypted key ('''dec_key'''). | |||
[2.0.0+] Introduced same engine allocation code as for [[#GenerateAesKey]]. | [2.0.0+] Introduced same engine allocation code as for [[#GenerateAesKey]]. | ||
== DecryptAesCtr == | == DecryptAesCtr == | ||
[2.0.0+] Verifies the engine is locked by current session | Takes a type-0x46 (B descriptor) buffer ('''data_out_buf'''), a u32 ('''keyslot'''), a type-0x45 (A descriptor) buffer ('''data_in_buf''') and a 16-byte CTR ('''aes_ctr'''). | ||
Decrypts '''data_in_buf''' into '''data_out_buf''' using the key set in the specified '''keyslot'''. | |||
[2.0.0+] Verifies the engine is locked by current session. | |||
== ComputeCmac == | == ComputeCmac == | ||
[2.0.0+] Verifies the engine is locked by current session, | Takes one type-9 (X descriptor) buffer ('''data_in_buf''') and a u32 ('''type?'''). | ||
Returns a 16-byte CMAC calculated over '''data_in_buf'''. | |||
[2.0.0+] Verifies the engine is locked by current session. | |||
== DecryptImportPrivkForExpMod1 == | |||
Takes one type-9 (X descriptor) buffer ('''enc_privk_in_buf'''), a 16-byte KEK ('''key_x'''), a 16-byte key ('''key_y''') and a u32 ('''version'''). | |||
'''version''' is 0 or 1. | |||
Decrypts '''enc_privk_in_buf''' with a key generated from '''key_x''' and '''key_y''' and imports it for later usage. | |||
== | == ExpMod1 == | ||
[2.0.0+] Verifies the engine is locked by current session | Takes 3 type-9 (X descriptor) buffers ('''data_in_buf''', '''param0_in_buf''' and '''param1_in_buf'''). | ||
Decrypts '''data_in_buf''' using the private key imported with [[#DecryptImportPrivkForExpMod1]] and the supplied buffers '''param0_in_buf''' and '''param1_in_buf'''. | |||
Generates and returns a 16-byte key ('''key_z'''). | |||
== LoadRsaKey == | |||
Takes a u32 ('''keyslot''') and a 16-byte key ('''key_z'''). | |||
Sets the specified '''keyslot''' with a key generated from '''key_z'''. | |||
[2.0.0+] Verifies the engine is locked by current session. | |||
== GenerateRsaKek == | |||
Takes a 16-byte EKS ('''Encryption Key Source'''). | |||
Returns an hardware scrambled sealed KEK ('''Key Encryption Key''' used as '''key_z'''). | |||
== LockAesEngine == | == LockAesEngine == | ||
Line 201: | Line 273: | ||
== UnlockAesEngine == | == UnlockAesEngine == | ||
Takes a single u32 and unlocks the engine with that id. It must be owned by current session otherwise 0xD21A will be returned. | Takes a single u32 and unlocks the engine with that id. It must be owned by current session otherwise 0xD21A will be returned. | ||
== GetSplWaitEvent == | |||
Returns an event handle for synchronizing with the locked AES engine. |