int cp_pss_sig(g1_t a, g1_t b, uint8_t *msg, int len, bn_t r, bn_t s) { bn_t m, n; int result = RLC_OK; bn_null(m); bn_null(n); TRY { bn_new(m); bn_new(n); g1_get_ord(n); bn_read_bin(m, msg, len); bn_mul(m, m, s); bn_mod(m, m, n); bn_add(m, m, r); bn_mod(m, m, n); g1_rand(a); g1_mul(b, a, m); } CATCH_ANY { result = RLC_ERR; } FINALLY { bn_free(m); bn_free(n); } return result; }
status_t element_random(element_t e) { if(e->isInitialized == TRUE) { if(e->type == ZR) { bn_t n; bn_inits(n); g1_get_ord(n); bn_t t = e->bn; bn_rand(t, BN_POS, bn_bits(n)); bn_mod(t, t, n); bn_free(n); } else if(e->type == G1) { g1_rand(e->g1); } else if(e->type == G2) { g2_rand(e->g2); } else if(e->type == GT) { gt_rand(e->gt); } return ELEMENT_OK; } return ELEMENT_UNINITIALIZED; }
int cp_psb_sig(g1_t a, g1_t b, uint8_t *msgs[], int lens[], bn_t r, bn_t s[], int l) { bn_t m, n, t; int i, result = RLC_OK; bn_null(m); bn_null(n); bn_null(t); TRY { bn_new(m); bn_new(n); bn_new(t); /* Choose random a in G1. */ g1_rand(a); /* Compute b = a^x+\sum y_im_i. */ g1_get_ord(n); bn_copy(t, r); for (i = 0; i < l; i++) { bn_read_bin(m, msgs[i], lens[i]); bn_mod(m, m, n); bn_mul(m, m, s[i]); bn_mod(m, m, n); bn_add(t, t, m); bn_mod(t, t, n); } g1_mul(b, a, t); } CATCH_ANY { result = RLC_ERR; } FINALLY { bn_free(m); bn_free(n); bn_free(t); } return result; }