Beispiel #1
0
Verifier::~Verifier(void) {
#if NONINTERACTIVE == 0
  clear_vec(batch_size * num_repetitions, c_values);
  clear_vec(num_repetitions * num_lin_pcp_queries, f_con_coins);
#endif
  clear_scalar(a);
  clear_scalar(f_s);

  mpz_clear(prime);

  delete v;
  delete curl;
}
Beispiel #2
0
double do_regular_ciphermul(int size_input, mpz_t *plain, mpz_t *cipher,
                            int prime_size, mpz_t prime) {
    mpz_t out1, out2;
    alloc_init_scalar(out1);
    alloc_init_scalar(out2);

    Measurement m;
    m.begin_with_init();
    crypto->dot_product_regular_enc(size_input, cipher, plain, out1, out2);
    m.end();

    clear_scalar(out1);
    clear_scalar(out2);
    return m.get_ru_elapsed_time();
}
Beispiel #3
0
void bisect_sfdlProverExo::baseline(const mpq_t* input_q, int num_inputs,
                                    mpq_t* output_recomputed, int num_outputs) {

  int m = bisect_sfdl_cons::m;
  int L = bisect_sfdl_cons::L;

  mpq_t temp_q;
  alloc_init_scalar(temp_q);

  mpq_t* a = output_recomputed;
  mpq_t* b = output_recomputed + m;
  mpq_t& f = temp_q;

  for(int i = 0; i < m; i++) {
    mpq_set(a[i], input_q[i]);
    mpq_set(b[i], input_q[i+m]);
  }

  for(int i = 0; i < L; i++) {
    exogenous_fAtMidpt(f, a, b);
    if (mpq_sgn(f) > 0) {
      for(int j = 0; j < m; j++) {
        mpq_add(b[j], a[j], b[j]);
        mpq_div_2exp(b[j], b[j], 1);
      }
    } else {
      for(int j = 0; j < m; j++) {
        mpq_add(a[j], a[j], b[j]);
        mpq_div_2exp(a[j], a[j], 1);
      }
    }
  }
  clear_scalar(temp_q);
}
Beispiel #4
0
ZComputationVerifier::~ZComputationVerifier() {
    clear_scalar(A_tau);
    clear_scalar(B_tau);
    clear_scalar(C_tau);
    clear_vec(size_input+size_output, input);
    clear_vec(size_input, input_q);
    clear_vec(size_f2_vec, set_v);

    clear_vec(num_repetitions * num_lin_pcp_queries, f_answers);
    clear_vec(expansion_factor, temp_arr);
    clear_vec(expansion_factor, temp_arr2);

    clear_scalar(temp);
    clear_scalar(temp2);
    clear_scalar(temp3);
    clear_scalar(lhs);
    clear_scalar(rhs);
    clear_vec(NUM_REPS_PCP, d_star);
    clear_scalar(omega);
}
Beispiel #5
0
int main(int argc, char **argv) {
    // TODO: the parameter "128" below should be made "192" or "220"
    // depending on the field size. Modify the code to create one crypto
    // object for each field size. This matters for performance of
    // encryption
    crypto = new Crypto(CRYPTO_TYPE_PRIVATE, CRYPTO_ELGAMAL, PNG_CHACHA, false, 128, 1024, 160);
    alloc_init_scalar(prime_128);
    alloc_init_scalar(prime_192);
    alloc_init_scalar(prime_220);

    load_prime(128, prime_128);
    load_prime(192, prime_192);
    load_prime(220, prime_220);

    measure_plaintext_ops();
    measure_ciphertext_ops();

    delete crypto;
    clear_scalar(prime_128);
    clear_scalar(prime_192);
    clear_scalar(prime_220);

    return 0;
}
Beispiel #6
0
void ZComputationVerifier::init_qap(const char *file_name_qap) {
    // compute these based on values set by the compiler
    poly_A = (poly_compressed *) malloc(num_aij * sizeof(poly_compressed));
    poly_B = (poly_compressed *) malloc(num_bij * sizeof(poly_compressed));
    poly_C = (poly_compressed *) malloc(num_cij * sizeof(poly_compressed));

    for (int i=0; i<num_aij; i++)
        alloc_init_scalar(poly_A[i].coefficient);

    for (int i=0; i<num_bij; i++)
        alloc_init_scalar(poly_B[i].coefficient);

    for (int i=0; i<num_cij; i++)
        alloc_init_scalar(poly_C[i].coefficient);

    // create vectors to store the evaluations of the polynomial at tau
    alloc_init_vec(&eval_poly_A, n+1);
    alloc_init_vec(&eval_poly_B, n+1);
    alloc_init_vec(&eval_poly_C, n+1);

    alloc_init_vec(&A_tau_io, num_repetitions*(size_input+size_output+1));
    alloc_init_vec(&B_tau_io, num_repetitions*(size_input+size_output+1));
    alloc_init_vec(&C_tau_io, num_repetitions*(size_input+size_output+1));


    // open the file
    FILE *fp = fopen(file_name_qap, "r");
    if (fp == NULL) {
        cout<<"Cannot read "<<file_name_qap<<endl;
        exit(1);
    }

    char line[BUFLEN];
    mpz_t temp;
    alloc_init_scalar(temp);

    // fill the array of struct: poly_A, poly_B, and poly_C
    int line_num = 0;
    while (fgets(line, sizeof line, fp) != NULL) {
        if (line[0] == '\n')
            continue;
        if (line_num < num_aij) {
            gmp_sscanf(line, "%d %d %Zd", &poly_A[line_num].i, &poly_A[line_num].j, poly_A[line_num].coefficient);
        } else if (line_num >= num_aij && line_num < num_aij+num_bij) {
            gmp_sscanf(line, "%d %d %Zd", &poly_B[line_num-num_aij].i, &poly_B[line_num-num_aij].j, poly_B[line_num-num_aij].coefficient);
        } else {
            gmp_sscanf(line, "%d %d %Zd", &poly_C[line_num-num_aij-num_bij].i, &poly_C[line_num-num_aij-num_bij].j, poly_C[line_num-num_aij-num_bij].coefficient);
        }
        line_num++;
    }
    fclose(fp);
    clear_scalar(temp);

    // set prime size based on name of the computation in case of Zaatar
    string str(file_name_qap);
    if (str.find("bisect_sfdl") != std::string::npos) {
        num_bits_in_prime = 220;
    } else if (str.find("pd2_sfdl") != std::string::npos) {
        num_bits_in_prime = 220;
    } else {
        num_bits_in_prime = 128;
    }

    cout<<"LOG: Using a prime of size "<<num_bits_in_prime<<endl;
}
Beispiel #7
0
void ZComputationVerifier::create_plain_queries() {
    clear_vec(size_f1_vec*expansion_factor, f1_commitment);
    clear_vec(size_f2_vec*expansion_factor, f2_commitment);

    m_plainq.begin_with_init();
    // keeps track of #filled coins
    int f_con_filled = -1;
    int query_id;

    for (int rho=0; rho<num_repetitions; rho++) {
        if (rho == 0) m_plainq.begin_with_init();
        else m_plainq.begin_with_history();

        // create linearity test queries
        query_id = 1;
        for (int i=0; i<NUM_REPS_LIN; i++) {
            v->create_lin_test_queries(size_f1_vec, f1_q1, f1_q2, f1_q3, f1_consistency,
                                       f_con_filled, f_con_coins, prime);

            f_con_filled += 3;

            v->create_lin_test_queries(size_f2_vec, f2_q1, f2_q2, f2_q3, f2_consistency,
                                       f_con_filled, f_con_coins, prime);

            f_con_filled += 3;

            //TODO: can be folded into a function
            /*
            snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho);
            dump_vector(size_f1_vec, f1_q1, scratch_str);
            send_file(scratch_str);


            snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho);
            dump_vector(size_f1_vec, f1_q2, scratch_str);
            send_file(scratch_str);

            // don't dump, but increment query_id
            query_id++;
            //snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho);
            //dump_vector(size_f1_vec, f1_q3, scratch_str);
            //send_file(scratch_str);

            snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho);
            dump_vector(size_f2_vec, f2_q1, scratch_str);
            send_file(scratch_str);

            snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho);
            dump_vector(size_f2_vec, f2_q2, scratch_str);
            send_file(scratch_str);

            query_id++;
            //snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho);
            //dump_vector(size_f2_vec, f2_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<size_f1_vec; i++)
                    mpz_set(f1_q4[i], f1_q1[i]);

                for (int i=0; i<size_f2_vec; i++)
                    mpz_set(f2_q4[i], f2_q1[i]);
            }
        }

        for (int i=0; i<n+1; i++) {
            mpz_set_ui(eval_poly_A[i], 0);
            mpz_set_ui(eval_poly_B[i], 0);
            mpz_set_ui(eval_poly_C[i], 0);
        }

        // create zquad correction queries: create q9, q10, q11, and q12
        v->create_div_corr_test_queries(n, size_f1_vec, size_f2_vec, f1_q1, f1_q2, f1_q3, f2_q1, f_con_coins, f_con_filled, f1_consistency, f_con_coins, f_con_filled+3, f2_consistency, f1_q4, f2_q4, d_star[rho], num_aij, num_bij, num_cij, set_v, poly_A, poly_B, poly_C, eval_poly_A, eval_poly_B, eval_poly_C, prime);

        f_con_filled += 4;

        int base = rho * (1 + size_input + size_output);
        mpz_set(A_tau_io[base+0], eval_poly_A[0]);
        mpz_set(B_tau_io[base+0], eval_poly_B[0]);
        mpz_set(C_tau_io[base+0], eval_poly_C[0]);

        for (int i=0; i<size_input+size_output; i++) {
            mpz_set(A_tau_io[base+1+i], eval_poly_A[1+n_prime+i]);
            mpz_set(B_tau_io[base+1+i], eval_poly_B[1+n_prime+i]);
            mpz_set(C_tau_io[base+1+i], eval_poly_C[1+n_prime+i]);
        }

        /*
        snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho);
        dump_vector(size_f1_vec, f1_q1, scratch_str);
        send_file(scratch_str);

        snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho);
        dump_vector(size_f1_vec, f1_q2, scratch_str);
        send_file(scratch_str);

        snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho);
        dump_vector(size_f1_vec, f1_q3, scratch_str);
        send_file(scratch_str);

        snprintf(scratch_str, BUFLEN-1, "q%d_qquery_r_%d", query_id++, rho);
        dump_vector(size_f2_vec, f2_q1, scratch_str);
        send_file(scratch_str);
        */
    }

    dump_vector(size_f1_vec, f1_consistency, (char *)"f1_consistency_query");
    send_file((char *)"f1_consistency_query");

    dump_vector(size_f2_vec, f2_consistency, (char *)"f2_consistency_query");
    send_file((char *)"f2_consistency_query");
    m_plainq.end();

    // cleanup time
    clear_vec(n+1, eval_poly_A);
    clear_vec(n+1, eval_poly_B);
    clear_vec(n+1, eval_poly_C);
    clear_vec(size_f1_vec, f1_consistency);
    clear_vec(size_f2_vec, f2_consistency);

    for (int i=0; i<num_aij; i++)
        clear_scalar(poly_A[i].coefficient);

    for (int i=0; i<num_bij; i++)
        clear_scalar(poly_B[i].coefficient);

    for (int i=0; i<num_cij; i++)
        clear_scalar(poly_C[i].coefficient);

    free(poly_A);
    free(poly_B);
    free(poly_C);

    clear_vec(size_f1_vec, f1_q1);
    clear_vec(size_f1_vec, f1_q2);
    clear_vec(size_f1_vec, f1_q3);
    clear_vec(size_f1_vec, f1_q4);
    clear_vec(size_f2_vec, f2_q1);
    clear_vec(size_f2_vec, f2_q2);
    clear_vec(size_f2_vec, f2_q3);
    clear_vec(size_f2_vec, f2_q4);

    // Ginger's codebase did some run test part of work in plain query
    // creation; so the base class calls with history;
    m_runtests.reset();
}