X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fd0_blind_id.git;a=blobdiff_plain;f=d0_bignum-openssl.c;h=1e103a4c725c8ca75dcf67e052544cdfdb153dd4;hp=c8316906f6b9a0b2d9327cbf852221934b6d2819;hb=17862d3aa240f8e2203dad321db501e78dec016a;hpb=0d9c60c64a7628d79882fd8ceb8d3aafc3548688 diff --git a/d0_bignum-openssl.c b/d0_bignum-openssl.c index c831690..1e103a4 100644 --- a/d0_bignum-openssl.c +++ b/d0_bignum-openssl.c @@ -46,6 +46,12 @@ #include #include +// for stupid OpenSSL versions in Mac OS X +#ifndef BN_is_negative +#define BN_is_negative(a) ((a)->neg != 0) +#define BN_set_negative(a,n) ((a)->neg = ((n) && !BN_is_zero(a))) +#endif + struct d0_bignum_s { BIGNUM z; @@ -57,7 +63,7 @@ static BN_CTX *ctx; #include #include -WARN_UNUSED_RESULT BOOL d0_bignum_INITIALIZE(void) +D0_WARN_UNUSED_RESULT D0_BOOL d0_bignum_INITIALIZE(void) { ctx = BN_CTX_new(); d0_bignum_init(&temp); @@ -71,7 +77,7 @@ void d0_bignum_SHUTDOWN(void) ctx = NULL; } -BOOL d0_iobuf_write_bignum(d0_iobuf_t *buf, const d0_bignum_t *bignum) +D0_BOOL d0_iobuf_write_bignum(d0_iobuf_t *buf, const d0_bignum_t *bignum) { static unsigned char numbuf[65536]; size_t count = 0; @@ -287,6 +293,13 @@ d0_bignum_t *d0_bignum_mod_add(d0_bignum_t *r, const d0_bignum_t *a, const d0_bi return r; } +d0_bignum_t *d0_bignum_mod_sub(d0_bignum_t *r, const d0_bignum_t *a, const d0_bignum_t *b, const d0_bignum_t *m) +{ + if(!r) r = d0_bignum_new(); if(!r) return NULL; + BN_mod_sub(&r->z, &a->z, &b->z, &m->z, ctx); + return r; +} + d0_bignum_t *d0_bignum_mod_mul(d0_bignum_t *r, const d0_bignum_t *a, const d0_bignum_t *b, const d0_bignum_t *m) { if(!r) r = d0_bignum_new(); if(!r) return NULL; @@ -301,13 +314,13 @@ d0_bignum_t *d0_bignum_mod_pow(d0_bignum_t *r, const d0_bignum_t *a, const d0_bi return r; } -BOOL d0_bignum_mod_inv(d0_bignum_t *r, const d0_bignum_t *a, const d0_bignum_t *m) +D0_BOOL d0_bignum_mod_inv(d0_bignum_t *r, const d0_bignum_t *a, const d0_bignum_t *m) { // here, r MUST be set, as otherwise we cannot return error state! return !!BN_mod_inverse(&r->z, &a->z, &m->z, ctx); } -int d0_bignum_isprime(d0_bignum_t *r, int param) +int d0_bignum_isprime(const d0_bignum_t *r, int param) { if(param <= 0) return BN_is_prime_fasttest(&r->z, 1, NULL, ctx, NULL, 1);