• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1var crypto = require("crypto");
2var BigInteger = require("jsbn").BigInteger;
3var ECPointFp = require("./lib/ec.js").ECPointFp;
4var Buffer = require("safer-buffer").Buffer;
5exports.ECCurves = require("./lib/sec.js");
6
7// zero prepad
8function unstupid(hex,len)
9{
10	return (hex.length >= len) ? hex : unstupid("0"+hex,len);
11}
12
13exports.ECKey = function(curve, key, isPublic)
14{
15  var priv;
16	var c = curve();
17	var n = c.getN();
18  var bytes = Math.floor(n.bitLength()/8);
19
20  if(key)
21  {
22    if(isPublic)
23    {
24      var curve = c.getCurve();
25//      var x = key.slice(1,bytes+1); // skip the 04 for uncompressed format
26//      var y = key.slice(bytes+1);
27//      this.P = new ECPointFp(curve,
28//        curve.fromBigInteger(new BigInteger(x.toString("hex"), 16)),
29//        curve.fromBigInteger(new BigInteger(y.toString("hex"), 16)));
30      this.P = curve.decodePointHex(key.toString("hex"));
31    }else{
32      if(key.length != bytes) return false;
33      priv = new BigInteger(key.toString("hex"), 16);
34    }
35  }else{
36    var n1 = n.subtract(BigInteger.ONE);
37    var r = new BigInteger(crypto.randomBytes(n.bitLength()));
38    priv = r.mod(n1).add(BigInteger.ONE);
39    this.P = c.getG().multiply(priv);
40  }
41  if(this.P)
42  {
43//  var pubhex = unstupid(this.P.getX().toBigInteger().toString(16),bytes*2)+unstupid(this.P.getY().toBigInteger().toString(16),bytes*2);
44//  this.PublicKey = Buffer.from("04"+pubhex,"hex");
45    this.PublicKey = Buffer.from(c.getCurve().encodeCompressedPointHex(this.P),"hex");
46  }
47  if(priv)
48  {
49    this.PrivateKey = Buffer.from(unstupid(priv.toString(16),bytes*2),"hex");
50    this.deriveSharedSecret = function(key)
51    {
52      if(!key || !key.P) return false;
53      var S = key.P.multiply(priv);
54      return Buffer.from(unstupid(S.getX().toBigInteger().toString(16),bytes*2),"hex");
55   }
56  }
57}
58
59