void CWiiSaveCrypted::ImportWiiSaveFiles() { if (!b_valid) return; File::IOFile fpData_bin(pathData_bin, "rb"); if (!fpData_bin) { PanicAlertT("Cannot open %s", pathData_bin); b_valid = false; return; } fpData_bin.Seek(HEADER_SZ + BK_SZ, SEEK_SET); FileHDR _tmpFileHDR; for(u32 i = 0; i < _numberOfFiles; i++) { memset(&_tmpFileHDR, 0, FILE_HDR_SZ); memset(IV, 0, 0x10); _fileSize = 0; if (!fpData_bin.ReadBytes(&_tmpFileHDR, FILE_HDR_SZ)) { PanicAlertT("Failed to write header for file %d", i); b_valid = false; } if (Common::swap32(_tmpFileHDR.magic) != FILE_HDR_MAGIC) { PanicAlertT("Bad File Header"); break; } else { std::string fileName ((char*)_tmpFileHDR.name); for (Common::replace_v::const_iterator iter = replacements.begin(); iter != replacements.end(); ++iter) { for (size_t j = 0; (j = fileName.find(iter->first, j)) != fileName.npos; ++j) fileName.replace(j, 1, iter->second); } std::string fullFilePath = WiiTitlePath + fileName; File::CreateFullPath(fullFilePath); if (_tmpFileHDR.type == 1) { _fileSize = Common::swap32(_tmpFileHDR.size); u32 RoundedFileSize = ROUND_UP(_fileSize, BLOCK_SZ); _encryptedData = new u8[RoundedFileSize]; _data = new u8[RoundedFileSize]; if (!fpData_bin.ReadBytes(_encryptedData, RoundedFileSize)) { PanicAlertT("Failed to read data from file %d", i); b_valid = false; break; } memcpy(IV, _tmpFileHDR.IV, 0x10); AES_cbc_encrypt((const unsigned char *)_encryptedData, _data, RoundedFileSize, &m_AES_KEY, IV, AES_DECRYPT); delete []_encryptedData; if (!File::Exists(fullFilePath) || AskYesNoT("%s already exists, overwrite?", fullFilePath.c_str())) { INFO_LOG(CONSOLE, "Creating file %s", fullFilePath.c_str()); File::IOFile fpRawSaveFile(fullFilePath, "wb"); fpRawSaveFile.WriteBytes(_data, _fileSize); } delete []_data; } } } }
void CWiiSaveCrypted::ExportWiiSaveFiles() { if (!b_valid) return; u8 *__ENCdata, *__data; for(u32 i = 0; i < _numberOfFiles; i++) { FileHDR tmpFileHDR; std::string __name, __ext; memset(&tmpFileHDR, 0, FILE_HDR_SZ); _fileSize = File::GetSize(FilesList[i]); _roundedfileSize = ROUND_UP(_fileSize, BLOCK_SZ); tmpFileHDR.magic = Common::swap32(FILE_HDR_MAGIC); tmpFileHDR.size = Common::swap32(_fileSize); tmpFileHDR.Permissions = 0x35; tmpFileHDR.type = File::IsDirectory(FilesList[i]) ? 2 : 1; SplitPath(FilesList[i], NULL, &__name, &__ext); __name += __ext; for (Common::replace_v::const_iterator iter = replacements.begin(); iter != replacements.end(); ++iter) { for (size_t j = 0; (j = __name.find(iter->second, j)) != __name.npos; ++j) { __name.replace(j, iter->second.length(), 1, iter->first); } } if (__name.length() > 0x44) { PanicAlertT("%s is too long for the filename, max chars is 45", __name.c_str()); b_valid = false; return; } strncpy((char *)tmpFileHDR.name, __name.c_str(), __name.length()); { File::IOFile fpData_bin(pathData_bin, "ab"); fpData_bin.WriteBytes(&tmpFileHDR, FILE_HDR_SZ); } if (tmpFileHDR.type == 1) { if (_fileSize == 0) { PanicAlertT("%s is a 0 byte file", FilesList[i].c_str()); b_valid = false; return; } File::IOFile fpRawSaveFile(FilesList[i], "rb"); if (!fpRawSaveFile) { PanicAlertT("%s failed to open", FilesList[i].c_str()); b_valid = false; } __data = new u8[_roundedfileSize]; __ENCdata = new u8[_roundedfileSize]; memset(__data, 0, _roundedfileSize); if (!fpRawSaveFile.ReadBytes(__data, _fileSize)) { PanicAlertT("Failed to read data from file: %s", FilesList[i].c_str()); b_valid = false; } AES_cbc_encrypt((const u8*)__data, __ENCdata, _roundedfileSize, &m_AES_KEY, tmpFileHDR.IV, AES_ENCRYPT); File::IOFile fpData_bin(pathData_bin, "ab"); fpData_bin.WriteBytes(__ENCdata, _roundedfileSize); delete [] __data; delete [] __ENCdata; } } }
void CWiiSaveCrypted::ExportWiiSaveFiles() { if (!b_valid) return; for (u32 i = 0; i < _numberOfFiles; i++) { FileHDR tmpFileHDR; std::string __name; memset(&tmpFileHDR, 0, FILE_HDR_SZ); u32 _fileSize = 0; if (File::IsDirectory(FilesList[i])) { tmpFileHDR.type = 2; } else { _fileSize = File::GetSize(FilesList[i]); tmpFileHDR.type = 1; } u32 _roundedfileSize = ROUND_UP(_fileSize, BLOCK_SZ); tmpFileHDR.magic = Common::swap32(FILE_HDR_MAGIC); tmpFileHDR.size = Common::swap32(_fileSize); tmpFileHDR.Permissions = 0x3c; __name = FilesList[i].substr(WiiTitlePath.length()+1); for (const Common::replace_t& repl : replacements) { for (size_t j = 0; (j = __name.find(repl.second, j)) != __name.npos; ++j) { __name.replace(j, repl.second.length(), 1, repl.first); } } if (__name.length() > 0x44) { PanicAlertT("\"%s\" is too long for the filename, max length is 0x44 + \\0", __name.c_str()); b_valid = false; return; } strncpy((char *)tmpFileHDR.name, __name.c_str(), sizeof(tmpFileHDR.name)); { File::IOFile fpData_bin(encryptedSavePath, "ab"); fpData_bin.WriteBytes(&tmpFileHDR, FILE_HDR_SZ); } if (tmpFileHDR.type == 1) { if (_fileSize == 0) { PanicAlertT("%s is a 0 byte file", FilesList[i].c_str()); b_valid = false; return; } File::IOFile fpRawSaveFile(FilesList[i], "rb"); if (!fpRawSaveFile) { PanicAlertT("%s failed to open", FilesList[i].c_str()); b_valid = false; } std::vector<u8> _data,_encryptedData; _data.reserve(_roundedfileSize); _encryptedData.reserve(_roundedfileSize); memset(&_data[0], 0, _roundedfileSize); if (!fpRawSaveFile.ReadBytes(&_data[0], _fileSize)) { PanicAlertT("Failed to read data from file: %s", FilesList[i].c_str()); b_valid = false; } aes_crypt_cbc(&m_AES_ctx, AES_ENCRYPT, _roundedfileSize, tmpFileHDR.IV, (const u8*)&_data[0], &_encryptedData[0]); File::IOFile fpData_bin(encryptedSavePath, "ab"); if (!fpData_bin.WriteBytes(&_encryptedData[0], _roundedfileSize)) PanicAlertT("Failed to write data to file: %s", encryptedSavePath.c_str()); } } }