keccak256-circom/test/utils.js
test/utils.jsRaw
1const F1Field = require("ffjavascript").F1Field;
2const Scalar = require("ffjavascript").Scalar;
3exports.p =
4 Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617");
5const Fr = new F1Field(exports.p);
6
7const chai = require("chai");
8const assert = chai.assert;
9
10module.exports = {
11 bytesToU64,
12 u64ToBytes,
13 u64ToBits,
14 bytesToBits,
15 u64ArrayToBits,
16 bitsToU64,
17 bitsToBytes,
18 bitsToU64Array,
19 strsToBigInts,
20 intsToBigInts,
21 bigIntsToInts,
22 bufferToBytes
23};
24
25function bytesToU64(byteArray) {
26 // var value = 0;
27 var value = Fr.e(0);
28 for ( var i = byteArray.length - 1; i >= 0; i--) {
29 // value = (value * 256) + byteArray[i];
30 value = Fr.add(Fr.mul(Fr.e(value), Fr.e(256)), Fr.e(byteArray[i]));
31 }
32
33 return value;
34}
35function u64ToBytes(a) {
36 var b = Fr.e(a);
37
38 const buff = new Uint8Array(8);
39 Scalar.toRprLE(buff, 0, b, 8);
40 return buff;
41}
42function u64ToBits(a) {
43 const aBytes = u64ToBytes(a);
44 return bytesToBits(aBytes);
45}
46function bytesToBits(b) {
47 const bits = [];
48 for (let i = 0; i < b.length; i++) {
49 for (let j = 0; j < 8; j++) {
50 if ((Number(b[i])&(1<<j)) > 0) {
51 // bits.push(Fr.e(1));
52 bits.push(1);
53 } else {
54 // bits.push(Fr.e(0));
55 bits.push(0);
56 }
57 }
58 }
59 return bits
60}
61function u64ArrayToBits(u) {
62 let r = [];
63 for (let i = 0; i < u.length; i++) {
64 r = r.concat(u64ToBits(u[i]));
65 }
66 return r
67}
68function bitsToU64(b) {
69 if (b.length != 64) {
70 console.log("b.length = ", b.length, " max=64");
71 return;
72 }
73 const by = bitsToBytes(b)
74 return bytesToU64(by)
75}
76function bitsToBytes(a) {
77 const b = [];
78
79 for (let i=0; i<a.length; i++) {
80 const p = Math.floor(i/8);
81 if (b[p]==undefined) {
82 b[p] = 0;
83 }
84 if (a[i]==1) {
85 b[p] |= 1<<(i%8);
86 }
87 }
88 return b;
89}
90
91function bitsToU64Array(b) {
92 const r = [];
93 for (let i = 0; i < b.length/64; i++) {
94 r.push(bitsToU64(b.slice(i*64, i*64+64)));
95 }
96 return r
97}
98
99function strsToBigInts(a) {
100 let b = [];
101 for (let i=0; i<a.length; i++) {
102 b[i] = Fr.e(a[i]);
103 }
104 return b;
105}
106function intsToBigInts(a) {
107 let b = [];
108 for (let i=0; i<a.length; i++) {
109 b[i] = Fr.e(a[i]);
110 }
111 return b;
112}
113function bigIntsToInts(a) {
114 let b = [];
115 for (let i=0; i<a.length; i++) {
116 b[i] = Number(a[i]);
117 }
118 return b;
119}
120function bufferToBytes(buff) {
121 const bytes = [];
122 for (let i = 0; i < buff.length; i++) {
123 bytes.push(buff[i]);
124 }
125 return bytes;
126}
127
128describe("Utils test", function () {
129 this.timeout(100000);
130
131 it ("utils", async () => {
132 let a = 3;
133 let aBits = u64ToBits(a);
134 let a2 = bitsToU64(aBits);
135 assert.equal(a2, a);
136 a = 12345;
137 aBits = u64ToBits(a);
138 a2 = bitsToU64(aBits);
139 assert.equal(a2, a);
140
141 a = intsToBigInts([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]);
142 aBits = u64ArrayToBits(a);
143 a2 = bitsToU64Array(aBits);
144 assert.deepEqual(a2, a);
145 });
146});
147