circom/ports/c/buildasm/old/buildzqfieldtester.js
ports/c/buildasm/old/buildzqfieldtester.jsRaw
1const chai = require("chai");
2const assert = chai.assert;
3
4const fs = require("fs");
5var tmp = require("tmp-promise");
6const path = require("path");
7const util = require("util");
8const exec = util.promisify(require("child_process").exec);
9
10const bigInt = require("big-integer");
11const BuildZqField = require("./buildzqfield");
12const ZqField = require("fflib").ZqField;
13
14module.exports = testField;
15
16function toMontgomeryStr(a, prime) {
17 const n64 = Math.floor((prime.bitLength() - 1) / 64)+1;
18 return a.shiftLeft(n64*64).mod(prime).toString(10);
19}
20
21function fromMontgomeryStr(a, prime) {
22 const n64 = Math.floor((prime.bitLength() - 1) / 64)+1;
23 const R = bigInt.one.shiftLeft(n64*64).mod(prime);
24 const RI = R.modInv(prime);
25 return bigInt(a).times(RI).mod(prime);
26}
27
28
29async function testField(prime, test) {
30 tmp.setGracefulCleanup();
31
32 const F = new ZqField(prime);
33
34 const dir = await tmp.dir({prefix: "circom_", unsafeCleanup: true });
35
36 const [hSource, cSource] = BuildZqField(prime, "Fr");
37
38 await fs.promises.writeFile(path.join(dir.path, "fr.h"), hSource, "utf8");
39 await fs.promises.writeFile(path.join(dir.path, "fr.c"), cSource, "utf8");
40
41 await exec("g++" +
42 ` ${path.join(__dirname, "tester.c")}` +
43 ` ${path.join(dir.path, "fr.c")}` +
44 ` -o ${path.join(dir.path, "tester")}` +
45 " -lgmp"
46 );
47
48 for (let i=0; i<test.length; i++) {
49 let a = bigInt(test[i][1]).mod(prime);
50 if (a.isNegative()) a = prime.add(a);
51 let b = bigInt(test[i][2]).mod(prime);
52 if (b.isNegative()) b = prime.add(b);
53 const ec = F[test[i][0]](a,b);
54 // console.log(toMontgomeryStr(a, prime));
55 // console.log(toMontgomeryStr(b, prime));
56 const res = await exec(`${path.join(dir.path, "tester")}` +
57 ` ${test[i][0]}` +
58 ` ${toMontgomeryStr(a, prime)}` +
59 ` ${toMontgomeryStr(b, prime)}`
60 );
61 // console.log(res.stdout);
62 const c=fromMontgomeryStr(res.stdout, prime);
63
64 assert.equal(ec.toString(), c.toString());
65 }
66
67}
68