Skip to content

Commit a11f9ea

Browse files
joyeecheungtargos
authored andcommitted
src: register external references in crypto bindings
PR-URL: #40239 Refs: #38905 Refs: #37476 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Minwoo Jung <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent fafc553 commit a11f9ea

38 files changed

+405
-33
lines changed

src/crypto/crypto_aes.cc

+4
Original file line numberDiff line numberDiff line change
@@ -603,5 +603,9 @@ void AES::Initialize(Environment* env, Local<Object> target) {
603603
#undef V
604604
}
605605

606+
void AES::RegisterExternalReferences(ExternalReferenceRegistry* registry) {
607+
AESCryptoJob::RegisterExternalReferences(registry);
608+
}
609+
606610
} // namespace crypto
607611
} // namespace node

src/crypto/crypto_aes.h

+1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ using AESCryptoJob = CipherJob<AESCipherTraits>;
8181

8282
namespace AES {
8383
void Initialize(Environment* env, v8::Local<v8::Object> target);
84+
void RegisterExternalReferences(ExternalReferenceRegistry* registry);
8485
} // namespace AES
8586
} // namespace crypto
8687
} // namespace node

src/crypto/crypto_cipher.cc

+32
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,38 @@ void CipherBase::Initialize(Environment* env, Local<Object> target) {
297297
NODE_DEFINE_CONSTANT(target, kWebCryptoCipherDecrypt);
298298
}
299299

