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