summaryrefslogtreecommitdiff
path: root/src/core/crypto/key_manager.cpp
diff options
context:
space:
mode:
authorGravatar Zach Hilman2018-09-23 20:44:39 -0400
committerGravatar Zach Hilman2018-10-07 13:15:11 -0400
commite4602748d6a7ba1a9bed95205e4f806cb2653af1 (patch)
tree97c902a4df19b47f18aa8c43be4916a82b414587 /src/core/crypto/key_manager.cpp
parentkey_manager: Add support for comments in keyfiles (diff)
downloadyuzu-e4602748d6a7ba1a9bed95205e4f806cb2653af1.tar.gz
yuzu-e4602748d6a7ba1a9bed95205e4f806cb2653af1.tar.xz
yuzu-e4602748d6a7ba1a9bed95205e4f806cb2653af1.zip
key_manager: Add support for crypto revisions past 04
Diffstat (limited to 'src/core/crypto/key_manager.cpp')
-rw-r--r--src/core/crypto/key_manager.cpp106
1 files changed, 63 insertions, 43 deletions
diff --git a/src/core/crypto/key_manager.cpp b/src/core/crypto/key_manager.cpp
index 6b93aee04..85776cdcb 100644
--- a/src/core/crypto/key_manager.cpp
+++ b/src/core/crypto/key_manager.cpp
@@ -254,7 +254,30 @@ void KeyManager::SetKey(S128KeyType id, Key128 key, u64 field1, u64 field2) {
254 std::tie(id, field1, field2); 254 std::tie(id, field1, field2);
255 }); 255 });
256 if (iter2 != s128_file_id.end()) 256 if (iter2 != s128_file_id.end())
257 WriteKeyToFile(false, iter2->first, key); 257 WriteKeyToFile(category, iter2->first, key);
258
259 // Variable cases
260 if (id == S128KeyType::KeyArea) {
261 const static std::array<const char*, 3> kak_names = {"key_area_key_application_{:02X}",
262 "key_area_key_ocean_{:02X}",
263 "key_area_key_system_{:02X}"};
264 WriteKeyToFile(category, fmt::format(kak_names.at(field2), field1), key);
265 } else if (id == S128KeyType::Master) {
266 WriteKeyToFile(category, fmt::format("master_key_{:02X}", field1), key);
267 } else if (id == S128KeyType::Package1) {
268 WriteKeyToFile(category, fmt::format("package1_key_{:02X}", field1), key);
269 } else if (id == S128KeyType::Package2) {
270 WriteKeyToFile(category, fmt::format("package2_key_{:02X}", field1), key);
271 } else if (id == S128KeyType::Titlekek) {
272 WriteKeyToFile(category, fmt::format("titlekek_{:02X}", field1), key);
273 } else if (id == S128KeyType::Keyblob) {
274 WriteKeyToFile(category, fmt::format("keyblob_key_{:02X}", field1), key);
275 } else if (id == S128KeyType::KeyblobMAC) {
276 WriteKeyToFile(category, fmt::format("keyblob_mac_key_{:02X}", field1), key);
277 } else if (id == S128KeyType::Source && field1 == static_cast<u64>(SourceKeyType::Keyblob)) {
278 WriteKeyToFile(category, fmt::format("keyblob_key_source_{:02X}", field2), key);
279 }
280
258 s128_keys[{id, field1, field2}] = key; 281 s128_keys[{id, field1, field2}] = key;
259} 282}
260 283
@@ -299,58 +322,55 @@ void KeyManager::DeriveSDSeedLazy() {
299} 322}
300 323
301const boost::container::flat_map<std::string, KeyIndex<S128KeyType>> KeyManager::s128_file_id = { 324const boost::container::flat_map<std::string, KeyIndex<S128KeyType>> KeyManager::s128_file_id = {
302 {"master_key_00", {S128KeyType::Master, 0, 0}},
303 {"master_key_01", {S128KeyType::Master, 1, 0}},
304 {"master_key_02", {S128KeyType::Master, 2, 0}},
305 {"master_key_03", {S128KeyType::Master, 3, 0}},
306 {"master_key_04", {S128KeyType::Master, 4, 0}},
307 {"package1_key_00", {S128KeyType::Package1, 0, 0}},
308 {"package1_key_01", {S128KeyType::Package1, 1, 0}},
309 {"package1_key_02", {S128KeyType::Package1, 2, 0}},
310 {"package1_key_03", {S128KeyType::Package1, 3, 0}},
311 {"package1_key_04", {S128KeyType::Package1, 4, 0}},
312 {"package2_key_00", {S128KeyType::Package2, 0, 0}},
313 {"package2_key_01", {S128KeyType::Package2, 1, 0}},
314 {"package2_key_02", {S128KeyType::Package2, 2, 0}},
315 {"package2_key_03", {S128KeyType::Package2, 3, 0}},
316 {"package2_key_04", {S128KeyType::Package2, 4, 0}},
317 {"titlekek_00", {S128KeyType::Titlekek, 0, 0}},
318 {"titlekek_01", {S128KeyType::Titlekek, 1, 0}},
319 {"titlekek_02", {S128KeyType::Titlekek, 2, 0}},
320 {"titlekek_03", {S128KeyType::Titlekek, 3, 0}},
321 {"titlekek_04", {S128KeyType::Titlekek, 4, 0}},
322 {"eticket_rsa_kek", {S128KeyType::ETicketRSAKek, 0, 0}}, 325 {"eticket_rsa_kek", {S128KeyType::ETicketRSAKek, 0, 0}},
323 {"key_area_key_application_00", 326 {"eticket_rsa_kek_source",
324 {S128KeyType::KeyArea, 0, static_cast<u64>(KeyAreaKeyType::Application)}}, 327 {S128KeyType::Source, static_cast<u64>(SourceKeyType::ETicketKek), 0}},
325 {"key_area_key_application_01", 328 {"eticket_rsa_kekek_source",
326 {S128KeyType::KeyArea, 1, static_cast<u64>(KeyAreaKeyType::Application)}}, 329 {S128KeyType::Source, static_cast<u64>(SourceKeyType::ETicketKekek), 0}},
327 {"key_area_key_application_02", 330 {"rsa_kek_mask_0", {S128KeyType::RSAKek, static_cast<u64>(RSAKekType::Mask0), 0}},
328 {S128KeyType::KeyArea, 2, static_cast<u64>(KeyAreaKeyType::Application)}}, 331 {"rsa_kek_seed_3", {S128KeyType::RSAKek, static_cast<u64>(RSAKekType::Seed3), 0}},
329 {"key_area_key_application_03", 332 {"rsa_oaep_kek_generation_source",
330 {S128KeyType::KeyArea, 3, static_cast<u64>(KeyAreaKeyType::Application)}}, 333 {S128KeyType::Source, static_cast<u64>(SourceKeyType::RSAOaepKekGeneration), 0}},
331 {"key_area_key_application_04", 334 {"sd_card_kek_source", {S128KeyType::Source, static_cast<u64>(SourceKeyType::SDKek), 0}},
332 {S128KeyType::KeyArea, 4, static_cast<u64>(KeyAreaKeyType::Application)}},
333 {"key_area_key_ocean_00", {S128KeyType::KeyArea, 0, static_cast<u64>(KeyAreaKeyType::Ocean)}},
334 {"key_area_key_ocean_01", {S128KeyType::KeyArea, 1, static_cast<u64>(KeyAreaKeyType::Ocean)}},
335 {"key_area_key_ocean_02", {S128KeyType::KeyArea, 2, static_cast<u64>(KeyAreaKeyType::Ocean)}},
336 {"key_area_key_ocean_03", {S128KeyType::KeyArea, 3, static_cast<u64>(KeyAreaKeyType::Ocean)}},
337 {"key_area_key_ocean_04", {S128KeyType::KeyArea, 4, static_cast<u64>(KeyAreaKeyType::Ocean)}},
338 {"key_area_key_system_00", {S128KeyType::KeyArea, 0, static_cast<u64>(KeyAreaKeyType::System)}},
339 {"key_area_key_system_01", {S128KeyType::KeyArea, 1, static_cast<u64>(KeyAreaKeyType::System)}},
340 {"key_area_key_system_02", {S128KeyType::KeyArea, 2, static_cast<u64>(KeyAreaKeyType::System)}},
341 {"key_area_key_system_03", {S128KeyType::KeyArea, 3, static_cast<u64>(KeyAreaKeyType::System)}},
342 {"key_area_key_system_04", {S128KeyType::KeyArea, 4, static_cast<u64>(KeyAreaKeyType::System)}},
343 {"sd_card_kek_source", {S128KeyType::Source, static_cast<u64>(SourceKeyType::SDKEK), 0}},
344 {"aes_kek_generation_source", 335 {"aes_kek_generation_source",
345 {S128KeyType::Source, static_cast<u64>(SourceKeyType::AESKEKGeneration), 0}}, 336 {S128KeyType::Source, static_cast<u64>(SourceKeyType::AESKekGeneration), 0}},
346 {"aes_key_generation_source", 337 {"aes_key_generation_source",
347 {S128KeyType::Source, static_cast<u64>(SourceKeyType::AESKeyGeneration), 0}}, 338 {S128KeyType::Source, static_cast<u64>(SourceKeyType::AESKeyGeneration), 0}},
339 {"package2_key_source", {S128KeyType::Source, static_cast<u64>(SourceKeyType::Package2), 0}},
340 {"master_key_source", {S128KeyType::Source, static_cast<u64>(SourceKeyType::Master), 0}},
341 {"header_kek_source", {S128KeyType::Source, static_cast<u64>(SourceKeyType::HeaderKek), 0}},
342 {"key_area_key_application_source",
343 {S128KeyType::Source, static_cast<u64>(SourceKeyType::KeyAreaKey),
344 static_cast<u64>(KeyAreaKeyType::Application)}},
345 {"key_area_key_ocean_source",
346 {S128KeyType::Source, static_cast<u64>(SourceKeyType::KeyAreaKey),
347 static_cast<u64>(KeyAreaKeyType::Ocean)}},
348 {"key_area_key_system_source",
349 {S128KeyType::Source, static_cast<u64>(SourceKeyType::KeyAreaKey),
350 static_cast<u64>(KeyAreaKeyType::System)}},
351 {"titlekek_source", {S128KeyType::Source, static_cast<u64>(SourceKeyType::Titlekek), 0}},
352 {"keyblob_mac_key_source", {S128KeyType::Source, static_cast<u64>(SourceKeyType::KeyblobMAC)}},
353 {"tsec_key", {S128KeyType::TSEC, 0, 0}},
354 {"secure_boot_key", {S128KeyType::SecureBoot, 0, 0}},
348 {"sd_seed", {S128KeyType::SDSeed, 0, 0}}, 355 {"sd_seed", {S128KeyType::SDSeed, 0, 0}},
356 {"bis_key_0_crypt", {S128KeyType::BIS, 0, static_cast<u64>(BISKeyType::Crypto)}},
357 {"bis_key_0_tweak", {S128KeyType::BIS, 0, static_cast<u64>(BISKeyType::Tweak)}},
358 {"bis_key_1_crypt", {S128KeyType::BIS, 1, static_cast<u64>(BISKeyType::Crypto)}},
359 {"bis_key_1_tweak", {S128KeyType::BIS, 1, static_cast<u64>(BISKeyType::Tweak)}},
360 {"bis_key_2_crypt", {S128KeyType::BIS, 2, static_cast<u64>(BISKeyType::Crypto)}},
361 {"bis_key_2_tweak", {S128KeyType::BIS, 2, static_cast<u64>(BISKeyType::Tweak)}},
362 {"bis_key_3_crypt", {S128KeyType::BIS, 3, static_cast<u64>(BISKeyType::Crypto)}},
363 {"bis_key_3_tweak", {S128KeyType::BIS, 3, static_cast<u64>(BISKeyType::Tweak)}},
364 {"header_kek", {S128KeyType::HeaderKek, 0, 0}},
365 {"sd_card_kek", {S128KeyType::SDKek, 0, 0}},
349}; 366};
350 367
351const boost::container::flat_map<std::string, KeyIndex<S256KeyType>> KeyManager::s256_file_id = { 368const boost::container::flat_map<std::string, KeyIndex<S256KeyType>> KeyManager::s256_file_id = {
352 {"header_key", {S256KeyType::Header, 0, 0}}, 369 {"header_key", {S256KeyType::Header, 0, 0}},
353 {"sd_card_save_key_source", {S256KeyType::SDKeySource, static_cast<u64>(SDKeyType::Save), 0}}, 370 {"sd_card_save_key_source", {S256KeyType::SDKeySource, static_cast<u64>(SDKeyType::Save), 0}},
354 {"sd_card_nca_key_source", {S256KeyType::SDKeySource, static_cast<u64>(SDKeyType::NCA), 0}}, 371 {"sd_card_nca_key_source", {S256KeyType::SDKeySource, static_cast<u64>(SDKeyType::NCA), 0}},
372 {"header_key_source", {S256KeyType::HeaderSource, 0, 0}},
373 {"sd_card_save_key", {S256KeyType::SDKey, static_cast<u64>(SDKeyType::Save), 0}},
374 {"sd_card_nca_key", {S256KeyType::SDKey, static_cast<u64>(SDKeyType::NCA), 0}},
355}; 375};
356} // namespace Core::Crypto 376} // namespace Core::Crypto