You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					59 lines
				
				1.8 KiB
			
		
		
			
		
	
	
					59 lines
				
				1.8 KiB
			| 
											3 years ago
										 | 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"); | ||
|  |    }      | ||
|  |   } | ||
|  | } | ||
|  | 
 |