thor-devkit
Version:
Typescript library to aid DApp development on VeChain Thor
89 lines • 7.21 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.secp256k1 = void 0;
const crypto_1 = require("crypto");
const elliptic_1 = require("elliptic");
const buffer_1 = require("buffer");
const curve = new elliptic_1.ec('secp256k1');
const N = buffer_1.Buffer.from('fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141', 'hex');
const ZERO = buffer_1.Buffer.alloc(32, 0);
function isValidPrivateKey(key) {
return buffer_1.Buffer.isBuffer(key) &&
key.length === 32 &&
!key.equals(ZERO) &&
key.compare(N) < 0;
}
function isValidMessageHash(hash) {
return buffer_1.Buffer.isBuffer(hash) && hash.length === 32;
}
/** secp256k1 methods set */
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 : (() => (0, crypto_1.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_1.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_1.Buffer.from(sig.r.toArray('be', 32));
const s = buffer_1.Buffer.from(sig.s.toArray('be', 32));
return buffer_1.Buffer.concat([r, s, buffer_1.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_1.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_1.Buffer.from(curve.recoverPubKey(msgHash, { r, s }, recovery).encode('array', false));
}
secp256k1.recover = recover;
})(secp256k1 || (exports.secp256k1 = secp256k1 = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcDI1NmsxLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NlY3AyNTZrMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBb0M7QUFDcEMsdUNBQW1DO0FBQ25DLG1DQUErQjtBQUUvQixNQUFNLEtBQUssR0FBRyxJQUFJLGFBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUVqQyxNQUFNLENBQUMsR0FBRyxlQUFNLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxFQUFFLEtBQUssQ0FBQyxDQUFBO0FBQ2hHLE1BQU0sSUFBSSxHQUFHLGVBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBRWhDLFNBQVMsaUJBQWlCLENBQUMsR0FBVztJQUNsQyxPQUFPLGVBQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQ3ZCLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRTtRQUNqQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ2pCLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQzFCLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLElBQVk7SUFDcEMsT0FBTyxlQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFBO0FBQ3RELENBQUM7QUFFRCw0QkFBNEI7QUFDNUIsSUFBaUIsU0FBUyxDQTRFekI7QUE1RUQsV0FBaUIsU0FBUztJQUN0Qjs7O09BR0c7SUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxHQUFrQjtRQUNqRCxHQUFHLEdBQUcsR0FBRyxhQUFILEdBQUcsY0FBSCxHQUFHLEdBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLG9CQUFXLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNwQyxTQUFVLENBQUM7WUFDUCxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQTtZ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