Cryptosystem: Difference between revisions
m Undo revision 6770 by Shchmue (talk) - ("Storage" is used in all other patents and all nv code, docs and binaries Tag: Undo |
No edit summary |
||
Line 1: | Line 1: | ||
= BootROM = | |||
The bootrom initializes two keyslots in the hardware engine: | The bootrom initializes two keyslots in the hardware engine: | ||
Line 48: | Line 48: | ||
} | } | ||
= Falcon coprocessor = | |||
The falcon processor (TSEC) generates a special console-unique key (that will be referred to as the "tsec key"). | The falcon processor (TSEC) generates a special console-unique key (that will be referred to as the "tsec key"). | ||
This is presumably using data stored in fuses that only microcode authenticated by NVidia has access to. | This is presumably using data stored in fuses that only microcode authenticated by NVidia has access to. | ||
= Package1ldr = | |||
== Key table == | |||
[1.0.0-3.0.2] During package1ldr: | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 84: | Line 83: | ||
|} | |} | ||
[1.0.0-3.0.2] After package1ldr: | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 107: | Line 105: | ||
|} | |} | ||
[4.0.0+] After package1ldr (Secure Monitor boot): | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 142: | Line 139: | ||
|} | |} | ||
[4.0.0+] After package1ldr (Secure Monitor runtime): | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 171: | Line 167: | ||
|} | |} | ||
[6.2.0+] After package1ldr/TSEC Payload (Secure Monitor boot): | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 206: | Line 201: | ||
|} | |} | ||
== Key generation == | |||
Note: aes_unwrap(wrapped_key, wrap_key) is just another name for a single AES-128 block decryption. | Note: aes_unwrap(wrapped_key, wrap_key) is just another name for a single AES-128 block decryption. | ||
Line 297: | Line 291: | ||
The key-derivation is described in more detail [[Package1#Key_generation|here]]. | The key-derivation is described in more detail [[Package1#Key_generation|here]]. | ||
=== Keyblob === | |||
There are 32 keyblobs written to NAND at factory, with each keyblob encrypted with a console-unique key derived from the console's SBK, the console's tsec key, and a constant specific to each keyblob. | There are 32 keyblobs written to NAND at factory, with each keyblob encrypted with a console-unique key derived from the console's SBK, the console's tsec key, and a constant specific to each keyblob. | ||
Despite being encrypted with console unique keys, though, the decrypted keyblob contents are shared for all consoles. | Despite being encrypted with console unique keys, though, the decrypted keyblob contents are shared for all consoles. | ||
Used keyblobs are as follows: | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 357: | Line 331: | ||
Starting from 6.2.0, key generation no longer uses keyblobs. | Starting from 6.2.0, key generation no longer uses keyblobs. | ||
== Secure Monitor Init | === Seeds === | ||
normalseed_retail = d8a2410a... | |||
[1.0.0] wrapped_keyblob_key = df206f59... | |||
[1.0.0] simpleseed_dev0 = aff11423... | |||
[1.0.0] simpleseed_dev1 = 5e177ee1... | |||
[1.0.0] normalseed_dev = 0542a0fd... | |||
[3.0.0] wrapped_keyblob_key = 0c25615d... | |||
[3.0.0] simpleseed_dev0 = de00216a... | |||
[3.0.0] simpleseed_dev1 = 2db7c0a1... | |||
[3.0.0] normalseed_dev = 678c5a03... | |||
[3.0.1] wrapped_keyblob_key = 337685ee... | |||
[3.0.1] simpleseed_dev0 = e045f5ba... | |||
[3.0.1] simpleseed_dev1 = 84d92e0d... | |||
[3.0.1] normalseed_dev = cd88155b... | |||
[4.0.0] wrapped_keyblob_key = 2d1f4880... | |||
=== Versions === | |||
The key generation system has historically been revised several times. Each version is bound to a specific BCT public key and can be identified by its first byte as follows: | |||
{| class="wikitable" border="1" | |||
|- | |||
! Version | |||
! BCT public key's first byte | |||
! Description | |||
|- | |||
| K1 | |||
| 0x11 | |||
| Erista prototype development | |||
|- | |||
| K2 | |||
| 0xFB | |||
| Erista prototype development | |||
|- | |||
| K3 | |||
| 0x4F | |||
| Erista prototype development | |||
|- | |||
| K4 | |||
| | |||
| Erista prototype retail | |||
|- | |||
| K5 | |||
| 0x37 | |||
| Erista development | |||
|- | |||
| K6 | |||
| 0xF7 | |||
| Erista retail | |||
|- | |||
| M1 | |||
| 0xDD | |||
| Mariko prototype development | |||
|- | |||
| M2 | |||
| 0xC3 | |||
| Mariko development | |||
|- | |||
| M3 | |||
| 0x9B | |||
| Mariko retail | |||
|} | |||
= Secure Monitor Init = | |||
On all versions, the key to decrypt [[Package2]] is generated by decrypting a constant seed with the master key. The key is erased after use. | On all versions, the key to decrypt [[Package2]] is generated by decrypting a constant seed with the master key. The key is erased after use. | ||
Additionally, starting from 4.0.0, the Secure Monitor init will decrypt another constant seed successively with a special per console key and a special static key passed by package1loader, to generate the firmware specific per-console key. The operation will erase these special keys passed by package1loader. | Additionally, starting from 4.0.0, the Secure Monitor init will decrypt another constant seed successively with a special per console key and a special static key passed by package1loader, to generate the firmware specific per-console key. The operation will erase these special keys passed by package1loader. | ||
= Secure Monitor = | |||
The secure monitor performs some runtime cryptographic operations. See [[SMC]] for what operations it provides. | The secure monitor performs some runtime cryptographic operations. See [[SMC]] for what operations it provides. |