Skip to content

Commit 9ab4a7e

Browse files
addaleaxcodebytere
authored andcommitted
src: move BaseObject subclass dtors/ctors out of node_crypto.h
Originally landed in the QUIC repo Move constructor and destructors for subclasses of `BaseObject` from node_crypto.h to node_crypto.cc. This removes the need to include base_object-inl.h when using node_crypto.h in some cases. Original review metadata: ``` PR-URL: nodejs/quic#220 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: James M Snell <[email protected]> ``` PR-URL: #31872 Reviewed-By: Sam Roberts <[email protected]> Reviewed-By: David Carlier <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Denys Otrishko <[email protected]> Reviewed-By: Tobias Nießen <[email protected]>
1 parent ab735d0 commit 9ab4a7e

File tree

2 files changed

+97
-80
lines changed

2 files changed

+97
-80
lines changed

src/node_crypto.cc

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,24 @@ void SecureContext::Initialize(Environment* env, Local<Object> target) {
531531
env->set_secure_context_constructor_template(t);
532532
}
533533

534+
SecureContext::SecureContext(Environment* env, v8::Local<v8::Object> wrap)
535+
: BaseObject(env, wrap) {
536+
MakeWeak();
537+
env->isolate()->AdjustAmountOfExternalAllocatedMemory(kExternalSize);
538+
}
539+
540+
inline void SecureContext::Reset() {
541+
if (ctx_ != nullptr) {
542+
env()->isolate()->AdjustAmountOfExternalAllocatedMemory(-kExternalSize);
543+
}
544+
ctx_.reset();
545+
cert_.reset();
546+
issuer_.reset();
547+
}
548+
549+
SecureContext::~SecureContext() {
550+
Reset();
551+
}
534552

