nomos-pocs/proof_of_leadership/poseidon/poseidon_16_to_1_Jubjub.circom

488 lines
14 KiB
Plaintext

//test
pragma circom 2.1.9;
include "poseidon_Jubjub_16_to_1_constants.circom";
template external_linear_layer_16_to_1() {
signal input in[16];
signal output out[16];
// Matrix is [10 14 2 6 5 7 1 3 5 7 1 3 5 7 1 3]
// [ 8 12 2 2 4 6 1 1 4 6 1 1 4 6 1 1]
// [ 2 6 10 14 1 3 5 7 1 3 5 7 1 3 5 7]
// [ 2 2 8 12 1 1 4 6 1 1 4 6 1 1 4 6]
// [ 5 7 1 3 10 14 2 6 5 7 1 3 5 7 1 3]
// [ 4 6 1 1 8 12 2 2 4 6 1 1 4 6 1 1]
// [ 1 3 5 7 2 6 10 14 1 3 5 7 1 3 5 7]
// [ 1 1 4 6 2 2 8 12 1 1 4 6 1 1 4 6]
// [ 5 7 1 3 5 7 1 3 10 14 2 6 5 7 1 3]
// [ 4 6 1 1 4 6 1 1 8 12 2 2 4 6 1 1]
// [ 1 3 5 7 1 3 5 7 2 6 10 14 1 3 5 7]
// [ 1 1 4 6 1 1 4 6 2 2 8 12 1 1 4 6]
// [ 5 7 1 3 5 7 1 3 5 7 1 3 10 14 2 6]
// [ 4 6 1 1 4 6 1 1 4 6 1 1 8 12 2 2]
// [ 1 3 5 7 1 3 5 7 1 3 5 7 2 6 10 14]
// [ 1 1 4 6 1 1 4 6 1 1 4 6 2 2 8 12]
out[0] <== in[0] +in[0] +in[0] +in[0] +in[0] +in[0] +in[0] +in[0] +in[0] +in[0] +
in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +
in[2] +in[2] +
in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +
in[4] +in[4] +in[4] +in[4] +in[4] +
in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +
in[6] +
in[7] +in[7] +in[7] +
in[8] +in[8] +in[8] +in[8] +in[8] +
in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +
in[10] +
in[11] +in[11] +in[11] +
in[12] +in[12] +in[12] +in[12] +in[12] +
in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +
in[14] +
in[15] +in[15] +in[15];
out[1] <== in[0] +in[0] +in[0] +in[0] +in[0] +in[0] +in[0] +in[0] +
in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +
in[2] +in[2] +
in[3] +in[3] +
in[4] +in[4] +in[4] +in[4] +
in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +
in[6] +
in[7] +
in[8] +in[8] +in[8] +in[8] +
in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +
in[10] +
in[11] +
in[12] +in[12] +in[12] +in[12] +
in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +
in[14] +
in[15];
out[2] <== in[0] +in[0] +
in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +
in[2] +in[2] +in[2] +in[2] +in[2] +in[2] +in[2] +in[2] +in[2] +in[2] +
in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +
in[4] +
in[5] +in[5] +in[5] +
in[6] +in[6] +in[6] +in[6] +in[6] +
in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +
in[8] +
in[9] +in[9] +in[9] +
in[10] +in[10] +in[10] +in[10] +in[10] +
in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +
in[12] +
in[13] +in[13] +in[13] +
in[14] +in[14] +in[14] +in[14] +in[14] +
in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15];
out[3] <== in[0] +in[0] +
in[1] +in[1] +
in[2] +in[2] +in[2] +in[2] +in[2] +in[2] +in[2] +in[2] +
in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +
in[4] +
in[5] +
in[6] +in[6] +in[6] +in[6] +
in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +
in[8] +
in[9] +
in[10] +in[10] +in[10] +in[10] +
in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +
in[12] +
in[13] +
in[14] +in[14] +in[14] +in[14] +
in[15] +in[15] +in[15] +in[15] +in[15] +in[15];
out[4] <== in[0] +in[0] +in[0] +in[0] +in[0] +
in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +
in[2] +
in[3] +in[3] +in[3] +
in[4] +in[4] +in[4] +in[4] +in[4] +in[4] +in[4] +in[4] +in[4] +in[4] +
in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +
in[6] +in[6] +
in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +
in[8] +in[8] +in[8] +in[8] +in[8] +
in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +
in[10] +
in[11] +in[11] +in[11] +
in[12] +in[12] +in[12] +in[12] +in[12] +
in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +
in[14] +
in[15] +in[15] +in[15];
out[5] <== in[0] +in[0] +in[0] +in[0] +
in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +
in[2] +
in[3] +
in[4] +in[4] +in[4] +in[4] +in[4] +in[4] +in[4] +in[4] +
in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +
in[6] +in[6] +
in[7] +in[7] +
in[8] +in[8] +in[8] +in[8] +
in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +
in[10] +
in[11] +
in[12] +in[12] +in[12] +in[12] +
in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +
in[14] +
in[15];
out[6] <== in[0] +
in[1] +in[1] +in[1] +
in[2] +in[2] +in[2] +in[2] +in[2] +
in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +
in[4] +in[4] +
in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +
in[6] +in[6] +in[6] +in[6] +in[6] +in[6] +in[6] +in[6] +in[6] +in[6] +
in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +
in[8] +
in[9] +in[9] +in[9] +
in[10] +in[10] +in[10] +in[10] +in[10] +
in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +
in[12] +
in[13] +in[13] +in[13] +
in[14] +in[14] +in[14] +in[14] +in[14] +
in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15];
out[7] <== in[0] +
in[1] +
in[2] +in[2] +in[2] +in[2] +
in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +
in[4] +in[4] +
in[5] +in[5] +
in[6] +in[6] +in[6] +in[6] +in[6] +in[6] +in[6] +in[6] +
in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +
in[8] +
in[9] +
in[10] +in[10] +in[10] +in[10] +
in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +
in[12] +
in[13] +
in[14] +in[14] +in[14] +in[14] +
in[15] +in[15] +in[15] +in[15] +in[15] +in[15];
out[8] <== in[0] +in[0] +in[0] +in[0] +in[0] +
in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +
in[2] +
in[3] +in[3] +in[3] +
in[4] +in[4] +in[4] +in[4] +in[4] +
in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +
in[6] +
in[7] +in[7] +in[7] +
in[8] +in[8] +in[8] +in[8] +in[8] +in[8] +in[8] +in[8] +in[8] +in[8] +
in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +
in[10] +in[10] +
in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +
in[12] +in[12] +in[12] +in[12] +in[12] +
in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +
in[14] +
in[15] +in[15] +in[15];
out[9] <== in[0] +in[0] +in[0] +in[0] +
in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +
in[2] +
in[3] +
in[4] +in[4] +in[4] +in[4] +
in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +
in[6] +
in[7] +
in[8] +in[8] +in[8] +in[8] +in[8] +in[8] +in[8] +in[8] +
in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +
in[10] +in[10] +
in[11] +in[11] +
in[12] +in[12] +in[12] +in[12] +
in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +
in[14] +
in[15];
out[10] <== in[0] +
in[1] +in[1] +in[1] +
in[2] +in[2] +in[2] +in[2] +in[2] +
in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +
in[4] +
in[5] +in[5] +in[5] +
in[6] +in[6] +in[6] +in[6] +in[6] +
in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +
in[8] +in[8] +
in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +
in[10] +in[10] +in[10] +in[10] +in[10] +in[10] +in[10] +in[10] +in[10] +in[10] +
in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +
in[12] +
in[13] +in[13] +in[13] +
in[14] +in[14] +in[14] +in[14] +in[14] +
in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15];
out[11] <== in[0] +
in[1] +
in[2] +in[2] +in[2] +in[2] +
in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +
in[4] +
in[5] +
in[6] +in[6] +in[6] +in[6] +
in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +
in[8] +in[8] +
in[9] +in[9] +
in[10] +in[10] +in[10] +in[10] +in[10] +in[10] +in[10] +in[10] +
in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +
in[12] +
in[13] +
in[14] +in[14] +in[14] +in[14] +
in[15] +in[15] +in[15] +in[15] +in[15] +in[15];
out[12] <== in[0] +in[0] +in[0] +in[0] +in[0] +
in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +
in[2] +
in[3] +in[3] +in[3] +
in[4] +in[4] +in[4] +in[4] +in[4] +
in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +
in[6] +
in[7] +in[7] +in[7] +
in[8] +in[8] +in[8] +in[8] +in[8] +
in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +
in[10] +
in[11] +in[11] +in[11] +
in[12] +in[12] +in[12] +in[12] +in[12] +in[12] +in[12] +in[12] +in[12] +in[12] +
in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +
in[14] +in[14] +
in[15] +in[15] +in[15] +in[15] +in[15] +in[15];
out[13] <== in[0] +in[0] +in[0] +in[0] +
in[1] +in[1] +in[1] +in[1] +in[1] +in[1] +
in[2] +
in[3] +
in[4] +in[4] +in[4] +in[4] +
in[5] +in[5] +in[5] +in[5] +in[5] +in[5] +
in[6] +
in[7] +
in[8] +in[8] +in[8] +in[8] +
in[9] +in[9] +in[9] +in[9] +in[9] +in[9] +
in[10] +
in[11] +
in[12] +in[12] +in[12] +in[12] +in[12] +in[12] +in[12] +in[12] +
in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +
in[14] +in[14] +
in[15] +in[15];
out[14] <== in[0] +
in[1] +in[1] +in[1] +
in[2] +in[2] +in[2] +in[2] +in[2] +
in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +
in[4] +
in[5] +in[5] +in[5] +
in[6] +in[6] +in[6] +in[6] +in[6] +
in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +
in[8] +
in[9] +in[9] +in[9] +
in[10] +in[10] +in[10] +in[10] +in[10] +
in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +
in[12] +in[12] +
in[13] +in[13] +in[13] +in[13] +in[13] +in[13] +
in[14] +in[14] +in[14] +in[14] +in[14] +in[14] +in[14] +in[14] +in[14] +in[14] +
in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15];
out[15] <== in[0] +
in[1] +
in[2] +in[2] +in[2] +in[2] +
in[3] +in[3] +in[3] +in[3] +in[3] +in[3] +
in[4] +
in[5] +
in[6] +in[6] +in[6] +in[6] +
in[7] +in[7] +in[7] +in[7] +in[7] +in[7] +
in[8] +
in[9] +
in[10] +in[10] +in[10] +in[10] +
in[11] +in[11] +in[11] +in[11] +in[11] +in[11] +
in[12] +in[12] +
in[13] +in[13] +
in[14] +in[14] +in[14] +in[14] +in[14] +in[14] +in[14] +in[14] +
in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15] +in[15];
}
template internal_linear_layer_16_to_1() {
signal input in[16];
signal output out[16];
signal sum <== in[0] + in[1] + in[2] + in[3] + in[4] + in[5] + in[6] + in[7] + in[8] + in[9] + in[10] + in[11] + in[12] + in[13] + in[14] + in[15];
out[0] <== in[0] * 67 + sum;
out[1] <== in[1] * 84 + sum;
out[2] <== in[2] * 80 + sum;
out[3] <== in[3] * 94 + sum;
out[4] <== in[4] * 57 + sum;
out[5] <== in[5] * 89 + sum;
out[6] <== in[6] * 92 + sum;
out[7] <== in[7] * 39 + sum;
out[8] <== in[8] * 34 + sum;
out[9] <== in[9] * 24 + sum;
out[10] <== in[10] + sum;
out[11] <== in[11] * 95 + sum;
out[12] <== in[12] * 21 + sum;
out[13] <== in[13] * 73 + sum;
out[14] <== in[14] * 68 + sum;
out[15] <== in[15] * 52 + sum;
}
template sbox_16_to_1() { // ALPHA = 5
signal input in;
signal output out;
signal in2;
signal in4;
in2 <== in*in;
in4 <== in2 * in2;
out <== in4 * in;
}
template ARC_16_to_1(index){
signal input in;
signal output out;
var constants[185] = round_constant_16_to_1();
out <== in + constants[index];
}
template partial_round_16_to_1(round_number) {
signal input in[16];
signal output out[16];
component add_constant = ARC_16_to_1(round_number + 60);
add_constant.in <== in[0];
component exp = sbox_16_to_1();
exp.in <== add_constant.out;
component matrix = internal_linear_layer_16_to_1();
matrix.in[0] <== exp.out;
for(var i=1; i<16; i++){
matrix.in[i] <== in[i];
}
for(var i=0; i<16; i++){
out[i] <== matrix.out[i];
}
}
template full_rounds_16_to_1(round_number){
signal input in[16];
signal output out[16];
component add_constant[16];
if(round_number < 4) {
for(var i=0; i<16; i++){
add_constant[i] = ARC_16_to_1(round_number*16+i);
}
} else {
for(var i=0; i<16; i++){
add_constant[i] = ARC_16_to_1((round_number - 61) * 16 + i + 121);
}
}
for(var i=0; i<16; i++){
add_constant[i].in <== in[i];
}
component exp[16];
for(var i=0; i<16; i++){
exp[i] = sbox_16_to_1();
exp[i].in <== add_constant[i].out;
}
component matrix = external_linear_layer_16_to_1();
for(var i=0; i<16; i++){
matrix.in[i] <== exp[i].out;
}
for(var i=0; i<16; i++){
out[i] <== matrix.out[i];
}
}
template permutation_16_to_1(){
signal input in[16];
signal output out[16];
component full_rounds_16_to_1[8];
component partial_round_16_to_1s[57];
component matrix = external_linear_layer_16_to_1();
for(var i=0; i<16; i++){
matrix.in[i] <== in[i];
}
for(var i=0; i<65; i++){
if(i < 4) {
full_rounds_16_to_1[i] = full_rounds_16_to_1(i);
} else {
if(i<61) {
partial_round_16_to_1s[i-4] = partial_round_16_to_1(i);
} else {
full_rounds_16_to_1[i-57] = full_rounds_16_to_1(i);
}
}
}
for(var i=0; i<16; i++){
full_rounds_16_to_1[0].in[i] <== matrix.out[i];
}
for(var i=1; i<4; i++){
for(var j=0; j<16; j++){
full_rounds_16_to_1[i].in[j] <== full_rounds_16_to_1[i-1].out[j];
}
}
for(var i=0; i<16; i++){
partial_round_16_to_1s[0].in[i] <== full_rounds_16_to_1[3].out[i];
}
for(var i=1; i<57; i++){
for(var j=0; j<16; j++){
partial_round_16_to_1s[i].in[j] <== partial_round_16_to_1s[i-1].out[j];
}
}
for(var i=0; i<16; i++){
full_rounds_16_to_1[4].in[i] <== partial_round_16_to_1s[56].out[i];
}
for(var i=5; i<8; i++){
for(var j=0; j<16; j++){
full_rounds_16_to_1[i].in[j] <== full_rounds_16_to_1[i-1].out[j];
}
}
for(var i=0; i<16; i++){
out[i] <== full_rounds_16_to_1[7].out[i];
}
}
template hash_16_to_1(){
signal input in[16];
signal output out;
component perm = permutation_16_to_1();
for(var i=0; i<16; i++){
perm.in[i] <== in[i];
}
out <== in[0] + perm.out[0] +
in[1] + perm.out[1] +
in[2] + perm.out[2] +
in[3] + perm.out[3] +
in[4] + perm.out[4] +
in[5] + perm.out[5] +
in[6] + perm.out[6] +
in[7] + perm.out[7] +
in[8] + perm.out[8] +
in[9] + perm.out[9] +
in[10] + perm.out[10] +
in[11] + perm.out[11] +
in[12] + perm.out[12] +
in[13] + perm.out[13] +
in[14] + perm.out[14] +
in[15] + perm.out[15];
}
//component main = hash_16_to_1();