Added EC Point multiplication to browser/Point.js
This commit is contained in:
parent
5f064cddec
commit
e2655f553d
|
@ -0,0 +1,41 @@
|
||||||
|
var Point = require('./browser/Point'),
|
||||||
|
twoSha256 = require('../util').twoSha256,
|
||||||
|
BigInteger = require('../browser/vendor-bundle.js').BigInteger;
|
||||||
|
|
||||||
|
// TODO: use native modules instead of browser libraries
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For now, this class can only supports derivation from public key
|
||||||
|
* It doesn't support private key derivation (TODO).
|
||||||
|
*
|
||||||
|
* @example examples/Armory.js
|
||||||
|
*/
|
||||||
|
function Armory (chaincode, pubkey) {
|
||||||
|
this.chaincode = new Buffer(chaincode, 'hex');
|
||||||
|
this.pubkey = new Buffer(pubkey, 'hex');
|
||||||
|
}
|
||||||
|
|
||||||
|
Armory.prototype.generatePubKey = function () {
|
||||||
|
var pubKey = this.pubkey;
|
||||||
|
var chainCode = this.chaincode;
|
||||||
|
var chainXor = twoSha256(pubKey);
|
||||||
|
|
||||||
|
for (var i = 0; i < 32; i++)
|
||||||
|
chainXor[i] ^= chainCode[i];
|
||||||
|
|
||||||
|
var A = new BigInteger(chainXor.toString('hex'), 16);
|
||||||
|
|
||||||
|
var pt = Point.fromUncompressedPubKey(pubKey);
|
||||||
|
pt = Point.multiply(pt, A);
|
||||||
|
|
||||||
|
var new_pubkey = pt.toUncompressedPubKey();
|
||||||
|
|
||||||
|
return new_pubkey;
|
||||||
|
};
|
||||||
|
|
||||||
|
Armory.prototype.next = function () {
|
||||||
|
var next_pubkey = this.generatePubKey();
|
||||||
|
return new Armory(this.chaincode, next_pubkey);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = Armory;
|
|
@ -48,6 +48,30 @@ Point.add = function(p1, p2) {
|
||||||
return point;
|
return point;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Point.multiply = function(p1, A) {
|
||||||
|
var ecparams = getSECCurveByName('secp256k1');
|
||||||
|
|
||||||
|
var p1xhex = p1.x.toBuffer({size: 32}).toString('hex');
|
||||||
|
var p1x = new BigInteger(p1xhex, 16);
|
||||||
|
var p1yhex = p1.y.toBuffer({size: 32}).toString('hex');
|
||||||
|
var p1y = new BigInteger(p1yhex, 16);
|
||||||
|
var p1px = new ECFieldElementFp(ecparams.getCurve().getQ(), p1x);
|
||||||
|
var p1py = new ECFieldElementFp(ecparams.getCurve().getQ(), p1y);
|
||||||
|
var p1p = new ECPointFp(ecparams.getCurve(), p1px, p1py);
|
||||||
|
|
||||||
|
var p = p1p.multiply(A);
|
||||||
|
|
||||||
|
var point = new Point();
|
||||||
|
var pointxbuf = new Buffer(p.getX().toBigInteger().toByteArrayUnsigned());
|
||||||
|
point.x = bignum.fromBuffer(pointxbuf, {size: pointxbuf.length});
|
||||||
|
assert(pointxbuf.length <= 32);
|
||||||
|
var pointybuf = new Buffer(p.getY().toBigInteger().toByteArrayUnsigned());
|
||||||
|
assert(pointybuf.length <= 32);
|
||||||
|
point.y = bignum.fromBuffer(pointybuf, {size: pointybuf.length});
|
||||||
|
|
||||||
|
return point;
|
||||||
|
};
|
||||||
|
|
||||||
//convert the public key of a Key into a Point
|
//convert the public key of a Key into a Point
|
||||||
Point.fromUncompressedPubKey = function(pubkey) {
|
Point.fromUncompressedPubKey = function(pubkey) {
|
||||||
var point = new Point();
|
var point = new Point();
|
||||||
|
|
Loading…
Reference in New Issue