int cp_psb_gen(bn_t r, bn_t s[], g2_t g, g2_t x, g2_t y[], int l) { bn_t n; int i, result = RLC_OK; bn_null(n); TRY { bn_new(n); g2_get_ord(n); bn_rand_mod(r, n); g2_rand(g); g2_mul(x, g, r); for (i = 0; i < l; i++) { bn_rand_mod(s[i], n); g2_mul(y[i], g, s[i]); } } CATCH_ANY { result = RLC_ERR; } FINALLY { bn_free(n); } return result; }
int cp_bgn_dec2(dig_t *out, g2_t in[2], bgn_t prv) { bn_t r, n; g2_t s, t, u; int i, result = STS_ERR; bn_null(n); bn_null(r); g2_null(s); g2_null(t); g2_null(u); TRY { bn_new(n); bn_new(r); g2_new(s); g2_new(t); g2_new(u); g2_get_ord(n); /* Compute T = x(ym + r)G - (zm + xr)G = m(xy - z)G. */ g2_mul(t, in[0], prv->x); g2_sub(t, t, in[1]); g2_norm(t, t); /* Compute U = (xy - z)G and find m. */ bn_mul(r, prv->x, prv->y); bn_sub(r, r, prv->z); bn_mod(r, r, n); g2_mul_gen(s, r); g2_copy(u, s); if (g2_is_infty(t) == 1) { *out = 0; result = STS_OK; } else { for (i = 0; i < INT_MAX; i++) { if (g2_cmp(t, u) == CMP_EQ) { *out = i + 1; result = STS_OK; break; } g2_add(u, u, s); g2_norm(u, u); } } } CATCH_ANY { result = STS_ERR; } FINALLY { bn_free(n); bn_free(r); g2_free(s); g2_free(t); g2_free(u); } return result; }
status_t element_init_G2(element_t e) { g2_inits(e->g2); g2_set_infty(e->g2); bn_inits(e->order); g2_get_ord(e->order); e->isInitialized = TRUE; e->type = G2; return ELEMENT_OK; }
int cp_bbs_ver(g1_t s, uint8_t *msg, int len, int hash, g2_t q, gt_t z) { bn_t m, n; g2_t g; gt_t e; uint8_t h[MD_LEN]; int result = 0; bn_null(m); bn_null(n); g2_null(g); gt_null(e); TRY { bn_new(m); bn_new(n); g2_new(g); gt_new(e); g2_get_ord(n); /* m = H(msg). */ if (hash) { bn_read_bin(m, msg, len); } else { md_map(h, msg, len); bn_read_bin(m, h, MD_LEN); } bn_mod(m, m, n); g2_mul_gen(g, m); g2_add(g, g, q); g2_norm(g, g); pc_map(e, s, g); if (gt_cmp(e, z) == CMP_EQ) { result = 1; } } CATCH_ANY { THROW(ERR_CAUGHT); } FINALLY { bn_free(m); bn_free(n); g2_free(g); gt_free(e); } return result; }
int cp_bls_gen(bn_t d, g2_t q) { bn_t n; int result = STS_OK; bn_null(n); TRY { bn_new(n); g2_get_ord(n); bn_rand_mod(d, n); g2_mul_gen(q, d); } CATCH_ANY { result = STS_ERR; } FINALLY { bn_free(n); } return result; }
int cp_bgn_enc2(g2_t out[2], dig_t in, bgn_t pub) { bn_t r, n; g2_t t; int result = STS_OK; bn_null(n); bn_null(r); g2_null(t); TRY { bn_new(n); bn_new(r); g2_new(t); g2_get_ord(n); bn_rand_mod(r, n); /* Compute c0 = (ym + r)G. */ g2_mul_dig(out[0], pub->hy, in); g2_mul_gen(t, r); g2_add(out[0], out[0], t); g2_norm(out[0], out[0]); /* Compute c1 = (zm + xr)G. */ g2_mul_dig(out[1], pub->hz, in); g2_mul(t, pub->hx, r); g2_add(out[1], out[1], t); g2_norm(out[1], out[1]); } CATCH_ANY { result = STS_ERR; } FINALLY { bn_free(n); bn_free(r); g2_free(t); } return result; }
int cp_bbs_gen(bn_t d, g2_t q, gt_t z) { bn_t n; g1_t g; int result = STS_OK; bn_null(n); g1_null(g); TRY { bn_new(n); g1_new(g); g1_get_gen(g); g2_get_gen(q); /* z = e(g1, g2). */ pc_map(z, g, q); g2_get_ord(n); do { bn_rand(d, BN_POS, 2 * pc_param_level()); bn_mod(d, d, n); } while (bn_is_zero(d)); /* q = d * g2. */ g2_mul_gen(q, d); g2_norm(q, q); } CATCH_ANY { result = STS_ERR; } FINALLY { bn_free(n); g1_free(g); } return result; }
int cp_pss_gen(bn_t r, bn_t s, g2_t g, g2_t x, g2_t y) { bn_t n; int result = RLC_OK; bn_null(n); TRY { bn_new(n); g2_get_ord(n); bn_rand_mod(r, n); bn_rand_mod(s, n); g2_rand(g); g2_mul(x, g, r); g2_mul(y, g, s); } CATCH_ANY { result = RLC_ERR; } FINALLY { bn_free(n); } return result; }