Skip to content

Commit

Permalink
PKey, refactor: refactor ECCKey, separate Ed25519Key.
Browse files Browse the repository at this point in the history
  • Loading branch information
xicilion committed Jan 28, 2023
1 parent 81a93fd commit 39f899e
Show file tree
Hide file tree
Showing 16 changed files with 294 additions and 162 deletions.
23 changes: 0 additions & 23 deletions fibjs/include/ifs/ECCKey.h
Expand Up @@ -30,7 +30,6 @@ class ECCKey_base : public PKey_base {
virtual result_t get_curve(exlib::string& retVal) = 0;
static result_t recover(Buffer_base* data, Buffer_base* sig, obj_ptr<ECCKey_base>& retVal, AsyncEvent* ac);
static result_t aggregateSignatures(v8::Local<v8::Array> sigs, obj_ptr<Buffer_base>& retVal);
virtual result_t toX25519(obj_ptr<ECCKey_base>& retVal, AsyncEvent* ac) = 0;
virtual result_t computeSecret(ECCKey_base* publicKey, obj_ptr<Buffer_base>& retVal, AsyncEvent* ac) = 0;

public:
Expand All @@ -42,12 +41,10 @@ class ECCKey_base : public PKey_base {
static void s_get_curve(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& args);
static void s_static_recover(const v8::FunctionCallbackInfo<v8::Value>& args);
static void s_static_aggregateSignatures(const v8::FunctionCallbackInfo<v8::Value>& args);
static void s_toX25519(const v8::FunctionCallbackInfo<v8::Value>& args);
static void s_computeSecret(const v8::FunctionCallbackInfo<v8::Value>& args);

public:
ASYNC_STATICVALUE3(ECCKey_base, recover, Buffer_base*, Buffer_base*, obj_ptr<ECCKey_base>);
ASYNC_MEMBERVALUE1(ECCKey_base, toX25519, obj_ptr<ECCKey_base>);
ASYNC_MEMBERVALUE2(ECCKey_base, computeSecret, ECCKey_base*, obj_ptr<Buffer_base>);
};
}
Expand All @@ -61,8 +58,6 @@ inline ClassInfo& ECCKey_base::class_info()
{ "recover", s_static_recover, true, true },
{ "recoverSync", s_static_recover, true, false },
{ "aggregateSignatures", s_static_aggregateSignatures, true, false },
{ "toX25519", s_toX25519, false, true },
{ "toX25519Sync", s_toX25519, false, false },
{ "computeSecret", s_computeSecret, false, true },
{ "computeSecretSync", s_computeSecret, false, false }
};
Expand Down Expand Up @@ -167,24 +162,6 @@ inline void ECCKey_base::s_static_aggregateSignatures(const v8::FunctionCallback
METHOD_RETURN();
}

inline void ECCKey_base::s_toX25519(const v8::FunctionCallbackInfo<v8::Value>& args)
{
obj_ptr<ECCKey_base> vr;

METHOD_NAME("ECCKey.toX25519");
METHOD_INSTANCE(ECCKey_base);
METHOD_ENTER();

ASYNC_METHOD_OVER(0, 0);

if (!cb.IsEmpty())
hr = pInst->acb_toX25519(cb, args);
else
hr = pInst->ac_toX25519(vr);

METHOD_RETURN();
}

