diff --git a/core/crypto/partition_data_manager.h b/core/crypto/partition_data_manager.h new file mode 100755 index 0000000..5310eda --- /dev/null +++ b/core/crypto/partition_data_manager.h @@ -0,0 +1,109 @@ +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include "../common/common_types.h" +#include "../core/file_sys/vfs/vfs_types.h" + +namespace Core::Crypto { + +enum class Package2Type { + NormalMain, + NormalSub, + SafeModeMain, + SafeModeSub, + RepairMain, + RepairSub, +}; + +class PartitionDataManager { +public: + static const u8 MAX_KEYBLOB_SOURCE_HASH; + static constexpr std::size_t NUM_ENCRYPTED_KEYBLOBS = 32; + static constexpr std::size_t ENCRYPTED_KEYBLOB_SIZE = 0xB0; + + using EncryptedKeyBlob = std::array; + using EncryptedKeyBlobs = std::array; + + explicit PartitionDataManager(const FileSys::VirtualDir& sysdata_dir); + ~PartitionDataManager(); + + // BOOT0 + bool HasBoot0() const; + FileSys::VirtualFile GetBoot0Raw() const; + EncryptedKeyBlob GetEncryptedKeyblob(std::size_t index) const; + EncryptedKeyBlobs 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(std::size_t 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(const std::array, 0x20>& package2_keys, + 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_key); + FileSys::VirtualFile GetDecryptedProdInfo() const; + 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; +}; + +std::array FindKeyFromHex16(const std::vector& binary, std::array hash); + +} // namespace Core::Crypto diff --git a/core/fs/vfs/vfs_types.h b/core/fs/vfs/vfs_types.h index 4a583ed..2510a01 100644 --- a/core/fs/vfs/vfs_types.h +++ b/core/fs/vfs/vfs_types.h @@ -5,7 +5,7 @@ #include -#include "common/common_types.h" +#include "../common/common_types.h" namespace FileSys {