keccak256-circom/circuits/utils.circom
circuits/utils.circomRaw
1// Keccak256 hash function (ethereum version).
2// For LICENSE check https://github.com/vocdoni/keccak256-circom/blob/master/LICENSE
3
4pragma circom 2.0.0;
5
6include "../node_modules/circomlib/circuits/gates.circom";
7include "../node_modules/circomlib/circuits/sha256/xor3.circom";
8include "../node_modules/circomlib/circuits/sha256/shift.circom"; // contains ShiftRight
9
10template Xor5(n) {
11 signal input a[n];
12 signal input b[n];
13 signal input c[n];
14 signal input d[n];
15 signal input e[n];
16 signal output out[n];
17 var i;
18
19 component xor3 = Xor3(n);
20 for (i=0; i<n; i++) {
21 xor3.a[i] <== a[i];
22 xor3.b[i] <== b[i];
23 xor3.c[i] <== c[i];
24 }
25 component xor4 = XorArray(n);
26 for (i=0; i<n; i++) {
27 xor4.a[i] <== xor3.out[i];
28 xor4.b[i] <== d[i];
29 }
30 component xor5 = XorArray(n);
31 for (i=0; i<n; i++) {
32 xor5.a[i] <== xor4.out[i];
33 xor5.b[i] <== e[i];
34 }
35 for (i=0; i<n; i++) {
36 out[i] <== xor5.out[i];
37 }
38}
39
40template XorArray(n) {
41 signal input a[n];
42 signal input b[n];
43 signal output out[n];
44 var i;
45
46 component aux[n];
47 for (i=0; i<n; i++) {
48 aux[i] = XOR();
49 aux[i].a <== a[i];
50 aux[i].b <== b[i];
51 }
52 for (i=0; i<n; i++) {
53 out[i] <== aux[i].out;
54 }
55}
56
57template XorArraySingle(n) {
58 signal input a[n];
59 signal output out[n];
60 var i;
61
62 component aux[n];
63 for (i=0; i<n; i++) {
64 aux[i] = XOR();
65 aux[i].a <== a[i];
66 aux[i].b <== 1;
67 }
68 for (i=0; i<n; i++) {
69 out[i] <== aux[i].out;
70 }
71}
72
73template OrArray(n) {
74 signal input a[n];
75 signal input b[n];
76 signal output out[n];
77 var i;
78
79 component aux[n];
80 for (i=0; i<n; i++) {
81 aux[i] = OR();
82 aux[i].a <== a[i];
83 aux[i].b <== b[i];
84 }
85 for (i=0; i<n; i++) {
86 out[i] <== aux[i].out;
87 }
88}
89
90template AndArray(n) {
91 signal input a[n];
92 signal input b[n];
93 signal output out[n];
94 var i;
95
96 component aux[n];
97 for (i=0; i<n; i++) {
98 aux[i] = AND();
99 aux[i].a <== a[i];
100 aux[i].b <== b[i];
101 }
102 for (i=0; i<n; i++) {
103 out[i] <== aux[i].out;
104 }
105}
106
107template ShL(n, r) {
108 signal input in[n];
109 signal output out[n];
110
111 for (var i=0; i<n; i++) {
112 if (i < r) {
113 out[i] <== 0;
114 } else {
115 out[i] <== in[ i-r ];
116 }
117 }
118}