-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathindex.js
65 lines (60 loc) · 1.86 KB
/
index.js
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
58
59
60
61
62
63
64
65
"use strict";
const crypto = require("crypto");
const { BigInteger } = require("jsbn");
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"
);
};
}
};