keccak256-circom/test/keccak256.js
test/keccak256.jsRaw
1const chai = require("chai");
2const path = require("path");
3const crypto = require("crypto");
4const F1Field = require("ffjavascript").F1Field;
5const Scalar = require("ffjavascript").Scalar;
6exports.p = Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617");
7const Fr = new F1Field(exports.p);
8
9const assert = chai.assert;
10
11const keccak256 = require("keccak256");
12
13const wasm_tester = require("circom_tester").wasm;
14
15// const printSignal = require("./helpers/printsignal");
16
17function bytesToU64(byteArray) {
18 var value = 0;
19 for ( var i = byteArray.length - 1; i >= 0; i--) {
20 value = (value * 256) + byteArray[i];
21 }
22
23 return value;
24}
25function u64ToBytes(long) {
26 var byteArray = [0, 0, 0, 0, 0, 0, 0, 0];
27
28 for ( var index = 0; index < byteArray.length; index ++ ) {
29 var byte = long & 0xff;
30 byteArray [ index ] = byte;
31 long = (long - byte) / 256 ;
32 }
33
34 return byteArray;
35}
36
37function u64ToBits(a) {
38 const aBytes = u64ToBytes(a);
39 return bytesToBits(aBytes);
40}
41function bytesToBits(b) {
42 const bits = [];
43 for (let i = 0; i < b.length; i++) {
44 for (let j = 0; j < 8; j++) {
45 if ((b[i]&(1<<j)) > 0) {
46 bits.push(Fr.e(1));
47 } else {
48 bits.push(Fr.e(0));
49 }
50 }
51 }
52 return bits
53}
54function u64ArrayToBits(u) {
55 let r = [];
56 for (let i = 0; i < u.length; i++) {
57 r = r.concat(u64ToBits(u[i]));
58 }
59 return r
60}
61function bitsToU64(b) {
62 if (b.length != 64) {
63 console.log("b.length = ", b.length, " max=64");
64 return;
65 }
66 const by = bitsToBytes(b)
67 return bytesToU64(by)
68}
69function bitsToBytes(a) {
70 const len = Math.floor((a.length -1 )/8)+1;
71 const b = [];
72
73 for (let i=0; i<a.length; i++) {
74 const p = Math.floor(i/8);
75 if (a[i]==1) {
76 b[p] |= 1<<(i%8);
77 }
78 }
79 return b;
80}
81
82function bitsToU64Array(b) {
83 const r = [];
84 for (let i = 0; i < b.length/64; i++) {
85 r.push(bitsToU64(b.slice(i*64, i*64+64)));
86 }
87 return r
88}
89
90function intsToBigInts(a) {
91 let b = [];
92 for (let i=0; i<a.length; i++) {
93 b[i] = Fr.e(a[i]);
94 }
95 return b;
96}
97
98describe("Utils test", function () {
99 this.timeout(100000);
100
101 it ("utils", async () => {
102 let a = 3;
103 let aBits = u64ToBits(a);
104 let a2 = bitsToU64(aBits);
105 assert.equal(a2, a);
106 a = 12345;
107 aBits = u64ToBits(a);
108 a2 = bitsToU64(aBits);
109 assert.equal(a2, a);
110
111 a = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];
112 aBits = u64ArrayToBits(a);
113 a2 = bitsToU64Array(aBits);
114 // console.log(a2, a);
115 assert.deepEqual(a2, a);
116 });
117});
118
119
120describe("Theta test", function () {
121 this.timeout(100000);
122
123 it ("Theta (testvector generated from go)", async () => {
124 const cir = await wasm_tester(path.join(__dirname, "circuits", "theta_test.circom"));
125
126 const input = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];
127 const expectedOut = [26,9,13,29,47,31,14,8,22,34,16,3,3,19,37,21,24,30,12,56,14,29,25,9,51];
128 const stateIn = u64ArrayToBits(input);
129 const expectedOutBits = u64ArrayToBits(expectedOut);
130
131 const witness = await cir.calculateWitness({ "in": stateIn }, true);
132
133 const stateOut = witness.slice(1, 1+(25*64));
134 const stateOutU64 = bitsToU64Array(stateOut);
135 // console.log(stateOutU64, expectedOut);
136 assert.deepEqual(stateOutU64, expectedOut);
137 });
138});
139