node-btcpay/cryptography.js
2018-04-16 18:05:21 +00:00

45 lines
1.3 KiB
JavaScript

let crypto = require('crypto')
let EC = require('elliptic').ec,
ec = new EC('secp256k1');
let bs58 = require('bs58')
const BN = require('bn.js')
let generate_keypair = function () {
let kp = ec.genKeyPair()
return kp
}
let load_keypair = function (buf) {
return ec.keyFromPrivate(buf)
}
let get_sin_from_key = function (kp) {
let pk = Buffer.from(kp.getPublic().encodeCompressed())
let version = get_version_from_compressed_key(pk)
let checksum = get_checksum_from_version(version)
return bs58.encode(Buffer.concat([version, checksum]))
}
let sign = function (message, kp) {
let digest = crypto.createHash('sha256').update(message).digest()
return Buffer.from(kp.sign(digest).toDER())
}
let get_version_from_compressed_key = function (pk) {
let sh2 = crypto.createHash('sha256').update(pk).digest()
let rp = crypto.createHash('ripemd160').update(sh2).digest()
return Buffer.concat([Buffer.from('0F', 'hex'), Buffer.from('02', 'hex'), rp])
}
let get_checksum_from_version = function (version) {
let h1 = crypto.createHash('sha256').update(version).digest()
let h2 = crypto.createHash('sha256').update(h1).digest()
return h2.slice(0, 4)
}
exports.generate_keypair = generate_keypair
exports.load_keypair = load_keypair
exports.get_sin_from_key = get_sin_from_key
exports.sign = sign