void PiEnc_Prove()

in src/cg21/cg21_rp_pi_enc.c [264:341]


void PiEnc_Prove(PAILLIER_private_key *priv_key, octet *k_oct, octet *rho_oct,
                 PiEnc_SECRETS *secrets, octet *e_oct, PiEnc_PROOFS *proofs, PiEnc_PROOFS_OCT *proofsOct)
{
    // ------------ VARIABLE DEFINITION ----------
    BIG_1024_58 ws1[FFLEN_2048];
    BIG_1024_58 ws2[FFLEN_2048];
    BIG_1024_58 hws[HFLEN_2048];
    BIG_1024_58 rho[2 * FFLEN_2048];
    BIG_1024_58 e[HFLEN_2048];
    BIG_1024_58 k[HFLEN_2048];
    BIG_1024_58 sp[HFLEN_2048];
    BIG_1024_58 sq[HFLEN_2048];

    char oct[2*FS_2048];
    octet OCT = {0, sizeof(oct), oct};

    OCT_clear(&OCT);

    // ------------ READ INPUTS ----------
    OCT_copy(&OCT, k_oct);
    OCT_pad(&OCT, HFS_2048);
    FF_2048_fromOctet(k, &OCT, HFLEN_2048);

    OCT_clear(&OCT);
    OCT_copy(&OCT, rho_oct);
    FF_2048_fromOctet(rho, &OCT, 2 * FFLEN_2048);

    OCT_copy(&OCT, e_oct);
    OCT_pad(&OCT, HFS_2048);
    FF_2048_fromOctet(e, &OCT, HFLEN_2048);

    // ------------ GENERATE PiEnc_PROOFS ----------
    // Compute z2 = r * mu^e mod N using CRT
    CG21_FF_2048_amod(hws, rho, 2 * FFLEN_2048, priv_key->p, HFLEN_2048);
    FF_2048_dmod(sp, secrets->r, priv_key->p, HFLEN_2048);
    FF_2048_nt_pow(hws, hws, e, priv_key->p, HFLEN_2048, HFLEN_2048);
    FF_2048_mul(ws1, sp, hws,  HFLEN_2048);
    FF_2048_dmod(sp, ws1, priv_key->p, HFLEN_2048);

    CG21_FF_2048_amod(hws, rho, 2 * FFLEN_2048, priv_key->q, HFLEN_2048);
    FF_2048_dmod(sq, secrets->r, priv_key->q, HFLEN_2048);
    FF_2048_nt_pow(hws, hws, e, priv_key->q, HFLEN_2048, HFLEN_2048);
    FF_2048_mul(ws1, sq, hws,  HFLEN_2048);
    FF_2048_dmod(sq, ws1, priv_key->q, HFLEN_2048);

    FF_2048_mul(ws2, priv_key->p, priv_key->q, HFLEN_2048);
    FF_2048_crt(ws1, sp, sq, priv_key->p, priv_key->invpq, ws2, HFLEN_2048);

    // Convert z2 to FF_4096 since it is only used as such
    FF_2048_toOctet(&OCT, ws1, FFLEN_2048);
    OCT_pad(&OCT, FS_4096);
    FF_4096_fromOctet(proofs->z2, &OCT, FFLEN_4096);

    // Compute z1 = e*k + alpha
    FF_2048_mul(ws1, e, k, HFLEN_2048);
    FF_2048_copy(proofs->z1, secrets->alpha, FFLEN_2048);
    FF_2048_add(proofs->z1, proofs->z1, ws1, FFLEN_2048);
    FF_2048_norm(proofs->z1, FFLEN_2048);

    // Compute z3 = e*mu + gamma
    CG21_FF_2048_amul(rho, e, HFLEN_2048, secrets->mu, FFLEN_2048 + HFLEN_2048);
    FF_2048_copy(proofs->z3, secrets->gamma, FFLEN_2048 + HFLEN_2048);
    FF_2048_add(proofs->z3, proofs->z3, rho, FFLEN_2048 + HFLEN_2048);
    FF_2048_norm(proofs->z3, FFLEN_2048 + HFLEN_2048);

    // proof to octets for transmission
    PiEnc_proof_toOctets(proofsOct, proofs);

    // ------------ CLEAR MEMORY ----------
    OCT_clear(&OCT);
    FF_2048_zero(rho, 2 * FFLEN_2048);
    FF_2048_zero(ws1, FFLEN_2048);
    FF_2048_zero(ws2, FFLEN_2048);
    FF_2048_zero(hws, HFLEN_2048);
    FF_2048_zero(sp, HFLEN_2048);
    FF_2048_zero(sq, HFLEN_2048);
    FF_2048_zero(k, HFLEN_2048);
}