X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=blobdiff_plain;f=src%2Fkey.cpp;h=94a54ef9389cfca1d52015fa3eb9f349260656e3;hp=53eea7152214738b99f0a116ae024a4099091008;hb=ef17ac0211ddd486127e1f94756fbb3fd704a9b4;hpb=bc0753c369cbf499e990541e723f737c62559803 diff --git a/src/key.cpp b/src/key.cpp index 53eea71..94a54ef 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -102,7 +102,7 @@ int ECDSA_SIG_recover_key_GFp(EC_KEY *eckey, ECDSA_SIG *ecsig, const unsigned ch if (!BN_bin2bn(msg, msglen, e)) { ret=-1; goto err; } if (8*msglen > n) BN_rshift(e, e, 8-(n & 7)); zero = BN_CTX_get(ctx); - BN_zero(zero); + if (!BN_set_word(zero, 0)) { ret=-1; goto err; } if (!BN_mod_sub(e, zero, e, order, ctx)) { ret=-1; goto err; } rr = BN_CTX_get(ctx); if (!BN_mod_inverse(rr, ecsig_r, order, ctx)) { ret=-1; goto err; } @@ -367,21 +367,25 @@ bool CKey::Sign(uint256 hash, std::vector& vchSig) if (sig==NULL) return false; const EC_GROUP *group = EC_KEY_get0_group(pkey); - CBigNum order, halforder; - EC_GROUP_get_order(group, order.get(), NULL); - BN_rshift1(halforder.get(), order.get()); + + BIGNUM* order = BN_new(), *halforder = BN_new(); + EC_GROUP_get_order(group, order, NULL); + BN_rshift1(halforder, order); // Get internal R and S pointers const BIGNUM *current_s = ECDSA_SIG_get0_s(sig); // enforce low S values, by negating the value (modulo the order) if above order/2. - if (BN_cmp(current_s, halforder.get()) > 0) { + if (BN_cmp(current_s, halforder) > 0) { BIGNUM *updated_s = BN_new(); BN_copy(updated_s, current_s); - BN_sub(updated_s, order.get(), updated_s); + BN_sub(updated_s, order, updated_s); ECDSA_SIG_set0(sig, NULL, updated_s); } + BN_free(order); + BN_free(halforder); + unsigned int nSize = ECDSA_size(pkey); vchSig.resize(nSize); // Make sure it is big enough unsigned char *pos = &vchSig[0]; @@ -407,21 +411,24 @@ bool CKey::SignCompact(uint256 hash, std::vector& vchSig) if (sig==NULL) return false; const EC_GROUP *group = EC_KEY_get0_group(pkey); - CBigNum order, halforder; - EC_GROUP_get_order(group, order.get(), NULL); - BN_rshift1(halforder.get(), order.get()); + BIGNUM* order = BN_new(), *halforder = BN_new(); + EC_GROUP_get_order(group, order, NULL); + BN_rshift1(halforder, order); // Get internal R and S pointers const BIGNUM *current_s = ECDSA_SIG_get0_s(sig); // enforce low S values, by negating the value (modulo the order) if above order/2. - if (BN_cmp(current_s, halforder.get()) > 0) { + if (BN_cmp(current_s, halforder) > 0) { BIGNUM *updated_s = BN_new(); BN_copy(updated_s, current_s); - BN_sub(updated_s, order.get(), updated_s); + BN_sub(updated_s, order, updated_s); ECDSA_SIG_set0(sig, NULL, updated_s); } + BN_free(order); + BN_free(halforder); + vchSig.clear(); vchSig.resize(65,0); int nBitsR = BN_num_bits(ECDSA_SIG_get0_r(sig)); @@ -454,6 +461,7 @@ bool CKey::SignCompact(uint256 hash, std::vector& vchSig) BN_bn2bin(ECDSA_SIG_get0_s(sig),&vchSig[65-(nBitsS+7)/8]); fOk = true; } + ECDSA_SIG_free(sig); return fOk; } @@ -642,23 +650,21 @@ bool CPoint::getBytes(std::vector &vchBytes) // ECC multiplication by specified multiplier bool CPoint::ECMUL(const CBigNum &bnMultiplier) { - if (!EC_POINT_mul(group, point, NULL, point, bnMultiplier.get(), NULL)) { - printf("CPoint::ECMUL() : EC_POINT_mul failed"); - return false; - } - - return true; + BIGNUM* bnMul = bnMultiplier.get(); + bool ok = EC_POINT_mul(group, point, NULL, point, bnMul, NULL); + if (!ok) printf("CPoint::ECMUL() : EC_POINT_mul failed"); + BN_free(bnMul); + return ok; } // Calculate G*m + q bool CPoint::ECMULGEN(const CBigNum &bnMultiplier, const CPoint &qPoint) { - if (!EC_POINT_mul(group, point, bnMultiplier.get(), qPoint.point, BN_value_one(), NULL)) { - printf("CPoint::ECMULGEN() : EC_POINT_mul failed."); - return false; - } - - return true; + BIGNUM* bnMul = bnMultiplier.get(); + bool ok = EC_POINT_mul(group, point, bnMul, qPoint.point, BN_value_one(), NULL); + if (!ok) printf("CPoint::ECMULGEN() : EC_POINT_mul failed."); + BN_free(bnMul); + return ok; } // CMalleablePubKey @@ -697,8 +703,7 @@ void CMalleablePubKey::GetVariant(CPubKey &R, CPubKey &vchPubKeyVariant) R = CPubKey(vchPubKey); // OpenSSL BIGNUM representation of r value - CBigNum bnr; - bnr = *(CBigNum*) EC_KEY_get0_private_key(eckey); + CBigNum bnr(EC_KEY_get0_private_key(eckey)); EC_KEY_free(eckey); CPoint point;