circomlib/test/babyjub_js.js
test/babyjub_js.jsRaw
1const chai = require("chai");
2const path = require("path");
3const snarkjs = require("snarkjs");
4const compiler = require("circom");
5const babyjub = require("../src/babyjub.js");
6
7const assert = chai.assert;
8
9// const bigInt = require("big-integer");
10
11
12describe("Baby Jub js test", function () {
13
14 this.timeout(100000);
15
16 it("Should add point (0,1) and (0,1)", () => {
17
18 const p1 = [
19 snarkjs.bigInt(0),
20 snarkjs.bigInt(1)];
21 const p2 = [
22 snarkjs.bigInt(0),
23 snarkjs.bigInt(1)
24 ];
25
26 const out = babyjub.addPoint(p1, p2)
27 assert(out[0].equals(0));
28 assert(out[1].equals(1));
29 });
30
31 it("Should base be 8*generator", () => {
32 let res;
33 res = babyjub.addPoint(babyjub.Generator, babyjub.Generator);
34 res = babyjub.addPoint(res, res);
35 res = babyjub.addPoint(res, res);
36
37 assert(res[0].equals(babyjub.Base8[0]));
38 assert(res[1].equals(babyjub.Base8[1]));
39 });
40
41 it("Should add 2 same numbers", () => {
42
43 const p1 = [
44 snarkjs.bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
45 snarkjs.bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
46 ];
47 const p2 = [
48 snarkjs.bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
49 snarkjs.bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
50 ];
51
52 const out = babyjub.addPoint(p1, p2)
53 assert(out[0].equals(snarkjs.bigInt("6890855772600357754907169075114257697580319025794532037257385534741338397365")));
54 assert(out[1].equals(snarkjs.bigInt("4338620300185947561074059802482547481416142213883829469920100239455078257889")));
55 });
56
57 it("Should add 2 different numbers", () => {
58
59 const p1 = [
60 snarkjs.bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
61 snarkjs.bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
62 ];
63 const p2 = [
64 snarkjs.bigInt("16540640123574156134436876038791482806971768689494387082833631921987005038935"),
65 snarkjs.bigInt("20819045374670962167435360035096875258406992893633759881276124905556507972311"),
66 ];
67
68 const out = babyjub.addPoint(p1, p2)
69
70 assert(out[0].equals(snarkjs.bigInt("7916061937171219682591368294088513039687205273691143098332585753343424131937")));
71 assert(out[1].equals(snarkjs.bigInt("14035240266687799601661095864649209771790948434046947201833777492504781204499")));
72 });
73
74 it("should mulPointEscalar 0", () => {
75 const p = [
76 snarkjs.bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
77 snarkjs.bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
78 ];
79
80 const r = babyjub.mulPointEscalar(p, snarkjs.bigInt("3"));
81 let r2 = babyjub.addPoint(p, p);
82 r2 = babyjub.addPoint(r2, p);
83 assert.equal(r2[0].toString(), r[0].toString());
84 assert.equal(r2[1].toString(), r[1].toString());
85 assert.equal(r[0].toString(), "19372461775513343691590086534037741906533799473648040012278229434133483800898");
86 assert.equal(r[1].toString(), "9458658722007214007257525444427903161243386465067105737478306991484593958249");
87 });
88
89 it("should mulPointEscalar 1", () => {
90 const p = [
91 snarkjs.bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
92 snarkjs.bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
93 ];
94
95 const r = babyjub.mulPointEscalar(p, snarkjs.bigInt("14035240266687799601661095864649209771790948434046947201833777492504781204499"));
96 assert.equal(r[0].toString(), "17070357974431721403481313912716834497662307308519659060910483826664480189605");
97 assert.equal(r[1].toString(), "4014745322800118607127020275658861516666525056516280575712425373174125159339");
98 });
99
100 it("should mulPointEscalar 2", () => {
101 const p = [
102 snarkjs.bigInt("6890855772600357754907169075114257697580319025794532037257385534741338397365"),
103 snarkjs.bigInt("4338620300185947561074059802482547481416142213883829469920100239455078257889"),
104 ];
105
106 const r = babyjub.mulPointEscalar(p, snarkjs.bigInt("20819045374670962167435360035096875258406992893633759881276124905556507972311"));
107 assert.equal(r[0].toString(), "13563888653650925984868671744672725781658357821216877865297235725727006259983");
108 assert.equal(r[1].toString(), "8442587202676550862664528699803615547505326611544120184665036919364004251662");
109 });
110
111 it("should inCurve 1", () => {
112 const p = [
113 snarkjs.bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
114 snarkjs.bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
115 ];
116 assert(babyjub.inCurve(p));
117 });
118
119 it("should inCurve 2", () => {
120 const p = [
121 snarkjs.bigInt("6890855772600357754907169075114257697580319025794532037257385534741338397365"),
122 snarkjs.bigInt("4338620300185947561074059802482547481416142213883829469920100239455078257889"),
123 ];
124 assert(babyjub.inCurve(p));
125 });
126
127 it("should inSubgroup 1", () => {
128 const p = [
129 snarkjs.bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
130 snarkjs.bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
131 ];
132 assert(babyjub.inSubgroup(p));
133 });
134
135 it("should inSubgroup 2", () => {
136 const p = [
137 snarkjs.bigInt("6890855772600357754907169075114257697580319025794532037257385534741338397365"),
138 snarkjs.bigInt("4338620300185947561074059802482547481416142213883829469920100239455078257889"),
139 ];
140 assert(babyjub.inSubgroup(p));
141 });
142
143 it("should packPoint - unpackPoint 1", () => {
144 const p = [
145 snarkjs.bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
146 snarkjs.bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
147 ];
148 const buf = babyjub.packPoint(p);
149 assert.equal(buf.toString('hex'), '53b81ed5bffe9545b54016234682e7b2f699bd42a5e9eae27ff4051bc698ce85');
150 const p2 = babyjub.unpackPoint(buf);
151 assert.equal(p2[0].toString(), "17777552123799933955779906779655732241715742912184938656739573121738514868268");
152 assert.equal(p2[1].toString(), "2626589144620713026669568689430873010625803728049924121243784502389097019475");
153 });
154
155 it("should packPoint - unpackPoint 2", () => {
156 const p = [
157 snarkjs.bigInt("6890855772600357754907169075114257697580319025794532037257385534741338397365"),
158 snarkjs.bigInt("4338620300185947561074059802482547481416142213883829469920100239455078257889"),
159 ];
160 const buf = babyjub.packPoint(p);
161 assert.equal(buf.toString('hex'), 'e114eb17eddf794f063a68fecac515e3620e131976108555735c8b0773929709');
162 const p2 = babyjub.unpackPoint(buf);
163 assert.equal(p2[0].toString(), "6890855772600357754907169075114257697580319025794532037257385534741338397365");
164 assert.equal(p2[1].toString(), "4338620300185947561074059802482547481416142213883829469920100239455078257889");
165 });
166});