Blame view

node_modules/ecc-jsbn/index.js 1.79 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
  var crypto = require("crypto");
  var BigInteger = require("jsbn").BigInteger;
  var ECPointFp = require("./lib/ec.js").ECPointFp;
  var Buffer = require("safer-buffer").Buffer;
  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 = Buffer.from("04"+pubhex,"hex");
      this.PublicKey = Buffer.from(c.getCurve().encodeCompressedPointHex(this.P),"hex");
    }
    if(priv)
    {
      this.PrivateKey = Buffer.from(unstupid(priv.toString(16),bytes*2),"hex");
      this.deriveSharedSecret = function(key)
      {
        if(!key || !key.P) return false;
        var S = key.P.multiply(priv);
        return Buffer.from(unstupid(S.getX().toBigInteger().toString(16),bytes*2),"hex");
     }     
    }
  }