UNPKG

thor-devkit

Version:

Typescript library to aid DApp development on VeChain Thor

86 lines 6.97 kB
import { randomBytes } from 'crypto'; import { ec as EC } from 'elliptic'; import { Buffer } from 'buffer'; const curve = new EC('secp256k1'); const N = Buffer.from('fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141', 'hex'); const ZERO = Buffer.alloc(32, 0); function isValidPrivateKey(key) { return Buffer.isBuffer(key) && key.length === 32 && !key.equals(ZERO) && key.compare(N) < 0; } function isValidMessageHash(hash) { return Buffer.isBuffer(hash) && hash.length === 32; } /** secp256k1 methods set */ export var secp256k1; (function (secp256k1) { /** * generate private key * @param rng the optional random number generator, which exactly generates 32 random bytes */ function generatePrivateKey(rng) { rng = rng !== null && rng !== void 0 ? rng : (() => randomBytes(32)); for (;;) { const privKey = rng(); if (isValidPrivateKey(privKey)) { return privKey; } } } secp256k1.generatePrivateKey = generatePrivateKey; /** * derive public key(uncompressed) from private key * @param privKey the private key */ function derivePublicKey(privKey) { if (!isValidPrivateKey(privKey)) { throw new Error('invalid private key'); } const keyPair = curve.keyFromPrivate(privKey); return Buffer.from(keyPair.getPublic().encode('array', false)); } secp256k1.derivePublicKey = derivePublicKey; /** * sign a message using elliptic curve algorithm on the curve secp256k1 * @param msgHash hash of message * @param privKey serialized private key */ function sign(msgHash, privKey) { if (!isValidMessageHash(msgHash)) { throw new Error('invalid message hash'); } if (!isValidPrivateKey(privKey)) { throw new Error('invalid private key'); } const keyPair = curve.keyFromPrivate(privKey); const sig = keyPair.sign(msgHash, { canonical: true }); const r = Buffer.from(sig.r.toArray('be', 32)); const s = Buffer.from(sig.s.toArray('be', 32)); return Buffer.concat([r, s, Buffer.from([sig.recoveryParam])]); } secp256k1.sign = sign; /** * recovery signature to public key * @param msgHash hash of message * @param sig signature */ function recover(msgHash, sig) { if (!isValidMessageHash(msgHash)) { throw new Error('invalid message hash'); } if (!Buffer.isBuffer(sig) || sig.length !== 65) { throw new Error('invalid signature'); } const recovery = sig[64]; if (recovery !== 0 && recovery !== 1) { throw new Error('invalid signature recovery'); } const r = sig.slice(0, 32); const s = sig.slice(32, 64); return Buffer.from(curve.recoverPubKey(msgHash, { r, s }, recovery).encode('array', false)); } secp256k1.recover = recover; })(secp256k1 || (secp256k1 = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcDI1NmsxLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NlY3AyNTZrMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFFL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUE7QUFFakMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxrRUFBa0UsRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUNoRyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUVoQyxTQUFTLGlCQUFpQixDQUFDLEdBQVc7SUFDbEMsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUN2QixHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUU7UUFDakIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNqQixHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUMxQixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxJQUFZO0lBQ3BDLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQTtBQUN0RCxDQUFDO0FBRUQsNEJBQTRCO0FBQzVCLE1BQU0sS0FBVyxTQUFTLENBNEV6QjtBQTVFRCxXQUFpQixTQUFTO0lBQ3RCOzs7T0FHRztJQUNILFNBQWdCLGtCQUFrQixDQUFDLEdBQWtCO1FBQ2pELEdBQUcsR0FBRyxHQUFHLGFBQUgsR0FBRyxjQUFILEdBQUcsR0FBSSxDQUFDLEdBQUcsRUFB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