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 element_cmp(element_t a, element_t b) { GroupType type = a->type; LEAVE_IF(a->isInitialized != TRUE || b->isInitialized != TRUE, "uninitialized argument."); EXIT_IF_NOT_SAME(a, b); switch(type) { case ZR: return bn_cmp(a->bn, b->bn); case G1: return g1_cmp(a->g1, b->g1); case G2: return g2_cmp(a->g2, b->g2); case GT: return gt_cmp(a->gt, b->gt); default: break; } return ELEMENT_INVALID_TYPES; }
int cp_bls_ver(g1_t s, uint8_t *msg, int len, g2_t q) { g1_t p; g2_t g; gt_t e1, e2; int result = 0; g1_null(p); g2_null(g); gt_null(e1); gt_null(e2); TRY { g1_new(p); g2_new(g); gt_new(e1); gt_new(e2); g2_get_gen(g); g1_map(p, msg, len); pc_map(e1, p, q); pc_map(e2, s, g); if (gt_cmp(e1, e2) == CMP_EQ) { result = 1; } } CATCH_ANY { THROW(ERR_CAUGHT); } FINALLY { g1_free(p); g2_free(g); gt_free(e1); gt_free(e2); } return result; }
int cp_bgn_dec(dig_t *out, gt_t in[4], bgn_t prv) { int i, result = STS_ERR; g1_t g; g2_t h; gt_t t[4]; bn_t n, r, s; bn_null(n); bn_null(r); bn_null(s); g1_null(g); g2_null(h); TRY { bn_new(n); bn_new(r); bn_new(s); g1_new(g); g2_new(h); for (i = 0; i < 4; i++) { gt_null(t[i]); gt_new(t[i]); } gt_exp(t[0], in[0], prv->x); gt_exp(t[0], t[0], prv->x); gt_mul(t[1], in[1], in[2]); gt_exp(t[1], t[1], prv->x); gt_inv(t[1], t[1]); gt_mul(t[3], in[3], t[1]); gt_mul(t[3], t[3], t[0]); gt_get_ord(n); g1_get_gen(g); g2_get_gen(h); bn_mul(r, prv->x, prv->y); bn_sqr(r, r); bn_mul(s, prv->x, prv->y); bn_mul(s, s, prv->z); bn_sub(r, r, s); bn_sub(r, r, s); bn_sqr(s, prv->z); bn_add(r, r, s); bn_mod(r, r, n); pc_map(t[1], g, h); gt_exp(t[1], t[1], r); gt_copy(t[2], t[1]); if (gt_is_unity(t[3]) == 1) { *out = 0; result = STS_OK; } else { for (i = 0; i < INT_MAX; i++) { if (gt_cmp(t[2], t[3]) == CMP_EQ) { *out = i + 1; result = STS_OK; break; } gt_mul(t[2], t[2], t[1]); } } } CATCH_ANY { result = STS_ERR; } FINALLY { bn_free(n); bn_free(r); bn_free(s); g1_free(g); g2_free(h); for (i = 0; i < 4; i++) { gt_free(t[i]); } } return result; }