/* * Dump an entire array of scalars. Useful when there are multiple functions in * the prover. * * Vectors will be stored with the following name: * f<num_func>_<suffix> * num_func is an integer in [0, n). */ void dump_scalar_array(int n, const mpz_t *scalars, const char *suffix, char *folder_name) { char vec_name[BUFLEN]; for (int i = 0; i < n; i++) { snprintf(vec_name, sizeof(vec_name), "f%d_%s", i, suffix); dump_scalar(scalars[i], vec_name, folder_name); } }
//PROVER's CODE void PolyEvalD3Prover:: prover_computation_commitment() { load_vector(expansion_factor*m, f1_commitment, (char *)"f1_commitment_query", FOLDER_WWW_DOWNLOAD); load_vector(expansion_factor*size_f2_vec, f2_commitment, (char *)"f2_commitment_query", FOLDER_WWW_DOWNLOAD); load_vector(expansion_factor*size_f3_vec, f3_commitment, (char *)"f3_commitment_query", FOLDER_WWW_DOWNLOAD); m_computation.begin_with_init(); //for (int k=0; k<INNER_LOOP_SMALL; k++) load_vector(num_coefficients, coefficients, (char *)"coefficients", FOLDER_WWW_DOWNLOAD); m_computation.end(); for (int i=batch_start; i<=batch_end; i++) { m_computation.begin_with_history(); //for (int k=0; k<INNER_LOOP_SMALL; k++) { snprintf(scratch_str, BUFLEN-1, "input_b_%d", i); load_vector(m, variables, scratch_str, FOLDER_WWW_DOWNLOAD); for (int j=0; j<expansion_factor; j++) mpz_set_ui(output[j], 0); computation_polyeval(output[0]); // start saving the state snprintf(scratch_str, BUFLEN-1, "output_b_%d", i); dump_scalar(output[0], scratch_str, FOLDER_WWW_DOWNLOAD); } m_computation.end(); computation_assignment(output[0]); snprintf(scratch_str, BUFLEN-1, "f1_assignment_vector_b_%d", i); dump_vector(m, F1, scratch_str, FOLDER_WWW_DOWNLOAD); snprintf(scratch_str, BUFLEN-1, "f2_assignment_vector_b_%d", i); dump_vector(size_f2_vec, F2, scratch_str, FOLDER_WWW_DOWNLOAD); snprintf(scratch_str, BUFLEN-1, "f3_assignment_vector_b_%d", i); dump_vector(size_f3_vec, F3, scratch_str, FOLDER_WWW_DOWNLOAD); } for (int i=batch_start; i<=batch_end; i++) { if (i == 0) m_answer_queries.begin_with_init(); else m_answer_queries.begin_with_history(); snprintf(scratch_str, BUFLEN-1, "f1_assignment_vector_b_%d", i); load_vector(m, F1, scratch_str, FOLDER_WWW_DOWNLOAD); snprintf(scratch_str, BUFLEN-1, "f2_assignment_vector_b_%d", i); load_vector(size_f2_vec, F2, scratch_str, FOLDER_WWW_DOWNLOAD); snprintf(scratch_str, BUFLEN-1, "f3_assignment_vector_b_%d", i); load_vector(size_f3_vec, F3, scratch_str, FOLDER_WWW_DOWNLOAD); v->dot_product_enc(m, f1_commitment, F1, dotp[0], dotp[1]); v->dot_product_enc(size_f2_vec, f2_commitment, F2, output[0], output[1]); v->add_enc(dotp[0], dotp[1], dotp[0], dotp[1], output[0], output[1]); v->dot_product_enc(size_f3_vec, f3_commitment, F3, output[0], output[1]); v->add_enc(dotp[0], dotp[1], dotp[0], dotp[1], output[0], output[1]); snprintf(scratch_str, BUFLEN-1, "f_commitment_answer_b_%d", i); dump_vector(expansion_factor, dotp, scratch_str, FOLDER_WWW_DOWNLOAD); m_answer_queries.end(); } }
void MatrixCubicVerifier::create_plain_queries() { uint32_t m2 = input_size*input_size; // keeps track of #filled coins int f1_con_filled = -1; for (int rho=0; rho<num_repetitions; rho++) { if (rho == 0) m_plainq.begin_with_init(); else m_plainq.begin_with_history(); int query_id = 1; for (int i=0; i<NUM_REPS_LIN; i++) { v->create_lin_test_queries(hadamard_code_size, f1_q1, f1_q2, f1_q3, f1_consistency, f1_con_filled, f_con_coins, prime); f1_con_filled += 3; //snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho); //dump_vector(hadamard_code_size, f1_q1, scratch_str); //send_file(scratch_str); //snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho); //dump_vector(hadamard_code_size, f1_q2, scratch_str); //send_file(scratch_str); query_id++; //snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho); //dump_vector(hadamard_code_size, f1_q3, scratch_str); //send_file(scratch_str); // use one of the linearity queries as self correction queries if (i == 0) { for (int i=0; i<hadamard_code_size; i++) mpz_set(f1_q4[i], f1_q1[i]); } } // f1_q1 = q3 // f1_q2 = q4 // f2_q1 = q1 // f2_q2 = q2 mpz_set_ui(f_con_coins[f1_con_filled+1], 0); mpz_set_ui(f_con_coins[f1_con_filled+2], 0); f1_con_filled += 2; query_id += 2; v->create_corr_test_queries_vproduct(input_size, f2_q1, f2_q2, f1_q1, f1_q4, f1_consistency, f1_con_filled, f_con_coins, prime); f1_con_filled += 1; //snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho); //dump_vector(hadamard_code_size, f1_q1, scratch_str); //send_file(scratch_str); m_plainq.end(); // compute answers to f1(q1) and f1(q2) locally now itself if (rho == 0) m_runtests.begin_with_init(); else m_runtests.begin_with_history(); for (int b=0; b<batch_size; b++) { mpz_set_ui(a1, 0); mpz_set_ui(a2, 0); snprintf(scratch_str, BUFLEN-1, "input1_b_%d", b); load_vector(2*input_size*input_size, A, scratch_str); //snprintf(scratch_str, BUFLEN-1, "input1_b_%d", b); //load_vector(input_size*input_size, B, scratch_str); int index; mpz_set_ui(a3, 0); for (int k=0; k<input_size; k++) { // dot product of k^th row of A with k^th row of f2_q1 //\sum_{j=1}{m}{A[k][j] \cdot f2_q1[k][j]} mpz_set_ui(a1, 0); mpz_set_ui(a2, 0); for (int j=0; j<input_size; j++) { index = j*input_size+k; mpz_mul(temp, A[index], f2_q1[index]); mpz_add(a1, a1, temp); } for (int i=0; i<input_size; i++) { index = k*input_size+i; mpz_mul(temp, B[index], f2_q2[index]); mpz_add(a2, a2, temp); } mpz_mul(temp, a1, a2); mpz_add(a3, a3, temp); mpz_mod(a3, a3, prime); } snprintf(scratch_str, BUFLEN-1, "corr_answer_b_%d_r_%d", b, rho); dump_scalar(a3, scratch_str); } m_runtests.end(); // circuit test m_plainq.begin_with_history(); v->get_random_vec_pub(input_size*input_size, gamma, prime); for (int i=0; i<hadamard_code_size; i++) mpz_set_ui(f1_q1[i], 0); int index, index2; for (int i=0; i<input_size; i++) { for (int j=0; j<input_size; j++) { // add gamma[i*input_size+j] to all the cells in query index2 = i*input_size+j; for (int k=0; k<input_size; k++) { index = index2 * input_size+k; mpz_add(f1_q1[index], f1_q1[index], gamma[index2]); } } } for (int i=0; i<input_size*input_size*input_size; i++) mpz_mod(f1_q1[i], f1_q1[i], prime); v->create_ckt_test_queries(hadamard_code_size, f1_q1, f1_q3, f1_q4, f1_consistency, f1_con_filled, f_con_coins, prime); //snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho); //dump_vector(hadamard_code_size, f1_q3, scratch_str); //send_file(scratch_str); f1_con_filled += 1; m_plainq.end(); m_runtests.begin_with_history(); // finally compute c for (int i=0; i<batch_size; i++) { snprintf(scratch_str, BUFLEN-1, "output_b_%d", i); load_vector(input_size*input_size, C, scratch_str); int c_index = i * num_repetitions + rho; mpz_set_ui(c_values[c_index], 0); for (int j=0; j<input_size*input_size; j++) { mpz_neg(temp, gamma[j]); mpz_mul(temp, temp, C[j]); mpz_add(c_values[c_index], c_values[c_index], temp); } } m_runtests.end(); } dump_vector(hadamard_code_size, f1_consistency, (char *)"f1_consistency_query"); send_file((char *)"f1_consistency_query"); }