<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://switchbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Selver</id>
	<title>Nintendo Switch Brew - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://switchbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Selver"/>
	<link rel="alternate" type="text/html" href="https://switchbrew.org/wiki/Special:Contributions/Selver"/>
	<updated>2026-05-09T15:05:59Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Secure_Monitor&amp;diff=4372</id>
		<title>Secure Monitor</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Secure_Monitor&amp;diff=4372"/>
		<updated>2018-03-30T12:25:23Z</updated>

		<summary type="html">&lt;p&gt;Selver: Fix links to CryptoUseCase (#CryptoUsecase to #enum_CryptoUsecase)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Secure Monitor Calls =&lt;br /&gt;
&lt;br /&gt;
The secure monitor provides two top level handlers of which each provides a range of sub handlers.&lt;br /&gt;
&lt;br /&gt;
Secure Monitor Calls follow the ARM SMC calling convention up to a small change:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit number || Bit mask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 31 || 0x80000000 || Set to 0 means Yielding Call; Set to 1 means Fast Call.&lt;br /&gt;
|-&lt;br /&gt;
| 30 || 0x40000000 || Set to 0 means SMC32 convention; Set to 1 means SMC64.&lt;br /&gt;
|-&lt;br /&gt;
| 29-24 || 0x3F000000 || Service Call ranges.&lt;br /&gt;
|-&lt;br /&gt;
| 23-16 || 0x00FF0000 || Must be zero.&lt;br /&gt;
|-&lt;br /&gt;
| 15-8 || 0x0000FF00 || Argument type. This is different from the ARM SMC calling convention.&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || 0x000000FF || Function number within the range call type.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If bit &#039;&#039;n&#039;&#039; is set in the argument type then parameter X&#039;&#039;n&#039;&#039; is treated as a pointer and the kernel will setup address translation for it in [[SVC#svcCallSecureMonitor|svcCallSecureMonitor]].&lt;br /&gt;
&lt;br /&gt;
SMC arguments are passed using registers X0-X7 with X0 always sending the call sub-id and returning the result of the call.&lt;br /&gt;
&lt;br /&gt;
== ID 0 ==&lt;br /&gt;
Functions exposed to user-mode processes using [[SVC|svcCallSecureMonitor]].&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Sub-ID || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000401 || SetConfig || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000002 || GetConfig (Same as ID 1, Sub-ID 4) || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000003 || CheckStatus || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000404 || GetResult || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000E05 || ExpMod || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000006 || GetRandomBytes (Same as ID 1, Sub-ID 5) || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000007 || [[#GenerateAesKek]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000008 || [[#LoadAesKey]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000009 || [[#CryptAes]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC300000A || [[#GenerateSpecificAesKey]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC300040B || [[#ComputeCmac]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0-4.1.0] 0xC300100C || [[#LoadRsaOaepKey]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| [5.0.0+] 0xC300D60C || [[#EncryptRsaKeyForImport]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0-4.1.0] 0xC300100D || [[#DecryptRsaPrivateKey]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| [5.0.0] 0xC300100D || [[#DecryptOrImportRsaKey]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0-4.1.0] 0xC300100E || [[#LoadSecureExpModKey]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC300060F || [[#SecureExpMod]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000610 || [[#UnwrapRsaOaepWrappedTitleKey]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000011 || [[#LoadTitleKey]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000012 || [2.0.0+] UnwrapAesWrappedTitleKey || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The overall concept here is the following:&lt;br /&gt;
* All key material (AES and RSA) is stored in userspace, but it&#039;s encrypted with random AES kek&#039;s (&amp;quot;key encryption keys&amp;quot;).&lt;br /&gt;
* Each kek is generated as a function of an access key (picked at random).&lt;br /&gt;
* The kek is generated differently depending on the [[#CryptoUsecase]] the key is used for.&lt;br /&gt;
** This means: Each key is &amp;quot;locked&amp;quot; to the [[#CryptoUsecase]] it was designated for.&lt;br /&gt;
** You can use a key for a different usecase, but you will only get garbage output.&lt;br /&gt;
* After the kek has been generated, it is wrapped with a session-specific key and given back to userspace.&lt;br /&gt;
** This means: Plaintext kek keys never leave TrustZone.&lt;br /&gt;
** Further, this means: Actual AES/RSA keys never leave TrustZone.&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
The [[#enum_CryptoUsecase|CryptoUsecase_TitleKey]] represents a RSA wrapped AES key.&lt;br /&gt;
&lt;br /&gt;
=== GenerateAesKek ===&lt;br /&gt;
Takes an &amp;quot;access key&amp;quot; as input, an [[#enum_CryptoUsecase]].&lt;br /&gt;
&lt;br /&gt;
Returns a session-unique kek for said usecase.&lt;br /&gt;
&lt;br /&gt;
=== LoadAesKey ===&lt;br /&gt;
Takes a session kek created with [[#GenerateAesKek]], and a wrapped AES key.&lt;br /&gt;
&lt;br /&gt;
The session kek must have been created with [[#enum_CryptoUsecase|CryptoUsecase_Aes]].&lt;br /&gt;
&lt;br /&gt;
=== CryptAes ===&lt;br /&gt;
Encrypts/decrypts using Aes (CTR and CBC).&lt;br /&gt;
&lt;br /&gt;
Key must be set prior using one of the [[#LoadAesKey]], [[#GenerateSpecificAesKey]] or [[#LoadRsaWrappedAesKey]] commands.&lt;br /&gt;
&lt;br /&gt;
=== GenerateSpecificAesKey ===&lt;br /&gt;
Todo: This one seems unrelated to [[#enum_CryptoUsecase]].&lt;br /&gt;
&lt;br /&gt;
=== LoadRsaOaepKey ===&lt;br /&gt;
Takes a session kek created with [[#GenerateAesKek]], a wrapped AES key, and a wrapped RSA private key.&lt;br /&gt;
&lt;br /&gt;
The session kek must have been created with [[#enum_CryptoUsecase|CryptoUsecase_RsaOaep]].&lt;br /&gt;
&lt;br /&gt;
This function was removed in [[5.0.0]], and replaced with [[#EncryptRsaKeyForImport]].&lt;br /&gt;
&lt;br /&gt;
=== EncryptRsaKeyForImport ===&lt;br /&gt;
Takes in two session keks created with [[#GenerateAesKek]], two wrapped AES keys, an enum member, and a wrapped RSA private key.&lt;br /&gt;
&lt;br /&gt;
Decrypts and validates the wrapped RSA private key with the first kek/wrapped key, and re-encrypts it with the second if valid.&lt;br /&gt;
&lt;br /&gt;
The re-encrypted key is then passed to the user, for use with [[#DecryptOrImportRsaKey]].&lt;br /&gt;
&lt;br /&gt;
=== DecryptRsaPrivateKey ===&lt;br /&gt;
Takes a session kek created with [[#GenerateAesKek]], a wrapped AES key, an enum member, and a wrapped RSA private key.&lt;br /&gt;
&lt;br /&gt;
The session kek must have been created with [[#enum_CryptoUsecase|CryptoUsecase_RsaPrivate]].&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] The SMC handler when certain conditions pass and SMC_ID==0xC300100D now returns error 0x6 instead of calling the handler funcptr.&lt;br /&gt;
&lt;br /&gt;
=== DecryptOrImportRsaKey ===&lt;br /&gt;
&lt;br /&gt;
This function replaced [[#DecryptRsaPrivateKey]] in [[5.0.0]], adding an additional enum member argument.&lt;br /&gt;
&lt;br /&gt;
This SMC extends DecryptRsaPrivateKey&#039;s original functionality to enable importing private keys into the security engine instead of decrypting them, when certain enum members are passed.&lt;br /&gt;
&lt;br /&gt;
=== LoadSecureExpModKey ===&lt;br /&gt;
Takes a session kek created with [[#GenerateAesKek]], and a wrapped RSA key.&lt;br /&gt;
&lt;br /&gt;
The session kek must have been created with [[#enum_CryptoUsecase|CryptoUsecase_RsaSecureExpMod]].&lt;br /&gt;
&lt;br /&gt;
This function was removed in [[5.0.0]], and replaced with [[#EncryptRsaKeyForImport]].&lt;br /&gt;
&lt;br /&gt;
=== SecureExpMod ===&lt;br /&gt;
Performs an Exp Mod operation using an exponent previously loaded with the [[#LoadSecureExpModKey]] command.&lt;br /&gt;
&lt;br /&gt;
=== UnwrapRsaOaepWrappedTitleKey ===&lt;br /&gt;
Takes an Rsa-Oaep-wrapped TitleKey, an RSA Public Key, and a label hash.&lt;br /&gt;
&lt;br /&gt;
Performs an Exp Mod operation using an exponent previously loaded with the [[#LoadRsaOaepKey]] command, and then validates/extracts a Titlekey from the resulting message.&lt;br /&gt;
&lt;br /&gt;
Returns a session-unique AES key especially for use in [[#LoadTitleKey]].&lt;br /&gt;
&lt;br /&gt;
=== LoadTitleKey ===&lt;br /&gt;
Takes a session-unique AES key from [[#UnwrapAesWrappedTitleKey]] or [[#UnwrapRsaOaepWrappedTitleKey]].&lt;br /&gt;
&lt;br /&gt;
=== enum CryptoUsecase ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CryptoUsecase_Aes&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CryptoUsecase_RsaPrivate&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CryptoUsecase_RsaSecureExpMod&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CryptoUsecase_RsaOaep&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ID 1 ==&lt;br /&gt;
Functions exposed to the kernel internally.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Sub-ID || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4000001 || [[#CpuSuspend]] || X1=power_state, X2=entrypoint_addr, X3=context_id || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x84000002 || [[#CpuOff]] || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4000003 || [[#CpuOn]] || X1=target_cpu, X2=entrypoint_addr, X3=context_id, X4,X5,X6,X7=0 || X0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000004 || [[#GetConfig]] (Same as ID 0, Sub-ID 2) || W1=config_item, X2,X3,X4,X5,X6,X7=0 || X0=result, X1,X2,X3,X4=config_val&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000005 || [[#GetRandomBytes]] (Same as ID 0, Sub-ID 6) || X1=size, X2,X3,X4,X5,X6,X7=0 || X0=result, X1,X2,X3,X4,X5,X6,X7=rand_bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000006 || [[#Panic]] || W1=panic_color, X2,X3,X4,X5,X6,X7=0 || X0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000007 || [2.0.0+] [[#ConfigureCarveout]] || X1=carveout_index, X2=region_phys_addr, X3=region_size, X4,X5,X6,X7=0 || X0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0xC3000008 || [2.0.0+] [[#ReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val, X4,X5,X6,X7=0 || X0=result, W1=out_val&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== CpuSuspend ===&lt;br /&gt;
Standard ARM PCSI SMC. Suspends the CPU (CPU0).&lt;br /&gt;
&lt;br /&gt;
The kernel calls this SMC on shutdown with &#039;&#039;&#039;power_state&#039;&#039;&#039; set to 0x0201001B (power level: 0x02==system; power type: 0x01==powerdown; ID: 0x1B).&lt;br /&gt;
&lt;br /&gt;
=== CpuOff ===&lt;br /&gt;
Standard ARM PCSI SMC. Turns off the CPU (CPU1, CPU2 or CPU3).&lt;br /&gt;
&lt;br /&gt;
=== CpuOn ===&lt;br /&gt;
Standard ARM PCSI SMC. Turns on the CPU (CPU1, CPU2 or CPU3).&lt;br /&gt;
&lt;br /&gt;
=== GetConfig ===&lt;br /&gt;
Takes a &#039;&#039;&#039;config_item&#039;&#039;&#039; and returns an associated &#039;&#039;&#039;config_val&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== GetRandomBytes ===&lt;br /&gt;
Takes a &#039;&#039;&#039;size&#039;&#039;&#039; and returns &#039;&#039;&#039;rand_bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The kernel limits &#039;&#039;&#039;size&#039;&#039;&#039; to 0x38 (for fitting in return registers).&lt;br /&gt;
&lt;br /&gt;
=== Panic ===&lt;br /&gt;
Issues a system panic.&lt;br /&gt;
&lt;br /&gt;
The kernel always calls this with &#039;&#039;&#039;panic_color&#039;&#039;&#039; set to 0xF00.&lt;br /&gt;
&lt;br /&gt;
=== ConfigureCarveout ===&lt;br /&gt;
Configures memory controller carveout regions.&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;&#039;carveout_index&#039;&#039;&#039; is 0, &#039;&#039;&#039;region_phys_addr&#039;&#039;&#039; and &#039;&#039;&#039;region_size&#039;&#039;&#039; are used to configure &#039;&#039;&#039;MC_SECURITY_CARVEOUT4&#039;&#039;&#039;.&lt;br /&gt;
If &#039;&#039;&#039;carveout_index&#039;&#039;&#039; is 1, &#039;&#039;&#039;region_phys_addr&#039;&#039;&#039; and &#039;&#039;&#039;region_size&#039;&#039;&#039; are used to configure &#039;&#039;&#039;MC_SECURITY_CARVEOUT5&#039;&#039;&#039;.&lt;br /&gt;
Any other &#039;&#039;&#039;carveout_index&#039;&#039;&#039; values are invalid.&lt;br /&gt;
&lt;br /&gt;
The kernel calls this with &#039;&#039;&#039;carveout_index&#039;&#039;&#039; set to 0, &#039;&#039;&#039;region_phys_addr&#039;&#039;&#039; set to 0x80060000 and &#039;&#039;&#039;region_size&#039;&#039;&#039; set to a dynamically calculated size which covers all the kernel and built-in sysmodules&#039; DRAM regions.&lt;br /&gt;
&lt;br /&gt;
=== ReadWriteRegister ===&lt;br /&gt;
Relays [[SVC#svcReadWriteRegister|svcReadWriteRegister]] to the Secure Monitor.&lt;br /&gt;
&lt;br /&gt;
= Errors =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Description&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Invalid input&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Busy&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Selver</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=Main_Page/Navigation&amp;diff=237</id>
		<title>Main Page/Navigation</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=Main_Page/Navigation&amp;diff=237"/>
		<updated>2017-04-06T02:58:11Z</updated>

		<summary type="html">&lt;p&gt;Selver: link to new SVC page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Main page box|Navigation|:Navigation}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: -.3em -1em -1em -1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; bgcolor=&amp;quot;#fff&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2px&amp;quot; cellspacing=&amp;quot;2px&amp;quot; style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#e7eef6&amp;quot;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;General&#039;&#039;&#039;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;Homebrew&#039;&#039;&#039;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;Switch Hardware&#039;&#039;&#039;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; style=&amp;quot;background: #F5FAFF;&amp;quot;&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
*[[Switch System Flaws]]&lt;br /&gt;
*[[Switch Userland Flaws]]&lt;br /&gt;
|&lt;br /&gt;
*[[Hardware|Overview]]&lt;br /&gt;
*[[Joy-Con]]&lt;br /&gt;
*[[Cartridge]]&lt;br /&gt;
*[[Dock]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: -.3em -1em -1em -1em; margin-top: +1em&amp;quot;&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; bgcolor=&amp;quot;#fff&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2px&amp;quot; cellspacing=&amp;quot;2px&amp;quot; style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#e7eef6&amp;quot;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;Switch Operating System&#039;&#039;&#039; &lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;Switch Software Stack&#039;&#039;&#039;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;Switch Content&#039;&#039;&#039;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; style=&amp;quot;background: #F5FAFF;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
*[[SVC|System Service Calls]] &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{box-footer-empty}}&lt;/div&gt;</summary>
		<author><name>Selver</name></author>
	</entry>
</feed>