From 2740ff9a9d1207ec6d4ea34ff7bc1db2ede619a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Tue, 7 May 2019 01:02:38 +0200 Subject: [PATCH] WiiSave: Fix save signing The system menu is passing the SHA1 hash of the save data to ES to sign, not the save data itself. Fixes save import in the System Menu for saves that were exported by Dolphin. --- Source/Core/Core/HW/WiiSave.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Source/Core/Core/HW/WiiSave.cpp b/Source/Core/Core/HW/WiiSave.cpp index 0f8d48c77e..dc70fdceae 100644 --- a/Source/Core/Core/HW/WiiSave.cpp +++ b/Source/Core/Core/HW/WiiSave.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -403,17 +404,21 @@ private: return false; // Read data to sign. - const u32 data_size = bk_header->size_of_files + sizeof(BkHeader); - auto data = std::make_unique(data_size); - m_file.Seek(sizeof(Header), SEEK_SET); - if (!m_file.ReadBytes(data.get(), data_size)) - return false; + std::array data_sha1; + { + const u32 data_size = bk_header->size_of_files + sizeof(BkHeader); + auto data = std::make_unique(data_size); + m_file.Seek(sizeof(Header), SEEK_SET); + if (!m_file.ReadBytes(data.get(), data_size)) + return false; + mbedtls_sha1(data.get(), data_size, data_sha1.data()); + } // Sign the data. IOS::CertECC ap_cert; Common::ec::Signature ap_sig; - m_iosc.Sign(ap_sig.data(), reinterpret_cast(&ap_cert), Titles::SYSTEM_MENU, data.get(), - data_size); + m_iosc.Sign(ap_sig.data(), reinterpret_cast(&ap_cert), Titles::SYSTEM_MENU, + data_sha1.data(), static_cast(data_sha1.size())); // Write signatures. if (!m_file.Seek(0, SEEK_END))