535553
void SecureContext::New(const FunctionCallbackInfo<Value>& args) {
536554
Environment* env = Environment::GetCurrent(args);
@@ -3816,6 +3834,15 @@ KeyType KeyObject::GetKeyType() const {
38163834
return this->key_type_;
38173835
}
38183836

3837+
KeyObject::KeyObject(Environment* env,
3838+
v8::Local<v8::Object> wrap,
3839+
KeyType key_type)
3840+
: BaseObject(env, wrap),
3841+
key_type_(key_type),
3842+
symmetric_key_(nullptr, nullptr) {
3843+
MakeWeak();
3844+
}
3845+
38193846
void KeyObject::Init(const FunctionCallbackInfo<Value>& args) {
38203847
KeyObject* key;
38213848
ASSIGN_OR_RETURN_UNWRAP(&key, args.Holder());
@@ -3958,6 +3985,17 @@ MaybeLocal<Value> KeyObject::ExportPrivateKey(
39583985
return WritePrivateKey(env(), asymmetric_key_.get(), config);
39593986
}
39603987

3988+
CipherBase::CipherBase(Environment* env,
3989+
v8::Local<v8::Object> wrap,
3990+
CipherKind kind)
3991+
: BaseObject(env, wrap),
3992+
ctx_(nullptr),
3993+
kind_(kind),
3994+
auth_tag_state_(kAuthTagUnknown),
3995+
auth_tag_len_(kNoAuthTagLength),
3996+
pending_auth_failed_(false) {
3997+
MakeWeak();
3998+
}
39613999

39624000
void CipherBase::Initialize(Environment* env, Local<Object> target) {
39634001
Local<FunctionTemplate> t = env->NewFunctionTemplate(New);
@@ -4579,6 +4617,11 @@ void CipherBase::Final(const FunctionCallbackInfo<Value>& args) {
45794617
args.GetReturnValue().Set(out.ToBuffer().ToLocalChecked());
45804618
}
45814619

4620+
Hmac::Hmac(Environment* env, v8::Local<v8::Object> wrap)
4621+
: BaseObject(env, wrap),
4622+
ctx_(nullptr) {
4623+
MakeWeak();
4624+
}
45824625

45834626
void Hmac::Initialize(Environment* env, Local<Object> target) {
45844627
Local<FunctionTemplate> t = env->NewFunctionTemplate(New);
@@ -4697,6 +4740,13 @@ void Hmac::HmacDigest(const FunctionCallbackInfo<Value>& args) {
46974740
args.GetReturnValue().Set(rc.ToLocalChecked());
46984741
}
46994742

4743+
Hash::Hash(Environment* env, v8::Local<v8::Object> wrap)
4744+
: BaseObject(env, wrap),
4745+
mdctx_(nullptr),
4746+
has_md_(false),
4747+
md_value_(nullptr) {
4748+
MakeWeak();
4749+
}
47004750

47014751
void Hash::Initialize(Environment* env, Local<Object> target) {
47024752
Local<FunctionTemplate> t = env->NewFunctionTemplate(New);
@@ -4711,6 +4761,10 @@ void Hash::Initialize(Environment* env, Local<Object> target) {
47114761
t->GetFunction(env->context()).ToLocalChecked()).Check();
47124762
}
47134763

4764+
Hash::~Hash() {
4765+
if (md_value_ != nullptr)
4766+
OPENSSL_clear_free(md_value_, md_len_);
4767+
}
47144768

47154769
void Hash::New(const FunctionCallbackInfo<Value>& args) {
47164770
Environment* env = Environment::GetCurrent(args);
@@ -4934,6 +4988,10 @@ void CheckThrow(Environment* env, SignBase::Error error) {
49344988
}
49354989
}
49364990

4991+
SignBase::SignBase(Environment* env, v8::Local<v8::Object> wrap)
4992+
: BaseObject(env, wrap) {
4993+
}
4994+
49374995
void SignBase::CheckThrow(SignBase::Error error) {
49384996
node::crypto::CheckThrow(env(), error);
49394997
}
@@ -4957,6 +5015,9 @@ static bool ApplyRSAOptions(const ManagedEVPPKey& pkey,
49575015
}
49585016

49595017

5018+
Sign::Sign(Environment* env, v8::Local<v8::Object> wrap) : SignBase(env, wrap) {
5019+
MakeWeak();
5020+
}
49605021

49615022
void Sign::Initialize(Environment* env, Local<Object> target) {
49625023
Local<FunctionTemplate> t = env->NewFunctionTemplate(New);
@@ -5277,6 +5338,11 @@ void SignOneShot(const FunctionCallbackInfo<Value>& args) {
52775338
args.GetReturnValue().Set(signature.ToBuffer().ToLocalChecked());
52785339
}
52795340

5341+
Verify::Verify(Environment* env, v8::Local<v8::Object> wrap) :
5342+
SignBase(env, wrap) {
5343+
MakeWeak();
5344+
}
5345+
52805346
void Verify::Initialize(Environment* env, Local<Object> target) {
52815347
Local<FunctionTemplate> t = env->NewFunctionTemplate(New);
52825348

@@ -5580,6 +5646,10 @@ void PublicKeyCipher::Cipher(const FunctionCallbackInfo<Value>& args) {
55805646
args.GetReturnValue().Set(out.ToBuffer().ToLocalChecked());
55815647
}
55825648

5649+
DiffieHellman::DiffieHellman(Environment* env, v8::Local<v8::Object> wrap)
5650+
: BaseObject(env, wrap), verifyError_(0) {
5651+
MakeWeak();
5652+
}
55835653

55845654
void DiffieHellman::Initialize(Environment* env, Local<Object> target) {
55855655
auto make = [&] (Local<String> name, FunctionCallback callback) {
@@ -5947,6 +6017,15 @@ void ECDH::Initialize(Environment* env, Local<Object> target) {
59476017
t->GetFunction(env->context()).ToLocalChecked()).Check();
59486018
}
59496019

6020+
ECDH::ECDH(Environment* env, v8::Local<v8::Object> wrap, ECKeyPointer&& key)
6021+
: BaseObject(env, wrap),
6022+
key_(std::move(key)),
6023+
group_(EC_KEY_get0_group(key_.get())) {
6024+
MakeWeak();
6025+
CHECK_NOT_NULL(group_);
6026+
}
6027+
6028+
ECDH::~ECDH() {}
59506029

59516030
void ECDH::New(const FunctionCallbackInfo<Value>& args) {
59526031
Environment* env = Environment::GetCurrent(args);

src/node_crypto.h

Lines changed: 18 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,9 @@ extern void UseExtraCaCerts(const std::string& file);
8484

8585
void InitCryptoOnce();
8686

87-
class SecureContext : public BaseObject {
87+
class SecureContext final : public BaseObject {
8888
public:
89-
~SecureContext() override {
90-
Reset();
91-
}
89+
~SecureContext() override;
9290

9391
static void Initialize(Environment* env, v8::Local<v8::Object> target);
9492

@@ -177,20 +175,8 @@ class SecureContext : public BaseObject {
177175
HMAC_CTX* hctx,
178176
int enc);
179177

180-
SecureContext(Environment* env, v8::Local<v8::Object> wrap)
181-
: BaseObject(env, wrap) {
182-
MakeWeak();
183-
env->isolate()->AdjustAmountOfExternalAllocatedMemory(kExternalSize);
184-
}
185-
186-
inline void Reset() {
187-
if (ctx_ != nullptr) {
188-
env()->isolate()->AdjustAmountOfExternalAllocatedMemory(-kExternalSize);
189-
}
190-
ctx_.reset();
191-
cert_.reset();
192-
issuer_.reset();
193-
}
178+
SecureContext(Environment* env, v8::Local<v8::Object> wrap);
179+
void Reset();
194180
};
195181

196182
// SSLWrap implicitly depends on the inheriting class' handle having an
@@ -460,14 +446,7 @@ class KeyObject : public BaseObject {
460446
v8::MaybeLocal<v8::Value> ExportPrivateKey(
461447
const PrivateKeyEncodingConfig& config) const;
462448

463-
KeyObject(Environment* env,
464-
v8::Local<v8::Object> wrap,
465-
KeyType key_type)
466-
: BaseObject(env, wrap),
467-
key_type_(key_type),
468-
symmetric_key_(nullptr, nullptr) {
469-
MakeWeak();
470-
}
449+
KeyObject(Environment* env, v8::Local<v8::Object> wrap, KeyType key_type);
471450

472451
private:
473452
const KeyType key_type_;
@@ -541,17 +520,7 @@ class CipherBase : public BaseObject {
541520
static void SetAuthTag(const v8::FunctionCallbackInfo<v8::Value>& args);
542521
static void SetAAD(const v8::FunctionCallbackInfo<v8::Value>& args);
543522

544-
CipherBase(Environment* env,
545-
v8::Local<v8::Object> wrap,
546-
CipherKind kind)
547-
: BaseObject(env, wrap),
548-
ctx_(nullptr),
549-
kind_(kind),
550-
auth_tag_state_(kAuthTagUnknown),
551-
auth_tag_len_(kNoAuthTagLength),
552-
pending_auth_failed_(false) {
553-
MakeWeak();
554-
}
523+
CipherBase(Environment* env, v8::Local<v8::Object> wrap, CipherKind kind);
555524

556525
private:
557526
DeleteFnPtr<EVP_CIPHER_CTX, EVP_CIPHER_CTX_free> ctx_;
@@ -581,18 +550,16 @@ class Hmac : public BaseObject {
581550
static void HmacUpdate(const v8::FunctionCallbackInfo<v8::Value>& args);
582551
static void HmacDigest(const v8::FunctionCallbackInfo<v8::Value>& args);
583552

584-
Hmac(Environment* env, v8::Local<v8::Object> wrap)
585-
: BaseObject(env, wrap),
586-
ctx_(nullptr) {
587-
MakeWeak();
588-
}
553+
Hmac(Environment* env, v8::Local<v8::Object> wrap);
589554

590555
private:
591556
DeleteFnPtr<HMAC_CTX, HMAC_CTX_free> ctx_;
592557
};
593558

594-
class Hash : public BaseObject {
559+
class Hash final : public BaseObject {
595560
public:
561+
~Hash() override;
562+
596563
static void Initialize(Environment* env, v8::Local<v8::Object> target);
597564

598565
// TODO(joyeecheung): track the memory used by OpenSSL types
@@ -608,18 +575,7 @@ class Hash : public BaseObject {
608575
static void HashUpdate(const v8::FunctionCallbackInfo<v8::Value>& args);
609576
static void HashDigest(const v8::FunctionCallbackInfo<v8::Value>& args);
610577

611-
Hash(Environment* env, v8::Local<v8::Object> wrap)
612-
: BaseObject(env, wrap),
613-
mdctx_(nullptr),
614-
has_md_(false),
615-
md_value_(nullptr) {
616-
MakeWeak();
617-
}
618-
619-
~Hash() override {
620-
if (md_value_ != nullptr)
621-
OPENSSL_clear_free(md_value_, md_len_);
622-
}
578+
Hash(Environment* env, v8::Local<v8::Object> wrap);
623579

624580
private:
625581
EVPMDPointer mdctx_;
@@ -641,9 +597,7 @@ class SignBase : public BaseObject {
641597
kSignMalformedSignature
642598
} Error;
643599

644-
SignBase(Environment* env, v8::Local<v8::Object> wrap)
645-
: BaseObject(env, wrap) {
646-
}
600+
SignBase(Environment* env, v8::Local<v8::Object> wrap);
647601

648602
Error Init(const char* sign_type);
649603
Error Update(const char* data, int len);
@@ -689,9 +643,7 @@ class Sign : public SignBase {
689643
static void SignUpdate(const v8::FunctionCallbackInfo<v8::Value>& args);
690644
static void SignFinal(const v8::FunctionCallbackInfo<v8::Value>& args);
691645

692-
Sign(Environment* env, v8::Local<v8::Object> wrap) : SignBase(env, wrap) {
693-
MakeWeak();
694-
}
646+
Sign(Environment* env, v8::Local<v8::Object> wrap);
695647
};
696648

697649
class Verify : public SignBase {
@@ -710,9 +662,7 @@ class Verify : public SignBase {
710662
static void VerifyUpdate(const v8::FunctionCallbackInfo<v8::Value>& args);
711663
static void VerifyFinal(const v8::FunctionCallbackInfo<v8::Value>& args);
712664

713-
Verify(Environment* env, v8::Local<v8::Object> wrap) : SignBase(env, wrap) {
714-
MakeWeak();
715-
}
665+
Verify(Environment* env, v8::Local<v8::Object> wrap);
716666
};
717667

718668
class PublicKeyCipher {
@@ -769,11 +719,7 @@ class DiffieHellman : public BaseObject {
769719
static void VerifyErrorGetter(
770720
const v8::FunctionCallbackInfo<v8::Value>& args);
771721

772-
DiffieHellman(Environment* env, v8::Local<v8::Object> wrap)
773-
: BaseObject(env, wrap),
774-
verifyError_(0) {
775-
MakeWeak();
776-
}
722+
DiffieHellman(Environment* env, v8::Local<v8::Object> wrap);
777723

778724
// TODO(joyeecheung): track the memory used by OpenSSL types
779725
SET_NO_MEMORY_INFO()
@@ -792,11 +738,9 @@ class DiffieHellman : public BaseObject {
792738
DHPointer dh_;
793739
};
794740

795-
class ECDH : public BaseObject {
741+
class ECDH final : public BaseObject {
796742
public:
797-
~ECDH() override {
798-
group_ = nullptr;
799-
}
743+
~ECDH() override;
800744

801745
static void Initialize(Environment* env, v8::Local<v8::Object> target);
802746
static ECPointPointer BufferToPoint(Environment* env,
@@ -809,13 +753,7 @@ class ECDH : public BaseObject {
809753
SET_SELF_SIZE(ECDH)
810754

811755
protected:
812-
ECDH(Environment* env, v8::Local<v8::Object> wrap, ECKeyPointer&& key)
813-
: BaseObject(env, wrap),
814-
key_(std::move(key)),
815-
group_(EC_KEY_get0_group(key_.get())) {
816-
MakeWeak();
817-
CHECK_NOT_NULL(group_);
818-
}
756+
ECDH(Environment* env, v8::Local<v8::Object> wrap, ECKeyPointer&& key);
819757

820758
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
821759
static void GenerateKeys(const v8::FunctionCallbackInfo<v8::Value>& args);

0 commit comments

Comments
 (0)