Exemplo n.º 1
0
/*
 * 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);
  }
}
Exemplo n.º 2
0
//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");
}