thor-devkit
Version:
Typescript library to aid DApp development on VeChain Thor
46 lines • 3.85 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Certificate = void 0;
const address_1 = require("./address");
const blake2b_1 = require("./blake2b");
const secp256k1_1 = require("./secp256k1");
const fast_json_stable_stringify_1 = __importDefault(require("fast-json-stable-stringify"));
const buffer_1 = require("buffer");
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 fast_json_stable_stringify_1.default(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 = blake2b_1.blake2b256(encoded);
const pubKey = secp256k1_1.secp256k1.recover(signingHash, buffer_1.Buffer.from(signature.slice(2), 'hex'));
if (address_1.address.fromPublicKey(pubKey) !== safeToLowerCase(cert.signer)) {
throw new Error('signature does not match with signer');
}
}
Certificate.verify = verify;
})(Certificate = exports.Certificate || (exports.Certificate = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2VydGlmaWNhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsdUNBQW1DO0FBQ25DLHVDQUFzQztBQUN0QywyQ0FBdUM7QUFDdkMsNEZBQWdFO0FBQ2hFLG1DQUErQjtBQW1CL0IsSUFBaUIsV0FBVyxDQXNDM0I7QUF0Q0QsV0FBaUIsV0FBVztJQUN4QixTQUFTLGVBQWUsQ0FBQyxHQUFXO1FBQ2hDLE9BQU8sT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQTtJQUM1RCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsU0FBZ0IsTUFBTSxDQUFDLElBQWlCO1FBQ3BDLE9BQU8sb0NBQXVCLGlDQUN2QixJQUFJLEtBQ1AsTUFBTSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUNwRSxDQUFBO0lBQ2hCLENBQUM7SUFOZSxrQkFBTSxTQU1yQixDQUFBO0lBRUQ7OztPQUdHO0lBQ0gsU0FBZ0IsTUFBTSxDQUFDLElBQWlCO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtTQUN2QztRQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUE7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDakUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1NBQ3ZDO1FBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxpQ0FBTSxJQUFJLEtBQUUsU0FBUyxFQUFFLFNBQVMsSUFBRyxDQUFBO1FBQ3pELE1BQU0sV0FBVyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFdkMsTUFBTSxNQUFNLEdBQUcscUJBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLGVBQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBRXJGLElBQUksaUJBQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNoRSxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUE7U0FDMUQ7SUFDTCxDQUFDO0lBakJlLGtCQUFNLFNBaUJyQixDQUFBO0FBQ0wsQ0FBQyxFQXRDZ0IsV0FBVyxHQUFYLG1CQUFXLEtBQVgsbUJBQVcsUUFzQzNCIn0=