X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=blobdiff_plain;f=src%2Fkey.cpp;h=94a54ef9389cfca1d52015fa3eb9f349260656e3;hp=1f4253365a36d2ba6f02ee5804e051f57f05ca7f;hb=ef17ac0211ddd486127e1f94756fbb3fd704a9b4;hpb=d9a9ab764d542fe29e177ff600eff108269d0a57 diff --git a/src/key.cpp b/src/key.cpp index 1f42533..94a54ef 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -6,7 +6,6 @@ #include #include -#include #include "key.h" #include "base58.h" @@ -103,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; } @@ -331,17 +330,6 @@ CSecret CKey::GetSecret(bool &fCompressed) const return vchRet; } -bool CKey::WritePEM(BIO *streamObj, const SecureString &strPassKey) const // dumppem 4KJLA99FyqMMhjjDe7KnRXK4sjtv9cCtNS /tmp/test.pem 123 -{ - EVP_PKEY *evpKey = EVP_PKEY_new(); - if (!EVP_PKEY_assign_EC_KEY(evpKey, pkey)) - return error("CKey::WritePEM() : Error initializing EVP_PKEY instance."); - if(!PEM_write_bio_PKCS8PrivateKey(streamObj, evpKey, EVP_aes_256_cbc(), (char *)&strPassKey[0], strPassKey.size(), NULL, NULL)) - return error("CKey::WritePEM() : Error writing private key data to stream object"); - - return true; -} - CSecret CKey::GetSecret() const { bool fCompressed; @@ -379,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]; @@ -419,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)); @@ -466,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; } @@ -482,7 +478,7 @@ bool CPubKey::SetCompactSignature(uint256 hash, const std::vector if (nV<27 || nV>=35) return false; ECDSA_SIG *sig = ECDSA_SIG_new(); - BIGNUM *sig_r, *sig_s; + BIGNUM *sig_r = BN_new(), *sig_s = BN_new(); BN_bin2bn(&vchSig[1],32,sig_r); BN_bin2bn(&vchSig[33],32,sig_s); ECDSA_SIG_set0(sig, sig_r, sig_s); @@ -654,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 @@ -709,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; @@ -1216,65 +1209,3 @@ bool CMalleableKeyView::IsValid() const { return vchSecretL.size() == 32 && GetMalleablePubKey().IsValid(); } - -//// Asymmetric encryption - -void CPubKey::EncryptData(const std::vector& data, std::vector& encrypted) -{ - ies_ctx_t *ctx; - char error[1024] = "Unknown error"; - cryptogram_t *cryptogram; - - const unsigned char* pbegin = &vbytes[0]; - EC_KEY *pkey = EC_KEY_new_by_curve_name(NID_secp256k1); - if (!o2i_ECPublicKey(&pkey, &pbegin, size())) - throw key_error("Unable to parse EC key"); - - ctx = create_context(pkey); - if (!EC_KEY_get0_public_key(ctx->user_key)) - throw key_error("Given EC key is not public key"); - - cryptogram = ecies_encrypt(ctx, (unsigned char*)&data[0], data.size(), error); - if (cryptogram == NULL) { - delete ctx; - ctx = NULL; - throw key_error(std::string("Error in encryption: %s") + error); - } - - encrypted.resize(cryptogram_data_sum_length(cryptogram)); - unsigned char *key_data = cryptogram_key_data(cryptogram); - memcpy(&encrypted[0], key_data, encrypted.size()); - cryptogram_free(cryptogram); - delete ctx; -} - -void CKey::DecryptData(const std::vector& encrypted, std::vector& data) -{ - ies_ctx_t *ctx; - char error[1024] = "Unknown error"; - cryptogram_t *cryptogram; - size_t length; - unsigned char *decrypted; - - ctx = create_context(pkey); - if (!EC_KEY_get0_private_key(ctx->user_key)) - throw key_error("Given EC key is not private key"); - - size_t key_length = ctx->stored_key_length; - size_t mac_length = EVP_MD_size(ctx->md); - cryptogram = cryptogram_alloc(key_length, mac_length, encrypted.size() - key_length - mac_length); - - memcpy(cryptogram_key_data(cryptogram), &encrypted[0], encrypted.size()); - - decrypted = ecies_decrypt(ctx, cryptogram, &length, error); - cryptogram_free(cryptogram); - delete ctx; - - if (decrypted == NULL) { - throw key_error(std::string("Error in decryption: %s") + error); - } - - data.resize(length); - memcpy(&data[0], decrypted, length); - free(decrypted); -}