* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Format:commit %H$, $Id$
+ * $Format:commit %H$
+ * $Id$
*/
/* NOTE: this file links against openssl (http://www.openssl.org), which is
#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;
#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);
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;
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;
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)
{
- return BN_is_prime(&r->z, param, NULL, ctx, NULL);
+ if(param <= 0)
+ return BN_is_prime_fasttest(&r->z, 1, NULL, ctx, NULL, 1);
+ else
+ return BN_is_prime(&r->z, param, NULL, ctx, NULL);
}
d0_bignum_t *d0_bignum_gcd(d0_bignum_t *r, d0_bignum_t *s, d0_bignum_t *t, const d0_bignum_t *a, const d0_bignum_t *b)