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}