SPL services: Difference between revisions
better names |
|||
Line 10: | Line 10: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || [[# | | 0 || [[#GenerateRandomBytes]] | ||
|} | |} | ||
== | == GenerateRandomBytes == | ||
Takes a type-6 buffer and fills it with random data from [[SMC#GetRandomBytes|GetRandomBytes SMC]]. Same command for "spl:" and "csrng" services. | Takes a type-6 buffer and fills it with random data from [[SMC#GetRandomBytes|GetRandomBytes SMC]]. Same command for "spl:" and "csrng" services. | ||
= spl:, spl:mig, spl:fs, spl:ssl, spl:es, spl:manu = | = spl:, spl:mig, spl:fs, spl:ssl, spl:es, spl:manu = | ||
These are "nn::spl::detail::IGeneralInterface", "nn::spl::detail::ICryptoInterface", "nn::spl::detail::IFsInterface", "nn::spl::detail::ISslInterface", "nn::spl::detail::IEsInterface" and "nn::spl::detail::IManuInterface" | These are "nn::spl::detail::IGeneralInterface", "nn::spl::detail::ICryptoInterface", "nn::spl::detail::IFsInterface", "nn::spl::detail::ISslInterface", "nn::spl::detail::IEsInterface" and "nn::spl::detail::IManuInterface". | ||
[2.0.0+] Where previously only one AES | [2.0.0+] Where previously only one AES keyslot was used, there is now support for 4 of them. | ||
[2.0.0+] When the session closes, all AES | [2.0.0+] When the session closes, all allocated AES keyslots are automatically freed. | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 29: | Line 29: | ||
| 0 || [[#GetConfig]] || spl:, spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | | 0 || [[#GetConfig]] || spl:, spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | ||
|- | |- | ||
| 1 || [[# | | 1 || [[#ExpMod]] || spl:, spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | ||
|- | |- | ||
| 2 || [[#GenerateAesKek]] || spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | | 2 || [[#GenerateAesKek]] || spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | ||
Line 39: | Line 39: | ||
| 5 || [[#SetConfig]] || spl:, spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | | 5 || [[#SetConfig]] || spl:, spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | ||
|- | |- | ||
| 7 || [[# | | 7 || [[#GenerateRandomBytes]] || spl:, spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | ||
|- | |- | ||
| 9 || [[# | | 9 || [[#ImportLotusKey]] || spl:fs | ||
|- | |- | ||
| 10 || [[# | | 10 || [[#DecryptLotusMessage]] || spl:fs | ||
|- | |- | ||
| 11 || [[#IsDevelopment]] || spl:, spl:mig, spl:fs, spl:ssl spl:es, spl:manu | | 11 || [[#IsDevelopment]] || spl:, spl:mig, spl:fs, spl:ssl spl:es, spl:manu | ||
Line 53: | Line 53: | ||
| 14 || [[#DecryptAesKey]] || spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | | 14 || [[#DecryptAesKey]] || spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | ||
|- | |- | ||
| 15 || [[# | | 15 || [[#CryptAesCtr]] || spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | ||
|- | |- | ||
| 16 || [[#ComputeCmac]] || spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | | 16 || [[#ComputeCmac]] || spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | ||
|- | |- | ||
| 17 || [[# | | 17 || [[#ImportEsKey]] || spl:es | ||
|- | |- | ||
| 18 || [[# | | 18 || [[#UnwrapTitleKey]] || spl:es | ||
|- | |- | ||
| 19 || [[#LoadTitleKey]] || spl:fs | | 19 || [[#LoadTitleKey]] || spl:fs | ||
|- | |- | ||
| 20 || [2.0.0+] [[# | | 20 || [2.0.0+] [[#UnwrapCommonTitleKey]] || spl:es | ||
|- | |- | ||
| 21 || [2.0.0+] [[# | | 21 || [2.0.0+] [[#AllocateAesKeyslot]] || spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | ||
|- | |- | ||
| 22 || [2.0.0+] [[# | | 22 || [2.0.0+] [[#FreeAesKeyslot]] || spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | ||
|- | |- | ||
| 23 || [2.0.0+] [[# | | 23 || [2.0.0+] [[#GetAesKeyslotAvailableEvent]] || spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | ||
|- | |- | ||
| 24 || [3.0.0+] [[#SetBootReason]] || spl:, spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | | 24 || [3.0.0+] [[#SetBootReason]] || spl:, spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | ||
Line 75: | Line 75: | ||
| 25 || [3.0.0+] [[#GetBootReason]] || spl:, spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | | 25 || [3.0.0+] [[#GetBootReason]] || spl:, spl:mig, spl:fs, spl:ssl, spl:es, spl:manu | ||
|- | |- | ||
| 26 || [5.0.0+] | | 26 || [5.0.0+] ImportSslKey || spl:ssl | ||
|- | |- | ||
| 27 || [5.0.0+] | | 27 || [5.0.0+] SslExpMod || spl:ssl | ||
|- | |- | ||
| 28 || [5.0.0+] | | 28 || [5.0.0+] ImportDrmKey || spl:es | ||
|- | |- | ||
| 29 || [5.0.0+] | | 29 || [5.0.0+] DrmExpMod || spl:es | ||
|- | |- | ||
| 30 || [5.0.0+] | | 30 || [5.0.0+] ReEncryptRsaPrivateKey || spl:manu | ||
|- | |- | ||
| 31 || [5.0.0+] GetPackage2Hash || spl:fs | | 31 || [5.0.0+] GetPackage2Hash || spl:fs | ||
|- | |- | ||
| 31 || [6.0.0+] | | 31 || [6.0.0+] UnwrapElicenseKey || spl:es | ||
|- | |- | ||
| 32 || [6.0.0+] [[# | | 32 || [6.0.0+] [[#LoadElicenseKey]] || spl:es | ||
|} | |} | ||
Line 97: | Line 97: | ||
Takes a u32 ('''ConfigItem'''), and returns one or more u64s ('''ConfigVal'''). | Takes a u32 ('''ConfigItem'''), and returns one or more u64s ('''ConfigVal'''). | ||
== | == ExpMod == | ||
Wrapper for [[SMC#ExpMod|ExpMod SMC]]. | Wrapper for [[SMC#ExpMod|ExpMod SMC]]. | ||
Line 118: | Line 118: | ||
Sets the specified '''keyslot''' with a key generated from '''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 | [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 == | == GenerateAesKey == | ||
Line 125: | Line 125: | ||
Generates a new key by decrypting (AES-ECB) '''enc_key''' with a key generated from the supplied '''key_x''' and a fixed '''key_y''' set with [[SMC#LoadAesKey|LoadAesKey SMC]]. | Generates a new key by decrypting (AES-ECB) '''enc_key''' with a key generated from the supplied '''key_x''' and a fixed '''key_y''' set with [[SMC#LoadAesKey|LoadAesKey SMC]]. | ||
[2.0.0+] Previously, it always used | [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 == | == SetConfig == | ||
Line 136: | Line 136: | ||
! ConfigItem || Name | ! ConfigItem || Name | ||
|- | |- | ||
| 13 || | | 13 || IsChargerHiZModeEnabled | ||
|} | |} | ||
Any other '''ConfigItem''', besides 13, can't be set. | Any other '''ConfigItem''', besides 13, can't be set. | ||
== | == ImportLotusKey == | ||
Wrapper for [[SMC#LoadSecureExpModKey|LoadSecureExpModKey SMC]]. | Wrapper for [[SMC#LoadSecureExpModKey|LoadSecureExpModKey SMC]]. | ||
Line 151: | Line 151: | ||
[5.0.0+] This now calls [[SMC#EncryptRsaKeyForImport|EncryptRsaKeyForImport SMC]] instead. | [5.0.0+] This now calls [[SMC#EncryptRsaKeyForImport|EncryptRsaKeyForImport SMC]] instead. | ||
== | == DecryptLotusMessage == | ||
Takes 3 type-9 (X descriptor) buffers ('''data_in_buf''', '''mod_in_buf''' and ''' | Takes 3 type-9 (X descriptor) buffers ('''data_in_buf''', '''mod_in_buf''' and '''label_hash_in_buf'''). | ||
Uses [[SMC#SecureExpMod|SecureExpMod SMC]] to decrypt '''data_in_buf''' using the private key imported with [[#LoadSecureExpModKey]] and the supplied '''mod_in_buf''' and ''' | Uses [[SMC#SecureExpMod|SecureExpMod SMC]] to decrypt '''data_in_buf''' using the private key imported with [[#LoadSecureExpModKey]] and the supplied '''mod_in_buf''' and '''label_hash_in_buf'''. | ||
Generates and returns a 16-byte sealed titlekey. | Generates and returns a 16-byte sealed titlekey. | ||
Line 191: | Line 191: | ||
[2.0.0+] Introduced same engine allocation code as for [[#GenerateAesKey]]. | [2.0.0+] Introduced same engine allocation code as for [[#GenerateAesKey]]. | ||
== | == CryptAesCtr == | ||
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'''). | 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'''). | ||
Uses [[SMC#CryptAes|CryptAes SMC]] to decrypt '''data_in_buf''' into '''data_out_buf''', using the key set in the specified '''keyslot'''. | Uses [[SMC#CryptAes|CryptAes SMC]] to decrypt '''data_in_buf''' into '''data_out_buf''', using the key set in the specified '''keyslot'''. | ||
[2.0.0+] Verifies the | [2.0.0+] Verifies the keyslot was allocated by current session. | ||
== ComputeCmac == | == ComputeCmac == | ||
Line 207: | Line 207: | ||
[2.0.0+] Verifies the engine is locked by current session. | [2.0.0+] Verifies the engine is locked by current session. | ||
== | == ImportEsKey == | ||
Wrapper for [[SMC#LoadRsaOaepKey|LoadRsaOaepKey SMC]]. | Wrapper for [[SMC#LoadRsaOaepKey|LoadRsaOaepKey SMC]]. | ||
Line 214: | Line 214: | ||
Decrypts enc_privk_in_buf with a key generated from key_x and key_y and imports it for later usage. | Decrypts enc_privk_in_buf with a key generated from key_x and key_y and imports it for later usage. | ||
== | == UnwrapTitleKey == | ||
Wrapper for [[SMC#UnwrapRsaOaepWrappedTitleKey|UnwrapRsaOaepWrappedTitleKey SMC]]. | Wrapper for [[SMC#UnwrapRsaOaepWrappedTitleKey|UnwrapRsaOaepWrappedTitleKey SMC]]. | ||
Line 232: | Line 232: | ||
[2.0.0+] Verifies the engine is locked by current session. | [2.0.0+] Verifies the engine is locked by current session. | ||
== | == UnwrapCommonTitleKey == | ||
Wrapper for [[SMC#UnwrapAesWrappedTitleKey|UnwrapAesWrappedTitleKey SMC]]. | Wrapper for [[SMC#UnwrapAesWrappedTitleKey|UnwrapAesWrappedTitleKey SMC]]. | ||
Line 239: | Line 239: | ||
Returns a sealed titlekey. | Returns a sealed titlekey. | ||
== | == AllocateAesKeyslot == | ||
Returns | Returns an allocated keyslot, or 0xD01A if all keyslots are taken. You need to allocate a keyslot before using AES functions. | ||
== | == FreeAesKeyslot == | ||
Takes a single u32 and | Takes a single u32 and frees the keyslot. The keyslot must have been allocated by current session otherwise 0xD21A will be returned. | ||
== | == GetAesKeyslotAvailableEvent == | ||
Returns an event handle for synchronizing with the | Returns an event handle for synchronizing with the AES keyslots. | ||
== SetBootReason == | == SetBootReason == | ||
Sets a static dword in spl .bss to the | Sets a static dword in spl .bss to the input u32 '''BootReason'''. | ||
[4.0.0+] returns 0xD41A if a value has been previously set without being [[#GetBootReason|gotten]]. | [4.0.0+] returns 0xD41A if a value has been previously set without being [[#GetBootReason|gotten]]. | ||
== GetBootReason == | == GetBootReason == | ||
Returns the static dword in spl .bss that can be set via [[#SetBootReason]]. | Returns the static dword '''BootReason''' in spl .bss that can be set via [[#SetBootReason]]. | ||
[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. | ||
== LoadElicenseKey == | |||
Same as [[#LoadTitleKey|LoadTitleKey]]. | |||
[[Category:Services]] | [[Category:Services]] |