Skip to content
This repository was archived by the owner on Aug 11, 2020. It is now read-only.

Commit 77f103b

Browse files
addaleaxjasnell
authored andcommitted
src: move BaseObject subclass dtors/ctors out of node_crypto.h
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. PR-URL: #220 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent 0772b16 commit 77f103b

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);
@@ -3811,6 +3829,15 @@ KeyType KeyObject::GetKeyType() const {
38113829
return this->key_type_;
38123830
}
38133831

3832+
KeyObject::KeyObject(Environment* env,
3833+
v8::Local<v8::Object> wrap,
3834+
KeyType key_type)
3835+
: BaseObject(env, wrap),
3836+
key_type_(key_type),
3837+
symmetric_key_(nullptr, nullptr) {
3838+
MakeWeak();
3839+
}
3840+
38143841
void KeyObject::Init(const FunctionCallbackInfo<Value>& args) {
38153842
KeyObject* key;
38163843
ASSIGN_OR_RETURN_UNWRAP(&key, args.Holder());
@@ -3955,6 +3982,17 @@ MaybeLocal<Value> KeyObject::ExportPrivateKey(
39553982
return WritePrivateKey(env(), asymmetric_key_.get(), config);
39563983
}
39573984

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

39593997
void CipherBase::Initialize(Environment* env, Local<Object> target) {
39603998
Local<FunctionTemplate> t = env->NewFunctionTemplate(New);
@@ -4577,6 +4615,11 @@ void CipherBase::Final(const FunctionCallbackInfo<Value>& args) {
45774615
args.GetReturnValue().Set(out.ToBuffer().ToLocalChecked());
45784616
}
45794617

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

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

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

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

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

47144768
void Hash::New(const FunctionCallbackInfo<Value>& args) {
47154769
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

@@ -5584,6 +5650,10 @@ void PublicKeyCipher::Cipher(const FunctionCallbackInfo<Value>& args) {
55845650
args.GetReturnValue().Set(out.ToBuffer().ToLocalChecked());
55855651
}
55865652

5653+
DiffieHellman::DiffieHellman(Environment* env, v8::Local<v8::Object> wrap)
5654+
: BaseObject(env, wrap), verifyError_(0) {
5655+
MakeWeak();
5656+
}
55875657

55885658
void DiffieHellman::Initialize(Environment* env, Local<Object> target) {
55895659
auto make = [&] (Local<String> name, FunctionCallback callback) {
@@ -5953,6 +6023,15 @@ void ECDH::Initialize(Environment* env, Local<Object> target) {
59536023
t->GetFunction(env->context()).ToLocalChecked()).Check();
59546024
}
59556025

6026+
ECDH::ECDH(Environment* env, v8::Local<v8::Object> wrap, ECKeyPointer&& key)
6027+
: BaseObject(env, wrap),
6028+
key_(std::move(key)),
6029+
group_(EC_KEY_get0_group(key_.get())) {
6030+
MakeWeak();
6031+
CHECK_NOT_NULL(group_);
6032+
}
6033+
6034+
ECDH::~ECDH() {}
59566035

59576036
void ECDH::New(const FunctionCallbackInfo<Value>& args) {
59586037
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
@@ -461,14 +447,7 @@ class KeyObject : public BaseObject {
461447
v8::MaybeLocal<v8::Value> ExportPrivateKey(
462448
const PrivateKeyEncodingConfig& config) const;
463449

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

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

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

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

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

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

595-
class Hash : public BaseObject {
560+
class Hash final : public BaseObject {
596561
public:
562+
~Hash() override;
563+
597564
static void Initialize(Environment* env, v8::Local<v8::Object> target);
598565

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

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

625581
private:
626582
EVPMDPointer mdctx_;
@@ -642,9 +598,7 @@ class SignBase : public BaseObject {
642598
kSignMalformedSignature
643599
} Error;
644600

645-
SignBase(Environment* env, v8::Local<v8::Object> wrap)
646-
: BaseObject(env, wrap) {
647-
}
601+
SignBase(Environment* env, v8::Local<v8::Object> wrap);
648602

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

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

698650
class Verify : public SignBase {
@@ -712,9 +664,7 @@ class Verify : public SignBase {
712664
static void VerifyUpdate(const v8::FunctionCallbackInfo<v8::Value>& args);
713665
static void VerifyFinal(const v8::FunctionCallbackInfo<v8::Value>& args);
714666

715-
Verify(Environment* env, v8::Local<v8::Object> wrap) : SignBase(env, wrap) {
716-
MakeWeak();
717-
}
667+
Verify(Environment* env, v8::Local<v8::Object> wrap);
718668
};
719669

720670
class PublicKeyCipher {
@@ -771,11 +721,7 @@ class DiffieHellman : public BaseObject {
771721
static void VerifyErrorGetter(
772722
const v8::FunctionCallbackInfo<v8::Value>& args);
773723

774-
DiffieHellman(Environment* env, v8::Local<v8::Object> wrap)
775-
: BaseObject(env, wrap),
776-
verifyError_(0) {
777-
MakeWeak();
778-
}
724+
DiffieHellman(Environment* env, v8::Local<v8::Object> wrap);
779725

780726
// TODO(joyeecheung): track the memory used by OpenSSL types
781727
SET_NO_MEMORY_INFO()
@@ -794,11 +740,9 @@ class DiffieHellman : public BaseObject {
794740
DHPointer dh_;
795741
};
796742

797-
class ECDH : public BaseObject {
743+
class ECDH final : public BaseObject {
798744
public:
799-
~ECDH() override {
800-
group_ = nullptr;
801-
}
745+
~ECDH() override;
802746

803747
static void Initialize(Environment* env, v8::Local<v8::Object> target);
804748
static ECPointPointer BufferToPoint(Environment* env,
@@ -811,13 +755,7 @@ class ECDH : public BaseObject {
811755
SET_SELF_SIZE(ECDH)
812756

813757
protected:
814-
ECDH(Environment* env, v8::Local<v8::Object> wrap, ECKeyPointer&& key)
815-
: BaseObject(env, wrap),
816-
key_(std::move(key)),
817-
group_(EC_KEY_get0_group(key_.get())) {
818-
MakeWeak();
819-
CHECK_NOT_NULL(group_);
820-
}
758+
ECDH(Environment* env, v8::Local<v8::Object> wrap, ECKeyPointer&& key);
821759

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

0 commit comments

Comments
 (0)