aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCory Fields <cory-nospam-@coryfields.com>2015-08-18 00:54:19 -0400
committerWladimir J. van der Laan <laanwj@gmail.com>2015-08-20 16:37:50 +0200
commit100ac4e185545c3924869227e271641f0484db0f (patch)
treed7fb0060b57468f7c1d9e595ead7cb0893ef3a93 /src
parent93b606aee41c3ff37980e73e8dc1c6c06f3b11f9 (diff)
downloadbitcoin-100ac4e185545c3924869227e271641f0484db0f.tar.xz
consensus: cache the openssl EC_GROUP to avoid a race condition for each CECKey instantiation
Github-Pull: #6571 Rebased-From: 1d1073c2d3231a9de4adbc2bc46846fc20b34f9e
Diffstat (limited to 'src')
-rw-r--r--src/ecwrapper.cpp33
1 files changed, 28 insertions, 5 deletions
diff --git a/src/ecwrapper.cpp b/src/ecwrapper.cpp
index 5e3aec25ba..f94bc954fd 100644
--- a/src/ecwrapper.cpp
+++ b/src/ecwrapper.cpp
@@ -13,6 +13,29 @@
namespace {
+class ecgroup_order
+{
+public:
+ static const EC_GROUP* get()
+ {
+ static const ecgroup_order wrapper;
+ return wrapper.pgroup;
+ }
+
+private:
+ ecgroup_order()
+ : pgroup(EC_GROUP_new_by_curve_name(NID_secp256k1))
+ {
+ }
+
+ ~ecgroup_order()
+ {
+ EC_GROUP_free(pgroup);
+ }
+
+ EC_GROUP* pgroup;
+};
+
/**
* Perform ECDSA key recovery (see SEC1 4.1.6) for curves over (mod p)-fields
* recid selects which key is recovered
@@ -92,8 +115,10 @@ err:
} // anon namespace
CECKey::CECKey() {
- pkey = EC_KEY_new_by_curve_name(NID_secp256k1);
+ pkey = EC_KEY_new();
assert(pkey != NULL);
+ int result = EC_KEY_set_group(pkey, ecgroup_order::get());
+ assert(result);
}
CECKey::~CECKey() {
@@ -185,11 +210,9 @@ bool CECKey::TweakPublic(const unsigned char vchTweak[32]) {
bool CECKey::SanityCheck()
{
- EC_KEY *pkey = EC_KEY_new_by_curve_name(NID_secp256k1);
- if(pkey == NULL)
+ const EC_GROUP *pgroup = ecgroup_order::get();
+ if(pgroup == NULL)
return false;
- EC_KEY_free(pkey);
-
// TODO Is there more EC functionality that could be missing?
return true;
}