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

Commit 2a284ba

Browse files
addaleaxdanbev
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 e81fba9 commit 2a284ba

File tree

2 files changed

+97
-81
lines changed

2 files changed

+97
-81
lines changed

src/node_crypto.cc

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
#include "node_errors.h"
2929
#include "node_mutex.h"
3030
#include "node_process.h"
31-
#include "base_object-inl.h"
3231
#include "tls_wrap.h" // TLSWrap
3332

3433
#include "async_wrap-inl.h"
@@ -526,6 +525,24 @@ void SecureContext::Initialize(Environment* env, Local<Object> target) {
526525
env->set_secure_context_constructor_template(t);
527526
}
528527

528+
SecureContext::SecureContext(Environment* env, v8::Local<v8::Object> wrap)
529+
: BaseObject(env, wrap) {
530+
MakeWeak();
531+
env->isolate()->AdjustAmountOfExternalAllocatedMemory(kExternalSize);
532+
}
533+
534+
inline void SecureContext::Reset() {
535+
if (ctx_ != nullptr) {
536+
env()->isolate()->AdjustAmountOfExternalAllocatedMemory(-kExternalSize);
537+
}
538+
ctx_.reset();
539+
cert_.reset();
540+
issuer_.reset();
541+
}
542+
543+
SecureContext::~SecureContext() {
544+
Reset();
545+
}
529546

