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
						
					
					
				| 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");
 | |
|    }     
 | |
|   }
 | |
| }
 | |
| 
 |