consensus: cache the openssl EC_GROUP to avoid a race condition for each CECKey instantiation
This commit is contained in:
parent
87f37e259d
commit
1d1073c2d3
1 changed files with 28 additions and 5 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue