UNPKG

thor-devkit

Version:

Typescript library to aid DApp development on VeChain Thor

40 lines 3.68 kB
import { address } from './address'; import { blake2b256 } from './blake2b'; import { secp256k1 } from './secp256k1'; import fastJsonStableStringify from 'fast-json-stable-stringify'; import { Buffer } from 'buffer'; export var Certificate; (function (Certificate) { function safeToLowerCase(str) { return typeof str === 'string' ? str.toLowerCase() : str; } /** * deterministically encode cert into JSON * @param cert cert object */ function encode(cert) { return fastJsonStableStringify(Object.assign(Object.assign({}, cert), { signer: safeToLowerCase(cert.signer), signature: cert.signature ? safeToLowerCase(cert.signature) : cert.signature })); } Certificate.encode = encode; /** * verify the cert * @param cert cert object with signature */ function verify(cert) { if (!cert.signature) { throw new Error('signature missing'); } const signature = cert.signature; if (!/^0x[0-9a-f]+$/i.test(signature) || signature.length % 2 !== 0) { throw new Error('invalid signature'); } const encoded = encode(Object.assign(Object.assign({}, cert), { signature: undefined })); const signingHash = blake2b256(encoded); const pubKey = secp256k1.recover(signingHash, Buffer.from(signature.slice(2), 'hex')); if (address.fromPublicKey(pubKey) !== safeToLowerCase(cert.signer)) { throw new Error('signature does not match with signer'); } } Certificate.verify = verify; })(Certificate || (Certificate = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2VydGlmaWNhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDdkMsT0FBTyx1QkFBdUIsTUFBTSw0QkFBNEIsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBbUIvQixNQUFNLEtBQVcsV0FBVyxDQXNDM0I7QUF0Q0QsV0FBaUIsV0FBVztJQUN4QixTQUFTLGVBQWUsQ0FBQyxHQUFXO1FBQ2hDLE9BQU8sT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQTtJQUM1RCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsU0FBZ0IsTUFBTSxDQUFDLElBQWlCO1FBQ3BDLE9BQU8sdUJBQXVCLGlDQUN2QixJQUFJLEtBQ1AsTUFBTSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUNwRSxDQUFBO0lBQ2hCLENBQUM7SUFOZSxrQkFBTSxTQU1yQixDQUFBO0lBRUQ7OztPQUdHO0lBQ0gsU0FBZ0IsTUFBTSxDQUFDLElBQWlCO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1FBQ3hDLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFBO1FBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1FBQ3hDLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLGlDQUFNLElBQUksS0FBRSxTQUFTLEVBQUUsU0FBUyxJQUFHLENBQUE7UUFDekQsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBRXZDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBRXJGLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDakUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFBO1FBQzNELENBQUM7SUFDTCxDQUFDO0lBakJlLGtCQUFNLFNBaUJyQixDQUFBO0FBQ0wsQ0FBQyxFQXRDZ0IsV0FBVyxLQUFYLFdBQVcsUUFzQzNCIn0=