From 29dc6f4519b94d7387486d1c37b899c8e50a00ef Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Sun, 23 Sep 2018 21:06:07 -0400 Subject: crypto: Add PartitionDataManager Keeps track of system files for key derivation --- src/core/crypto/partition_data_manager.h | 104 +++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 src/core/crypto/partition_data_manager.h (limited to 'src/core/crypto/partition_data_manager.h') diff --git a/src/core/crypto/partition_data_manager.h b/src/core/crypto/partition_data_manager.h new file mode 100644 index 000000000..85bb2a110 --- /dev/null +++ b/src/core/crypto/partition_data_manager.h @@ -0,0 +1,104 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once +#include +#include "common/common_funcs.h" +#include "common/common_types.h" +#include "common/swap.h" +#include "core/file_sys/vfs_types.h" + +namespace Core::Crypto { + +enum class Package2Type { + NormalMain, + NormalSub, + SafeModeMain, + SafeModeSub, + RepairMain, + RepairSub, +}; + +class PartitionDataManager { +public: + const static u8 MAX_KEYBLOB_SOURCE_HASH; + + explicit PartitionDataManager(FileSys::VirtualDir sysdata_dir); + + // BOOT0 + bool HasBoot0() const; + FileSys::VirtualFile GetBoot0Raw() const; + std::array GetEncryptedKeyblob(u8 index) const; + std::array, 0x20> GetEncryptedKeyblobs() const; + std::vector GetSecureMonitor() const; + std::array GetPackage2KeySource() const; + std::array GetAESKekGenerationSource() const; + std::array GetTitlekekSource() const; + std::array, 0x20> GetTZMasterKeys(std::array master_key) const; + std::array GetRSAKekSeed3() const; + std::array GetRSAKekMask0() const; + std::vector GetPackage1Decrypted() const; + std::array GetMasterKeySource() const; + std::array GetKeyblobMACKeySource() const; + std::array GetKeyblobKeySource(u8 revision) const; + + // Fuses + bool HasFuses() const; + FileSys::VirtualFile GetFusesRaw() const; + std::array GetSecureBootKey() const; + + // K-Fuses + bool HasKFuses() const; + FileSys::VirtualFile GetKFusesRaw() const; + + // Package2 + bool HasPackage2(Package2Type type = Package2Type::NormalMain) const; + FileSys::VirtualFile GetPackage2Raw(Package2Type type = Package2Type::NormalMain) const; + void DecryptPackage2(std::array, 0x20> package2, Package2Type type); + const std::vector& GetPackage2FSDecompressed( + Package2Type type = Package2Type::NormalMain) const; + std::array GetKeyAreaKeyApplicationSource( + Package2Type type = Package2Type::NormalMain) const; + std::array GetKeyAreaKeyOceanSource( + Package2Type type = Package2Type::NormalMain) const; + std::array GetKeyAreaKeySystemSource( + Package2Type type = Package2Type::NormalMain) const; + std::array GetSDKekSource(Package2Type type = Package2Type::NormalMain) const; + std::array GetSDSaveKeySource(Package2Type type = Package2Type::NormalMain) const; + std::array GetSDNCAKeySource(Package2Type type = Package2Type::NormalMain) const; + std::array GetHeaderKekSource(Package2Type type = Package2Type::NormalMain) const; + std::array GetHeaderKeySource(Package2Type type = Package2Type::NormalMain) const; + const std::vector& GetPackage2SPLDecompressed( + Package2Type type = Package2Type::NormalMain) const; + std::array GetAESKeyGenerationSource( + Package2Type type = Package2Type::NormalMain) const; + + // PRODINFO + bool HasProdInfo() const; + FileSys::VirtualFile GetProdInfoRaw() const; + void DecryptProdInfo(std::array bis_crypt, std::array bis_tweak); + std::array GetETicketExtendedKek() const; + +private: + FileSys::VirtualFile boot0; + FileSys::VirtualFile fuses; + FileSys::VirtualFile kfuses; + std::array package2; + FileSys::VirtualFile prodinfo; + FileSys::VirtualFile secure_monitor; + FileSys::VirtualFile package1_decrypted; + + // Processed + std::array package2_decrypted; + FileSys::VirtualFile prodinfo_decrypted; + std::vector secure_monitor_bytes; + std::vector package1_decrypted_bytes; + std::array, 6> package2_fs; + std::array, 6> package2_spl; +}; + +template +std::array FindKeyFromHex(const std::vector& binary, std::array hash); + +} // namespace Core::Crypto -- cgit v1.2.3 From 3ec054643e50f2845fb6a1a924b83bd71a0e2234 Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Sat, 29 Sep 2018 11:48:51 -0400 Subject: partition_data_manager: Rename system files for hekate x --- src/core/crypto/partition_data_manager.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'src/core/crypto/partition_data_manager.h') diff --git a/src/core/crypto/partition_data_manager.h b/src/core/crypto/partition_data_manager.h index 85bb2a110..45c7fecfa 100644 --- a/src/core/crypto/partition_data_manager.h +++ b/src/core/crypto/partition_data_manager.h @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #pragma once + #include #include "common/common_funcs.h" #include "common/common_types.h" @@ -22,9 +23,10 @@ enum class Package2Type { class PartitionDataManager { public: - const static u8 MAX_KEYBLOB_SOURCE_HASH; + static const u8 MAX_KEYBLOB_SOURCE_HASH; explicit PartitionDataManager(FileSys::VirtualDir sysdata_dir); + ~PartitionDataManager(); // BOOT0 bool HasBoot0() const; @@ -77,7 +79,7 @@ public: // PRODINFO bool HasProdInfo() const; FileSys::VirtualFile GetProdInfoRaw() const; - void DecryptProdInfo(std::array bis_crypt, std::array bis_tweak); + void DecryptProdInfo(std::array bis_key); std::array GetETicketExtendedKek() const; private: @@ -98,7 +100,6 @@ private: std::array, 6> package2_spl; }; -template -std::array FindKeyFromHex(const std::vector& binary, std::array hash); +std::array FindKeyFromHex16(const std::vector& binary, std::array hash); } // namespace Core::Crypto -- cgit v1.2.3