jsonld-signatures-merkleproof2019
Version:
A jsonld signature implementation to support MerkleProof2019 verification in Verifiable Credential context
46 lines (42 loc) • 1.5 kB
text/typescript
import { sha256 } from '@noble/hashes/sha2.js';
import { Buffer } from 'buffer';
import VerifierError from '../models/VerifierError.js';
import { toByteArray } from '../utils/data.js';
import getText from '../helpers/getText.js';
import type { DecodedProof, PathDefinition } from '../models/Proof';
export default function ensureValidReceipt (receipt: DecodedProof): void {
let proofHash: string = receipt.targetHash;
const merkleRoot = receipt.merkleRoot;
try {
const proof = receipt.path;
if (proof && proofHash) {
for (const index in proof) {
const node: PathDefinition = proof[index];
let appendedBuffer;
if (typeof node.left !== 'undefined') {
appendedBuffer = toByteArray(`${node.left}${proofHash}`);
proofHash = Buffer.from(sha256(Uint8Array.from(appendedBuffer))).toString('hex');
} else if (typeof node.right !== 'undefined') {
appendedBuffer = toByteArray(`${proofHash}${node.right}`);
proofHash = Buffer.from(sha256(Uint8Array.from(appendedBuffer))).toString('hex');
} else {
throw new VerifierError(
'checkReceipt',
'Trigger catch error.'
);
}
}
}
} catch (e) {
throw new VerifierError(
'checkReceipt',
getText('errors', 'ensureValidReceipt')
);
}
if (proofHash !== merkleRoot) {
throw new VerifierError(
'checkReceipt',
getText('errors', 'invalidMerkleReceipt')
);
}
}