arnaucube
arnaucube/keccak256-circomPublic Self-hosted repository
keccak256-circom/circuits/utils.circom
circuits/utils.circomRaw
 1pragma circom 2.0.0;
 2
 3include "../node_modules/circomlib/circuits/gates.circom";
 4include "../node_modules/circomlib/circuits/sha256/xor3.circom";
 5include "../node_modules/circomlib/circuits/sha256/shift.circom"; // contains ShiftRight
 6
 7template Xor5(n) {
 8    signal input a[n];
 9    signal input b[n];
10    signal input c[n];
11    signal input d[n];
12    signal input e[n];
13    signal output out[n];
14    var i;
15    
16    component xor3 = Xor3(n);
17    for (i=0; i<n; i++) {
18        xor3.a[i] <== a[i];
19        xor3.b[i] <== b[i];
20        xor3.c[i] <== c[i];
21    }
22    component xor4 = XorArray(n);
23    for (i=0; i<n; i++) {
24        xor4.a[i] <== xor3.out[i];
25        xor4.b[i] <== d[i];
26    }
27    component xor5 = XorArray(n);
28    for (i=0; i<n; i++) {
29        xor5.a[i] <== xor4.out[i];
30        xor5.b[i] <== e[i];
31    }
32    for (i=0; i<n; i++) {
33        out[i] <== xor5.out[i];
34    }
35}
36
37template XorArray(n) {
38    signal input a[n];
39    signal input b[n];
40    signal output out[n];
41    var i;
42
43    component aux[n];
44    for (i=0; i<n; i++) {
45        aux[i] = XOR();
46        aux[i].a <== a[i];
47        aux[i].b <== b[i];
48    }
49    for (i=0; i<n; i++) {
50        out[i] <== aux[i].out;
51    }
52}
53template OrArray(n) {
54    signal input a[n];
55    signal input b[n];
56    signal output out[n];
57    var i;
58
59    component aux[n];
60    for (i=0; i<n; i++) {
61        aux[i] = OR();
62        aux[i].a <== a[i];
63        aux[i].b <== b[i];
64    }
65    for (i=0; i<n; i++) {
66        out[i] <== aux[i].out;
67    }
68}
69
70template ShL(n, r) {
71    signal input in[n];
72    signal output out[n];
73
74    for (var i=0; i<n; i++) {
75        if (i < r) {
76            out[i] <== 0;
77        } else {
78            out[i] <== in[ i-r ];
79        }
80    }
81}