bitcoinjs-lib/src/eckey.js

85 lines
2 KiB
JavaScript
Raw Normal View History

var assert = require('assert')
2014-07-02 14:37:32 +10:00
var base58check = require('bs58check')
2014-07-28 13:46:34 +10:00
var crypto = require('crypto')
var ecdsa = require('./ecdsa')
2014-12-23 15:08:20 +11:00
var typeForce = require('typeforce')
var networks = require('./networks')
2014-05-13 16:44:29 +10:00
var BigInteger = require('bigi')
var ECPubKey = require('./ecpubkey')
2014-06-07 16:24:27 +10:00
var ecurve = require('ecurve')
var secp256k1 = ecurve.getCurveByName('secp256k1')
function ECKey(d, compressed) {
assert(d.signum() > 0, 'Private key must be greater than 0')
assert(d.compareTo(ECKey.curve.n) < 0, 'Private key must be less than the curve order')
var Q = ECKey.curve.G.multiply(d)
this.d = d
2014-04-17 19:08:16 +10:00
this.pub = new ECPubKey(Q, compressed)
}
// Constants
ECKey.curve = secp256k1
2014-04-17 19:08:16 +10:00
// Static constructors
ECKey.fromWIF = function(string) {
var payload = base58check.decode(string)
var compressed = false
// Ignore the version byte
payload = payload.slice(1)
2014-04-17 19:08:16 +10:00
if (payload.length === 33) {
assert.strictEqual(payload[32], 0x01, 'Invalid compression flag')
// Truncate the compression flag
payload = payload.slice(0, -1)
compressed = true
2014-04-17 19:08:16 +10:00
}
assert.equal(payload.length, 32, 'Invalid WIF payload length')
var d = BigInteger.fromBuffer(payload)
return new ECKey(d, compressed)
}
2014-04-17 19:08:16 +10:00
ECKey.makeRandom = function(compressed, rng) {
2014-07-28 13:46:34 +10:00
rng = rng || crypto.randomBytes
2014-06-23 18:22:01 +10:00
var buffer = rng(32)
2014-12-23 15:08:20 +11:00
typeForce('Buffer', buffer)
assert.equal(buffer.length, 32, 'Expected 256-bit Buffer from RNG')
var d = BigInteger.fromBuffer(buffer)
d = d.mod(ECKey.curve.n)
return new ECKey(d, compressed)
2013-11-18 23:47:56 -05:00
}
2014-04-17 19:08:16 +10:00
// Export functions
ECKey.prototype.toWIF = function(network) {
network = network || networks.bitcoin
2014-03-25 02:44:43 +11:00
var bufferLen = this.pub.compressed ? 34 : 33
var buffer = new Buffer(bufferLen)
buffer.writeUInt8(network.wif, 0)
this.d.toBuffer(32).copy(buffer, 1)
2014-04-17 19:08:16 +10:00
if (this.pub.compressed) {
buffer.writeUInt8(0x01, 33)
}
return base58check.encode(buffer)
2014-01-08 17:13:26 -05:00
}
// Operations
ECKey.prototype.sign = function(hash) {
return ecdsa.sign(ECKey.curve, hash, this.d)
}
2014-05-13 16:44:29 +10:00
module.exports = ECKey