thor-devkit
Version:
Typescript library to aid DApp development on VeChain Thor
40 lines • 3.68 kB
JavaScript
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=