Browse Source

Immutable Address, PublicKey and PrivateKey

patch-2
Braydon Fuller 10 years ago
parent
commit
3298a01498
  1. 24
      lib/address.js
  2. 17
      lib/privatekey.js
  3. 21
      lib/publickey.js
  4. 6
      test/privatekey.js

24
lib/address.js

@ -22,7 +22,7 @@ var Hash = require('./crypto/hash');
* *
* // get an address from a public key * // get an address from a public key
* var address = Address(publicKey, 'testnet').toString(); * var address = Address(publicKey, 'testnet').toString();
* *
* *
* @param {String} data - The encoded data in various formats * @param {String} data - The encoded data in various formats
* @param {String} [network] - The network: 'mainnet' or 'testnet' * @param {String} [network] - The network: 'mainnet' or 'testnet'
@ -69,10 +69,20 @@ function Address(data, network, type) {
info.network = info.network || network || 'mainnet'; info.network = info.network || network || 'mainnet';
info.type = info.type || type || 'pubkeyhash'; info.type = info.type || type || 'pubkeyhash';
// set the validated values Object.defineProperty(this, 'hashBuffer', {
this.hashBuffer = info.hashBuffer; configurable: false,
this.network = info.network; value: info.hashBuffer
this.type = info.type; });
Object.defineProperty(this, 'network', {
configurable: false,
value: info.network
});
Object.defineProperty(this, 'type', {
configurable: false,
value: info.type
});
return this; return this;
@ -130,7 +140,7 @@ Address._transformBuffer = function(buffer, network, type){
bufNetwork = 'mainnet'; bufNetwork = 'mainnet';
bufType = 'scripthash'; bufType = 'scripthash';
break; break;
case networks.testnet.pubkeyhash: case networks.testnet.pubkeyhash:
bufNetwork = 'testnet'; bufNetwork = 'testnet';
bufType = 'pubkeyhash'; bufType = 'pubkeyhash';
@ -141,7 +151,7 @@ Address._transformBuffer = function(buffer, network, type){
bufType = 'scripthash'; bufType = 'scripthash';
break; break;
} }
if (!bufNetwork || (network && network !== bufNetwork)) { if (!bufNetwork || (network && network !== bufNetwork)) {
throw new TypeError('Address has mismatched network type.'); throw new TypeError('Address has mismatched network type.');
} }

17
lib/privatekey.js

@ -67,9 +67,20 @@ var PrivateKey = function PrivateKey(data, network, compressed) {
throw new TypeError('Must specify whether the corresponding public key is compressed or not (true or false)'); throw new TypeError('Must specify whether the corresponding public key is compressed or not (true or false)');
} }
this.bn = info.bn; Object.defineProperty(this, 'bn', {
this.compressed = info.compressed; configurable: false,
this.network = info.network; value: info.bn
});
Object.defineProperty(this, 'compressed', {
configurable: false,
value: info.compressed
});
Object.defineProperty(this, 'network', {
configurable: false,
value: info.network
});
return this; return this;

21
lib/publickey.js

@ -11,10 +11,10 @@ var BN = require('./crypto/bn');
* *
* // instantiate from a private key * // instantiate from a private key
* var key = PublicKey(privateKey, true); * var key = PublicKey(privateKey, true);
* *
* // export to as a DER hex encoded string * // export to as a DER hex encoded string
* var exported = key.toString(); * var exported = key.toString();
* *
* // import the public key * // import the public key
* var imported = PublicKey.fromString(exported); * var imported = PublicKey.fromString(exported);
* *
@ -44,7 +44,7 @@ var PublicKey = function PublicKey(data, compressed) {
info = PublicKey._transformDER(new Buffer(data, 'hex' )); info = PublicKey._transformDER(new Buffer(data, 'hex' ));
} else if (data instanceof Buffer || data instanceof Uint8Array){ } else if (data instanceof Buffer || data instanceof Uint8Array){
info = PublicKey._transformDER(data); info = PublicKey._transformDER(data);
} else if (data.constructor && (data.constructor.name && } else if (data.constructor && (data.constructor.name &&
data.constructor.name === 'PrivateKey')) { data.constructor.name === 'PrivateKey')) {
info = PublicKey._transformPrivateKey(data); info = PublicKey._transformPrivateKey(data);
} else { } else {
@ -62,8 +62,15 @@ var PublicKey = function PublicKey(data, compressed) {
//https://www.iacr.org/archive/pkc2003/25670211/25670211.pdf //https://www.iacr.org/archive/pkc2003/25670211/25670211.pdf
info.point.validate(); info.point.validate();
this.point = info.point; Object.defineProperty(this, 'point', {
this.compressed = info.compressed; configurable: false,
value: info.point
});
Object.defineProperty(this, 'compressed', {
configurable: false,
value: info.compressed
});
return this; return this;
@ -78,7 +85,7 @@ var PublicKey = function PublicKey(data, compressed) {
*/ */
PublicKey._transformPrivateKey = function(privkey) { PublicKey._transformPrivateKey = function(privkey) {
var info = {}; var info = {};
if (!privkey.constructor || if (!privkey.constructor ||
(privkey.constructor.name && privkey.constructor.name !== 'PrivateKey')) { (privkey.constructor.name && privkey.constructor.name !== 'PrivateKey')) {
throw new TypeError('Must be an instance of PrivateKey'); throw new TypeError('Must be an instance of PrivateKey');
} }

6
test/privatekey.js

@ -251,16 +251,14 @@ describe('PrivateKey', function() {
it('should convert this known PrivateKey to known PublicKey and preserve compressed=true', function() { it('should convert this known PrivateKey to known PublicKey and preserve compressed=true', function() {
var privhex = '906977a061af29276e40bf377042ffbde414e496ae2260bbf1fa9d085637bfff'; var privhex = '906977a061af29276e40bf377042ffbde414e496ae2260bbf1fa9d085637bfff';
var privkey = new PrivateKey(BN(new Buffer(privhex, 'hex'))); var privkey = new PrivateKey(BN(new Buffer(privhex, 'hex')), 'livenet', true);
privkey.compressed = true;
var pubkey = privkey.toPublicKey(); var pubkey = privkey.toPublicKey();
pubkey.compressed.should.equal(true); pubkey.compressed.should.equal(true);
}); });
it('should convert this known PrivateKey to known PublicKey and preserve compressed=true', function() { it('should convert this known PrivateKey to known PublicKey and preserve compressed=true', function() {
var privhex = '906977a061af29276e40bf377042ffbde414e496ae2260bbf1fa9d085637bfff'; var privhex = '906977a061af29276e40bf377042ffbde414e496ae2260bbf1fa9d085637bfff';
var privkey = new PrivateKey(BN(new Buffer(privhex, 'hex'))); var privkey = new PrivateKey(BN(new Buffer(privhex, 'hex')), 'livenet', false);
privkey.compressed = false;
var pubkey = privkey.toPublicKey(); var pubkey = privkey.toPublicKey();
pubkey.compressed.should.equal(false); pubkey.compressed.should.equal(false);
}); });

Loading…
Cancel
Save