]> git.xonotic.org Git - xonotic/d0_blind_id.git/blobdiff - d0_bignum-openssl.c
version 0.3: allow variable length for sign data buffer
[xonotic/d0_blind_id.git] / d0_bignum-openssl.c
index b4fc8732718c194d3b2aeec76c271642139749c7..1e103a4c725c8ca75dcf67e052544cdfdb153dd4 100644 (file)
 #include <string.h>
 #include <openssl/bn.h>
 
+// 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;
@@ -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;
@@ -307,7 +320,7 @@ D0_BOOL d0_bignum_mod_inv(d0_bignum_t *r, const d0_bignum_t *a, const d0_bignum_
        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);