/ test / sha256.js
sha256.js
  1  const chai = require("chai");
  2  const path = require("path");
  3  const crypto = require("crypto");
  4  const F1Field = require("ffjavascript").F1Field;
  5  const Scalar = require("ffjavascript").Scalar;
  6  exports.p = Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617");
  7  const Fr = new F1Field(exports.p);
  8  
  9  const assert = chai.assert;
 10  
 11  const sha256 = require("./helpers/sha256");
 12  
 13  const wasm_tester = require("circom_tester").wasm;
 14  
 15  // const printSignal = require("./helpers/printsignal");
 16  
 17  
 18  function buffer2bitArray(b) {
 19      const res = [];
 20      for (let i=0; i<b.length; i++) {
 21          for (let j=0; j<8; j++) {
 22              res.push((b[i] >> (7-j) &1));
 23          }
 24      }
 25      return res;
 26  }
 27  
 28  function bitArray2buffer(a) {
 29      const len = Math.floor((a.length -1 )/8)+1;
 30      const b = new Buffer.alloc(len);
 31  
 32      for (let i=0; i<a.length; i++) {
 33          const p = Math.floor(i/8);
 34          b[p] = b[p] | (Number(a[i]) << ( 7 - (i%8)  ));
 35      }
 36      return b;
 37  }
 38  
 39  
 40  describe("SHA256 test", function () {
 41      this.timeout(100000);
 42  
 43  
 44      it("Should work bits to array and array to bits", async () => {
 45          const b = new Buffer.alloc(64);
 46          for (let i=0; i<64; i++) {
 47              b[i] = i+1;
 48          }
 49          const a = buffer2bitArray(b);
 50          const b2 = bitArray2buffer(a);
 51  
 52          assert.equal(b.toString("hex"), b2.toString("hex"), true);
 53      });
 54  
 55      it("Should calculate a hash of 1 compressor", async () => {
 56          const cir = await wasm_tester(path.join(__dirname, "circuits", "sha256_2_test.circom"));
 57  
 58          const witness = await cir.calculateWitness({ "a": "1", "b": "2" }, true);
 59  
 60          const b = new Buffer.alloc(54);
 61          b[26] = 1;
 62          b[53] = 2;
 63  
 64          const hash = crypto.createHash("sha256")
 65              .update(b)
 66              .digest("hex");
 67          const r = "0x" + hash.slice(10);
 68  
 69          const hash2 = sha256.hash(b.toString("hex"), {msgFormat: "hex-bytes"});
 70  
 71          assert.equal(hash, hash2);
 72  
 73          assert(Fr.eq(witness[1], Fr.e(r)));
 74      }).timeout(1000000);
 75  
 76      it("Should calculate a hash of 2 compressor", async () => {
 77          const cir = await wasm_tester(path.join(__dirname, "circuits", "sha256_test512.circom"));
 78  
 79          const b = new Buffer.alloc(64);
 80          for (let i=0; i<64; i++) {
 81              b[i] = i+1;
 82          }
 83  
 84          const hash = crypto.createHash("sha256")
 85              .update(b)
 86              .digest("hex");
 87  
 88          const arrIn = buffer2bitArray(b);
 89          const witness = await cir.calculateWitness({ "in": arrIn }, true);
 90  
 91          const arrOut = witness.slice(1, 257);
 92          const hash2 = bitArray2buffer(arrOut).toString("hex");
 93  
 94          assert.equal(hash, hash2);
 95  
 96      }).timeout(1000000);
 97      it ("Should calculate a hash of 2 compressor", async () => {
 98          const cir = await wasm_tester(path.join(__dirname, "circuits", "sha256_test448.circom"));
 99  
100          const testStr = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
101  
102          const b = Buffer.from(testStr, "utf8");
103  
104          const hash = crypto.createHash("sha256")
105              .update(b)
106              .digest("hex");
107  
108          const arrIn = buffer2bitArray(b);
109  
110          const witness = await cir.calculateWitness({ "in": arrIn }, true);
111  
112          const arrOut = witness.slice(1, 257);
113          const hash2 = bitArray2buffer(arrOut).toString("hex");
114  
115          assert.equal(hash, hash2);
116      });
117  
118  });