530547
void SecureContext::New(const FunctionCallbackInfo<Value>& args) {
531548
Environment* env = Environment::GetCurrent(args);
@@ -3725,6 +3742,15 @@ KeyType KeyObject::GetKeyType() const {
37253742
return this->key_type_;
37263743
}
37273744

3745+
KeyObject::KeyObject(Environment* env,
3746+
v8::Local<v8::Object> wrap,
3747+
KeyType key_type)
3748+
: BaseObject(env, wrap),
3749+
key_type_(key_type),
3750+
symmetric_key_(nullptr, nullptr) {
3751+
MakeWeak();
3752+
}
3753+
37283754
void KeyObject::Init(const FunctionCallbackInfo<Value>& args) {
37293755
KeyObject* key;
37303756
ASSIGN_OR_RETURN_UNWRAP(&key, args.Holder());
@@ -3867,6 +3893,17 @@ MaybeLocal<Value> KeyObject::ExportPrivateKey(
38673893
return WritePrivateKey(env(), asymmetric_key_.get(), config);
38683894
}
38693895

3896+
CipherBase::CipherBase(Environment* env,
3897+
v8::Local<v8::Object> wrap,
3898+
CipherKind kind)
3899+
: BaseObject(env, wrap),
3900+
ctx_(nullptr),
3901+
kind_(kind),
3902+
auth_tag_state_(kAuthTagUnknown),
3903+
auth_tag_len_(kNoAuthTagLength),
3904+
pending_auth_failed_(false) {
3905+
MakeWeak();
3906+
}
38703907

38713908
void CipherBase::Initialize(Environment* env, Local<Object> target) {
38723909
Local<FunctionTemplate> t = env->NewFunctionTemplate(New);
@@ -4489,6 +4526,11 @@ void CipherBase::Final(const FunctionCallbackInfo<Value>& args) {
44894526
args.GetReturnValue().Set(out.ToBuffer().ToLocalChecked());
44904527
}
44914528

4529+
Hmac::Hmac(Environment* env, v8::Local<v8::Object> wrap)
4530+
: BaseObject(env, wrap),
4531+
ctx_(nullptr) {
4532+
MakeWeak();
4533+
}
44924534

44934535
void Hmac::Initialize(Environment* env, Local<Object> target) {
44944536
Local<FunctionTemplate> t = env->NewFunctionTemplate(New);
@@ -4608,6 +4650,13 @@ void Hmac::HmacDigest(const FunctionCallbackInfo<Value>& args) {
46084650
args.GetReturnValue().Set(rc.ToLocalChecked());
46094651
}
46104652

4653+
Hash::Hash(Environment* env, v8::Local<v8::Object> wrap)
4654+
: BaseObject(env, wrap),
4655+
mdctx_(nullptr),
4656+
has_md_(false),
4657+
md_value_(nullptr) {
4658+
MakeWeak();
4659+
}
46114660

46124661
void Hash::Initialize(Environment* env, Local<Object> target) {
46134662
Local<FunctionTemplate> t = env->NewFunctionTemplate(New);
@@ -4622,6 +4671,10 @@ void Hash::Initialize(Environment* env, Local<Object> target) {
46224671
t->GetFunction(env->context()).ToLocalChecked()).Check();
46234672
}
46244673

4674+
Hash::~Hash() {
4675+
if (md_value_ != nullptr)
4676+
OPENSSL_clear_free(md_value_, md_len_);
4677+
}
46254678

46264679
void Hash::New(const FunctionCallbackInfo<Value>& args) {
46274680
Environment* env = Environment::GetCurrent(args);
@@ -4846,6 +4899,10 @@ void CheckThrow(Environment* env, SignBase::Error error) {
48464899
}
48474900
}
48484901

4902+
SignBase::SignBase(Environment* env, v8::Local<v8::Object> wrap)
4903+
: BaseObject(env, wrap) {
4904+
}
4905+
48494906
void SignBase::CheckThrow(SignBase::Error error) {
48504907
node::crypto::CheckThrow(env(), error);
48514908
}
@@ -4869,6 +4926,9 @@ static bool ApplyRSAOptions(const ManagedEVPPKey& pkey,
48694926
}
48704927

48714928

4929+
Sign::Sign(Environment* env, v8::Local<v8::Object> wrap) : SignBase(env, wrap) {
4930+
MakeWeak();
4931+
}
48724932

48734933
void Sign::Initialize(Environment* env, Local<Object> target) {
48744934
Local<FunctionTemplate> t = env->NewFunctionTemplate(New);
@@ -5189,6 +5249,11 @@ void SignOneShot(const FunctionCallbackInfo<Value>& args) {
51895249
args.GetReturnValue().Set(signature.ToBuffer().ToLocalChecked());
51905250
}
51915251

5252+
Verify::Verify(Environment* env, v8::Local<v8::Object> wrap) :
5253+
SignBase(env, wrap) {
5254+
MakeWeak();
5255+
}
5256+
51925257
void Verify::Initialize(Environment* env, Local<Object> target) {
51935258
Local<FunctionTemplate> t = env->NewFunctionTemplate(New);
51945259

@@ -5495,6 +5560,10 @@ void PublicKeyCipher::Cipher(const FunctionCallbackInfo<Value>& args) {
54955560
args.GetReturnValue().Set(out.ToBuffer().ToLocalChecked());
54965561
}
54975562

5563+
DiffieHellman::DiffieHellman(Environment* env, v8::Local<v8::Object> wrap)
5564+
: BaseObject(env, wrap), verifyError_(0) {
5565+
MakeWeak();
5566+
}
54985567

54995568
void DiffieHellman::Initialize(Environment* env, Local<Object> target) {
55005569
auto make = [&] (Local<String> name, FunctionCallback callback) {
@@ -5862,6 +5931,15 @@ void ECDH::Initialize(Environment* env, Local<Object> target) {
58625931
t->GetFunction(env->context()).ToLocalChecked()).Check();
58635932
}
58645933

5934+
ECDH::ECDH(Environment* env, v8::Local<v8::Object> wrap, ECKeyPointer&& key)
5935+
: BaseObject(env, wrap),
5936+
key_(std::move(key)),
5937+
group_(EC_KEY_get0_group(key_.get())) {
5938+
MakeWeak();
5939+
CHECK_NOT_NULL(group_);
5940+
}
5941+
5942+
ECDH::~ECDH() {}
58655943

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

src/node_crypto.h

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

9191
void InitCryptoOnce();
9292

93-
class SecureContext : public BaseObject {
93+
class SecureContext final : public BaseObject {
9494
public:
95-
~SecureContext() override {
96-
Reset();
97-
}
95+
~SecureContext() override;
9896

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

@@ -185,20 +183,8 @@ class SecureContext : public BaseObject {
185183
HMAC_CTX* hctx,
186184
int enc);
187185

188-
SecureContext(Environment* env, v8::Local<v8::Object> wrap)
189-
: BaseObject(env, wrap) {
190-
MakeWeak();
191-
env->isolate()->AdjustAmountOfExternalAllocatedMemory(kExternalSize);
192-
}
193-
194-
inline void Reset() {
195-
if (ctx_ != nullptr) {
196-
env()->isolate()->AdjustAmountOfExternalAllocatedMemory(-kExternalSize);
197-
}
198-
ctx_.reset();
199-
cert_.reset();
200-
issuer_.reset();
201-
}
186+
SecureContext(Environment* env, v8::Local<v8::Object> wrap);
187+
void Reset();
202188
};
203189

204190
#define SSLWRAP_TYPES(V) \
@@ -472,14 +458,7 @@ class KeyObject : public BaseObject {
472458
v8::MaybeLocal<v8::Value> ExportPrivateKey(
473459
const PrivateKeyEncodingConfig& config) const;
474460

475-
KeyObject(Environment* env,
476-
v8::Local<v8::Object> wrap,
477-
KeyType key_type)
478-
: BaseObject(env, wrap),
479-
key_type_(key_type),
480-
symmetric_key_(nullptr, nullptr) {
481-
MakeWeak();
482-
}
461+
KeyObject(Environment* env, v8::Local<v8::Object> wrap, KeyType key_type);
483462

484463
private:
485464
const KeyType key_type_;
@@ -553,17 +532,7 @@ class CipherBase : public BaseObject {
553532
static void SetAuthTag(const v8::FunctionCallbackInfo<v8::Value>& args);
554533
static void SetAAD(const v8::FunctionCallbackInfo<v8::Value>& args);
555534

556-
CipherBase(Environment* env,
557-
v8::Local<v8::Object> wrap,
558-
CipherKind kind)
559-
: BaseObject(env, wrap),
560-
ctx_(nullptr),
561-
kind_(kind),
562-
auth_tag_state_(kAuthTagUnknown),
563-
auth_tag_len_(kNoAuthTagLength),
564-
pending_auth_failed_(false) {
565-
MakeWeak();
566-
}
535+
CipherBase(Environment* env, v8::Local<v8::Object> wrap, CipherKind kind);
567536

568537
private:
569538
DeleteFnPtr<EVP_CIPHER_CTX, EVP_CIPHER_CTX_free> ctx_;
@@ -593,18 +562,16 @@ class Hmac : public BaseObject {
593562
static void HmacUpdate(const v8::FunctionCallbackInfo<v8::Value>& args);
594563
static void HmacDigest(const v8::FunctionCallbackInfo<v8::Value>& args);
595564

596-
Hmac(Environment* env, v8::Local<v8::Object> wrap)
597-
: BaseObject(env, wrap),
598-
ctx_(nullptr) {
599-
MakeWeak();
600-
}
565+
Hmac(Environment* env, v8::Local<v8::Object> wrap);
601566

602567
private:
603568
DeleteFnPtr<HMAC_CTX, HMAC_CTX_free> ctx_;
604569
};
605570

606-
class Hash : public BaseObject {
571+
class Hash final : public BaseObject {
607572
public:
573+
~Hash() override;
574+
608575
static void Initialize(Environment* env, v8::Local<v8::Object> target);
609576

610577
// TODO(joyeecheung): track the memory used by OpenSSL types
@@ -620,18 +587,7 @@ class Hash : public BaseObject {
620587
static void HashUpdate(const v8::FunctionCallbackInfo<v8::Value>& args);
621588
static void HashDigest(const v8::FunctionCallbackInfo<v8::Value>& args);
622589

623-
Hash(Environment* env, v8::Local<v8::Object> wrap)
624-
: BaseObject(env, wrap),
625-
mdctx_(nullptr),
626-
has_md_(false),
627-
md_value_(nullptr) {
628-
MakeWeak();
629-
}
630-
631-
~Hash() override {
632-
if (md_value_ != nullptr)
633-
OPENSSL_clear_free(md_value_, md_len_);
634-
}
590+
Hash(Environment* env, v8::Local<v8::Object> wrap);
635591

636592
private:
637593
EVPMDPointer mdctx_;
@@ -653,9 +609,7 @@ class SignBase : public BaseObject {
653609
kSignMalformedSignature
654610
} Error;
655611

656-
SignBase(Environment* env, v8::Local<v8::Object> wrap)
657-
: BaseObject(env, wrap) {
658-
}
612+
SignBase(Environment* env, v8::Local<v8::Object> wrap);
659613

660614
Error Init(const char* sign_type);
661615
Error Update(const char* data, int len);
@@ -701,9 +655,7 @@ class Sign : public SignBase {
701655
static void SignUpdate(const v8::FunctionCallbackInfo<v8::Value>& args);
702656
static void SignFinal(const v8::FunctionCallbackInfo<v8::Value>& args);
703657

704-
Sign(Environment* env, v8::Local<v8::Object> wrap) : SignBase(env, wrap) {
705-
MakeWeak();
706-
}
658+
Sign(Environment* env, v8::Local<v8::Object> wrap);
707659
};
708660

709661
class Verify : public SignBase {
@@ -723,9 +675,7 @@ class Verify : public SignBase {
723675
static void VerifyUpdate(const v8::FunctionCallbackInfo<v8::Value>& args);
724676
static void VerifyFinal(const v8::FunctionCallbackInfo<v8::Value>& args);
725677

726-
Verify(Environment* env, v8::Local<v8::Object> wrap) : SignBase(env, wrap) {
727-
MakeWeak();
728-
}
678+
Verify(Environment* env, v8::Local<v8::Object> wrap);
729679
};
730680

731681
class PublicKeyCipher {
@@ -782,11 +732,7 @@ class DiffieHellman : public BaseObject {
782732
static void VerifyErrorGetter(
783733
const v8::FunctionCallbackInfo<v8::Value>& args);
784734

785-
DiffieHellman(Environment* env, v8::Local<v8::Object> wrap)
786-
: BaseObject(env, wrap),
787-
verifyError_(0) {
788-
MakeWeak();
789-
}
735+
DiffieHellman(Environment* env, v8::Local<v8::Object> wrap);
790736

791737
// TODO(joyeecheung): track the memory used by OpenSSL types
792738
SET_NO_MEMORY_INFO()
@@ -805,11 +751,9 @@ class DiffieHellman : public BaseObject {
805751
DHPointer dh_;
806752
};
807753

808-
class ECDH : public BaseObject {
754+
class ECDH final : public BaseObject {
809755
public:
810-
~ECDH() override {
811-
group_ = nullptr;
812-
}
756+
~ECDH() override;
813757

814758
static void Initialize(Environment* env, v8::Local<v8::Object> target);
815759
static ECPointPointer BufferToPoint(Environment* env,
@@ -822,13 +766,7 @@ class ECDH : public BaseObject {
822766
SET_SELF_SIZE(ECDH)
823767

824768
protected:
825-
ECDH(Environment* env, v8::Local<v8::Object> wrap, ECKeyPointer&& key)
826-
: BaseObject(env, wrap),
827-
key_(std::move(key)),
828-
group_(EC_KEY_get0_group(key_.get())) {
829-
MakeWeak();
830-
CHECK_NOT_NULL(group_);
831-
}
769+
ECDH(Environment* env, v8::Local<v8::Object> wrap, ECKeyPointer&& key);
832770

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

0 commit comments

Comments
 (0)