46 lines
947 B
TypeScript
46 lines
947 B
TypeScript
|
// Copyright 2022 Signal Messenger, LLC
|
||
|
// SPDX-License-Identifier: AGPL-3.0-only
|
||
|
|
||
|
import { createReadStream } from 'fs';
|
||
|
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<CheckIntegrityResultType> {
|
||
|
try {
|
||
|
const hash = createHash('sha512');
|
||
|
for await (const chunk of createReadStream(fileName)) {
|
||
|
hash.update(chunk);
|
||
|
}
|
||
|
|
||
|
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),
|
||
|
};
|
||
|
}
|
||
|
}
|