@@ -2233,16 +2233,17 @@ void SSLWrap<Base>::GetEphemeralKeyInfo(
22332233
22342234  Local<Object> info = Object::New (env->isolate ());
22352235
2236-   EVP_PKEY* key ;
2237- 
2238-   if  ( SSL_get_server_tmp_key (w-> ssl_ . get (), & key)) { 
2239-     int  kid = EVP_PKEY_id (key);
2236+   EVP_PKEY* raw_key ;
2237+    if  ( SSL_get_server_tmp_key (w-> ssl_ . get (), &raw_key)) { 
2238+     EVPKeyPointer  key (raw_key); 
2239+     int  kid = EVP_PKEY_id (key. get () );
22402240    switch  (kid) {
22412241      case  EVP_PKEY_DH:
22422242        info->Set (context, env->type_string (),
22432243                  FIXED_ONE_BYTE_STRING (env->isolate (), " DH" FromJust ();
22442244        info->Set (context, env->size_string (),
2245-                   Integer::New (env->isolate (), EVP_PKEY_bits (key))).FromJust ();
2245+                   Integer::New (env->isolate (), EVP_PKEY_bits (key.get ())))
2246+             .FromJust ();
22462247        break ;
22472248      case  EVP_PKEY_EC:
22482249      //  TODO(shigeki) Change this to EVP_PKEY_X25519 and add EVP_PKEY_X448
@@ -2251,7 +2252,7 @@ void SSLWrap<Base>::GetEphemeralKeyInfo(
22512252        {
22522253          const  char * curve_name;
22532254          if  (kid == EVP_PKEY_EC) {
2254-             EC_KEY* ec = EVP_PKEY_get1_EC_KEY (key);
2255+             EC_KEY* ec = EVP_PKEY_get1_EC_KEY (key. get () );
22552256            int  nid = EC_GROUP_get_curve_name (EC_KEY_get0_group (ec));
22562257            curve_name = OBJ_nid2sn (nid);
22572258            EC_KEY_free (ec);
@@ -2265,11 +2266,10 @@ void SSLWrap<Base>::GetEphemeralKeyInfo(
22652266                                  curve_name)).FromJust ();
22662267          info->Set (context, env->size_string (),
22672268                    Integer::New (env->isolate (),
2268-                                  EVP_PKEY_bits (key))).FromJust ();
2269+                                  EVP_PKEY_bits (key. get () ))).FromJust ();
22692270        }
22702271        break ;
22712272    }
2272-     EVP_PKEY_free (key);
22732273  }
22742274
22752275  return  args.GetReturnValue ().Set (info);
@@ -3138,7 +3138,7 @@ static ManagedEVPPKey GetPrivateKeyFromJs(
31383138        ParsePrivateKey (config.Release (), key.get (), key.size ());
31393139    if  (!pkey)
31403140      ThrowCryptoError (env, ERR_get_error (), " Failed to read private key" 
3141-     return  ManagedEVPPKey (pkey. release ( ));
3141+     return  ManagedEVPPKey (std::move (pkey ));
31423142  } else  {
31433143    CHECK (args[*offset]->IsObject () && allow_key_object);
31443144    KeyObject* key;
@@ -3197,7 +3197,7 @@ static ManagedEVPPKey GetPublicOrPrivateKeyFromJs(
31973197    }
31983198    if  (!pkey)
31993199      ThrowCryptoError (env, ERR_get_error (), " Failed to read asymmetric key" 
3200-     return  ManagedEVPPKey (pkey. release ( ));
3200+     return  ManagedEVPPKey (std::move (pkey ));
32013201  } else  {
32023202    CHECK (args[*offset]->IsObject ());
32033203    KeyObject* key = Unwrap<KeyObject>(args[*offset].As <Object>());
@@ -3287,42 +3287,27 @@ static MaybeLocal<Value> WritePrivateKey(
32873287  return  BIOToStringOrBuffer (env, bio.get (), config.format_ );
32883288}
32893289
3290- ManagedEVPPKey::ManagedEVPPKey () : pkey_(nullptr ) {}
3291- 
3292- ManagedEVPPKey::ManagedEVPPKey (EVP_PKEY* pkey) : pkey_(pkey) {}
3290+ ManagedEVPPKey::ManagedEVPPKey (EVPKeyPointer&& pkey) : pkey_(std::move(pkey)) {}
32933291
3294- ManagedEVPPKey::ManagedEVPPKey (const  ManagedEVPPKey& key) : pkey_( nullptr ) {
3295-   *this  = key ;
3292+ ManagedEVPPKey::ManagedEVPPKey (const  ManagedEVPPKey& that ) {
3293+   *this  = that ;
32963294}
32973295
3298- ManagedEVPPKey::ManagedEVPPKey (ManagedEVPPKey&& key) {
3299-   *this  = key;
3300- }
3296+ ManagedEVPPKey& ManagedEVPPKey::operator =(const  ManagedEVPPKey& that) {
3297+   pkey_.reset (that.get ());
33013298
3302- ManagedEVPPKey::~ManagedEVPPKey () {
3303-   EVP_PKEY_free (pkey_);
3304- }
3305- 
3306- ManagedEVPPKey& ManagedEVPPKey::operator =(const  ManagedEVPPKey& key) {
3307-   EVP_PKEY_free (pkey_);
3308-   pkey_ = key.pkey_ ;
3309-   EVP_PKEY_up_ref (pkey_);
3310-   return  *this ;
3311- }
3299+   if  (pkey_)
3300+     EVP_PKEY_up_ref (pkey_.get ());
33123301
3313- ManagedEVPPKey& ManagedEVPPKey::operator =(ManagedEVPPKey&& key) {
3314-   EVP_PKEY_free (pkey_);
3315-   pkey_ = key.pkey_ ;
3316-   key.pkey_  = nullptr ;
33173302  return  *this ;
33183303}
33193304
33203305ManagedEVPPKey::operator  bool () const  {
3321-   return  pkey_ !=  nullptr ;
3306+   return  !!pkey_ ;
33223307}
33233308
33243309EVP_PKEY* ManagedEVPPKey::get () const  {
3325-   return  pkey_;
3310+   return  pkey_. get () ;
33263311}
33273312
33283313Local<Function> KeyObject::Initialize (Environment* env, Local<Object> target) {
@@ -5704,13 +5689,13 @@ class DSAKeyPairGenerationConfig : public KeyPairGenerationConfig {
57045689      }
57055690    }
57065691
5707-     EVP_PKEY* params  = nullptr ;
5708-     if  (EVP_PKEY_paramgen (param_ctx.get (), ¶ms ) <= 0 )
5692+     EVP_PKEY* raw_params  = nullptr ;
5693+     if  (EVP_PKEY_paramgen (param_ctx.get (), &raw_params ) <= 0 )
57095694      return  nullptr ;
5695+     EVPKeyPointer params (raw_params);
57105696    param_ctx.reset ();
57115697
5712-     EVPKeyCtxPointer key_ctx (EVP_PKEY_CTX_new (params, nullptr ));
5713-     EVP_PKEY_free (params);
5698+     EVPKeyCtxPointer key_ctx (EVP_PKEY_CTX_new (params.get (), nullptr ));
57145699    return  key_ctx;
57155700  }
57165701
@@ -5739,13 +5724,13 @@ class ECKeyPairGenerationConfig : public KeyPairGenerationConfig {
57395724    if  (EVP_PKEY_CTX_set_ec_param_enc (param_ctx.get (), param_encoding_) <= 0 )
57405725      return  nullptr ;
57415726
5742-     EVP_PKEY* params  = nullptr ;
5743-     if  (EVP_PKEY_paramgen (param_ctx.get (), ¶ms ) <= 0 )
5727+     EVP_PKEY* raw_params  = nullptr ;
5728+     if  (EVP_PKEY_paramgen (param_ctx.get (), &raw_params ) <= 0 )
57445729      return  nullptr ;
5730+     EVPKeyPointer params (raw_params);
57455731    param_ctx.reset ();
57465732
5747-     EVPKeyCtxPointer key_ctx (EVP_PKEY_CTX_new (params, nullptr ));
5748-     EVP_PKEY_free (params);
5733+     EVPKeyCtxPointer key_ctx (EVP_PKEY_CTX_new (params.get (), nullptr ));
57495734    return  key_ctx;
57505735  }
57515736
@@ -5793,7 +5778,7 @@ class GenerateKeyPairJob : public CryptoJob {
57935778    EVP_PKEY* pkey = nullptr ;
57945779    if  (EVP_PKEY_keygen (ctx.get (), &pkey) != 1 )
57955780      return  false ;
5796-     pkey_ = ManagedEVPPKey (pkey);
5781+     pkey_ = ManagedEVPPKey (EVPKeyPointer ( pkey) );
57975782    return  true ;
57985783  }
57995784
0 commit comments