]> de.git.xonotic.org Git - xonotic/d0_blind_id.git/blobdiff - d0_bignum-openssl.c
also support signing
[xonotic/d0_blind_id.git] / d0_bignum-openssl.c
index c8316906f6b9a0b2d9327cbf852221934b6d2819..0830ab23369333cbbf88b7ad7e86fa51f37cec7d 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;
@@ -57,7 +63,7 @@ static BN_CTX *ctx;
 #include <time.h>
 #include <stdio.h>
 
-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,7 +314,7 @@ 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);