@@ -463,19 +463,22 @@ bool ECDHBitsTraits::DeriveBits(
463
463
464
464
char * data = nullptr ;
465
465
size_t len = 0 ;
466
+ ManagedEVPPKey m_privkey = params.private_ ->GetAsymmetricKey ();
467
+ ManagedEVPPKey m_pubkey = params.public_ ->GetAsymmetricKey ();
466
468
467
469
switch (params.id_ ) {
468
470
case EVP_PKEY_X25519:
469
471
// Fall through
470
472
case EVP_PKEY_X448: {
471
- EVPKeyCtxPointer ctx (
472
- EVP_PKEY_CTX_new (
473
- params.private_ ->GetAsymmetricKey ().get (),
474
- nullptr ));
473
+ EVPKeyCtxPointer ctx = nullptr ;
474
+ {
475
+ ctx.reset (EVP_PKEY_CTX_new (m_privkey.get (), nullptr ));
476
+ }
477
+ Mutex::ScopedLock pub_lock (*m_pubkey.mutex ());
475
478
if (EVP_PKEY_derive_init (ctx.get ()) <= 0 ||
476
479
EVP_PKEY_derive_set_peer (
477
480
ctx.get (),
478
- params. public_ -> GetAsymmetricKey () .get ()) <= 0 ||
481
+ m_pubkey .get ()) <= 0 ||
479
482
EVP_PKEY_derive (ctx.get (), nullptr , &len) <= 0 ) {
480
483
return false ;
481
484
}
@@ -492,10 +495,14 @@ bool ECDHBitsTraits::DeriveBits(
492
495
break ;
493
496
}
494
497
default : {
495
- const EC_KEY* private_key =
496
- EVP_PKEY_get0_EC_KEY (params.private_ ->GetAsymmetricKey ().get ());
497
- const EC_KEY* public_key =
498
- EVP_PKEY_get0_EC_KEY (params.public_ ->GetAsymmetricKey ().get ());
498
+ const EC_KEY* private_key;
499
+ {
500
+ Mutex::ScopedLock priv_lock (*m_privkey.mutex ());
501
+ private_key = EVP_PKEY_get0_EC_KEY (m_privkey.get ());
502
+ }
503
+
504
+ Mutex::ScopedLock pub_lock (*m_pubkey.mutex ());
505
+ const EC_KEY* public_key = EVP_PKEY_get0_EC_KEY (m_pubkey.get ());
499
506
500
507
const EC_GROUP* group = EC_KEY_get0_group (private_key);
501
508
if (group == nullptr )
@@ -607,7 +614,7 @@ WebCryptoKeyExportStatus EC_Raw_Export(
607
614
CHECK (m_pkey);
608
615
Mutex::ScopedLock lock (*m_pkey.mutex ());
609
616
610
- EC_KEY* ec_key = EVP_PKEY_get0_EC_KEY (m_pkey.get ());
617
+ const EC_KEY* ec_key = EVP_PKEY_get0_EC_KEY (m_pkey.get ());
611
618
612
619
unsigned char * data;
613
620
size_t len = 0 ;
@@ -627,10 +634,10 @@ WebCryptoKeyExportStatus EC_Raw_Export(
627
634
}
628
635
CHECK_NOT_NULL (fn);
629
636
// Get the size of the raw key data
630
- if (fn (key_data-> GetAsymmetricKey () .get (), nullptr , &len) == 0 )
637
+ if (fn (m_pkey .get (), nullptr , &len) == 0 )
631
638
return WebCryptoKeyExportStatus::INVALID_KEY_TYPE;
632
639
data = MallocOpenSSL<unsigned char >(len);
633
- if (fn (key_data-> GetAsymmetricKey () .get (), data, &len) == 0 )
640
+ if (fn (m_pkey .get (), data, &len) == 0 )
634
641
return WebCryptoKeyExportStatus::INVALID_KEY_TYPE;
635
642
} else {
636
643
if (key_data->GetKeyType () != kKeyTypePublic )
@@ -696,7 +703,7 @@ Maybe<bool> ExportJWKEcKey(
696
703
Mutex::ScopedLock lock (*m_pkey.mutex ());
697
704
CHECK_EQ (EVP_PKEY_id (m_pkey.get ()), EVP_PKEY_EC);
698
705
699
- EC_KEY* ec = EVP_PKEY_get0_EC_KEY (m_pkey.get ());
706
+ const EC_KEY* ec = EVP_PKEY_get0_EC_KEY (m_pkey.get ());
700
707
CHECK_NOT_NULL (ec);
701
708
702
709
const EC_POINT* pub = EC_KEY_get0_public_key (ec);
@@ -751,6 +758,7 @@ Maybe<bool> ExportJWKEdKey(
751
758
std::shared_ptr<KeyObjectData> key,
752
759
Local<Object> target) {
753
760
ManagedEVPPKey pkey = key->GetAsymmetricKey ();
761
+ Mutex::ScopedLock lock (*pkey.mutex ());
754
762
755
763
const char * curve = nullptr ;
756
764
switch (EVP_PKEY_id (pkey.get ())) {
@@ -902,7 +910,7 @@ Maybe<bool> GetEcKeyDetail(
902
910
Mutex::ScopedLock lock (*m_pkey.mutex ());
903
911
CHECK_EQ (EVP_PKEY_id (m_pkey.get ()), EVP_PKEY_EC);
904
912
905
- EC_KEY* ec = EVP_PKEY_get0_EC_KEY (m_pkey.get ());
913
+ const EC_KEY* ec = EVP_PKEY_get0_EC_KEY (m_pkey.get ());
906
914
CHECK_NOT_NULL (ec);
907
915
908
916
const EC_GROUP* group = EC_KEY_get0_group (ec);
@@ -919,8 +927,8 @@ Maybe<bool> GetEcKeyDetail(
919
927
// implementation here is a adapted from Chromium's impl here:
920
928
// https://github.com/chromium/chromium/blob/7af6cfd/components/webcrypto/algorithms/ecdsa.cc
921
929
922
- size_t GroupOrderSize (ManagedEVPPKey key) {
923
- EC_KEY* ec = EVP_PKEY_get0_EC_KEY (key.get ());
930
+ size_t GroupOrderSize (const ManagedEVPPKey& key) {
931
+ const EC_KEY* ec = EVP_PKEY_get0_EC_KEY (key.get ());
924
932
CHECK_NOT_NULL (ec);
925
933
const EC_GROUP* group = EC_KEY_get0_group (ec);
926
934
BignumPointer order (BN_new ());
0 commit comments