Skip to content

Commit 15ec381

Browse files
bnoordhuistargos
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 <cjihrig@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Minwoo Jung <minwoo@nodesource.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent 30d7f67 commit 15ec381

File tree

2 files changed

+33
-52
lines changed

2 files changed

+33
-52
lines changed

src/node_crypto.cc

+28-43
Original file line numberDiff line numberDiff line change
@@ -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

32923277
ManagedEVPPKey::operator bool() const {
3293-
return pkey_ != nullptr;
3278+
return !!pkey_;
32943279
}
32953280

32963281
EVP_PKEY* ManagedEVPPKey::get() const {
3297-
return pkey_;
3282+
return pkey_.get();
32983283
}
32993284

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

src/node_crypto.h

+5-9
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)