300+
void CipherBase::RegisterExternalReferences(
301+
ExternalReferenceRegistry* registry) {
302+
registry->Register(New);
303+
304+
registry->Register(Init);
305+
registry->Register(InitIv);
306+
registry->Register(Update);
307+
registry->Register(Final);
308+
registry->Register(SetAutoPadding);
309+
registry->Register(GetAuthTag);
310+
registry->Register(SetAuthTag);
311+
registry->Register(SetAAD);
312+
313+
registry->Register(GetSSLCiphers);
314+
registry->Register(GetCiphers);
315+
316+
registry->Register(PublicKeyCipher::Cipher<PublicKeyCipher::kPublic,
317+
EVP_PKEY_encrypt_init,
318+
EVP_PKEY_encrypt>);
319+
registry->Register(PublicKeyCipher::Cipher<PublicKeyCipher::kPrivate,
320+
EVP_PKEY_decrypt_init,
321+
EVP_PKEY_decrypt>);
322+
registry->Register(PublicKeyCipher::Cipher<PublicKeyCipher::kPrivate,
323+
EVP_PKEY_sign_init,
324+
EVP_PKEY_sign>);
325+
registry->Register(PublicKeyCipher::Cipher<PublicKeyCipher::kPublic,
326+
EVP_PKEY_verify_recover_init,
327+
EVP_PKEY_verify_recover>);
328+
329+
registry->Register(GetCipherInfo);
330+
}
331+
300332
void CipherBase::New(const FunctionCallbackInfo<Value>& args) {
301333
CHECK(args.IsConstructCall());
302334
Environment* env = Environment::GetCurrent(args);

src/crypto/crypto_cipher.h

+5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class CipherBase : public BaseObject {
2121
static void GetCiphers(const v8::FunctionCallbackInfo<v8::Value>& args);
2222

2323
static void Initialize(Environment* env, v8::Local<v8::Object> target);
24+
static void RegisterExternalReferences(ExternalReferenceRegistry* registry);
2425

2526
void MemoryInfo(MemoryTracker* tracker) const override;
2627
SET_MEMORY_INFO_NAME(CipherBase)
@@ -190,6 +191,10 @@ class CipherJob final : public CryptoJob<CipherTraits> {
190191
CryptoJob<CipherTraits>::Initialize(New, env, target);
191192
}
192193

194+
static void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
195+
CryptoJob<CipherTraits>::RegisterExternalReferences(New, registry);
196+
}
197+
193198
CipherJob(
194199
Environment* env,
195200
v8::Local<v8::Object> object,

src/crypto/crypto_context.cc

+41
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,47 @@ void SecureContext::Initialize(Environment* env, Local<Object> target) {
339339
IsExtraRootCertsFileLoaded);
340340
}
341341

342+
void SecureContext::RegisterExternalReferences(
343+
ExternalReferenceRegistry* registry) {
344+
registry->Register(New);
345+
registry->Register(Init);
346+
registry->Register(SetKey);
347+
registry->Register(SetCert);
348+
registry->Register(AddCACert);
349+
registry->Register(AddCRL);
350+
registry->Register(AddRootCerts);
351+
registry->Register(SetCipherSuites);
352+
registry->Register(SetCiphers);
353+
registry->Register(SetSigalgs);
354+
registry->Register(SetECDHCurve);
355+
registry->Register(SetDHParam);
356+
registry->Register(SetMaxProto);
357+
registry->Register(SetMinProto);
358+
registry->Register(GetMaxProto);
359+
registry->Register(GetMinProto);
360+
registry->Register(SetOptions);
361+
registry->Register(SetSessionIdContext);
362+
registry->Register(SetSessionTimeout);
363+
registry->Register(Close);
364+
registry->Register(LoadPKCS12);
365+
registry->Register(SetTicketKeys);
366+
registry->Register(SetFreeListLength);
367+
registry->Register(EnableTicketKeyCallback);
368+
registry->Register(GetTicketKeys);
369+
registry->Register(GetCertificate<true>);
370+
registry->Register(GetCertificate<false>);
371+
372+
#ifndef OPENSSL_NO_ENGINE
373+
registry->Register(SetEngineKey);
374+
registry->Register(SetClientCertEngine);
375+
#endif // !OPENSSL_NO_ENGINE
376+
377+
registry->Register(CtxGetter);
378+
379+
registry->Register(GetRootCertificates);
380+
registry->Register(IsExtraRootCertsFileLoaded);
381+
}
382+
342383
SecureContext* SecureContext::Create(Environment* env) {
343384
Local<Object> obj;
344385
if (!GetConstructorTemplate(env)

src/crypto/crypto_context.h

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class SecureContext final : public BaseObject {
3838
static v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
3939
Environment* env);
4040
static void Initialize(Environment* env, v8::Local<v8::Object> target);
41+
static void RegisterExternalReferences(ExternalReferenceRegistry* registry);
4142
static SecureContext* Create(Environment* env);
4243

4344
SSL_CTX* operator*() const { return ctx_.get(); }

src/crypto/crypto_dh.cc

+22
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,28 @@ void DiffieHellman::Initialize(Environment* env, Local<Object> target) {
108108
DHBitsJob::Initialize(env, target);
109109
}
110110

111+
void DiffieHellman::RegisterExternalReferences(
112+
ExternalReferenceRegistry* registry) {
113+
registry->Register(New);
114+
registry->Register(DiffieHellmanGroup);
115+
116+
registry->Register(GenerateKeys);
117+
registry->Register(ComputeSecret);
118+
registry->Register(GetPrime);
119+
registry->Register(GetGenerator);
120+
registry->Register(GetPublicKey);
121+
registry->Register(GetPrivateKey);
122+
registry->Register(SetPublicKey);
123+
registry->Register(SetPrivateKey);
124+
125+
registry->Register(DiffieHellman::VerifyErrorGetter);
126+
registry->Register(DiffieHellman::Stateless);
127+
128+
DHKeyPairGenJob::RegisterExternalReferences(registry);
129+
DHKeyExportJob::RegisterExternalReferences(registry);
130+
DHBitsJob::RegisterExternalReferences(registry);
131+
}
132+
111133
bool DiffieHellman::Init(int primeLength, int g) {
112134
dh_.reset(DH_new());
113135
if (!DH_generate_parameters_ex(dh_.get(), primeLength, g, nullptr))

src/crypto/crypto_dh.h

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ namespace crypto {
1717
class DiffieHellman : public BaseObject {
1818
public:
1919
static void Initialize(Environment* env, v8::Local<v8::Object> target);
20+
static void RegisterExternalReferences(ExternalReferenceRegistry* registry);
2021

2122
bool Init(int primeLength, int g);
2223
bool Init(const char* p, int p_len, int g);

src/crypto/crypto_dsa.cc

+5
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,11 @@ void Initialize(Environment* env, Local<Object> target) {
167167
DsaKeyPairGenJob::Initialize(env, target);
168168
DSAKeyExportJob::Initialize(env, target);
169169
}
170+
171+
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
172+
DsaKeyPairGenJob::RegisterExternalReferences(registry);
173+
DSAKeyExportJob::RegisterExternalReferences(registry);
174+
}
170175
} // namespace DSAAlg
171176
} // namespace crypto
172177
} // namespace node

src/crypto/crypto_dsa.h

+1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ v8::Maybe<bool> GetDsaKeyDetail(
6868

6969
namespace DSAAlg {
7070
void Initialize(Environment* env, v8::Local<v8::Object> target);
71+
void RegisterExternalReferences(ExternalReferenceRegistry* registry);
7172
} // namespace DSAAlg
7273
} // namespace crypto
7374
} // namespace node

src/crypto/crypto_ec.cc

+16
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,22 @@ void ECDH::Initialize(Environment* env, Local<Object> target) {
8383
NODE_DEFINE_CONSTANT(target, OPENSSL_EC_EXPLICIT_CURVE);
8484
}
8585

86+
void ECDH::RegisterExternalReferences(ExternalReferenceRegistry* registry) {
87+
registry->Register(New);
88+
registry->Register(GenerateKeys);
89+
registry->Register(ComputeSecret);
90+
registry->Register(GetPublicKey);
91+
registry->Register(GetPrivateKey);
92+
registry->Register(SetPublicKey);
93+
registry->Register(SetPrivateKey);
94+
registry->Register(ECDH::ConvertKey);
95+
registry->Register(ECDH::GetCurves);
96+
97+
ECDHBitsJob::RegisterExternalReferences(registry);
98+
ECKeyPairGenJob::RegisterExternalReferences(registry);
99+
ECKeyExportJob::RegisterExternalReferences(registry);
100+
}
101+
86102
void ECDH::GetCurves(const FunctionCallbackInfo<Value>& args) {
87103
Environment* env = Environment::GetCurrent(args);
88104
const size_t num_curves = EC_get_builtin_curves(nullptr, 0);

src/crypto/crypto_ec.h

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class ECDH final : public BaseObject {
2424
~ECDH() override;
2525

2626
static void Initialize(Environment* env, v8::Local<v8::Object> target);
27+
static void RegisterExternalReferences(ExternalReferenceRegistry* registry);
28+
2729
static ECPointPointer BufferToPoint(Environment* env,
2830
const EC_GROUP* group,
2931
v8::Local<v8::Value> buf);

src/crypto/crypto_hash.cc

+9
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,15 @@ void Hash::Initialize(Environment* env, Local<Object> target) {
5757
HashJob::Initialize(env, target);
5858
}
5959

60+
void Hash::RegisterExternalReferences(ExternalReferenceRegistry* registry) {
61+
registry->Register(New);
62+
registry->Register(HashUpdate);
63+
registry->Register(HashDigest);
64+
registry->Register(GetHashes);
65+
66+
HashJob::RegisterExternalReferences(registry);
67+
}
68+
6069
void Hash::New(const FunctionCallbackInfo<Value>& args) {
6170
Environment* env = Environment::GetCurrent(args);
6271

src/crypto/crypto_hash.h

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace crypto {
1616
class Hash final : public BaseObject {
1717
public:
1818
static void Initialize(Environment* env, v8::Local<v8::Object> target);
19+
static void RegisterExternalReferences(ExternalReferenceRegistry* registry);
1920

2021
void MemoryInfo(MemoryTracker* tracker) const override;
2122
SET_MEMORY_INFO_NAME(Hash)

src/crypto/crypto_hmac.cc

+8
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ void Hmac::Initialize(Environment* env, Local<Object> target) {
5353
HmacJob::Initialize(env, target);
5454
}
5555

56+
void Hmac::RegisterExternalReferences(ExternalReferenceRegistry* registry) {
57+
registry->Register(New);
58+
registry->Register(HmacInit);
59+
registry->Register(HmacUpdate);
60+
registry->Register(HmacDigest);
61+
HmacJob::RegisterExternalReferences(registry);
62+
}
63+
5664
void Hmac::New(const FunctionCallbackInfo<Value>& args) {
5765
Environment* env = Environment::GetCurrent(args);
5866
new Hmac(env, args.This());

src/crypto/crypto_hmac.h

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ namespace crypto {
1717
class Hmac : public BaseObject {
1818
public:
1919
static void Initialize(Environment* env, v8::Local<v8::Object> target);
20+
static void RegisterExternalReferences(ExternalReferenceRegistry* registry);
2021

2122
void MemoryInfo(MemoryTracker* tracker) const override;
2223
SET_MEMORY_INFO_NAME(Hmac)

src/crypto/crypto_keygen.cc

+6
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ void Initialize(Environment* env, Local<Object> target) {
104104
NidKeyPairGenJob::Initialize(env, target);
105105
SecretKeyGenJob::Initialize(env, target);
106106
}
107+
108+
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
109+
NidKeyPairGenJob::RegisterExternalReferences(registry);
110+
SecretKeyGenJob::RegisterExternalReferences(registry);
111+
}
112+
107113
} // namespace Keygen
108114
} // namespace crypto
109115
} // namespace node

src/crypto/crypto_keygen.h

+5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace node {
1616
namespace crypto {
1717
namespace Keygen {
1818
void Initialize(Environment* env, v8::Local<v8::Object> target);
19+
void RegisterExternalReferences(ExternalReferenceRegistry* registry);
1920
} // namespace Keygen
2021

2122
enum class KeyGenJobStatus {
@@ -58,6 +59,10 @@ class KeyGenJob final : public CryptoJob<KeyGenTraits> {
5859
CryptoJob<KeyGenTraits>::Initialize(New, env, target);
5960
}
6061

62+
static void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
63+
CryptoJob<KeyGenTraits>::RegisterExternalReferences(New, registry);
64+
}
65+
6166
KeyGenJob(
6267
Environment* env,
6368
v8::Local<v8::Object> object,

src/crypto/crypto_keys.cc

+24
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,20 @@ v8::Local<v8::Function> KeyObjectHandle::Initialize(Environment* env) {
927927
return function;
928928
}
929929

930+
void KeyObjectHandle::RegisterExternalReferences(
931+
ExternalReferenceRegistry* registry) {
932+
registry->Register(New);
933+
registry->Register(Init);
934+
registry->Register(GetSymmetricKeySize);
935+
registry->Register(GetAsymmetricKeyType);
936+
registry->Register(Export);
937+
registry->Register(ExportJWK);
938+
registry->Register(InitECRaw);
939+
registry->Register(InitEDRaw);
940+
registry->Register(InitJWK);
941+
registry->Register(GetKeyDetail);
942+
}
943+
930944
MaybeLocal<Object> KeyObjectHandle::Create(
931945
Environment* env,
932946
std::shared_ptr<KeyObjectData> data) {
@@ -1256,6 +1270,12 @@ void NativeKeyObject::Initialize(Environment* env, Local<Object> target) {
12561270
NativeKeyObject::CreateNativeKeyObjectClass);
12571271
}
12581272

1273+
void NativeKeyObject::RegisterExternalReferences(
1274+
ExternalReferenceRegistry* registry) {
1275+
registry->Register(NativeKeyObject::CreateNativeKeyObjectClass);
1276+
registry->Register(NativeKeyObject::New);
1277+
}
1278+
12591279
void NativeKeyObject::New(const FunctionCallbackInfo<Value>& args) {
12601280
Environment* env = Environment::GetCurrent(args);
12611281
CHECK_EQ(args.Length(), 1);
@@ -1405,6 +1425,10 @@ void Initialize(Environment* env, Local<Object> target) {
14051425
NODE_DEFINE_CONSTANT(target, kSigEncDER);
14061426
NODE_DEFINE_CONSTANT(target, kSigEncP1363);
14071427
}
1428+
1429+
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
1430+
KeyObjectHandle::RegisterExternalReferences(registry);
1431+
}
14081432
} // namespace Keys
14091433

14101434
} // namespace crypto

src/crypto/crypto_keys.h

+7
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ class KeyObjectData : public MemoryRetainer {
169169
class KeyObjectHandle : public BaseObject {
170170
public:
171171
static v8::Local<v8::Function> Initialize(Environment* env);
172+
static void RegisterExternalReferences(ExternalReferenceRegistry* registry);
172173

173174
static v8::MaybeLocal<v8::Object> Create(Environment* env,
174175
std::shared_ptr<KeyObjectData> data);
@@ -216,6 +217,7 @@ class KeyObjectHandle : public BaseObject {
216217
class NativeKeyObject : public BaseObject {
217218
public:
218219
static void Initialize(Environment* env, v8::Local<v8::Object> target);
220+
static void RegisterExternalReferences(ExternalReferenceRegistry* registry);
219221

220222
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
221223
static void CreateNativeKeyObjectClass(
@@ -316,6 +318,10 @@ class KeyExportJob final : public CryptoJob<KeyExportTraits> {
316318
CryptoJob<KeyExportTraits>::Initialize(New, env, target);
317319
}
318320

321+
static void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
322+
CryptoJob<KeyExportTraits>::RegisterExternalReferences(New, registry);
323+
}
324+
319325
KeyExportJob(
320326
Environment* env,
321327
v8::Local<v8::Object> object,
@@ -403,6 +409,7 @@ WebCryptoKeyExportStatus PKEY_PKCS8_Export(
403409

404410
namespace Keys {
405411
void Initialize(Environment* env, v8::Local<v8::Object> target);
412+
void RegisterExternalReferences(ExternalReferenceRegistry* registry);
406413
} // namespace Keys
407414

408415
} // namespace crypto

src/crypto/crypto_random.cc

+6
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,12 @@ void Initialize(Environment* env, Local<Object> target) {
246246
RandomPrimeJob::Initialize(env, target);
247247
CheckPrimeJob::Initialize(env, target);
248248
}
249+
250+
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
251+
RandomBytesJob::RegisterExternalReferences(registry);
252+
RandomPrimeJob::RegisterExternalReferences(registry);
253+
CheckPrimeJob::RegisterExternalReferences(registry);
254+
}
249255
} // namespace Random
250256
} // namespace crypto
251257
} // namespace node

0 commit comments

Comments
 (0)