arnaucube
arnaucube/keccak256-circomPublic Self-hosted repository
keccak256-circom/circuits/keccak256.circom
circuits/keccak256.circomRaw
 1pragma circom 2.0.0;
 2
 3include "./utils.circom";
 4
 5template Pad(nBits) {
 6    signal input in[nBits];
 7    var blockSize=136*8;
 8    signal output out[blockSize];
 9    signal out2[blockSize];
10    var i;
11
12    for (i=0; i<nBits; i++) {
13        out2[i] <== in[i];
14    }
15    var domain = 0x01;
16    for (i=0; i<8; i++) {
17        out2[nBits+i] <== (domain >> i) & 1;
18    }
19    for (i=nBits+8; i<blockSize; i++) {
20        out2[i] <== 0;
21    }
22    component aux = OrArray(8);
23    for (i=0; i<8; i++) {
24        aux.a[i] <== out2[blockSize-8+i];
25        aux.b[i] <== (0x80 >> i) & 1;
26    }
27    for (i=0; i<8; i++) {
28        out[blockSize-8+i] <== aux.out[i];
29    }
30    for (i=0; i<blockSize-8; i++) {
31        out[i]<==out2[i];
32    }
33}
34
35template Keccak256(nBits) {
36    signal input in[nBits];
37    signal output out[256];
38    var i;
39
40    // pad
41    component pad = Pad(nBits);
42    for (i=0; i<nBits; i++) {
43        pad.in[i] <== in[i];
44    }
45    
46}