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