int cp_bgn_dec1(dig_t *out, g1_t in[2], bgn_t prv) { bn_t r, n; g1_t s, t, u; int i, result = STS_ERR; bn_null(n); bn_null(r); g1_null(s); g1_null(t); g1_null(u); TRY { bn_new(n); bn_new(r); g1_new(s); g1_new(t); g1_new(u); g1_get_ord(n); /* Compute T = x(ym + r)G - (zm + xr)G = m(xy - z)G. */ g1_mul(t, in[0], prv->x); g1_sub(t, t, in[1]); g1_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); g1_mul_gen(s, r); g1_copy(u, s); if (g1_is_infty(t) == 1){ *out = 0; result = STS_OK; } else { for (i = 0; i < INT_MAX; i++) { if (g1_cmp(t, u) == CMP_EQ) { *out = i + 1; result = STS_OK; break; } g1_add(u, u, s); g1_norm(u, u); } } } CATCH_ANY { result = STS_ERR; } FINALLY { bn_free(n); bn_free(r); g1_free(s); g1_free(t); g1_free(u); } 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; }