inline void ECCKey_base::s_computeSecret(const v8::FunctionCallbackInfo<v8::Value>& args)
{
obj_ptr<Buffer_base> vr;
Expand Down
82 changes: 82 additions & 0 deletions fibjs/include/ifs/Ed25519Key.h
@@ -0,0 +1,82 @@
/***************************************************************************
* *
* This file was automatically generated using idlc.js *
* PLEASE DO NOT EDIT!!!! *
* *
***************************************************************************/

#pragma once

/**
@author Leo Hoo <lion@9465.net>
*/

#include "../object.h"
#include "ifs/ECCKey.h"

namespace fibjs {

class ECCKey_base;

class Ed25519Key_base : public ECCKey_base {
DECLARE_CLASS(Ed25519Key_base);

public:
// Ed25519Key_base
virtual result_t toX25519(obj_ptr<ECCKey_base>& retVal, AsyncEvent* ac) = 0;

public:
static void s__new(const v8::FunctionCallbackInfo<v8::Value>& args)
{
CONSTRUCT_INIT();

Isolate* isolate = Isolate::current();

isolate->m_isolate->ThrowException(
isolate->NewString("not a constructor"));
}

public:
static void s_toX25519(const v8::FunctionCallbackInfo<v8::Value>& args);

public:
ASYNC_MEMBERVALUE1(Ed25519Key_base, toX25519, obj_ptr<ECCKey_base>);
};
}

namespace fibjs {
inline ClassInfo& Ed25519Key_base::class_info()
{
static ClassData::ClassMethod s_method[] = {
{ "toX25519", s_toX25519, false, true },
{ "toX25519Sync", s_toX25519, false, false }
};

static ClassData s_cd = {
"Ed25519Key", false, s__new, NULL,
ARRAYSIZE(s_method), s_method, 0, NULL, 0, NULL, 0, NULL, NULL, NULL,
&ECCKey_base::class_info()
};

static ClassInfo s_ci(s_cd);
return s_ci;
}

inline void Ed25519Key_base::s_toX25519(const v8::FunctionCallbackInfo<v8::Value>& args)
{
obj_ptr<ECCKey_base> vr;

METHOD_NAME("Ed25519Key.toX25519");
METHOD_INSTANCE(Ed25519Key_base);
METHOD_ENTER();

ASYNC_METHOD_OVER(0, 0);

if (!cb.IsEmpty())
hr = pInst->acb_toX25519(cb, args);
else
hr = pInst->ac_toX25519(vr);

METHOD_RETURN();
}
}
73 changes: 28 additions & 45 deletions fibjs/src/crypto/PKey_ecc.cpp → fibjs/src/crypto/ECCKey.cpp
@@ -1,5 +1,5 @@
/*
* PKey_ecc.cpp
* ECCKey.cpp
*
* Created on: May 2, 2022
* Author: lion
Expand Down Expand Up @@ -77,7 +77,7 @@ static const curve_info curves[] = {
{ MBEDTLS_ECP_DP_BLS12381_G2, "BLS12381_G2" },
};

int32_t PKey_ecc::get_curve_id(exlib::string& curve)
int32_t ECCKey::get_curve_id(exlib::string& curve)
{
int32_t i;

Expand All @@ -88,7 +88,7 @@ int32_t PKey_ecc::get_curve_id(exlib::string& curve)
return MBEDTLS_ECP_DP_NONE;
}

const char* PKey_ecc::get_curve_name(int32_t id)
const char* ECCKey::get_curve_name(int32_t id)
{
int32_t i;

Expand All @@ -99,7 +99,7 @@ const char* PKey_ecc::get_curve_name(int32_t id)
return NULL;
}

int PKey_ecc::load_group(mbedtls_ecp_group* grp, int32_t id)
int ECCKey::load_group(mbedtls_ecp_group* grp, int32_t id)
{
if (id >= MBEDTLS_ECP_DP_ED25519) {
grp->id = (mbedtls_ecp_group_id)id;
Expand All @@ -110,17 +110,11 @@ int PKey_ecc::load_group(mbedtls_ecp_group* grp, int32_t id)
return mbedtls_ecp_group_load(grp, (mbedtls_ecp_group_id)id);
}

PKey_ecc::PKey_ecc()
{
mbedtls_pk_setup(&m_key, mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY));
}

PKey_ecc::PKey_ecc(mbedtls_pk_context& key, bool genpub)
: PKey_impl<ECCKey_base>(key)
void ECCKey::init(mbedtls_pk_context& key, bool genpub, exlib::string algo)
{
mbedtls_ecp_keypair* ecp = mbedtls_pk_ec(m_key);
int32_t id = ecp->grp.id;
m_alg = id == MBEDTLS_ECP_DP_SM2P256R1 ? "SM2" : "ECDSA";
m_alg = !algo.empty() ? algo : (id == MBEDTLS_ECP_DP_SM2P256R1 ? "SM2" : "ECDSA");

if (genpub) {
if (mbedtls_mpi_cmp_int(&ecp->d, 0) && !mbedtls_mpi_cmp_int(&ecp->Q.X, 0))
Expand Down Expand Up @@ -191,7 +185,7 @@ PKey_ecc::PKey_ecc(mbedtls_pk_context& key, bool genpub)
}
}

PKey_ecc::PKey_ecc(int32_t id)
void ECCKey::init(int32_t id)
{
mbedtls_pk_type_t pk_type;

Expand All @@ -208,13 +202,13 @@ PKey_ecc::PKey_ecc(int32_t id)
mbedtls_ctr_drbg_random, &g_ssl.ctr_drbg);
}

PKey_ecc* PKey_ecc::create(mbedtls_pk_context& key)
ECCKey_base* ECCKey::create(mbedtls_pk_context& key, exlib::string algo)
{
int32_t id = mbedtls_pk_ec(key)->grp.id;

switch (id) {
case MBEDTLS_ECP_DP_SECP256K1:
return new PKey_p256k1(key);
return new PKey_p256k1(key, algo);
case MBEDTLS_ECP_DP_CURVE25519:
case MBEDTLS_ECP_DP_ED25519:
return new PKey_25519(key);
Expand All @@ -224,10 +218,10 @@ PKey_ecc* PKey_ecc::create(mbedtls_pk_context& key)
return new PKey_bls_g2(key);
}

return new PKey_ecc(key, true);
return new ECCKey_impl<ECCKey_base>(key, true, algo);
}

result_t PKey_ecc::generateKey(exlib::string curve, obj_ptr<PKey_base>& retVal)
result_t ECCKey::generateKey(exlib::string curve, obj_ptr<PKey_base>& retVal)
{
int32_t id = get_curve_id(curve);

Expand All @@ -248,13 +242,13 @@ result_t PKey_ecc::generateKey(exlib::string curve, obj_ptr<PKey_base>& retVal)
retVal = new PKey_bls_g2();
break;
default:
retVal = new PKey_ecc(id);
retVal = new ECCKey_impl<ECCKey_base>(id);
}

return 0;
}

result_t PKey_ecc::get_publicKey(obj_ptr<PKey_base>& retVal)
result_t ECCKey::get_publicKey(obj_ptr<PKey_base>& retVal)
{
bool priv;

Expand All @@ -276,15 +270,12 @@ result_t PKey_ecc::get_publicKey(obj_ptr<PKey_base>& retVal)
load_group(&ecp1->grp, ecp->grp.id);
mbedtls_ecp_copy(&ecp1->Q, &ecp->Q);

obj_ptr<PKey_ecc> pk = PKey_ecc::create(ctx);
pk->m_alg = m_alg;

retVal = pk;
retVal = ECCKey::create(ctx, m_alg);

return 0;
}

result_t PKey_ecc::clone(obj_ptr<PKey_base>& retVal)
result_t ECCKey::clone(obj_ptr<PKey_base>& retVal)
{
mbedtls_pk_context ctx;

Expand All @@ -298,15 +289,12 @@ result_t PKey_ecc::clone(obj_ptr<PKey_base>& retVal)
mbedtls_mpi_copy(&ecp1->d, &ecp->d);
mbedtls_ecp_copy(&ecp1->Q, &ecp->Q);

obj_ptr<PKey_ecc> pk = PKey_ecc::create(ctx);
pk->m_alg = m_alg;

retVal = pk;
retVal = ECCKey::create(ctx, m_alg);

return 0;
}

result_t PKey_ecc::equals(PKey_base* key, bool& retVal)
result_t ECCKey::equals(PKey_base* key, bool& retVal)
{
retVal = false;

Expand All @@ -332,7 +320,7 @@ result_t PKey_ecc::equals(PKey_base* key, bool& retVal)
return 0;
}

result_t PKey_ecc::sign(Buffer_base* data, PKey_base* key, obj_ptr<Buffer_base>& retVal, AsyncEvent* ac)
result_t ECCKey::sign(Buffer_base* data, PKey_base* key, obj_ptr<Buffer_base>& retVal, AsyncEvent* ac)
{
result_t hr;

Expand Down Expand Up @@ -378,7 +366,7 @@ result_t PKey_ecc::sign(Buffer_base* data, PKey_base* key, obj_ptr<Buffer_base>&
return 0;
}

result_t PKey_ecc::verify(Buffer_base* data, Buffer_base* sign, PKey_base* key, bool& retVal, AsyncEvent* ac)
result_t ECCKey::verify(Buffer_base* data, Buffer_base* sign, PKey_base* key, bool& retVal, AsyncEvent* ac)
{
if (key) {
result_t hr;
Expand Down Expand Up @@ -457,7 +445,7 @@ static int asn1_get_num(unsigned char** p, const unsigned char* end, unsigned ch
return (ret);
}

result_t PKey_ecc::der2bin(const exlib::string& der, exlib::string& bin)
result_t ECCKey::der2bin(const exlib::string& der, exlib::string& bin)
{
const unsigned char* data = (const unsigned char*)der.c_str();
size_t datlen = der.length();
Expand Down Expand Up @@ -485,7 +473,7 @@ result_t PKey_ecc::der2bin(const exlib::string& der, exlib::string& bin)
return 0;
}

result_t PKey_ecc::bin2der(const exlib::string& bin, exlib::string& der)
result_t ECCKey::bin2der(const exlib::string& bin, exlib::string& der)
{
const unsigned char* p0 = (const unsigned char*)bin.c_str();
size_t sz = bin.length();
Expand Down Expand Up @@ -548,7 +536,7 @@ result_t PKey_ecc::bin2der(const exlib::string& bin, exlib::string& der)
return 0;
}

result_t PKey_ecc::check_opts(v8::Local<v8::Object> opts, AsyncEvent* ac)
result_t ECCKey::check_opts(v8::Local<v8::Object> opts, AsyncEvent* ac)
{
static const char* s_keys[] = {
"to", "format", NULL
Expand All @@ -557,7 +545,7 @@ result_t PKey_ecc::check_opts(v8::Local<v8::Object> opts, AsyncEvent* ac)
if (!ac->isSync())
return 0;

Isolate* isolate = holder();
Isolate* isolate = Isolate::current();
result_t hr;

hr = CheckConfig(opts, s_keys);
Expand All @@ -583,7 +571,7 @@ result_t PKey_ecc::check_opts(v8::Local<v8::Object> opts, AsyncEvent* ac)
return CHECK_ERROR(CALL_E_NOSYNC);
}

result_t PKey_ecc::sign(Buffer_base* data, v8::Local<v8::Object> opts, obj_ptr<Buffer_base>& retVal, AsyncEvent* ac)
result_t ECCKey::sign(Buffer_base* data, v8::Local<v8::Object> opts, obj_ptr<Buffer_base>& retVal, AsyncEvent* ac)
{
result_t hr = check_opts(opts, ac);
if (hr < 0)
Expand Down Expand Up @@ -634,7 +622,7 @@ result_t PKey_ecc::sign(Buffer_base* data, v8::Local<v8::Object> opts, obj_ptr<B
return 0;
}

result_t PKey_ecc::verify(Buffer_base* data, Buffer_base* sign, v8::Local<v8::Object> opts, bool& retVal, AsyncEvent* ac)
result_t ECCKey::verify(Buffer_base* data, Buffer_base* sign, v8::Local<v8::Object> opts, bool& retVal, AsyncEvent* ac)
{
result_t hr = check_opts(opts, ac);
if (hr < 0)
Expand Down Expand Up @@ -676,7 +664,7 @@ result_t PKey_ecc::verify(Buffer_base* data, Buffer_base* sign, v8::Local<v8::Ob
return 0;
}

result_t PKey_ecc::computeSecret(ECCKey_base* publicKey, obj_ptr<Buffer_base>& retVal, AsyncEvent* ac)
result_t ECCKey::computeSecret(ECCKey_base* publicKey, obj_ptr<Buffer_base>& retVal, AsyncEvent* ac)
{
if (ac->isSync())
return CHECK_ERROR(CALL_E_NOSYNC);
Expand Down Expand Up @@ -727,7 +715,7 @@ result_t PKey_ecc::computeSecret(ECCKey_base* publicKey, obj_ptr<Buffer_base>& r
return 0;
}

result_t PKey_ecc::get_curve(exlib::string& retVal)
result_t ECCKey::get_curve(exlib::string& retVal)
{
mbedtls_ecp_keypair* ecp = mbedtls_pk_ec(m_key);
const char* _name = get_curve_name(ecp->grp.id);
Expand All @@ -737,7 +725,7 @@ result_t PKey_ecc::get_curve(exlib::string& retVal)
return 0;
}

result_t PKey_ecc::set_alg(exlib::string newVal)
result_t ECCKey::set_alg(exlib::string newVal)
{
int32_t id = mbedtls_pk_ec(m_key)->grp.id;

Expand All @@ -756,9 +744,4 @@ result_t PKey_ecc::set_alg(exlib::string newVal)
return 0;
}

result_t PKey_ecc::toX25519(obj_ptr<ECCKey_base>& retVal, AsyncEvent* ac)
{
return CHECK_ERROR(CALL_E_INVALIDARG);
}

}

0 comments on commit 39f899e

Please sign in to comment.