int main(int argc, char const *argv[]) { if (argc > 1){ if (argc == 3 && !strcmp(argv[1], "setup")){ global_broadcast_params_t gbs; //Global Setup int n = atoi(argv[2]); setup_global_broadcast_params(&gbs, n); FILE * file; file = fopen("/tmp/gbs2.txt" , "w"); int i = 0, t; //print n fprintf(file, "%d\n", n); //print g fprintf(file, "%s\n", PUBLIC_G); //print gs[i] for (i=0; i < 2*n; i++){ if (i==n) continue; char* s = (char*) malloc(MAX_ELEMENT_LEN); t = element_snprint(s, MAX_ELEMENT_LEN, gbs->gs[i]); fprintf(file, "%s\n", s); free(s); } fclose(file); store_gbp_params("/tmp/gbs.txt", gbs); FreeGBP(gbs); return 0; } else if (argc == 2 && !strcmp(argv[1], "restore")){ global_broadcast_params_t gbs; //Global Setup restore_global_broadcast_params2(&gbs); return 0; } else if (argc == 3 && !strcmp(argv[1], "revoke")){ update_after_revocation(argv[2]); return 0; } } fprintf(stderr, "Run with ./mainbgw [task] [Other parameter]\n"); fprintf(stderr, "For example ./mainbgw setup 16\n"); return 1; }
//Called in file encryption function to generate C0,C1,C0',C1' and EK //returns CT,EK void EK_CT_generate(char *gamma, int *shared_users, int num_users, unsigned char *pps, ct CT, element_t EK, char *t_str) { global_broadcast_params_t gbs; element_t t; int j; //Global Setup of gbs params setup_global_broadcast_params(&gbs, pps); element_set_str(gbs->gamma, gamma, PBC_CONVERT_BASE); //it is important to set user gamma here else a random value will be used //pick a random value of t from Zr element_init_Zr(t, gbs->pairing); element_random(t); element_snprint(t_str,MAX_ELEMENT_LEN,t); //compute C0=g^t element_init(CT->OC0, gbs->pairing->G1); element_pow_zn(CT->OC0, gbs->g, t); //compute C1=(g^gamma)x(g[num_users+1-j]) for j in all shared users element_init(CT->OC1, gbs->pairing->G1); element_pow_zn(CT->OC1, gbs->g, gbs->gamma); //at this step C1 = g^gamma = v as given in paper for(j=0;j<num_users;j++) element_mul(CT->OC1, CT->OC1, gbs->gs[(gbs->num_users)-shared_users[j]]); element_pow_zn(CT->OC1, CT->OC1, t); //Duplicate C0'=C0 element_init(CT->C0, gbs->pairing->G1); element_set(CT->C0,CT->OC0); //Duplicate C1'=C1 element_init(CT->C1, gbs->pairing->G1); element_set(CT->C1,CT->OC1); //COMPUTE EK = e(g[n], g[1])^(t) element_init(EK, gbs->pairing->GT); element_pairing(EK, gbs->gs[0],gbs->gs[gbs->num_users-1]); //at this step EK = e(g[1],g[n]) element_pow_zn(EK,EK,t); //EK = e(g[1],g[n])^t //free the memory for global broadcast params element_clear(t); FreeGBP(gbs); return; }