keyvenant
Version:
Keyvenant is a JavaScript tool to generate and export CovenantSQL keys to facilitate key management locally and in web extensions.
62 lines • 4.13 kB
JavaScript
import secp256k1 from 'secp256k1/elliptic';
import coinstring from 'coinstring';
import { string2Buffer } from './utils';
import THash from './utils/THash';
import crypto from './utils/crypto';
/**
* create CovenantSQL private key
* use ECDS(secp256k1) for private key generation
* @param keySize=32 default keysize is 32 bytes
* @return privateKey hex string
*/
export function createPrivateKey(keySize = 32) {
// recursively try random bytes until has a valid private key
let recursiveVerify = (randomBytes) => {
let privateKey = randomBytes.slice(0, keySize);
if (!isPrivateKeyValid(privateKey)) {
return this.createPrivateKey();
}
return privateKey.toString('hex');
};
let randomBytes = crypto.randomBytes(keySize + keySize);
return recursiveVerify(randomBytes);
}
/**
* create public key from private key
* use secp256k1 public key generation with compress enabled
* @param privateKey private key hex string
* @param compressed=true default compress public key
* @return publicKey hex string
*/
export function privateKeyToPublicKey(privateKey, compressed = true) {
let prvBuf = string2Buffer(privateKey);
// compressed => 33 bytes compressed public key
// uncompressed => 65 bytes compressed public key
let pubBuf = secp256k1.publicKeyCreate(prvBuf, compressed);
return pubBuf.toString('hex');
}
/**
* convert address from public key
* 1. hash public key by THash
* 2. base58 encode hasedPubKey to filter out O 0, I i, + /
* @param publicKey public key hex string
* @param version version hex string to differ MainNet & TestNet
* @return address hex string
*/
export function publicKeyToAddress(publicKey, version) {
let pubBuf = string2Buffer(publicKey);
// hash public key by THash
let hasedPubKey = THash(pubBuf);
// base58 encode hasedPubKey to filter out O 0, I i, + /
let addressBuf = coinstring.encode(hasedPubKey, version);
return addressBuf.toString('hex');
}
/**
* check private key validity
* @param privateKey private key hex string
* @return boolean of private key validity
*/
function isPrivateKeyValid(privateKey) {
return secp256k1.privateKeyVerify(privateKey);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Z2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9rZXlnZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxTQUFTLE1BQU0sb0JBQW9CLENBQUE7QUFDMUMsT0FBTyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBRW5DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDdkMsT0FBTyxLQUFLLE1BQU0sZUFBZSxDQUFBO0FBQ2pDLE9BQU8sTUFBTSxNQUFNLGdCQUFnQixDQUFBO0FBRW5DOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixPQUFPLEdBQUcsRUFBRTtJQUVaLDZEQUE2RDtJQUM3RCxJQUFJLGVBQWUsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRTtRQUM1QyxJQUFJLFVBQVUsR0FBVyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDbEMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtTQUMvQjtRQUNELE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNuQyxDQUFDLENBQUE7SUFFRCxJQUFJLFdBQVcsR0FBVyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQTtJQUMvRCxPQUFPLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUNyQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxVQUFrQixFQUNsQixVQUFVLEdBQUcsSUFBSTtJQUVqQixJQUFJLE1BQU0sR0FBVyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDOUMsK0NBQStDO0lBQy9DLGlEQUFpRDtJQUNqRCxJQUFJLE1BQU0sR0FBVyxTQUFTLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUVsRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLFNBQWlCLEVBQ2pCLE9BQWU7SUFFZixJQUFJLE1BQU0sR0FBVyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDN0MsMkJBQTJCO0lBQzNCLElBQUksV0FBVyxHQUFXLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN2Qyx3REFBd0Q7SUFDeEQsSUFBSSxVQUFVLEdBQVcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFFaEUsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ25DLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FDeEIsVUFBa0I7SUFFbEIsT0FBTyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUE7QUFDL0MsQ0FBQyJ9