|  | var crypto = require("crypto"); | 
|  | var BigInteger = require("jsbn").BigInteger; | 
|  | var ECPointFp = require("./lib/ec.js").ECPointFp; | 
|  | exports.ECCurves = require("./lib/sec.js"); | 
|  |  | 
|  | // zero prepad | 
|  | function unstupid(hex,len) | 
|  | { | 
|  | return (hex.length >= len) ? hex : unstupid("0"+hex,len); | 
|  | } | 
|  |  | 
|  | exports.ECKey = function(curve, key, isPublic) | 
|  | { | 
|  | var priv; | 
|  | var c = curve(); | 
|  | var n = c.getN(); | 
|  | var bytes = Math.floor(n.bitLength()/8); | 
|  |  | 
|  | if(key) | 
|  | { | 
|  | if(isPublic) | 
|  | { | 
|  | var curve = c.getCurve(); | 
|  | //      var x = key.slice(1,bytes+1); // skip the 04 for uncompressed format | 
|  | //      var y = key.slice(bytes+1); | 
|  | //      this.P = new ECPointFp(curve, | 
|  | //        curve.fromBigInteger(new BigInteger(x.toString("hex"), 16)), | 
|  | //        curve.fromBigInteger(new BigInteger(y.toString("hex"), 16))); | 
|  | this.P = curve.decodePointHex(key.toString("hex")); | 
|  | }else{ | 
|  | if(key.length != bytes) return false; | 
|  | priv = new BigInteger(key.toString("hex"), 16); | 
|  | } | 
|  | }else{ | 
|  | var n1 = n.subtract(BigInteger.ONE); | 
|  | var r = new BigInteger(crypto.randomBytes(n.bitLength())); | 
|  | priv = r.mod(n1).add(BigInteger.ONE); | 
|  | this.P = c.getG().multiply(priv); | 
|  | } | 
|  | if(this.P) | 
|  | { | 
|  | //  var pubhex = unstupid(this.P.getX().toBigInteger().toString(16),bytes*2)+unstupid(this.P.getY().toBigInteger().toString(16),bytes*2); | 
|  | //  this.PublicKey = new Buffer("04"+pubhex,"hex"); | 
|  | this.PublicKey = new Buffer(c.getCurve().encodeCompressedPointHex(this.P),"hex"); | 
|  | } | 
|  | if(priv) | 
|  | { | 
|  | this.PrivateKey = new Buffer(unstupid(priv.toString(16),bytes*2),"hex"); | 
|  | this.deriveSharedSecret = function(key) | 
|  | { | 
|  | if(!key || !key.P) return false; | 
|  | var S = key.P.multiply(priv); | 
|  | return new Buffer(unstupid(S.getX().toBigInteger().toString(16),bytes*2),"hex"); | 
|  | } | 
|  | } | 
|  | } | 
|  |  |