mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Savedata: Reset data size when retrying hash.
It's even possible we might've not loaded the key before, so let's play it safe and reset everything. The previous fix only worked in some games, when dataSize was larger than necessary.
This commit is contained in:
parent
1d430ffac9
commit
c4717fae2f
2 changed files with 19 additions and 10 deletions
|
@ -642,20 +642,28 @@ int SavedataParam::DetermineCryptMode(const SceUtilitySavedataParam *param) cons
|
||||||
return decryptMode;
|
return decryptMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SavedataParam::LoadCryptedSave(SceUtilitySavedataParam *param, u8 *data, u8 *saveData, int &saveSize, int prevCryptMode, const u8 *expectedHash, bool &saveDone) {
|
void SavedataParam::LoadCryptedSave(SceUtilitySavedataParam *param, u8 *data, const u8 *saveData, int &saveSize, int prevCryptMode, const u8 *expectedHash, bool &saveDone) {
|
||||||
|
int orig_size = saveSize;
|
||||||
int align_len = align16(saveSize);
|
int align_len = align16(saveSize);
|
||||||
u8 *data_base = new u8[align_len];
|
u8 *data_base = new u8[align_len];
|
||||||
u8 *cryptKey = new u8[0x10];
|
u8 *cryptKey = new u8[0x10];
|
||||||
memset(cryptKey, 0, 0x10);
|
|
||||||
|
|
||||||
int decryptMode = DetermineCryptMode(param);
|
int decryptMode = DetermineCryptMode(param);
|
||||||
const int detectedMode = decryptMode;
|
const int detectedMode = decryptMode;
|
||||||
bool hasKey = decryptMode > 1;
|
bool hasKey;
|
||||||
if (hasKey) {
|
|
||||||
memcpy(cryptKey, param->key, 0x10);
|
auto resetData = [&](int mode) {
|
||||||
}
|
saveSize = orig_size;
|
||||||
memset(data_base + saveSize, 0, align_len - saveSize);
|
align_len = align16(saveSize);
|
||||||
memcpy(data_base, saveData, saveSize);
|
hasKey = mode > 1;
|
||||||
|
|
||||||
|
if (hasKey) {
|
||||||
|
memcpy(cryptKey, param->key, 0x10);
|
||||||
|
}
|
||||||
|
memcpy(data_base, saveData, saveSize);
|
||||||
|
memset(data_base + saveSize, 0, align_len - saveSize);
|
||||||
|
};
|
||||||
|
resetData(decryptMode);
|
||||||
|
|
||||||
if (decryptMode != prevCryptMode) {
|
if (decryptMode != prevCryptMode) {
|
||||||
if (prevCryptMode == 1 && param->key[0] == 0) {
|
if (prevCryptMode == 1 && param->key[0] == 0) {
|
||||||
|
@ -688,12 +696,13 @@ void SavedataParam::LoadCryptedSave(SceUtilitySavedataParam *param, u8 *data, u8
|
||||||
int err = DecryptSave(decryptMode, data_base, &saveSize, &align_len, hasKey ? cryptKey : nullptr, expectedHash);
|
int err = DecryptSave(decryptMode, data_base, &saveSize, &align_len, hasKey ? cryptKey : nullptr, expectedHash);
|
||||||
// Perhaps the file had the wrong mode....
|
// Perhaps the file had the wrong mode....
|
||||||
if (err != 0 && detectedMode != decryptMode) {
|
if (err != 0 && detectedMode != decryptMode) {
|
||||||
hasKey = detectedMode > 1;
|
resetData(detectedMode);
|
||||||
err = DecryptSave(detectedMode, data_base, &saveSize, &align_len, hasKey ? cryptKey : nullptr, expectedHash);
|
err = DecryptSave(detectedMode, data_base, &saveSize, &align_len, hasKey ? cryptKey : nullptr, expectedHash);
|
||||||
}
|
}
|
||||||
// TODO: Should return an error, but let's just try with a bad hash.
|
// TODO: Should return an error, but let's just try with a bad hash.
|
||||||
if (err != 0 && expectedHash != nullptr) {
|
if (err != 0 && expectedHash != nullptr) {
|
||||||
WARN_LOG(SCEUTILITY, "Incorrect hash on save data, likely corrupt");
|
WARN_LOG(SCEUTILITY, "Incorrect hash on save data, likely corrupt");
|
||||||
|
resetData(decryptMode);
|
||||||
err = DecryptSave(decryptMode, data_base, &saveSize, &align_len, hasKey ? cryptKey : nullptr, nullptr);
|
err = DecryptSave(decryptMode, data_base, &saveSize, &align_len, hasKey ? cryptKey : nullptr, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -361,7 +361,7 @@ private:
|
||||||
void ClearFileInfo(SaveFileInfo &saveInfo, const std::string &saveName);
|
void ClearFileInfo(SaveFileInfo &saveInfo, const std::string &saveName);
|
||||||
|
|
||||||
int LoadSaveData(SceUtilitySavedataParam *param, const std::string &saveDirName, const std::string& dirPath, bool secureMode);
|
int LoadSaveData(SceUtilitySavedataParam *param, const std::string &saveDirName, const std::string& dirPath, bool secureMode);
|
||||||
void LoadCryptedSave(SceUtilitySavedataParam *param, u8 *data, u8 *saveData, int &saveSize, int prevCryptMode, const u8 *expectedHash, bool &saveDone);
|
void LoadCryptedSave(SceUtilitySavedataParam *param, u8 *data, const u8 *saveData, int &saveSize, int prevCryptMode, const u8 *expectedHash, bool &saveDone);
|
||||||
void LoadNotCryptedSave(SceUtilitySavedataParam *param, u8 *data, u8 *saveData, int &saveSize);
|
void LoadNotCryptedSave(SceUtilitySavedataParam *param, u8 *data, u8 *saveData, int &saveSize);
|
||||||
void LoadSFO(SceUtilitySavedataParam *param, const std::string& dirPath);
|
void LoadSFO(SceUtilitySavedataParam *param, const std::string& dirPath);
|
||||||
void LoadFile(const std::string& dirPath, const std::string& filename, PspUtilitySavedataFileData *fileData);
|
void LoadFile(const std::string& dirPath, const std::string& filename, PspUtilitySavedataFileData *fileData);
|
||||||
|
|
Loading…
Add table
Reference in a new issue