arnaucube
arnaucube/keccak256-circomPublic Self-hosted repository
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}