// Keccak256 hash function (ethereum version).
|
|
// For LICENSE check https://github.com/vocdoni/keccak256-circom/blob/master/LICENSE
|
|
|
|
pragma circom 2.0.0;
|
|
|
|
include "../node_modules/circomlib/circuits/gates.circom";
|
|
include "../node_modules/circomlib/circuits/sha256/xor3.circom";
|
|
include "../node_modules/circomlib/circuits/sha256/shift.circom"; // contains ShiftRight
|
|
|
|
template Xor5(n) {
|
|
signal input a[n];
|
|
signal input b[n];
|
|
signal input c[n];
|
|
signal input d[n];
|
|
signal input e[n];
|
|
signal output out[n];
|
|
var i;
|
|
|
|
component xor3 = Xor3(n);
|
|
for (i=0; i<n; i++) {
|
|
xor3.a[i] <== a[i];
|
|
xor3.b[i] <== b[i];
|
|
xor3.c[i] <== c[i];
|
|
}
|
|
component xor4 = XorArray(n);
|
|
for (i=0; i<n; i++) {
|
|
xor4.a[i] <== xor3.out[i];
|
|
xor4.b[i] <== d[i];
|
|
}
|
|
component xor5 = XorArray(n);
|
|
for (i=0; i<n; i++) {
|
|
xor5.a[i] <== xor4.out[i];
|
|
xor5.b[i] <== e[i];
|
|
}
|
|
for (i=0; i<n; i++) {
|
|
out[i] <== xor5.out[i];
|
|
}
|
|
}
|
|
|
|
template XorArray(n) {
|
|
signal input a[n];
|
|
signal input b[n];
|
|
signal output out[n];
|
|
var i;
|
|
|
|
component aux[n];
|
|
for (i=0; i<n; i++) {
|
|
aux[i] = XOR();
|
|
aux[i].a <== a[i];
|
|
aux[i].b <== b[i];
|
|
}
|
|
for (i=0; i<n; i++) {
|
|
out[i] <== aux[i].out;
|
|
}
|
|
}
|
|
|
|
template XorArraySingle(n) {
|
|
signal input a[n];
|
|
signal output out[n];
|
|
var i;
|
|
|
|
component aux[n];
|
|
for (i=0; i<n; i++) {
|
|
aux[i] = XOR();
|
|
aux[i].a <== a[i];
|
|
aux[i].b <== 1;
|
|
}
|
|
for (i=0; i<n; i++) {
|
|
out[i] <== aux[i].out;
|
|
}
|
|
}
|
|
|
|
template OrArray(n) {
|
|
signal input a[n];
|
|
signal input b[n];
|
|
signal output out[n];
|
|
var i;
|
|
|
|
component aux[n];
|
|
for (i=0; i<n; i++) {
|
|
aux[i] = OR();
|
|
aux[i].a <== a[i];
|
|
aux[i].b <== b[i];
|
|
}
|
|
for (i=0; i<n; i++) {
|
|
out[i] <== aux[i].out;
|
|
}
|
|
}
|
|
|
|
template AndArray(n) {
|
|
signal input a[n];
|
|
signal input b[n];
|
|
signal output out[n];
|
|
var i;
|
|
|
|
component aux[n];
|
|
for (i=0; i<n; i++) {
|
|
aux[i] = AND();
|
|
aux[i].a <== a[i];
|
|
aux[i].b <== b[i];
|
|
}
|
|
for (i=0; i<n; i++) {
|
|
out[i] <== aux[i].out;
|
|
}
|
|
}
|
|
|
|
template ShL(n, r) {
|
|
signal input in[n];
|
|
signal output out[n];
|
|
|
|
for (var i=0; i<n; i++) {
|
|
if (i < r) {
|
|
out[i] <== 0;
|
|
} else {
|
|
out[i] <== in[ i-r ];
|
|
}
|
|
}
|
|
}
|