in src/cg21/cg21_reshare.c [189:241]
int CG21_KEY_RESHARE_ROUND1_N2(csprng *RNG, const CG21_SSID *ssid, int ID, CG21_RESHARE_SETTING setting,
CG21_RESHARE_ROUND1_STORE_SECRET_N2 *storeSecret, CG21_RESHARE_ROUND1_STORE_PUB_N2 *storePub,
CG21_RESHARE_ROUND1_OUT *pubOut){
// check ID is in N2, but not in T1
bool check_T1 = false;
bool check_N2 = false;
for (int i=0; i<setting.t1; i++){
if (ID == *(setting.T1 + i)){
check_T1 = true;
}
}
for (int i=0; i<setting.n2; i++){
if (ID == *(setting.N2 + i)){
check_N2 = true;
}
}
if (check_T1!=false || check_N2!=true){
return CG21_ID_IS_INVALID;
}
BIG_256_56 q;
BIG_256_56 s;
// sample rho_i
BIG_256_56_rcopy(q, CURVE_Order_SECP256K1);
BIG_256_56_randomnum(s, q, RNG);
storePub->rho->len=EGS_SECP256K1;
BIG_256_56_toBytes(storePub->rho->val,s);
BIG_256_56_zero(s);
// sample u_i
BIG_256_56_randomnum(s, q, RNG);
storePub->u->len=EGS_SECP256K1;
BIG_256_56_toBytes(storePub->u->val,s);
BIG_256_56_zero(s);
// i component of (ssid,i,V)
*pubOut->i = ID;
*storePub->i = ID;
// commit to random r
SCHNORR_commit(RNG, storeSecret->r, storePub->A);
//compute V_i
int rc = CG21_KEY_RESHARE_GEN_V_N2(ssid, storePub, pubOut, setting);
if (rc!=CG21_OK) {
return rc;
}
return CG21_OK;
}