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;
}