+ element_t aid[skcount + ctxt->sharecount];
+ element_t* beta[skcount + ctxt->sharecount];
+ for (size_t i = 0; i < skcount; ++i) {
+ beta[i] = (element_t*)calloc(1, sizeof(element_t));
+ element_init_GT(*(beta[i]), param->pairing);
+ element_init_Zr(aid[i], param->pairing);
+ element_set(aid[i], sk[i]->aid);
+ pairing_apply(*(beta[i]), ctxt->s, sk[i]->d, param->pairing);
+ }
+ for (size_t i = 0; i < ctxt->sharecount; ++i) {
+ beta[skcount+i] = (element_t*)calloc(1, sizeof(element_t));
+ element_init_GT(*(beta[skcount+i]), param->pairing);
+ element_init_Zr(aid[skcount+i], param->pairing);
+ element_set(aid[skcount+i], ctxt->shares[i].aid);
+
+ element_set1(innerp);
+ for (size_t j = 0; j < sk[0]->dimension; ++j) {
+ element_pow_zn(hy, h, y[j]);
+ element_printf("%B %B\n", ctxt->shares[i].cx[j], hy);
+ pairing_apply(tmp, ctxt->shares[i].cx[j], hy, param->pairing);
+ element_mul(innerp, innerp, tmp);
+ }
+ element_mul(*(beta[skcount+i]), ctxt->shares[i].c, innerp);
+ }
+
+ element_t recover[1];
+ dipe_ss_recover(param, skcount + ctxt->sharecount, aid, 1, beta, recover);
+ element_set(ptxt, recover[0]);
+ element_clear(recover[0]);
+