@@ -463,19 +463,22 @@ bool ECDHBitsTraits::DeriveBits(
463463
464464 char * data = nullptr ;
465465 size_t len = 0 ;
466+ ManagedEVPPKey m_privkey = params.private_ ->GetAsymmetricKey ();
467+ ManagedEVPPKey m_pubkey = params.public_ ->GetAsymmetricKey ();
466468
467469 switch (params.id_ ) {
468470 case EVP_PKEY_X25519:
469471 // Fall through
470472 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 ());
475478 if (EVP_PKEY_derive_init (ctx.get ()) <= 0 ||
476479 EVP_PKEY_derive_set_peer (
477480 ctx.get (),
478- params. public_ -> GetAsymmetricKey () .get ()) <= 0 ||
481+ m_pubkey .get ()) <= 0 ||
479482 EVP_PKEY_derive (ctx.get (), nullptr , &len) <= 0 ) {
480483 return false ;
481484 }
@@ -492,10 +495,14 @@ bool ECDHBitsTraits::DeriveBits(
492495 break ;
493496 }
494497 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 ());
499506
500507 const EC_GROUP* group = EC_KEY_get0_group (private_key);
501508 if (group == nullptr )
@@ -607,7 +614,7 @@ WebCryptoKeyExportStatus EC_Raw_Export(
607614 CHECK (m_pkey);
608615 Mutex::ScopedLock lock (*m_pkey.mutex ());
609616
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 ());
611618
612619 unsigned char * data;
613620 size_t len = 0 ;
@@ -627,10 +634,10 @@ WebCryptoKeyExportStatus EC_Raw_Export(
627634 }
628635 CHECK_NOT_NULL (fn);
629636 // 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 )
631638 return WebCryptoKeyExportStatus::INVALID_KEY_TYPE;
632639 data = MallocOpenSSL<unsigned char >(len);
633- if (fn (key_data-> GetAsymmetricKey () .get (), data, &len) == 0 )
640+ if (fn (m_pkey .get (), data, &len) == 0 )
634641 return WebCryptoKeyExportStatus::INVALID_KEY_TYPE;
635642 } else {
636643 if (key_data->GetKeyType () != kKeyTypePublic )
@@ -696,7 +703,7 @@ Maybe<bool> ExportJWKEcKey(
696703 Mutex::ScopedLock lock (*m_pkey.mutex ());
697704 CHECK_EQ (EVP_PKEY_id (m_pkey.get ()), EVP_PKEY_EC);
698705
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 ());
700707 CHECK_NOT_NULL (ec);
701708
702709 const EC_POINT* pub = EC_KEY_get0_public_key (ec);
@@ -751,6 +758,7 @@ Maybe<bool> ExportJWKEdKey(
751758 std::shared_ptr<KeyObjectData> key,
752759 Local<Object> target) {
753760 ManagedEVPPKey pkey = key->GetAsymmetricKey ();
761+ Mutex::ScopedLock lock (*pkey.mutex ());
754762
755763 const char * curve = nullptr ;
756764 switch (EVP_PKEY_id (pkey.get ())) {
@@ -902,7 +910,7 @@ Maybe<bool> GetEcKeyDetail(
902910 Mutex::ScopedLock lock (*m_pkey.mutex ());
903911 CHECK_EQ (EVP_PKEY_id (m_pkey.get ()), EVP_PKEY_EC);
904912
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 ());
906914 CHECK_NOT_NULL (ec);
907915
908916 const EC_GROUP* group = EC_KEY_get0_group (ec);
@@ -919,8 +927,8 @@ Maybe<bool> GetEcKeyDetail(
919927// implementation here is a adapted from Chromium's impl here:
920928// https://github.com/chromium/chromium/blob/7af6cfd/components/webcrypto/algorithms/ecdsa.cc
921929
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 ());
924932 CHECK_NOT_NULL (ec);
925933 const EC_GROUP* group = EC_KEY_get0_group (ec);
926934 BignumPointer order (BN_new ());
0 commit comments