// Copyright 2022 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import { createReadStream } from 'fs'; import { pipeline } from 'stream/promises'; import { createHash } from 'crypto'; import * as Errors from '../types/errors'; export type CheckIntegrityResultType = Readonly< | { ok: true; error?: void; } | { ok: false; error: string; } >; export async function checkIntegrity( fileName: string, sha512: string ): Promise { try { const hash = createHash('sha512'); await pipeline(createReadStream(fileName), hash); const actualSHA512 = hash.digest('base64'); if (sha512 === actualSHA512) { return { ok: true }; } return { ok: false, error: `Integrity check failure: expected ${sha512}, got ${actualSHA512}`, }; } catch (error) { return { ok: false, error: Errors.toLogFormat(error), }; } }