int CG21_KEY_RESHARE_ROUND3_CHECK_V_N2()

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