X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fbignum.h;h=6ab5a6d4cd55e9d3d5d0e431be8fa1d277343457;hb=dba17cd539033f9e051e023cc4617991ac722c44;hp=f1ec8d4368fbe873c7344e3bf9061b0cb1668abc;hpb=d9a9ab764d542fe29e177ff600eff108269d0a57;p=novacoin.git diff --git a/src/bignum.h b/src/bignum.h index f1ec8d4..6ab5a6d 100644 --- a/src/bignum.h +++ b/src/bignum.h @@ -59,26 +59,41 @@ public: CBigNum(const CBigNum& b) { - bn = BN_new(); - if (!BN_copy(bn, b.bn)) + BIGNUM *dup = BN_dup(b.bn); + if (!dup) { - BN_clear_free(bn); - throw bignum_error("CBigNum::CBigNum(const CBigNum&) : BN_copy failed"); + throw bignum_error("CBigNum::CBigNum(const CBigNum&) : BN_dup failed"); } + bn = dup; } CBigNum& operator=(const CBigNum& b) { - if (!BN_copy(bn, b.bn)) - throw bignum_error("CBigNum::operator= : BN_copy failed"); + BIGNUM *dup = BN_dup(b.bn); + if (!dup) + { + throw bignum_error("CBigNum::operator= : BN_dup failed"); + } + bn = dup; return (*this); } + CBigNum(const BIGNUM *bnp) { + BIGNUM *dup = BN_dup(bnp); + if (!dup) + { + throw bignum_error("CBigNum::CBigNum(const BIGNUM*) : BN_dup failed"); + } + bn = dup; + } + ~CBigNum() { BN_clear_free(bn); } + CBigNum(bool n) { bn = BN_new(); setuint32(n); } + CBigNum(int8_t n) { bn = BN_new(); if (n >= 0) setuint32(n); else setint64(n); } CBigNum(int16_t n) { bn = BN_new(); if (n >= 0) setuint32(n); else setint64(n); } CBigNum(int32_t n) { bn = BN_new(); if (n >= 0) setuint32(n); else setint64(n); } @@ -465,7 +480,7 @@ public: } BIGNUM* get() const { - return bn; + return BN_dup(bn); } unsigned int GetSerializeSize(int nType=0, int nVersion=PROTOCOL_VERSION) const @@ -592,7 +607,7 @@ public: */ bool isPrime(const int checks=BN_prime_checks) const { CAutoBN_CTX pctx; - int ret = BN_is_prime(bn, checks, NULL, pctx, NULL); + int ret = BN_is_prime_ex(bn, checks, pctx, NULL); if(ret < 0){ throw bignum_error("CBigNum::isPrime :BN_is_prime"); } @@ -705,9 +720,7 @@ public: friend inline const CBigNum operator/(const CBigNum& a, const CBigNum& b); friend inline const CBigNum operator%(const CBigNum& a, const CBigNum& b); friend inline const CBigNum operator*(const CBigNum& a, const CBigNum& b); - friend inline bool operator<(const CBigNum& a, const CBigNum& b); friend inline const CBigNum operator+(const CBigNum& a, const CBigNum& b); - friend inline const CBigNum operator-(const CBigNum& a, const CBigNum& b); friend inline const CBigNum operator*(const CBigNum& a); friend inline const CBigNum operator-(const CBigNum& a);