UNPKG

signify-ts

Version:

Signing at the edge for KERI, ACDC, and KERIA

69 lines (68 loc) 2.24 kB
import { blake3 } from '@noble/hashes/blake3'; import { Matter, MtrDex } from "./matter.js"; /** * @description : Diger is subset of Matter and is used to verify the digest of serialization * It uses .raw : as digest * .code as digest algorithm * */ export class Diger extends Matter { // This constructor will assign digest verification function to ._verify constructor({ raw, code = MtrDex.Blake3_256, qb64, qb64b, qb2 }, ser = null) { try { super({ raw, code, qb64, qb64b, qb2 }); } catch (error) { if (ser == null) { throw error; } if (code === MtrDex.Blake3_256) { const dig = blake3.create({ dkLen: 32 }).update(ser).digest(); super({ raw: dig, code: code }); } else { throw new Error(`Unsupported code = ${code} for digester.`); } } if (code === MtrDex.Blake3_256) { this._verify = this.blake3_256; } else { throw new Error(`Unsupported code = ${code} for digester.`); } } /** * * @param {Uint8Array} ser serialization bytes * @description This method will return true if digest of bytes serialization ser matches .raw * using .raw as reference digest for ._verify digest algorithm determined by .code */ verify(ser) { return this._verify(ser, this.raw); } compare(ser, dig = null, diger = null) { if (dig != null) { if (dig.toString() == this.qb64) { return true; } diger = new Diger({ qb64b: dig }); } else if (diger != null) { if (diger.qb64b == this.qb64b) { return true; } } else { throw new Error('Both dig and diger may not be None.'); } if (diger.code == this.code) { return false; } return diger.verify(ser) && this.verify(ser); } blake3_256(ser, dig) { const digest = blake3.create({ dkLen: 32 }).update(ser).digest(); return (digest.length == dig.length && digest.toString() === dig.toString()); } }