|
|
|
@ -13,6 +13,29 @@
@@ -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:
@@ -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]) {
@@ -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; |
|
|
|
|
} |
|
|
|
|