8000 crypto, refactor: deprecation "sign to" function in ecc. · fibjs/fibjs@39d1578 · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit 39d1578

Browse files
committed
crypto, refactor: deprecation "sign to" function in ecc.
1 parent 24da7f5 commit 39d1578

File tree

10 files changed

+45
-528
lines changed

10 files changed

+45
-528
lines changed

fibjs/include/ECKey.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ class ECKey : public PKey {
5555
result_t bin2der(const exlib::string& bin, exlib::string& der);
5656

5757
private:
58-
result_t sign(Buffer_base* data, PKey_base* key, obj_ptr<Buffer_base>& retVal, AsyncEvent* ac);
59-
result_t verify(Buffer_base* data, Buffer_base* sign, PKey_base* key, bool& retVal, AsyncEvent* ac);
58+
result_t sdsa_sign(Buffer_base* data, obj_ptr<Buffer_base>& retVal, AsyncEvent* ac);
59+
result_t sdsa_verify(Buffer_base* data, Buffer_base* sign, bool& retVal, AsyncEvent* ac);
6060

6161
private:
6262
result_t check_opts(v8::Local<v8::Object> opts, AsyncEvent* ac);

fibjs/src/crypto/ECKey.cpp

Lines changed: 19 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
#include "ssl.h"
1313

1414
extern "C" {
15-
int ecsdsa_sign(mbedtls_ecp_keypair* ctx, int sdsa, mbedtls_ecp_keypair* to_ctx, const unsigned char* hash, size_t hlen,
15+
int ecsdsa_sign(mbedtls_ecp_keypair* ctx, const unsigned char* hash, size_t hlen,
1616
unsigned char* sig, size_t* slen, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng);
17-
int ecsdsa_verify(mbedtls_ecp_keypair* ctx, int sdsa, mbedtls_ecp_keypair* to_ctx, const unsigned char* hash, size_t hlen,
17+
int ecsdsa_verify(mbedtls_ecp_keypair* ctx, const unsigned char* hash, size_t hlen,
1818
const unsigned char* sig, size_t slen, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng);
1919
}
2020

@@ -361,41 +361,25 @@ result_t ECKey::equals(PKey_base* key, bool& retVal)
361361
return 0;
362362
}
363363

364-
result_t ECKey::sign(Buffer_base* data, PKey_base* key, obj_ptr<Buffer_base>& retVal, AsyncEvent* ac)
364+
result_t ECKey::sdsa_sign(Buffer_base* data, obj_ptr<Buffer_base>& retVal, AsyncEvent* ac)
365365
{
366366
result_t hr;
367367

368-
if (key) {
369-
mbedtls_pk_type_t type;
370-
371-
mbedtls_pk_context& mkey = PKey::key(key);
372-
373-
type = mbedtls_pk_get_type(&mkey);
374-
if (type != MBEDTLS_PK_ECKEY && type != MBEDTLS_PK_SM2)
375-
return CHECK_ERROR(CALL_E_INVALIDARG);
376-
377-
mbedtls_ecp_keypair* ecp1 = mbedtls_pk_ec(m_key);
378-
mbedtls_ecp_keypair* ecp2 = mbedtls_pk_ec(mkey);
379-
if (ecp1->grp.id != ecp2->grp.id)
380-
return CHECK_ERROR(Runtime::setError("Public key is not valid for specified curve"));
381-
}
382-
383368
int32_t ret;
384369
exlib::string output;
385370
size_t olen = MBEDTLS_ECDSA_MAX_LEN;
386371

387372
obj_ptr<Buffer> buf_data = Buffer::Cast(data);
388373
output.resize(MBEDTLS_ECDSA_MAX_LEN);
389374

390-
ret = ecsdsa_sign(mbedtls_pk_ec(m_key), m_alg == "ECSDSA", key ? mbedtls_pk_ec(PKey::key(key)) : NULL,
391-
buf_data->data(), buf_data->length(), (unsigned char*)output.c_buffer(), &olen,
392-
mbedtls_ctr_drbg_random, &g_ssl.ctr_drbg);
375+
ret = ecsdsa_sign(mbedtls_pk_ec(m_key), buf_data->data(), buf_data->length(),
376+
(unsigned char*)output.c_buffer(), &olen, mbedtls_ctr_drbg_random, &g_ssl.ctr_drbg);
393377
if (ret != 0)
394378
return CHECK_ERROR(_ssl::setError(ret));
395379

396380
output.resize(olen);
397381

398-
if (ac->m_ctx[1].string() == "raw") {
382+
if (ac->m_ctx[0].string() == "raw") {
399383
hr = der2bin(output, output);
400384
if (hr < 0)
401385
return hr;
@@ -406,46 +390,22 @@ result_t ECKey::sign(Buffer_base* data, PKey_base* key, obj_ptr<Buffer_base>& re
406390
return 0;
407391
}
408392

409-
result_t ECKey::verify(Buffer_base* data, Buffer_base* sign, PKey_base* key, bool& retVal, AsyncEvent* ac)
393+
result_t ECKey::sdsa_verify(Buffer_base* data, Buffer_base* sign, bool& retVal, AsyncEvent* ac)
410394
{
411-
if (key) {
412-
result_t hr;
413-
bool priv;
414-
415-
mbedtls_pk_context& mkey = PKey::key(key);
416-
417-
mbedtls_pk_type_t type = mbedtls_pk_get_type(&mkey);
418-
if (type != MBEDTLS_PK_ECKEY && type != MBEDTLS_PK_SM2)
419-
return CHECK_ERROR(CALL_E_INVALIDARG);
420-
421-
hr = key->isPrivate(priv);
422-
if (hr < 0)
423-
return hr;
424-
425-
if (!priv)
426-
return CHECK_ERROR(CALL_E_INVALIDARG);
427-
428-
mbedtls_ecp_keypair* ecp1 = mbedtls_pk_ec(m_key);
429-
mbedtls_ecp_keypair* ecp2 = mbedtls_pk_ec(mkey);
430-
if (ecp1->grp.id != ecp2->grp.id)
431-
return CHECK_ERROR(Runtime::setError("Public key is not valid for specified curve"));
432-
}
433-
434395
int32_t ret;
435396

436397
obj_ptr<Buffer> buf_data = Buffer::Cast(data);
437398

438399
exlib::string strsign;
439400
sign->toString(strsign);
440-
if (ac->m_ctx[1].string() == "raw") {
401+
if (ac->m_ctx[0].string() == "raw") {
441402
result_t hr = bin2der(strsign, strsign);
442403
if (hr < 0)
443404
return hr;
444405
}
445406

446-
ret = ecsdsa_verify(mbedtls_pk_ec(m_key), m_alg == "ECSDSA", key ? mbedtls_pk_ec(PKey::key(key)) : NULL,
447-
buf_data->data(), buf_data->length(), (const unsigned char*)strsign.c_str(), strsign.length(),
448-
mbedtls_ctr_drbg_random, &g_ssl.ctr_drbg);
407+
ret = ecsdsa_verify(mbedtls_pk_ec(m_key), buf_data->data(), buf_data->length(),
408+
(const unsigned char*)strsign.c_str(), strsign.length(), mbedtls_ctr_drbg_random, &g_ssl.ctr_drbg);
449409
if (ret == MBEDTLS_ERR_ECP_VERIFY_FAILED || ret == MBEDTLS_ERR_SM2_BAD_SIGNATURE) {
450410
retVal = false;
451411
return 0;
@@ -578,7 +538,7 @@ result_t ECKey::bin2der(const exlib::string& bin, exlib::string& der)
578538
result_t ECKey::check_opts(v8::Local<v8::Object> opts, AsyncEvent* ac)
579539
{
580540
static const char* s_keys[] = {
581-
"to", "format", NULL
541+
"format", NULL
582542
};
583543

584544
if (!ac->isSync())
@@ -591,21 +551,15 @@ result_t ECKey::check_opts(v8::Local<v8::Object> opts, AsyncEvent* ac)
591551
if (hr < 0)
592552
return hr;
593553

594-
ac->m_ctx.resize(2);
595-
596-
obj_ptr<PKey_base> to;
597-
hr = GetConfigValue(isolate, opts, "to", to, true);
598-
if (hr < 0 && hr != CALL_E_PARAMNOTOPTIONAL)
599-
return hr;
600-
ac->m_ctx[0] = to;
554+
ac->m_ctx.resize(1);
601555

602556
exlib::string fmt = "der";
603557
hr = GetConfigValue(isolate, opts, "format", fmt, true);
604558
if (hr < 0 && hr != CALL_E_PARAMNOTOPTIONAL)
605559
return hr;
606560
if (fmt != "der" && fmt != "raw")
607561
return CHECK_ERROR(Runtime::setError(exlib::string("unsupported format \'") + fmt + "\'."));
608-
ac->m_ctx[1] = fmt;
562+
ac->m_ctx[0] = fmt;
609563

610564
return CHECK_ERROR(CALL_E_NOSYNC);
611565
}
@@ -625,12 +579,8 @@ result_t ECKey::sign(Buffer_base* data, v8::Local<v8::Object> opts, obj_ptr<Buff
625579
if (!priv)
626580
return CHECK_ERROR(CALL_E_INVALID_CALL);
627581

628-
obj_ptr<PKey_base> to = PKey_base::getInstance(ac->m_ctx[0].object());
629-
if (m_alg == "ECSDSA" || m_alg == "SM2")
630-
return sign(data, to, retVal, ac);
631-
632-
if (to)
633-
return CHECK_ERROR(CALL_E_INVALID_CALL);
582+
if (m_alg == "ECSDSA")
583+
return sdsa_sign(data, retVal, ac);
634584

635585
int32_t ret;
636586
exlib::string output;
@@ -648,7 +598,7 @@ result_t ECKey::sign(Buffer_base* data, v8::Local<v8::Object> opts, obj_ptr<Buff
648598

649599
output.resize(olen);
650600

651-
if (ac->m_ctx[1].string() == "raw") {
601+
if (ac->m_ctx[0].string() == "raw") {
652602
hr = der2bin(output, output);
653603
if (hr < 0)
654604
return hr;
@@ -665,20 +615,16 @@ result_t ECKey::verify(Buffer_base* data, Buffer_base* sign, v8::Local<v8::Objec
665615
if (hr < 0)
666616
return hr;
667617

668-
obj_ptr<PKey_base> to = PKey_base::getInstance(ac->m_ctx[0].object());
669-
if (m_alg == "ECSDSA" || m_alg == "SM2")
670-
return verify(data, sign, to, retVal, ac);
671-
672-
if (to)
673-
return CHECK_ERROR(CALL_E_INVALID_CALL);
618+
if (m_alg == "ECSDSA")
619+
return sdsa_verify(data, sign, retVal, ac);
674620

675621
int32_t ret;
676622
exlib::string strsign;
677623

678624
obj_ptr<Buffer> buf_data = Buffer::Cast(data);
679625
sign->toString(strsign);
680626

681-
if (ac->m_ctx[1].string() == "raw") {
627+
if (ac->m_ctx[0].string() == "raw") {
682628
hr = bin2der(strsign, strsign);
683629
if (hr < 0)
684630
return hr;

fibjs/src/crypto/ECKey_p256k1.cpp

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ ECKey_p256k1::ECKey_p256k1()
5050
result_t ECKey_p256k1::check_opts(v8::Local<v8::Object> opts, AsyncEvent* ac)
5151
{
5252
static const char* s_keys[] = {
53-
"to", "format", "recoverable", NULL
53+
"format", "recoverable", NULL
5454
};
5555

5656
if (!ac->isSync())
@@ -63,27 +63,21 @@ result_t ECKey_p256k1::check_opts(v8::Local<v8::Object> opts, AsyncEvent* ac)
6363
if (hr < 0)
6464
return hr;
6565

66-
ac->m_ctx.resize(3);
67-
68-
obj_ptr<PKey_base> to;
69-
hr = GetConfigValue(isolate, opts, "to", to, true);
70-
if (hr < 0 && hr != CALL_E_PARAMNOTOPTIONAL)
71-
return hr;
72-
ac->m_ctx[0] = to;
66+
ac->m_ctx.resize(2);
7367

7468
bool recoverable = false;
7569
hr = GetConfigValue(isolate, opts, "recoverable", recoverable, true);
7670
if (hr < 0 && hr != CALL_E_PARAMNOTOPTIONAL)
7771
return hr;
78-
ac->m_ctx[2] = recoverable;
72+
ac->m_ctx[1] = recoverable;
7973

8074
exlib::string fmt = recoverable ? "raw" : "der";
8175
hr = GetConfigValue(isolate, opts, "format", fmt, true);
8276
if (hr < 0 && hr != CALL_E_PARAMNOTOPTIONAL)
8377
return hr;
8478
if (fmt != "der" && fmt != "raw")
8579
return CHECK_ERROR(Runtime::setError(exlib::string("unsupported format \'") + fmt + "\'."));
86-
ac->m_ctx[1] = fmt;
80+
ac->m_ctx[0] = fmt;
8781

8882
return CHECK_ERROR(CALL_E_NOSYNC);
8983
}
@@ -106,7 +100,7 @@ result_t ECKey_p256k1::sign(Buffer_base* data, v8::Local<v8::Object> opts, obj_p
106100
if (hr < 0)
107101
return hr;
108102

109-
bool recoverable = ac->m_ctx[2].boolVal();
103+
bool recoverable = ac->m_ctx[1].boolVal();
110104
if (!recoverable)
111105
return ECKey::sign(data, opts, retVal, ac);
112106

@@ -119,10 +113,7 @@ result_t ECKey_p256k1::sign(Buffer_base* data, v8::Local<v8::Object> opts, obj_p
119113
if (!priv)
120114
return CHECK_ERROR(CALL_E_INVALID_CALL);
121115

122-
if (ac->m_ctx[0].object())
123-
return CHECK_ERROR(CALL_E_INVALID_CALL);
124-
125-
exlib::string fmt = ac->m_ctx[1].string();
116+
exlib::string fmt = ac->m_ctx[0].string();
126117
if (fmt != "raw")
127118
return CHECK_ERROR(Runtime::setError(exlib::string("unsupported format \'") + fmt + "\'."));
128119

0 commit comments

Comments
 (0)
0