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)
{
- bn = BN_new();
- if (!BN_copy(bn, b.bn)) {
- BN_clear_free(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); }
}
BIGNUM* get() const {
- return bn;
+ return BN_dup(bn);
}
unsigned int GetSerializeSize(int nType=0, int nVersion=PROTOCOL_VERSION) const
*/
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");
}