From 41a336888965b1ef535084839644a061dc10eafe Mon Sep 17 00:00:00 2001 From: Starsam80 Date: Wed, 29 Dec 2021 21:03:50 -0700 Subject: [PATCH] NANDImporter: Only read the AES key once There is no need to constantly reset the key for every file entry. --- Source/Core/DiscIO/NANDImporter.cpp | 14 ++++++-------- Source/Core/DiscIO/NANDImporter.h | 2 ++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/Core/DiscIO/NANDImporter.cpp b/Source/Core/DiscIO/NANDImporter.cpp index 67be289b4c..4520930ca3 100644 --- a/Source/Core/DiscIO/NANDImporter.cpp +++ b/Source/Core/DiscIO/NANDImporter.cpp @@ -4,7 +4,6 @@ #include "DiscIO/NANDImporter.h" #include -#include #include #include "Common/Crypto/AES.h" @@ -35,8 +34,8 @@ void NANDImporter::ImportNANDBin(const std::string& path_to_bin, if (!FindSuperblock()) return; - ProcessEntry(0, ""); ExportKeys(); + ProcessEntry(0, ""); ExtractCertificates(); } @@ -165,13 +164,8 @@ void NANDImporter::ProcessEntry(u16 entry_number, const std::string& parent_path std::vector NANDImporter::GetEntryData(const NANDFSTEntry& entry) { - constexpr size_t NAND_AES_KEY_OFFSET = 0x158; constexpr size_t NAND_FAT_BLOCK_SIZE = 0x4000; - std::array key{}; - std::copy(&m_nand_keys[NAND_AES_KEY_OFFSET], &m_nand_keys[NAND_AES_KEY_OFFSET + key.size()], - key.begin()); - u16 sub = entry.sub; size_t remaining_bytes = entry.size; std::vector data{}; @@ -181,7 +175,7 @@ std::vector NANDImporter::GetEntryData(const NANDFSTEntry& entry) { std::array iv{}; std::vector block = Common::AES::Decrypt( - key.data(), iv.data(), &m_nand[NAND_FAT_BLOCK_SIZE * sub], NAND_FAT_BLOCK_SIZE); + m_aes_key.data(), iv.data(), &m_nand[NAND_FAT_BLOCK_SIZE * sub], NAND_FAT_BLOCK_SIZE); size_t size = std::min(remaining_bytes, block.size()); data.insert(data.end(), block.begin(), block.begin() + size); @@ -264,6 +258,10 @@ bool NANDImporter::ExtractCertificates() void NANDImporter::ExportKeys() { + constexpr size_t NAND_AES_KEY_OFFSET = 0x158; + + std::copy_n(&m_nand_keys[NAND_AES_KEY_OFFSET], m_aes_key.size(), m_aes_key.begin()); + const std::string file_path = m_nand_root + "/keys.bin"; File::IOFile file(file_path, "wb"); if (!file.WriteBytes(m_nand_keys.data(), NAND_KEYS_SIZE)) diff --git a/Source/Core/DiscIO/NANDImporter.h b/Source/Core/DiscIO/NANDImporter.h index b0956e8d00..269a6c5483 100644 --- a/Source/Core/DiscIO/NANDImporter.h +++ b/Source/Core/DiscIO/NANDImporter.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include #include @@ -73,6 +74,7 @@ private: std::string m_nand_root; std::vector m_nand; std::vector m_nand_keys; + std::array m_aes_key; std::unique_ptr m_superblock; std::function m_update_callback; };