Cryptosystem: Difference between revisions
Line 156: | Line 156: | ||
Normal key generation looks like this on 1.0.0/2.0.0: | Normal key generation looks like this on 1.0.0/2.0.0: | ||
keyblob_key /* slot13 */ = aes_unwrap(aes_unwrap(df206f59.., tsec_key /* slot13 */, sbk /* slot14 */) | keyblob_key /* slot13 */ = aes_unwrap(aes_unwrap(df206f59.., tsec_key /* slot13 */), sbk /* slot14 */) | ||
cmac_key /* slot11 */ = aes_unwrap(59c7fb6f.., keyblob_key) | cmac_key /* slot11 */ = aes_unwrap(59c7fb6f.., keyblob_key) | ||
Line 168: | Line 168: | ||
master_key /* slot12 */ = aes_unwrap(bct->pubkey[0] == 0x4f ? normalseed_dev : normalseed_retail, keyblob+0x20) | master_key /* slot12 */ = aes_unwrap(bct->pubkey[0] == 0x4f ? normalseed_dev : normalseed_retail, keyblob+0x20) | ||
per_console_key /* slot13 */ = aes_unwrap(4f025f0e.., keyblob_key) | per_console_key /* slot13 */ = aes_unwrap(4f025f0e.., keyblob_key) | ||
.. and on 3.0.0, they moved keyslots around a little to generate the same per-console key as 1.0.0: | |||
keyblob_key_10 /* slot10 */ = aes_unwrap(aes_unwrap(df206f59.., tsec_key /* slot13 */), sbk /* slot14 */) | |||
keyblob_key /* slot13 */ = aes_unwrap(aes_unwrap(0c25615d.., tsec_key /* slot13 */), sbk /* slot14 */) | |||
cmac_key /* slot11 */ = aes_unwrap(59c7fb6f.., keyblob_key) | |||
if aes_cmac(buf=keyblob+0x10, len=0xA0, cmac_key) != keyblob[0:0x10]: | |||
panic() | |||
aes_ctr_decrypt(buf=keyblob+0x20, len=0x90, iv=keyblob+0x10 key=keyblob_key) | |||
// Final keys: | |||
package1_key /* slot11 */ = keyblob[0x80:0x90] | |||
master_key /* slot12 */ = aes_unwrap(bct->pubkey[0] == 0x4f ? normalseed_dev : normalseed_retail, keyblob+0x20) | |||
per_console_key /* slot13 */ = aes_unwrap(4f025f0e.., keyblob_key_10) | |||
SBK and SSK keyslots are cleared after keys have been generated. | SBK and SSK keyslots are cleared after keys have been generated. |