// 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