@@ -2206,16 +2206,17 @@ void SSLWrap<Base>::GetEphemeralKeyInfo(
22062206
22072207 Local<Object> info = Object::New (env->isolate ());
22082208
2209- EVP_PKEY* key ;
2210-
2211- if ( SSL_get_server_tmp_key (w-> ssl_ . get (), & key)) {
2212- int kid = EVP_PKEY_id (key);
2209+ EVP_PKEY* raw_key ;
2210+ if ( SSL_get_server_tmp_key (w-> ssl_ . get (), &raw_key)) {
2211+ EVPKeyPointer key (raw_key);
2212+ int kid = EVP_PKEY_id (key. get () );
22132213 switch (kid) {
22142214 case EVP_PKEY_DH:
22152215 info->Set (context, env->type_string (),
22162216 FIXED_ONE_BYTE_STRING (env->isolate (), " DH" )).FromJust ();
22172217 info->Set (context, env->size_string (),
2218- Integer::New (env->isolate (), EVP_PKEY_bits (key))).FromJust ();
2218+ Integer::New (env->isolate (), EVP_PKEY_bits (key.get ())))
2219+ .FromJust ();
22192220 break ;
22202221 case EVP_PKEY_EC:
22212222 // TODO(shigeki) Change this to EVP_PKEY_X25519 and add EVP_PKEY_X448
@@ -2224,7 +2225,7 @@ void SSLWrap<Base>::GetEphemeralKeyInfo(
22242225 {
22252226 const char * curve_name;
22262227 if (kid == EVP_PKEY_EC) {
2227- EC_KEY* ec = EVP_PKEY_get1_EC_KEY (key);
2228+ EC_KEY* ec = EVP_PKEY_get1_EC_KEY (key. get () );
22282229 int nid = EC_GROUP_get_curve_name (EC_KEY_get0_group (ec));
22292230 curve_name = OBJ_nid2sn (nid);
22302231 EC_KEY_free (ec);
@@ -2238,11 +2239,10 @@ void SSLWrap<Base>::GetEphemeralKeyInfo(
22382239 curve_name)).FromJust ();
22392240 info->Set (context, env->size_string (),
22402241 Integer::New (env->isolate (),
2241- EVP_PKEY_bits (key))).FromJust ();
2242+ EVP_PKEY_bits (key. get () ))).FromJust ();
22422243 }
22432244 break ;
22442245 }
2245- EVP_PKEY_free (key);
22462246 }
22472247
22482248 return args.GetReturnValue ().Set (info);
@@ -3110,7 +3110,7 @@ static ManagedEVPPKey GetPrivateKeyFromJs(
31103110 ParsePrivateKey (config.Release (), key.get (), key.size ());
31113111 if (!pkey)
31123112 ThrowCryptoError (env, ERR_get_error (), " Failed to read private key" );
3113- return ManagedEVPPKey (pkey. release ( ));
3113+ return ManagedEVPPKey (std::move (pkey ));
31143114 } else {
31153115 CHECK (args[*offset]->IsObject () && allow_key_object);
31163116 KeyObject* key;
@@ -3169,7 +3169,7 @@ static ManagedEVPPKey GetPublicOrPrivateKeyFromJs(
31693169 }
31703170 if (!pkey)
31713171 ThrowCryptoError (env, ERR_get_error (), " Failed to read asymmetric key" );
3172- return ManagedEVPPKey (pkey. release ( ));
3172+ return ManagedEVPPKey (std::move (pkey ));
31733173 } else {
31743174 CHECK (args[*offset]->IsObject ());
31753175 KeyObject* key = Unwrap<KeyObject>(args[*offset].As <Object>());
@@ -3259,42 +3259,27 @@ static MaybeLocal<Value> WritePrivateKey(
32593259 return BIOToStringOrBuffer (env, bio.get (), config.format_ );
32603260}
32613261
3262- ManagedEVPPKey::ManagedEVPPKey () : pkey_(nullptr ) {}
3263-
3264- ManagedEVPPKey::ManagedEVPPKey (EVP_PKEY* pkey) : pkey_(pkey) {}
3262+ ManagedEVPPKey::ManagedEVPPKey (EVPKeyPointer&& pkey) : pkey_(std::move(pkey)) {}
32653263
3266- ManagedEVPPKey::ManagedEVPPKey (const ManagedEVPPKey& key) : pkey_( nullptr ) {
3267- *this = key ;
3264+ ManagedEVPPKey::ManagedEVPPKey (const ManagedEVPPKey& that ) {
3265+ *this = that ;
32683266}
32693267
3270- ManagedEVPPKey::ManagedEVPPKey (ManagedEVPPKey&& key) {
3271- *this = key;
3272- }
3268+ ManagedEVPPKey& ManagedEVPPKey::operator =(const ManagedEVPPKey& that) {
3269+ pkey_.reset (that.get ());
32733270
3274- ManagedEVPPKey::~ManagedEVPPKey () {
3275- EVP_PKEY_free (pkey_);
3276- }
3277-
3278- ManagedEVPPKey& ManagedEVPPKey::operator =(const ManagedEVPPKey& key) {
3279- EVP_PKEY_free (pkey_);
3280- pkey_ = key.pkey_ ;
3281- EVP_PKEY_up_ref (pkey_);
3282- return *this ;
3283- }
3271+ if (pkey_)
3272+ EVP_PKEY_up_ref (pkey_.get ());
32843273
3285- ManagedEVPPKey& ManagedEVPPKey::operator =(ManagedEVPPKey&& key) {
3286- EVP_PKEY_free (pkey_);
3287- pkey_ = key.pkey_ ;
3288- key.pkey_ = nullptr ;
32893274 return *this ;
32903275}
32913276
32923277ManagedEVPPKey::operator bool () const {
3293- return pkey_ != nullptr ;
3278+ return !!pkey_ ;
32943279}
32953280
32963281EVP_PKEY* ManagedEVPPKey::get () const {
3297- return pkey_;
3282+ return pkey_. get () ;
32983283}
32993284
33003285Local<Function> KeyObject::Initialize (Environment* env, Local<Object> target) {
@@ -5672,13 +5657,13 @@ class DSAKeyPairGenerationConfig : public KeyPairGenerationConfig {
56725657 }
56735658 }
56745659
5675- EVP_PKEY* params = nullptr ;
5676- if (EVP_PKEY_paramgen (param_ctx.get (), ¶ms ) <= 0 )
5660+ EVP_PKEY* raw_params = nullptr ;
5661+ if (EVP_PKEY_paramgen (param_ctx.get (), &raw_params ) <= 0 )
56775662 return nullptr ;
5663+ EVPKeyPointer params (raw_params);
56785664 param_ctx.reset ();
56795665
5680- EVPKeyCtxPointer key_ctx (EVP_PKEY_CTX_new (params, nullptr ));
5681- EVP_PKEY_free (params);
5666+ EVPKeyCtxPointer key_ctx (EVP_PKEY_CTX_new (params.get (), nullptr ));
56825667 return key_ctx;
56835668 }
56845669
@@ -5707,13 +5692,13 @@ class ECKeyPairGenerationConfig : public KeyPairGenerationConfig {
57075692 if (EVP_PKEY_CTX_set_ec_param_enc (param_ctx.get (), param_encoding_) <= 0 )
57085693 return nullptr ;
57095694
5710- EVP_PKEY* params = nullptr ;
5711- if (EVP_PKEY_paramgen (param_ctx.get (), ¶ms ) <= 0 )
5695+ EVP_PKEY* raw_params = nullptr ;
5696+ if (EVP_PKEY_paramgen (param_ctx.get (), &raw_params ) <= 0 )
57125697 return nullptr ;
5698+ EVPKeyPointer params (raw_params);
57135699 param_ctx.reset ();
57145700
5715- EVPKeyCtxPointer key_ctx (EVP_PKEY_CTX_new (params, nullptr ));
5716- EVP_PKEY_free (params);
5701+ EVPKeyCtxPointer key_ctx (EVP_PKEY_CTX_new (params.get (), nullptr ));
57175702 return key_ctx;
57185703 }
57195704
@@ -5761,7 +5746,7 @@ class GenerateKeyPairJob : public CryptoJob {
57615746 EVP_PKEY* pkey = nullptr ;
57625747 if (EVP_PKEY_keygen (ctx.get (), &pkey) != 1 )
57635748 return false ;
5764- pkey_ = ManagedEVPPKey (pkey);
5749+ pkey_ = ManagedEVPPKey (EVPKeyPointer ( pkey) );
57655750 return true ;
57665751 }
57675752
0 commit comments