@meterio/devkit
Version: 
Typescript library to aid DApp development on Meter network
85 lines • 6.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.secp256k1 = void 0;
const crypto_1 = require("crypto");
const elliptic_1 = require("elliptic");
const curve = new elliptic_1.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 */
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 || (() => (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.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 = exports.secp256k1 || (exports.secp256k1 = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcDI1NmsxLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NyeS9zZWNwMjU2azEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQXFDO0FBQ3JDLHVDQUFvQztBQUVwQyxNQUFNLEtBQUssR0FBRyxJQUFJLGFBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUVsQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2pHLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRWpDLFNBQVMsaUJBQWlCLENBQUMsR0FBVztJQUNwQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlGLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLElBQVk7SUFDdEMsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFFRCw0QkFBNEI7QUFDNUIsSUFBaUIsU0FBUyxDQXdFekI7QUF4RUQsV0FBaUIsU0FBUztJQUN4Qjs7O09BR0c7SUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxHQUFrQjtRQUNuRCxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxvQkFBVyxFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckMsU0FBUztZQUNQLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVB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