This commit is contained in:
Ryan X. Charles 2014-08-06 22:47:10 -07:00
parent 9f7e01b8ca
commit 3df3d41434
3 changed files with 152 additions and 1 deletions

View File

@ -15,9 +15,9 @@ privsec.buffer = Buffer;
privsec.constants = require('./lib/constants');
privsec.hash = require('./lib/hash');
privsec.point = require('./lib/point');
privsec.privkey = require('./lib/privkey');
//privsec.key = require('lib/key');
//privsec.privkey = require('lib/privkey');
//privsec.pubkey = require('lib/pubkey');
//privsec.script = require('lib/script');
//privsec.scriptexec = require('lib/scriptexec');

77
lib/privkey.js Normal file
View File

@ -0,0 +1,77 @@
var bn = require('./bn');
var point = require('./point');
var constants = require('./constants');
var base58check = require('./base58check');
var Privkey = function(n, network, compressed) {
if (typeof n === 'undefined')
return;
this.setNumber(n);
this.setNetwork(network);
this.setCompressed(compressed);
};
Privkey.prototype.setNumber = function(n) {
if (!n.lt(point.getN()))
throw new Error('privkey: Number must be less than N');
this.n = n;
};
Privkey.prototype.setNetwork = function(network) {
if (typeof constants[network] === undefined)
throw new Error('privkey: Must specify the network ("mainnet" or "testnet")');
this.network = network;
};
Privkey.prototype.setCompressed = function(compressed) {
if (typeof compressed !== 'boolean')
throw new Error('privkey: Must specify whether the corresponding public key is compressed or not (true or false)');
this.compressed = compressed;
};
Privkey.prototype.toWIF = function() {
this.setNetwork(this.network);
this.setCompressed(this.compressed);
var network = this.network;
var compressed = this.compressed;
var privbuf = this.n.toBuffer({size: 32});
var buf;
if (compressed)
buf = Buffer.concat([new Buffer([constants[network].privkey]), this.n.toBuffer({size: 32}), new Buffer([0x01])]);
else
buf = Buffer.concat([new Buffer([constants[network].privkey]), this.n.toBuffer({size: 32})]);
return base58check.encode(buf);
};
Privkey.prototype.fromWIF = function(str) {
var buf = base58check.decode(str);
if (buf.length === 1 + 32 + 1 && buf[1 + 32 + 1 - 1] == 1)
this.compressed = true;
else if (buf.length === 1 + 32)
this.compressed = false;
else
throw new Error('privkey: Length of buffer must be 33 (uncompressed) or 34 (compressed)');
if (buf[0] === constants.mainnet.privkey)
this.network = 'mainnet';
else if (buf[0] === constants.testnet.privkey)
this.network = 'testnet';
else
throw new Error('privkey: Invalid network');
this.n = bn.fromBuffer(buf.slice(1, 32 + 1));
};
Privkey.prototype.toString = function() {
return this.toWIF();
};
Privkey.prototype.fromString = function(str) {
this.fromWIF(str);
};
module.exports = Privkey;

74
test/test.privkey.js Normal file
View File

@ -0,0 +1,74 @@
var Privkey = require('../lib/privkey');
var base58check = require('../lib/base58check');
var bn = require('../lib/bn');
var should = require('chai').should();
describe('#privkey', function() {
var hex = '96c132224121b509b7d0a16245e957d9192609c5637c6228311287b1be21627a';
var buf = new Buffer(hex, 'hex');
var enctestnet = 'cSdkPxkAjA4HDr5VHgsebAPDEh9Gyub4HK8UJr2DFGGqKKy4K5sG';
var enctu = '92jJzK4tbURm1C7udQXxeCBvXHoHJstDXRxAMouPG1k1XUaXdsu';
var encmainnet = 'L2Gkw3kKJ6N24QcDuH4XDqt9cTqsKTVNDGz1CRZhk9cq4auDUbJy';
var encmu = '5JxgQaFM1FMd38cd14e3mbdxsdSa9iM2BV6DHBYsvGzxkTNQ7Un';
it('should create an empty private key', function() {
var privkey = new Privkey();
should.exist(privkey);
});
it('should create a mainnet private key', function() {
var privkey = new Privkey(bn.fromBuffer(buf), 'mainnet', true);
privkey.toString().should.equal(encmainnet);
});
it('should create an uncompressed testnet private key', function() {
var privkey = new Privkey(bn.fromBuffer(buf), 'testnet', false);
privkey.toString().should.equal(enctu);
});
it('should create an uncompressed mainnet private key', function() {
var privkey = new Privkey(bn.fromBuffer(buf), 'mainnet', false);
privkey.toString().should.equal(encmu);
});
describe('#fromWIF', function() {
it('should parse this compressed testnet address correctly', function() {
var privkey = new Privkey();
privkey.fromWIF(encmainnet);
privkey.toWIF().should.equal(encmainnet);
});
});
describe('#toWIF', function() {
it('should parse this compressed testnet address correctly', function() {
var privkey = new Privkey();
privkey.fromWIF(enctestnet);
privkey.toWIF().should.equal(enctestnet);
});
});
describe('#fromString', function() {
it('should parse this uncompressed testnet address correctly', function() {
var privkey = new Privkey();
privkey.fromString(enctu);
privkey.toWIF().should.equal(enctu);
});
});
describe('#toString', function() {
it('should parse this uncompressed mainnet address correctly', function() {
var privkey = new Privkey();
privkey.fromString(encmu);
privkey.toString().should.equal(encmu);
});
});
});