in src/cg21/cg21_presign.c [23:53]
int CG21_VALIDATE_PARTIAL_PKS(CG21_RESHARE_OUTPUT *reshareOutput){
int size = reshareOutput->pk.pack_size;
char cc[size][EFS_SECP256K1 + 1];
octet CC[size];
init_octets((char *)cc, CC, EFS_SECP256K1 + 1, size);
char x_[EFS_SECP256K1 + 1];
octet X = {0, sizeof(x_), x_};
// unpack partial PKs into array of octets
int rc = CG21_unpack(reshareOutput->pk.X_set_packed, size, CC, EFS_SECP256K1 + 1);
if (rc!=CG21_OK){
return rc;
}
// add all the partial PKs
OCT_copy(&X, &CC[0]);
for (int j =1; j<size; j++){
CG21_ADD_TWO_PK(&X, &CC[j]);
}
// check whether the sum-of-PKs match the main PK
rc = OCT_comp(&X, reshareOutput->pk.X);
if (!rc){
return CG21_PRESIGN_PARTIAL_PK_NOT_VALID;
}
return CG21_OK;
}