|
|
pragma circom 2.0.0;
include "./utils.circom"; include "./theta.circom"; include "./rhopi.circom"; include "./chi.circom"; include "./iota.circom";
template Pad(nBits) { signal input in[nBits];
var blockSize=136*8; signal output out[blockSize]; signal out2[blockSize];
var i;
for (i=0; i<nBits; i++) { out2[i] <== in[i]; } var domain = 0x01; for (i=0; i<8; i++) { out2[nBits+i] <== (domain >> i) & 1; } for (i=nBits+8; i<blockSize; i++) { out2[i] <== 0; } component aux = OrArray(8); for (i=0; i<8; i++) { aux.a[i] <== out2[blockSize-8+i]; aux.b[i] <== (0x80 >> i) & 1; } for (i=0; i<8; i++) { out[blockSize-8+i] <== aux.out[i]; } for (i=0; i<blockSize-8; i++) { out[i]<==out2[i]; } }
template KeccakfRound(r) { signal input in[25*64]; signal output out[25*64]; var i;
component theta = Theta(); component rhopi = RhoPi(); component chi = Chi(); component iota = Iota(r);
for (i=0; i<25*64; i++) { theta.in[i] <== in[i]; } for (i=0; i<25*64; i++) { rhopi.in[i] <== theta.out[i]; } for (i=0; i<25*64; i++) { chi.in[i] <== rhopi.out[i]; } for (i=0; i<25*64; i++) { iota.in[i] <== chi.out[i]; } for (i=0; i<25*64; i++) { out[i] <== iota.out[i]; } }
|