Skip to content

Commit 9100c6b

Browse files
author
HenryNguyen5
authored
Refactor/cryptonote utils (#17)
* Change parse to be a static property * First passthrough * Change mutability of const -> let where needed * Fix redundant type checks / global variables * Reorg codebase + fix majority imports * Add more types * Add moment dep * Add types to test * More type err fixes * Loop refactoring + more types * Convert more errors to objects, fix more type errs, use functional constructs over loops * Remove unused functions * Add typescript dep * Change string errors to obj * Fix more tsc errors * skirt around tsc errors for unimplemented bulletproofs * Fix biginteger error * Add ts-jest * Fix rest of tsc errors, fix tests
1 parent 12f131e commit 9100c6b

File tree

80 files changed

+10601
-4035
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+10601
-4035
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ node_modules/
33
coverage
44
.vscode
55
yarn-error.log
6-
tests/fixtures
6+
tests/fixtures
7+
dist

tests/MG_sigs.spec.js renamed to __test__/MG_sigs.spec.ts

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
import {
2+
skGen,
3+
ge_scalarmult_base,
4+
identity,
5+
ge_scalarmult,
6+
hashToPoint,
7+
MLSAG_Gen,
8+
MLSAG_ver,
9+
} from "cryptonote_utils";
10+
111
// Copyright (c) 2014-2018, MyMonero.com
212
//
313
// All rights reserved.
@@ -26,21 +36,19 @@
2636
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
2737
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2838

29-
const monero_utils = require("../").monero_utils;
30-
3139
it("MG_sigs", () => {
32-
function skvGen(len) {
33-
let skVec = [];
40+
function skvGen(len: number) {
41+
const skVec: string[] = [];
3442
for (let i = 0; i < len; i++) {
35-
skVec.push(monero_utils.skGen());
43+
skVec.push(skGen());
3644
}
3745
return skVec;
3846
}
3947
//initializes a key matrix;
4048
//first parameter is rows,
4149
//second is columns
42-
function keyMInit(rows, cols) {
43-
let rv = [];
50+
function keyMInit(cols: number) {
51+
let rv: string[][] = [];
4452
for (let i = 0; i < cols; i++) {
4553
rv.push([]);
4654
}
@@ -53,7 +61,7 @@ it("MG_sigs", () => {
5361
let N = 3; // cols
5462
let R = 2; // rows
5563

56-
let xm = keyMInit(R, N); // = [[None]*N] #just used to generate test public keys
64+
let xm = keyMInit(N); // = [[None]*N] #just used to generate test public keys
5765
let sk = skvGen(R);
5866

5967
// [
@@ -63,15 +71,15 @@ it("MG_sigs", () => {
6371
// [pubkeyn, commitmentn]]
6472
// // Gen creates a signature which proves that for some column in the keymatrix "pk"
6573
// the signer knows a secret key for each row in that column
66-
let P = keyMInit(R, N); // = keyM[[None]*N] #stores the public keys;
74+
let P = keyMInit(N); // = keyM[[None]*N] #stores the public keys;
6775

6876
let ind = 2;
6977
let i = 0;
7078

7179
for (j = 0; j < R; j++) {
7280
for (i = 0; i < N; i++) {
73-
xm[i][j] = monero_utils.skGen();
74-
P[i][j] = monero_utils.ge_scalarmult_base(xm[i][j]); // generate fake [pubkey, commit]
81+
xm[i][j] = skGen();
82+
P[i][j] = ge_scalarmult_base(xm[i][j]); // generate fake [pubkey, commit]
7583
}
7684
}
7785

@@ -80,34 +88,27 @@ it("MG_sigs", () => {
8088
sk[j] = xm[ind][j];
8189
}
8290

83-
let message = monero_utils.identity();
84-
let kimg = monero_utils.ge_scalarmult(
85-
monero_utils.hashToPoint(P[ind][0]),
86-
sk[0],
87-
);
88-
let rv = monero_utils.MLSAG_Gen(message, P, sk, kimg, ind);
89-
let c = monero_utils.MLSAG_ver(message, P, rv, kimg);
91+
let message = identity();
92+
let kimg = ge_scalarmult(hashToPoint(P[ind][0]), sk[0]);
93+
let rv = MLSAG_Gen(message, P, sk, kimg, ind);
94+
let c = MLSAG_ver(message, P, rv, kimg);
9095

9196
expect(c).toEqual(true);
9297

93-
xtmp = skvGen(R);
94-
xm = keyMInit(R, N); // = [[None]*N] #just used to generate test public keys
98+
xm = keyMInit(N); // = [[None]*N] #just used to generate test public keys
9599
sk = skvGen(R);
96100

97101
for (j = 0; j < R; j++) {
98102
for (i = 0; i < N; i++) {
99-
xm[i][j] = monero_utils.skGen();
100-
P[i][j] = monero_utils.ge_scalarmult_base(xm[i][j]); // generate fake [pubkey, commit]
103+
xm[i][j] = skGen();
104+
P[i][j] = ge_scalarmult_base(xm[i][j]); // generate fake [pubkey, commit]
101105
}
102106
}
103107

104108
sk[1] = skGen(); //assume we don't know one of the private keys..
105-
kimg = monero_utils.ge_scalarmult(
106-
monero_utils.hashToPoint(P[ind][0]),
107-
sk[0],
108-
);
109-
rv = monero_utils.MLSAG_Gen(message, P, sk, kimg, ind);
110-
c = monero_utils.MLSAG_ver(message, P, rv, kimg);
109+
kimg = ge_scalarmult(hashToPoint(P[ind][0]), sk[0]);
110+
rv = MLSAG_Gen(message, P, sk, kimg, ind);
111+
c = MLSAG_ver(message, P, rv, kimg);
111112

112113
expect(c).toEqual(false);
113114
});

tests/borromean/borromean_1.spec.js renamed to __test__/borromean/borromean_1.spec.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import { generate_parameters } from "./test_parameters";
2+
import { genBorromean, verifyBorromean } from "cryptonote_utils";
3+
14
// Copyright (c) 2014-2018, MyMonero.com
25
//
36
// All rights reserved.
@@ -26,13 +29,11 @@
2629
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
2730
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2831

29-
const monero_utils = require("../../").monero_utils;
30-
const { generate_parameters } = require("./test_parameters");
3132
const { indi, P1v, P2v, xv, N } = generate_parameters();
3233

3334
it("borromean_3", () => {
3435
// #true one
35-
const bb = monero_utils.genBorromean(xv, [P1v, P2v], indi, 2, N); /*?.*/
36-
const valid = monero_utils.verifyBorromean(bb, P1v, P2v); /*?.*/
36+
const bb = genBorromean(xv, [P1v, P2v], indi, 2, N); /*?.*/
37+
const valid = verifyBorromean(bb, P1v, P2v); /*?.*/
3738
expect(valid).toBe(true);
3839
});

tests/borromean/borromean_2.spec.js renamed to __test__/borromean/borromean_2.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@
2626
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
2727
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2828

29-
const monero_utils = require("../../").monero_utils;
30-
const { generate_parameters } = require("./test_parameters");
29+
import { generate_parameters } from "./test_parameters";
30+
import { genBorromean, verifyBorromean } from "cryptonote_utils";
3131
const { indi, P1v, P2v, xv, N } = generate_parameters();
3232

3333
it("borromean_2", () => {
3434
//#false one
3535
indi[3] = `${(+indi[3] + 1) % 2}`;
36-
const bb = monero_utils.genBorromean(xv, [P1v, P2v], indi, 2, N); /*?.*/
37-
const valid = monero_utils.verifyBorromean(bb, P1v, P2v); /*?.*/
36+
const bb = genBorromean(xv, [P1v, P2v], indi, 2, N); /*?.*/
37+
const valid = verifyBorromean(bb, P1v, P2v); /*?.*/
3838
expect(valid).toBe(false);
3939
});

tests/borromean/borromean_3.spec.js renamed to __test__/borromean/borromean_3.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,16 @@
2626
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
2727
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2828

29-
const monero_utils = require("../../").monero_utils;
30-
const { generate_parameters } = require("./test_parameters");
29+
import { generate_parameters } from "./test_parameters";
30+
import { genBorromean, verifyBorromean } from "cryptonote_utils";
3131
const { indi, P1v, P2v, xv, N } = generate_parameters();
3232

3333
it("borromean_3", () => {
3434
//#true one again
3535
indi[3] = `${(+indi[3] + 1) % 2}`;
3636
indi[3] = `${(+indi[3] + 1) % 2}`;
3737

38-
const bb = monero_utils.genBorromean(xv, [P1v, P2v], indi, 2, N); /*?.*/
39-
const valid = monero_utils.verifyBorromean(bb, P1v, P2v); /*?.*/
38+
const bb = genBorromean(xv, [P1v, P2v], indi, 2, N); /*?.*/
39+
const valid = verifyBorromean(bb, P1v, P2v); /*?.*/
4040
expect(valid).toBe(true);
4141
});

tests/borromean/borromean_4.spec.js renamed to __test__/borromean/borromean_4.spec.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { genBorromean, verifyBorromean } from "cryptonote_utils";
2+
13
// Copyright (c) 2014-2018, MyMonero.com
24
//
35
// All rights reserved.
@@ -26,13 +28,12 @@
2628
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
2729
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2830

29-
const monero_utils = require("../../").monero_utils;
30-
const { generate_parameters } = require("./test_parameters");
31+
import { generate_parameters } from "./test_parameters";
3132
const { indi, P1v, P2v, xv, N } = generate_parameters();
3233

3334
it("borromean_4", () => {
3435
// #false one
35-
const bb = monero_utils.genBorromean(xv, [P2v, P1v], indi, 2, N); /*?.*/
36-
const valid = monero_utils.verifyBorromean(bb, P1v, P2v); /*?.*/
36+
const bb = genBorromean(xv, [P2v, P1v], indi, 2, N); /*?.*/
37+
const valid = verifyBorromean(bb, P1v, P2v); /*?.*/
3738
expect(valid).toBe(false);
3839
});

tests/borromean/test_parameters.js renamed to __test__/borromean/test_parameters.ts

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -26,36 +26,35 @@
2626
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
2727
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2828

29-
const monero_utils = require("../../").monero_utils;
30-
const { randomBytes } = require("crypto");
29+
import { randomBytes } from "crypto";
30+
import {
31+
skGen,
32+
ge_scalarmult_base,
33+
ge_add,
34+
ge_sub,
35+
H2,
36+
} from "cryptonote_utils";
37+
import { padLeft } from "cryptonote_utils/formatters";
3138

3239
function randomBit() {
3340
// get random 8 bits in hex
3441
const rand8bits = randomBytes(1).toString("hex");
3542
// take 4 bits "nibble" and convert to binary
3643
// then take last index
37-
return monero_utils.padLeft(
38-
parseInt(rand8bits[0], 16).toString(2),
39-
4,
40-
0,
41-
)[3];
44+
return padLeft(parseInt(rand8bits[0], 16).toString(2), 4, "0")[3];
4245
}
4346

4447
//Tests for Borromean signatures
4548
//#boro true one, false one, C != sum Ci, and one out of the range..
4649
const N = 64;
47-
let xv = [], // vector of secret keys, 1 per ring (nrings)
48-
P1v = [], //key64, arr of commitments Ci
49-
P2v = [], //key64
50-
indi = []; // vector of secret indexes, 1 per ring (nrings), can be a string
51-
52-
let indi_2 = [];
53-
let indi_3 = [];
54-
let indi_4 = [];
50+
let xv: string[] = [], // vector of secret keys, 1 per ring (nrings)
51+
P1v: string[] = [], //key64, arr of commitments Ci
52+
P2v: string[] = [], //key64
53+
indi: string[] = []; // vector of secret indexes, 1 per ring (nrings), can be a string
5554

5655
let generated = false;
5756

58-
function generate_parameters() {
57+
export function generate_parameters() {
5958
if (generated) {
6059
const indiCopy = [...indi];
6160

@@ -64,20 +63,18 @@ function generate_parameters() {
6463
for (let j = 0; j < N; j++) {
6564
indi[j] = randomBit(); /*?.*/
6665

67-
xv[j] = monero_utils.skGen(); /*?.*/
66+
xv[j] = skGen(); /*?.*/
6867

6968
if (+indi[j] === 0) {
70-
P1v[j] = monero_utils.ge_scalarmult_base(xv[j]); /*?.*/
69+
P1v[j] = ge_scalarmult_base(xv[j]); /*?.*/
7170
} else {
72-
P1v[j] = monero_utils.ge_scalarmult_base(xv[j]); // calculate aG = xv[j].G /*?.*/
73-
P1v[j] = monero_utils.ge_add(P1v[j], monero_utils.H2[j]); // calculate aG + H2 /*?.*/
71+
P1v[j] = ge_scalarmult_base(xv[j]); // calculate aG = xv[j].G /*?.*/
72+
P1v[j] = ge_add(P1v[j], H2[j]); // calculate aG + H2 /*?.*/
7473
}
7574

76-
P2v[j] = monero_utils.ge_sub(P1v[j], monero_utils.H2[j]); /*?.*/
75+
P2v[j] = ge_sub(P1v[j], H2[j]); /*?.*/
7776
}
7877
generated = true;
7978
return { xv, P1v, P2v, indi, N };
8079
}
8180
}
82-
83-
module.exports = { generate_parameters };

0 commit comments

Comments
 (0)