keccak256-circom/circuits/chi.circom
circuits/chi.circomRaw
1pragma circom 2.0.0;
2
3include "./utils.circom";
4
5template step() {
6 // out = a ^ (^b) & c
7 signal input a[64];
8 signal input b[64];
9 signal input c[64];
10 signal output out[64];
11 var i;
12
13 // ^b
14 component bXor = XorArraySingle(64);
15 for (i=0; i<64; i++) {
16 bXor.a[i] <== b[i];
17 }
18 // (^b)&c
19 component bc = AndArray(64);
20 for (i=0; i<64; i++) {
21 bc.a[i] <== bXor.out[i];
22 bc.b[i] <== c[i];
23 }
24 // a^(^b)&c
25 component abc = XorArray(64);
26 for (i=0; i<64; i++) {
27 abc.a[i] <== a[i];
28 abc.b[i] <== bc.out[i];
29 }
30 for (i=0; i<64; i++) {
31 out[i] <== abc.out[i];
32 }
33}
34
35template Chi() {
36 signal input in[25*64];
37 signal output out[25*64];
38
39 var i;
40
41 component r0 = step();
42 for (i=0; i<64; i++) {
43 r0.a[i] <== in[i];
44 r0.b[i] <== in[1*64+i];
45 r0.c[i] <== in[2*64+i];
46 }
47 component r1 = step();
48 for (i=0; i<64; i++) {
49 r1.a[i] <== in[1*64+i];
50 r1.b[i] <== in[2*64+i];
51 r1.c[i] <== in[3*64+i];
52 }
53 component r2 = step();
54 for (i=0; i<64; i++) {
55 r2.a[i] <== in[2*64+i];
56 r2.b[i] <== in[3*64+i];
57 r2.c[i] <== in[4*64+i];
58 }
59 component r3 = step();
60 for (i=0; i<64; i++) {
61 r3.a[i] <== in[3*64+i];
62 r3.b[i] <== in[4*64+i];
63 r3.c[i] <== in[0*64+i];
64 }
65 component r4 = step();
66 for (i=0; i<64; i++) {
67 r4.a[i] <== in[4*64+i];
68 r4.b[i] <== in[i];
69 r4.c[i] <== in[1*64+i];
70 }
71
72 component r5 = step();
73 for (i=0; i<64; i++) {
74 r5.a[i] <== in[5*64+i];
75 r5.b[i] <== in[6*64+i];
76 r5.c[i] <== in[7*64+i];
77 }
78 component r6 = step();
79 for (i=0; i<64; i++) {
80 r6.a[i] <== in[6*64+i];
81 r6.b[i] <== in[7*64+i];
82 r6.c[i] <== in[8*64+i];
83 }
84 component r7 = step();
85 for (i=0; i<64; i++) {
86 r7.a[i] <== in[7*64+i];
87 r7.b[i] <== in[8*64+i];
88 r7.c[i] <== in[9*64+i];
89 }
90 component r8 = step();
91 for (i=0; i<64; i++) {
92 r8.a[i] <== in[8*64+i];
93 r8.b[i] <== in[9*64+i];
94 r8.c[i] <== in[5*64+i];
95 }
96 component r9 = step();
97 for (i=0; i<64; i++) {
98 r9.a[i] <== in[9*64+i];
99 r9.b[i] <== in[5*64+i];
100 r9.c[i] <== in[6*64+i];
101 }
102
103 component r10 = step();
104 for (i=0; i<64; i++) {
105 r10.a[i] <== in[10*64+i];
106 r10.b[i] <== in[11*64+i];
107 r10.c[i] <== in[12*64+i];
108 }
109 component r11 = step();
110 for (i=0; i<64; i++) {
111 r11.a[i] <== in[11*64+i];
112 r11.b[i] <== in[12*64+i];
113 r11.c[i] <== in[13*64+i];
114 }
115 component r12 = step();
116 for (i=0; i<64; i++) {
117 r12.a[i] <== in[12*64+i];
118 r12.b[i] <== in[13*64+i];
119 r12.c[i] <== in[14*64+i];
120 }
121 component r13 = step();
122 for (i=0; i<64; i++) {
123 r13.a[i] <== in[13*64+i];
124 r13.b[i] <== in[14*64+i];
125 r13.c[i] <== in[10*64+i];
126 }
127 component r14 = step();
128 for (i=0; i<64; i++) {
129 r14.a[i] <== in[14*64+i];
130 r14.b[i] <== in[10*64+i];
131 r14.c[i] <== in[11*64+i];
132 }
133
134 component r15 = step();
135 for (i=0; i<64; i++) {
136 r15.a[i] <== in[15*64+i];
137 r15.b[i] <== in[16*64+i];
138 r15.c[i] <== in[17*64+i];
139 }
140 component r16 = step();
141 for (i=0; i<64; i++) {
142 r16.a[i] <== in[16*64+i];
143 r16.b[i] <== in[17*64+i];
144 r16.c[i] <== in[18*64+i];
145 }
146 component r17 = step();
147 for (i=0; i<64; i++) {
148 r17.a[i] <== in[17*64+i];
149 r17.b[i] <== in[18*64+i];
150 r17.c[i] <== in[19*64+i];
151 }
152 component r18 = step();
153 for (i=0; i<64; i++) {
154 r18.a[i] <== in[18*64+i];
155 r18.b[i] <== in[19*64+i];
156 r18.c[i] <== in[15*64+i];
157 }
158 component r19 = step();
159 for (i=0; i<64; i++) {
160 r19.a[i] <== in[19*64+i];
161 r19.b[i] <== in[15*64+i];
162 r19.c[i] <== in[16*64+i];
163 }
164
165 component r20 = step();
166 for (i=0; i<64; i++) {
167 r20.a[i] <== in[20*64+i];
168 r20.b[i] <== in[21*64+i];
169 r20.c[i] <== in[22*64+i];
170 }
171 component r21 = step();
172 for (i=0; i<64; i++) {
173 r21.a[i] <== in[21*64+i];
174 r21.b[i] <== in[22*64+i];
175 r21.c[i] <== in[23*64+i];
176 }
177 component r22 = step();
178 for (i=0; i<64; i++) {
179 r22.a[i] <== in[22*64+i];
180 r22.b[i] <== in[23*64+i];
181 r22.c[i] <== in[24*64+i];
182 }
183 component r23 = step();
184 for (i=0; i<64; i++) {
185 r23.a[i] <== in[23*64+i];
186 r23.b[i] <== in[24*64+i];
187 r23.c[i] <== in[20*64+i];
188 }
189 component r24 = step();
190 for (i=0; i<64; i++) {
191 r24.a[i] <== in[24*64+i];
192 r24.b[i] <== in[20*64+i];
193 r24.c[i] <== in[21*64+i];
194 }
195
196 for (i=0; i<64; i++) {
197 out[i] <== r0.out[i];
198 out[1*64+i] <== r1.out[i];
199 out[2*64+i] <== r2.out[i];
200 out[3*64+i] <== r3.out[i];
201 out[4*64+i] <== r4.out[i];
202
203 out[5*64+i] <== r5.out[i];
204 out[6*64+i] <== r6.out[i];
205 out[7*64+i] <== r7.out[i];
206 out[8*64+i] <== r8.out[i];
207 out[9*64+i] <== r9.out[i];
208
209 out[10*64+i] <== r10.out[i];
210 out[11*64+i] <== r11.out[i];
211 out[12*64+i] <== r12.out[i];
212 out[13*64+i] <== r13.out[i];
213 out[14*64+i] <== r14.out[i];
214
215 out[15*64+i] <== r15.out[i];
216 out[16*64+i] <== r16.out[i];
217 out[17*64+i] <== r17.out[i];
218 out[18*64+i] <== r18.out[i];
219 out[19*64+i] <== r19.out[i];
220
221 out[20*64+i] <== r20.out[i];
222 out[21*64+i] <== r21.out[i];
223 out[22*64+i] <== r22.out[i];
224 out[23*64+i] <== r23.out[i];
225 out[24*64+i] <== r24.out[i];
226 }
227}