summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorLéo Lam <leo@innovatetechnologi.es>2019-05-07 01:02:38 +0200
committerLéo Lam <leo@innovatetechnologi.es>2019-05-07 01:09:48 +0200
commit2740ff9a9d1207ec6d4ea34ff7bc1db2ede619a0 (patch)
treed1b5555fe542f9ccd137a30f7b4b744584ad5ac9 /Source/Core
parent6f6c7e5df06b29cb87f90a85d215d7bd948f2669 (diff)
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.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/HW/WiiSave.cpp19
1 files 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 <cstdio>
#include <cstring>
#include <mbedtls/md5.h>
+#include <mbedtls/sha1.h>
#include <memory>
#include <optional>
#include <string>
@@ -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<u8[]>(data_size);
- m_file.Seek(sizeof(Header), SEEK_SET);
- if (!m_file.ReadBytes(data.get(), data_size))
- return false;
+ std::array<u8, 20> data_sha1;
+ {
+ const u32 data_size = bk_header->size_of_files + sizeof(BkHeader);
+ auto data = std::make_unique<u8[]>(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<u8*>(&ap_cert), Titles::SYSTEM_MENU, data.get(),
- data_size);
+ m_iosc.Sign(ap_sig.data(), reinterpret_cast<u8*>(&ap_cert), Titles::SYSTEM_MENU,
+ data_sha1.data(), static_cast<u32>(data_sha1.size()));
// Write signatures.
if (!m_file.Seek(0, SEEK_END))