static int CG21_PI_MOD_proof_fromOCTET()

in src/cg21/cg21_pi_mod.c [282:316]


static int CG21_PI_MOD_proof_fromOCTET(CG21_PIMOD_PROOF_OCT *paillierProof, CG21_PIMOD_PROOF *pimodProof){
    char result2[CG21_PAILLIER_PROOF_ITERS*2+1];

    char w[FS_2048];
    octet W = {0, sizeof(w), w};

    if (paillierProof->x->len != CG21_PAILLIER_PROOF_SIZE || paillierProof->z->len != CG21_PAILLIER_PROOF_SIZE)
    {
        return CG21_PAILLIER_PROOF_INVALID;
    }

    // load xi, yi and zi values from octets
    for (int i = CG21_PAILLIER_PROOF_ITERS - 1; i >= 0; i--)
    {
        OCT_chop(paillierProof->x, &W, paillierProof->x->len - FS_2048);
        FF_2048_fromOctet(pimodProof->xi[i], &W, FFLEN_2048);

        OCT_chop(paillierProof->z, &W, paillierProof->z->len - FS_2048);
        FF_2048_fromOctet(pimodProof->zi[i], &W, FFLEN_2048);
    }

    // Restore length of the proofs
    paillierProof->x->len = CG21_PAILLIER_PROOF_SIZE;
    paillierProof->z->len = CG21_PAILLIER_PROOF_SIZE;

    // Convert w from octet to BIG_512_60 w[HFLEN_4096]
    FF_4096_zero(pimodProof->w, HFLEN_4096);
    FF_4096_fromOctet(pimodProof->w, paillierProof->w, HFLEN_4096);

    // convert ab from octet to ab[CG21_PAILLIER_PROOF_ITERS][2]
    OCT_toStr(paillierProof->ab, result2);
    charToBool(result2, pimodProof->ab);

    return CG21_OK;
}