Remove OpenSSL bignum implementation

This commit is contained in:
Pieter Wuille
2014-10-29 07:47:28 -07:00
parent 9c698f16d6
commit 520ba3c921
7 changed files with 12 additions and 323 deletions

View File

@@ -11,8 +11,6 @@
#if defined(USE_NUM_GMP)
#include "num_gmp.h"
#elif defined(USE_NUM_OPENSSL)
#include "num_openssl.h"
#else
#error "Please select num implementation"
#endif

View File

@@ -13,8 +13,6 @@
#if defined(USE_NUM_GMP)
#include "num_gmp_impl.h"
#elif defined(USE_NUM_OPENSSL)
#include "num_openssl_impl.h"
#else
#error "Please select num implementation"
#endif

View File

@@ -1,17 +0,0 @@
// Copyright (c) 2013 Pieter Wuille
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef _SECP256K1_NUM_REPR_
#define _SECP256K1_NUM_REPR_
#include <openssl/bn.h>
typedef struct {
BIGNUM bn;
#ifdef VERIFY
void* init;
#endif
} secp256k1_num_t;
#endif

View File

@@ -1,263 +0,0 @@
// Copyright (c) 2013 Pieter Wuille
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef _SECP256K1_NUM_REPR_IMPL_H_
#define _SECP256K1_NUM_REPR_IMPL_H_
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/bn.h>
#include <openssl/crypto.h>
#include "util.h"
#include "num.h"
void static secp256k1_num_init(secp256k1_num_t *r) {
#ifdef VERIFY
r->init = r;
#endif
BN_init(&r->bn);
}
void static secp256k1_num_free(secp256k1_num_t *r) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
r->init = NULL;
#endif
BN_free(&r->bn);
}
void static secp256k1_num_clear(secp256k1_num_t *r) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
#endif
BN_clear(&r->bn);
}
void static secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
VERIFY_CHECK(a->init == a);
#endif
BN_copy(&r->bn, &a->bn);
}
void static secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num_t *a) {
#ifdef VERIFY
VERIFY_CHECK(a->init == a);
#endif
unsigned int size = BN_num_bytes(&a->bn);
VERIFY_CHECK(size <= rlen);
memset(r,0,rlen);
BN_bn2bin(&a->bn, r + rlen - size);
}
void static secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, unsigned int alen) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
#endif
BN_bin2bn(a, alen, &r->bn);
}
void static secp256k1_num_set_int(secp256k1_num_t *r, int a) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
#endif
BN_set_word(&r->bn, a < 0 ? -a : a);
BN_set_negative(&r->bn, a < 0);
}
void static secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
VERIFY_CHECK(a->init == a);
VERIFY_CHECK(m->init == m);
#endif
BN_CTX *ctx = BN_CTX_new();
BN_mod_inverse(&r->bn, &a->bn, &m->bn, ctx);
BN_CTX_free(ctx);
}
void static secp256k1_num_mod_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b, const secp256k1_num_t *m) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
VERIFY_CHECK(a->init == a);
VERIFY_CHECK(b->init == b);
VERIFY_CHECK(m->init == m);
#endif
BN_CTX *ctx = BN_CTX_new();
BN_mod_mul(&r->bn, &a->bn, &b->bn, &m->bn, ctx);
BN_CTX_free(ctx);
}
int static secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b) {
#ifdef VERIFY
VERIFY_CHECK(a->init == a);
VERIFY_CHECK(b->init == b);
#endif
return BN_ucmp(&a->bn, &b->bn);
}
int static secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b) {
#ifdef VERIFY
VERIFY_CHECK(a->init == a);
VERIFY_CHECK(b->init == b);
#endif
return BN_cmp(&a->bn, &b->bn) == 0;
}
void static secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
VERIFY_CHECK(a->init == a);
VERIFY_CHECK(b->init == b);
#endif
BN_add(&r->bn, &a->bn, &b->bn);
}
void static secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
VERIFY_CHECK(a->init == a);
VERIFY_CHECK(b->init == b);
#endif
BN_sub(&r->bn, &a->bn, &b->bn);
}
void static secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
VERIFY_CHECK(a->init == a);
VERIFY_CHECK(b->init == b);
#endif
BN_CTX *ctx = BN_CTX_new();
BN_mul(&r->bn, &a->bn, &b->bn, ctx);
BN_CTX_free(ctx);
}
void static secp256k1_num_div(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
VERIFY_CHECK(a->init == a);
VERIFY_CHECK(b->init == b);
#endif
BN_CTX *ctx = BN_CTX_new();
BN_div(&r->bn, NULL, &a->bn, &b->bn, ctx);
BN_CTX_free(ctx);
}
void static secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
VERIFY_CHECK(m->init == m);
#endif
BN_CTX *ctx = BN_CTX_new();
BN_nnmod(&r->bn, &r->bn, &m->bn, ctx);
BN_CTX_free(ctx);
}
int static secp256k1_num_bits(const secp256k1_num_t *a) {
#ifdef VERIFY
VERIFY_CHECK(a->init == a);
#endif
return BN_num_bits(&a->bn);
}
int static secp256k1_num_shift(secp256k1_num_t *r, int bits) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
#endif
int ret = BN_is_zero(&r->bn) ? 0 : r->bn.d[0] & ((1 << bits) - 1);
BN_rshift(&r->bn, &r->bn, bits);
return ret;
}
int static secp256k1_num_is_zero(const secp256k1_num_t *a) {
#ifdef VERIFY
VERIFY_CHECK(a->init == a);
#endif
return BN_is_zero(&a->bn);
}
int static secp256k1_num_is_odd(const secp256k1_num_t *a) {
#ifdef VERIFY
VERIFY_CHECK(a->init == a);
#endif
return BN_is_odd(&a->bn);
}
int static secp256k1_num_is_neg(const secp256k1_num_t *a) {
#ifdef VERIFY
VERIFY_CHECK(a->init == a);
#endif
return BN_is_negative(&a->bn);
}
int static secp256k1_num_get_bit(const secp256k1_num_t *a, int pos) {
#ifdef VERIFY
VERIFY_CHECK(a->init == a);
#endif
return BN_is_bit_set(&a->bn, pos);
}
void static secp256k1_num_inc(secp256k1_num_t *r) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
#endif
BN_add_word(&r->bn, 1);
}
void static secp256k1_num_set_hex(secp256k1_num_t *r, const char *a, int alen) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
#endif
char *str = (char*)malloc(alen+1);
memcpy(str, a, alen);
str[alen] = 0;
BIGNUM *pbn = &r->bn;
BN_hex2bn(&pbn, str);
free(str);
}
void static secp256k1_num_get_hex(char *r, int rlen, const secp256k1_num_t *a) {
#ifdef VERIFY
VERIFY_CHECK(a->init == a);
#endif
char *str = BN_bn2hex(&a->bn);
int len = strlen(str);
VERIFY_CHECK(rlen >= len);
for (int i=0; i<rlen-len; i++)
r[i] = '0';
memcpy(r+rlen-len, str, len);
OPENSSL_free(str);
}
void static secp256k1_num_split(secp256k1_num_t *rl, secp256k1_num_t *rh, const secp256k1_num_t *a, int bits) {
#ifdef VERIFY
VERIFY_CHECK(a->init == a);
VERIFY_CHECK(rl->init == rl);
VERIFY_CHECK(rh->init == rh);
#endif
BN_copy(&rl->bn, &a->bn);
BN_rshift(&rh->bn, &a->bn, bits);
BN_mask_bits(&rl->bn, bits);
}
void static secp256k1_num_negate(secp256k1_num_t *r) {
#ifdef VERIFY
VERIFY_CHECK(r->init == r);
#endif
BN_set_negative(&r->bn, !BN_is_negative(&r->bn));
}
int static secp256k1_num_get_bits(const secp256k1_num_t *a, int offset, int count) {
int ret = 0;
for (int i = 0; i < count; i++) {
ret |= BN_is_bit_set(&a->bn, offset + i) << i;
}
return ret;
}
#endif