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