in src/cg21/cg21_reshare.c [288:344]
int CG21_KEY_RESHARE_ROUND3_CHECK_V_N2(const CG21_SSID *ssid,
CG21_RESHARE_SETTING setting,
const CG21_RESHARE_ROUND1_STORE_PUB_N2 *ReceiveR3,
CG21_RESHARE_ROUND1_OUT *ReceiveR2){
// check Party IDs in both messages are the same
if (*ReceiveR2->i != *ReceiveR3->i){
return CG21_RESHARE_V_IS_NOT_VALID;
}
/* ID should not be in T1, but in N2 */
//check ID is not in T1
bool ID_in_T1=false;
for (int i=0; i<setting.t1; i++){
if (*(setting.T1+i) == *ReceiveR2->i){
ID_in_T1 = true;
}
}
if (ID_in_T1){
return CG21_RESHARE_V_IS_NOT_VALID;
}
// check ID is in N2
bool ID_in_N2=false;
for (int i=0; i<setting.n2; i++){
if (*(setting.N2+i) == *ReceiveR2->i){
ID_in_N2 = true;
}
}
if (!ID_in_N2){
return CG21_RESHARE_V_IS_NOT_VALID;
}
int Vi;
char v[SHA256];
octet V = {0, sizeof(v), v};
CG21_RESHARE_ROUND1_OUT pubOut;
pubOut.i = &Vi;
pubOut.V = &V;
pubOut.i = ReceiveR2->i;
//compute V_i
int rc = CG21_KEY_RESHARE_GEN_V_N2(ssid, ReceiveR3, &pubOut, setting);
if (rc!=CG21_OK) {
return rc;
}
int ret = OCT_comp(pubOut.V, ReceiveR2->V);
if (ret != 1){
return CG21_RESHARE_V_IS_NOT_VALID;
}
return CG21_OK;
}