keyvenant
Version:
Keyvenant is a JavaScript tool to generate and export CovenantSQL keys to facilitate key management locally and in web extensions.
70 lines • 4.53 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const elliptic_1 = __importDefault(require("secp256k1/elliptic"));
const coinstring_1 = __importDefault(require("coinstring"));
const utils_1 = require("./utils");
const THash_1 = __importDefault(require("./utils/THash"));
const crypto_1 = __importDefault(require("./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
*/
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_1.default.randomBytes(keySize + keySize);
return recursiveVerify(randomBytes);
}
exports.createPrivateKey = createPrivateKey;
/**
* 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
*/
function privateKeyToPublicKey(privateKey, compressed = true) {
let prvBuf = utils_1.string2Buffer(privateKey);
// compressed => 33 bytes compressed public key
// uncompressed => 65 bytes compressed public key
let pubBuf = elliptic_1.default.publicKeyCreate(prvBuf, compressed);
return pubBuf.toString('hex');
}
exports.privateKeyToPublicKey = privateKeyToPublicKey;
/**
* 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
*/
function publicKeyToAddress(publicKey, version) {
let pubBuf = utils_1.string2Buffer(publicKey);
// hash public key by THash
let hasedPubKey = THash_1.default(pubBuf);
// base58 encode hasedPubKey to filter out O 0, I i, + /
let addressBuf = coinstring_1.default.encode(hasedPubKey, version);
return addressBuf.toString('hex');
}
exports.publicKeyToAddress = publicKeyToAddress;
/**
* check private key validity
* @param privateKey private key hex string
* @return boolean of private key validity
*/
function isPrivateKeyValid(privateKey) {
return elliptic_1.default.privateKeyVerify(privateKey);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Z2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9rZXlnZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrRUFBMEM7QUFDMUMsNERBQW1DO0FBRW5DLG1DQUF1QztBQUN2QywwREFBaUM7QUFDakMsNERBQW1DO0FBRW5DOzs7OztHQUtHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLE9BQU8sR0FBRyxFQUFFO0lBRVosNkRBQTZEO0lBQzdELElBQUksZUFBZSxHQUFHLENBQUMsV0FBbUIsRUFBRSxFQUFFO1FBQzVDLElBQUksVUFBVSxHQUFXLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ3RELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNsQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1NBQy9CO1FBQ0QsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ25DLENBQUMsQ0FBQTtJQUVELElBQUksV0FBVyxHQUFXLGdCQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQTtJQUMvRCxPQUFPLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUNyQyxDQUFDO0FBZEQsNENBY0M7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixxQkFBcUIsQ0FDbkMsVUFBa0IsRUFDbEIsVUFBVSxHQUFHLElBQUk7SUFFakIsSUFBSSxNQUFNLEdBQVcscUJBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUM5QywrQ0FBK0M7SUFDL0MsaURBQWlEO0lBQ2pELElBQUksTUFBTSxHQUFXLGtCQUFTLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUVsRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDL0IsQ0FBQztBQVZELHNEQVVDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLGtCQUFrQixDQUNoQyxTQUFpQixFQUNqQixPQUFlO0lBRWYsSUFBSSxNQUFNLEdBQVcscUJBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUM3QywyQkFBMkI7SUFDM0IsSUFBSSxXQUFXLEdBQVcsZUFBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3ZDLHdEQUF3RDtJQUN4RCxJQUFJLFVBQVUsR0FBVyxvQkFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFFaEUsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ25DLENBQUM7QUFYRCxnREFXQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUN4QixVQUFrQjtJQUVsQixPQUFPLGtCQUFTLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUE7QUFDL0MsQ0FBQyJ9