diff --git a/trunk/ConsoleDataMigration/sources/ConsoleBackup/Exporter.cpp b/trunk/ConsoleDataMigration/sources/ConsoleBackup/Exporter.cpp index edf795d..fd4c75f 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleBackup/Exporter.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleBackup/Exporter.cpp @@ -71,7 +71,7 @@ u64 s_ExportProgress = 0; } -void AddCmac(nn::fs::FileOutputStream* file, nn::crypto::Sha256Context* context); +bool AddCmac(nn::fs::FileOutputStream* file, nn::crypto::Sha256Context* context); nn::Result DeleteTrash(std::wstring currentDirectory) { @@ -758,6 +758,22 @@ nn::Result WriteMcuRtcData(common::HardwareStateManager& manager) return nn::ResultSuccess(); } +bool AddCmactoExportFileList() +{ + nn::Result result; + nn::fs::FileOutputStream list; + result = list.TryInitialize(common::FILE_LIST_PATHNAME, true); + COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result); + s64 fileSize = 0; + result = list.TryGetSize(&fileSize); + COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result); + // 末尾に移動 + result = list.TrySetPosition(fileSize); + COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result); + + return AddCmac(&list, &s_FileListContext); +} + void ExportThreadFunc() { nn::Result result; @@ -778,6 +794,15 @@ void ExportThreadFunc() { common::SaveDataMover saveDataMover; saveDataMover.StartExport(buf, bufSize, &s_ExportProgress); + COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED( + saveDataMover.GetLastResult(), s_IsExportSucceeded + ); + } + + // FileListにCMACを付加する + if(!AddCmactoExportFileList()) + { + s_IsExportSucceeded = false; } common::SdMountManager::Unmount(); @@ -925,7 +950,7 @@ bool IsExportSucceeded() //!@ brief ファイルにSHA256から計算したAES-CMACを付加します //!@ param[in] file CMACを付加したいInitialize済みのファイル //!@ param[in] context CMAC計算元のSHA256コンテキスト -void AddCmac(nn::fs::FileOutputStream* file, nn::crypto::Sha256Context* context) +bool AddCmac(nn::fs::FileOutputStream* file, nn::crypto::Sha256Context* context) { nn::Result result; @@ -934,12 +959,16 @@ void AddCmac(nn::fs::FileOutputStream* file, nn::crypto::Sha256Context* context) bit8 cmac[nn::crypto::AES_CMAC_MAC_SIZE]; result = nn::crypto::CalculateAesCmacSw(cmac, sha256Hash, nn::crypto::Sha256Context::HASH_SIZE, common::cmacKey); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); + COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result); s32 writeSize; result = file->TryWrite(&writeSize, cmac, sizeof(cmac), false); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); + COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result); + result = file->TryFlush(); + COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result); + + return true; } }