Skip to content

Commit 3610155

Browse files
bnoordhuisdanbev
authored andcommitted
src: use EVPKeyPointer in more places
Rejoice, the code base is now free of manual EVP_PKEY_free() calls! PR-URL: #26632 Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Tobias Nießen <[email protected]> Reviewed-By: Minwoo Jung <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent 0f745bf commit 3610155

File tree

2 files changed

+33
-52
lines changed

2 files changed

+33
-52
lines changed

src/node_crypto.cc

Lines changed: 28 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -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

33203305
ManagedEVPPKey::operator bool() const {
3321-
return pkey_ != nullptr;
3306+
return !!pkey_;
33223307
}
33233308

33243309
EVP_PKEY* ManagedEVPPKey::get() const {
3325-
return pkey_;
3310+
return pkey_.get();
33263311
}
33273312

33283313
Local<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(), &params) <= 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(), &params) <= 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

src/node_crypto.h

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -421,20 +421,16 @@ enum KeyType {
421421
// use.
422422
class ManagedEVPPKey {
423423
public:
424-
ManagedEVPPKey();
425-
explicit ManagedEVPPKey(EVP_PKEY* pkey);
426-
ManagedEVPPKey(const ManagedEVPPKey& key);
427-
ManagedEVPPKey(ManagedEVPPKey&& key);
428-
~ManagedEVPPKey();
429-
430-
ManagedEVPPKey& operator=(const ManagedEVPPKey& key);
431-
ManagedEVPPKey& operator=(ManagedEVPPKey&& key);
424+
ManagedEVPPKey() = default;
425+
explicit ManagedEVPPKey(EVPKeyPointer&& pkey);
426+
ManagedEVPPKey(const ManagedEVPPKey& that);
427+
ManagedEVPPKey& operator=(const ManagedEVPPKey& that);
432428

433429
operator bool() const;
434430
EVP_PKEY* get() const;
435431

436432
private:
437-
EVP_PKEY* pkey_;
433+
EVPKeyPointer pkey_;
438434
};
439435

440436
class KeyObject : public BaseObject {

0 commit comments

Comments
 (0)