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 });