arnaucube
arnaucube/circomPublic Self-hosted repository
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