add "compressed" feature to pubkeys

...not just privkeys. since, of course, they can be compressed or uncompressed.
This commit is contained in:
Ryan X. Charles 2014-08-22 17:43:22 -07:00
parent ee0dff9e2e
commit 7c945cdc01
4 changed files with 17 additions and 11 deletions

View File

@ -11,10 +11,8 @@ function Address(hashbuf, network, type) {
this.type = type;
};
Address.prototype.fromPubkey = function(pubkey, network, compressed) {
if (typeof compressed === 'undefined')
compressed = true;
this.hashbuf = Hash.sha256ripemd160(pubkey.toDER(compressed));
Address.prototype.fromPubkey = function(pubkey, network) {
this.hashbuf = Hash.sha256ripemd160(pubkey.toBuffer());
this.network = network || 'mainnet';
this.type = 'pubkeyhash';
return this;

View File

@ -34,12 +34,12 @@ Key.prototype.fromString = function(str) {
}
};
Key.prototype.getAddress = function(network, compressed) {
return (new Address()).fromPubkey(this.pubkey, network, compressed);
Key.prototype.getAddress = function(network) {
return Address().fromPubkey(this.pubkey, network);
};
Key.prototype.privkey2pubkey = function() {
this.pubkey = new Pubkey(point.getG().mul(this.privkey.bn));
this.pubkey = new Pubkey(point.getG().mul(this.privkey.bn), this.privkey.compressed);
};
Key.prototype.toString = function() {

View File

@ -1,12 +1,13 @@
var Point = require('./point');
var bn = require('./bn');
var Pubkey = function Pubkey(point) {
var Pubkey = function Pubkey(point, compressed) {
if (!(this instanceof Pubkey))
return new Pubkey(point);
if (point && !point.getX() && !point.getY())
throw new Error('Invalid point');
this.point = point;
this.compressed = compressed;
};
Pubkey.prototype.fromDER = function(buf) {
@ -18,14 +19,17 @@ Pubkey.prototype.fromDER = function(buf) {
var x = bn(xbuf);
var y = bn(ybuf);
this.point = Point(x, y);
this.compressed = false;
} else if (buf[0] == 0x03) {
var xbuf = buf.slice(1);
var x = bn(xbuf);
this.fromX(true, x);
this.compressed = true;
} else if (buf[0] == 0x02) {
var xbuf = buf.slice(1);
var x = bn(xbuf);
this.fromX(false, x);
this.compressed = true;
} else {
throw new Error('Invalid DER format pubkey');
}
@ -43,10 +47,12 @@ Pubkey.prototype.fromX = function(odd, x) {
};
Pubkey.prototype.toBuffer = function() {
return this.toDER(true);
var compressed = typeof this.compressed === 'undefined' ? true : this.compressed;
return this.toDER(compressed);
};
Pubkey.prototype.toDER = function(compressed) {
compressed = typeof this.compressed === 'undefined' ? compressed : this.compressed;
if (typeof compressed !== 'boolean')
throw new Error('Must specify whether the public key is compressed or not (true or false)');
@ -70,7 +76,8 @@ Pubkey.prototype.toDER = function(compressed) {
};
Pubkey.prototype.toString = function() {
return this.toDER(true).toString('hex');
var compressed = typeof this.compressed === 'undefined' ? true : this.compressed;
return this.toDER(compressed).toString('hex');
};
//https://www.iacr.org/archive/pkc2003/25670211/25670211.pdf

View File

@ -26,7 +26,8 @@ describe('Address', function() {
var pubkey = new Pubkey();
pubkey.fromDER(new Buffer('0285e9737a74c30a873f74df05124f2aa6f53042c2fc0a130d6cbd7d16b944b004', 'hex'));
var address = new Address();
address.fromPubkey(pubkey, 'mainnet', false);
pubkey.compressed = false;
address.fromPubkey(pubkey, 'mainnet');
address.toString().should.equal('16JXnhxjJUhxfyx4y6H4sFcxrgt8kQ8ewX');
});