|
|
|
@ -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;
|
|
|
|
|
}
|
|
|
|
|