diff --git a/src/js/core/read_write_proxy.js b/src/js/core/read_write_proxy.js index c9439603..48e12b4c 100644 --- a/src/js/core/read_write_proxy.js +++ b/src/js/core/read_write_proxy.js @@ -2,7 +2,7 @@ import { Application } from "../application"; /* typehints:end */ -import { sha1, CRC_PREFIX } from "./sensitive_utils.encrypt"; +import { sha1, CRC_PREFIX, computeCrc } from "./sensitive_utils.encrypt"; import { createLogger } from "./logging"; import { FILE_NOT_FOUND } from "../platform/storage"; import { accessNestedPropertyReverse } from "./utils"; @@ -11,7 +11,6 @@ import { ExplainedResult } from "./explained_result"; import { decompressX64, compressX64 } from "./lzstring"; import { asyncCompressor, compressionPrefix } from "./async_compression"; import { compressObject, decompressObject } from "../savegame/savegame_compressor"; -import crc32 from "crc/crc32"; const logger = createLogger("read_write_proxy"); @@ -85,7 +84,7 @@ export class ReadWriteProxy { */ static serializeObject(obj) { const jsonString = JSON.stringify(compressObject(obj)); - const checksum = CRC_PREFIX + crc32(jsonString + salt).toString(16); + const checksum = computeCrc(jsonString + salt); return compressionPrefix + compressX64(checksum + jsonString); } @@ -109,7 +108,7 @@ export class ReadWriteProxy { const jsonString = decompressed.substr(40); const desiredChecksum = checksum.startsWith(CRC_PREFIX) - ? CRC_PREFIX + crc32(jsonString + salt).toString(16) + ? computeCrc(jsonString + salt) : sha1(jsonString + salt); if (desiredChecksum !== checksum) { @@ -191,12 +190,14 @@ export class ReadWriteProxy { const jsonString = decompressed.substr(40); const desiredChecksum = checksum.startsWith(CRC_PREFIX) - ? CRC_PREFIX + crc32(jsonString + salt).toString(16) + ? computeCrc(jsonString + salt) : sha1(jsonString + salt); if (desiredChecksum !== checksum) { // Checksum mismatch - return Promise.reject("bad-content / checksum-mismatch"); + return Promise.reject( + "bad-content / checksum-mismatch: " + desiredChecksum + " vs " + checksum + ); } return jsonString; } else { diff --git a/src/js/core/sensitive_utils.encrypt.js b/src/js/core/sensitive_utils.encrypt.js index a35165ef..5a83bf76 100644 --- a/src/js/core/sensitive_utils.encrypt.js +++ b/src/js/core/sensitive_utils.encrypt.js @@ -1,5 +1,5 @@ import { createHash } from "rusha"; - +import crc32 from "crc/crc32"; import { decompressX64 } from "./lzstring"; export function sha1(str) { @@ -13,3 +13,11 @@ export function getNameOfProvider() { // Distinguish legacy crc prefixes export const CRC_PREFIX = "crc32".padEnd(32, "-"); + +/** + * Computes the crc for a given string + * @param {string} str + */ +export function computeCrc(str) { + return CRC_PREFIX + crc32(str).toString(16).padStart(8, "0"); +} diff --git a/src/js/webworkers/compression.worker.js b/src/js/webworkers/compression.worker.js index 855d3f50..56581ac1 100644 --- a/src/js/webworkers/compression.worker.js +++ b/src/js/webworkers/compression.worker.js @@ -1,8 +1,7 @@ -import { compressX64 } from "../core/lzstring"; import { globalConfig } from "../core/config"; +import { compressX64 } from "../core/lzstring"; +import { computeCrc } from "../core/sensitive_utils.encrypt"; import { compressObject } from "../savegame/savegame_compressor"; -import { CRC_PREFIX } from "../core/sensitive_utils.encrypt"; -import crc32 from "crc/crc32"; function accessNestedPropertyReverse(obj, keys) { let result = obj; @@ -31,7 +30,7 @@ function performJob(job, data) { const optimized = compressObject(data.obj); const stringified = JSON.stringify(optimized); - const checksum = CRC_PREFIX + crc32(stringified + salt).toString(16); + const checksum = computeCrc(stringified + salt); return data.compressionPrefix + compressX64(checksum + stringified); } default: