diff --git a/pkgs/shared/src/utils.ts b/pkgs/shared/src/utils.ts index 6495e81..e768bb7 100644 --- a/pkgs/shared/src/utils.ts +++ b/pkgs/shared/src/utils.ts @@ -4,3 +4,16 @@ export function createArray( ): Array { return Array.from({ length }, (_, index) => f(index)); } + +export function byteArraysEqual(arr1: Uint8Array, arr2: Uint8Array): boolean { + const len = arr1.length; + if (len !== arr2.length) { + return false; + } + for (let i = 0; i < len; i += 1) { + if (arr1[i] !== arr2[i]) { + return false; + } + } + return true; +} diff --git a/pkgs/shared/src/wire.ts b/pkgs/shared/src/wire.ts index fcbe412..265d8b5 100644 --- a/pkgs/shared/src/wire.ts +++ b/pkgs/shared/src/wire.ts @@ -3,6 +3,7 @@ import { fromByteArray as serializeArray, toByteArray as deserializeArray, } from "base64-js"; +import { byteArraysEqual } from "./utils"; export { serializeArray, deserializeArray }; @@ -56,7 +57,7 @@ export async function verifyAndDeserializeData( ): Promise { const arr = utf16StringToArrayBuffer(`${signedData.data}:${secret}`); const hash = new Uint8Array(await crypto.subtle.digest("SHA-256", arr)); - if (hash !== deserializeArray(signedData.hash)) { + if (!byteArraysEqual(hash, deserializeArray(signedData.hash))) { throw new Error(`Signed data verification failed, hash mismatch`); } const data = JSON.parse(signedData.data);