Browse Source
consensus: cache the openssl EC_GROUP to avoid a race condition for each CECKey instantiation
Github-Pull: #6571
Rebased-From: 1d1073c2d3231a9de4adbc2bc46846fc20b34f9e
pull/145/head
Cory Fields
9 years ago
committed by
Wladimir J. van der Laan
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
1 changed files with
28 additions and
5 deletions
-
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; |
|
|
|
} |
|
|
|