diff --git a/src/crypto/crypto_aes.cc b/src/crypto/crypto_aes.cc index b7b3a0517d1d16..171688b92926a1 100644 --- a/src/crypto/crypto_aes.cc +++ b/src/crypto/crypto_aes.cc @@ -491,8 +491,7 @@ void UseDefaultIV(AESCipherConfig* params) { } // namespace AESCipherConfig::AESCipherConfig(AESCipherConfig&& other) noexcept - : mode(other.mode), - variant(other.variant), + : variant(other.variant), cipher(other.cipher), length(other.length), iv(std::move(other.iv)), @@ -505,12 +504,8 @@ AESCipherConfig& AESCipherConfig::operator=(AESCipherConfig&& other) noexcept { } void AESCipherConfig::MemoryInfo(MemoryTracker* tracker) const { - // If mode is sync, then the data in each of these properties - // is not owned by the AESCipherConfig, so we ignore it. - if (IsCryptoJobAsync(mode)) { - tracker->TrackFieldWithSize("iv", iv.size()); - tracker->TrackFieldWithSize("additional_data", additional_data.size()); - } + tracker->TraitTrackInline(iv, "iv"); + tracker->TraitTrackInline(additional_data, "additional_data"); } Maybe AESCipherTraits::AdditionalConfig( @@ -521,8 +516,6 @@ Maybe AESCipherTraits::AdditionalConfig( AESCipherConfig* params) { Environment* env = Environment::GetCurrent(args); - params->mode = mode; - CHECK(args[offset]->IsUint32()); // Key Variant params->variant = static_cast(args[offset].As()->Value()); diff --git a/src/crypto/crypto_aes.h b/src/crypto/crypto_aes.h index 401e7b2c338a1b..76359f14e7df2b 100644 --- a/src/crypto/crypto_aes.h +++ b/src/crypto/crypto_aes.h @@ -58,7 +58,6 @@ enum class AESKeyVariant { }; struct AESCipherConfig final : public MemoryRetainer { - CryptoJobMode mode; AESKeyVariant variant; ncrypto::Cipher cipher; size_t length; diff --git a/src/crypto/crypto_argon2.cc b/src/crypto/crypto_argon2.cc index 42c5179f2b2340..8bf0272b28f8f8 100644 --- a/src/crypto/crypto_argon2.cc +++ b/src/crypto/crypto_argon2.cc @@ -21,8 +21,7 @@ using v8::Uint32; using v8::Value; Argon2Config::Argon2Config(Argon2Config&& other) noexcept - : mode{other.mode}, - key{std::move(other.key)}, + : key{std::move(other.key)}, pass{std::move(other.pass)}, salt{std::move(other.salt)}, secret{std::move(other.secret)}, @@ -40,13 +39,13 @@ Argon2Config& Argon2Config::operator=(Argon2Config&& other) noexcept { } void Argon2Config::MemoryInfo(MemoryTracker* tracker) const { - if (key) tracker->TrackField("key", key); - if (IsCryptoJobAsync(mode)) { - if (!key) tracker->TrackFieldWithSize("pass", pass.size()); - tracker->TrackFieldWithSize("salt", salt.size()); - tracker->TrackFieldWithSize("secret", secret.size()); - tracker->TrackFieldWithSize("ad", ad.size()); - } + if (key) + tracker->TrackField("key", key); + else + tracker->TraitTrackInline(pass, "pass"); + tracker->TraitTrackInline(salt, "salt"); + tracker->TraitTrackInline(secret, "secret"); + tracker->TraitTrackInline(ad, "ad"); } MaybeLocal Argon2Traits::EncodeOutput(Environment* env, @@ -62,8 +61,6 @@ Maybe Argon2Traits::AdditionalConfig( Argon2Config* config) { Environment* env = Environment::GetCurrent(args); - config->mode = mode; - CHECK(KeyObjectHandle::HasInstance(env, args[offset]) || IsAnyBufferSource(args[offset])); // pass ArrayBufferOrViewContents salt(args[offset + 1]); diff --git a/src/crypto/crypto_argon2.h b/src/crypto/crypto_argon2.h index 058293805c073a..846da0e6f67579 100644 --- a/src/crypto/crypto_argon2.h +++ b/src/crypto/crypto_argon2.h @@ -22,7 +22,6 @@ namespace node::crypto { // at least 16 bytes in length. struct Argon2Config final : public MemoryRetainer { - CryptoJobMode mode; KeyObjectData key; ByteSource pass; ByteSource salt; diff --git a/src/crypto/crypto_chacha20_poly1305.cc b/src/crypto/crypto_chacha20_poly1305.cc index db45ae356b6b3e..1cdb933c65d415 100644 --- a/src/crypto/crypto_chacha20_poly1305.cc +++ b/src/crypto/crypto_chacha20_poly1305.cc @@ -81,8 +81,7 @@ bool ValidateAdditionalData(Environment* env, ChaCha20Poly1305CipherConfig::ChaCha20Poly1305CipherConfig( ChaCha20Poly1305CipherConfig&& other) noexcept - : mode(other.mode), - cipher(other.cipher), + : cipher(other.cipher), iv(std::move(other.iv)), additional_data(std::move(other.additional_data)) {} @@ -94,12 +93,8 @@ ChaCha20Poly1305CipherConfig& ChaCha20Poly1305CipherConfig::operator=( } void ChaCha20Poly1305CipherConfig::MemoryInfo(MemoryTracker* tracker) const { - // If mode is sync, then the data in each of these properties - // is not owned by the ChaCha20Poly1305CipherConfig, so we ignore it. - if (IsCryptoJobAsync(mode)) { - tracker->TrackFieldWithSize("iv", iv.size()); - tracker->TrackFieldWithSize("additional_data", additional_data.size()); - } + tracker->TraitTrackInline(iv, "iv"); + tracker->TraitTrackInline(additional_data, "additional_data"); } Maybe ChaCha20Poly1305CipherTraits::AdditionalConfig( @@ -110,7 +105,6 @@ Maybe ChaCha20Poly1305CipherTraits::AdditionalConfig( ChaCha20Poly1305CipherConfig* params) { Environment* env = Environment::GetCurrent(args); - params->mode = mode; params->cipher = ncrypto::Cipher::CHACHA20_POLY1305; #ifndef OPENSSL_IS_BORINGSSL diff --git a/src/crypto/crypto_chacha20_poly1305.h b/src/crypto/crypto_chacha20_poly1305.h index f56b1a2e74a152..f0af11e122c4db 100644 --- a/src/crypto/crypto_chacha20_poly1305.h +++ b/src/crypto/crypto_chacha20_poly1305.h @@ -13,7 +13,6 @@ namespace node::crypto { constexpr unsigned kChaCha20Poly1305AuthTagLength = 16; struct ChaCha20Poly1305CipherConfig final : public MemoryRetainer { - CryptoJobMode mode; ncrypto::Cipher cipher; ByteSource iv; ByteSource additional_data; diff --git a/src/crypto/crypto_cipher.h b/src/crypto/crypto_cipher.h index 30e460db0b583e..f351c845497d07 100644 --- a/src/crypto/crypto_cipher.h +++ b/src/crypto/crypto_cipher.h @@ -268,9 +268,8 @@ class CipherJob final : public CryptoJob { SET_SELF_SIZE(CipherJob) void MemoryInfo(MemoryTracker* tracker) const override { - if (IsCryptoJobAsync(CryptoJob::mode())) - tracker->TrackFieldWithSize("in", in_.size()); - tracker->TrackFieldWithSize("out", out_.size()); + tracker->TraitTrackInline(in_, "in"); + tracker->TraitTrackInline(out_, "out"); CryptoJob::MemoryInfo(tracker); } diff --git a/src/crypto/crypto_hash.cc b/src/crypto/crypto_hash.cc index 1a98b7b5b0c9ca..47f8eedf1fd128 100644 --- a/src/crypto/crypto_hash.cc +++ b/src/crypto/crypto_hash.cc @@ -54,7 +54,7 @@ Hash::Hash(Environment* env, Local wrap) : BaseObject(env, wrap) { void Hash::MemoryInfo(MemoryTracker* tracker) const { tracker->TrackFieldWithSize("mdctx", mdctx_ ? kSizeOf_EVP_MD_CTX : 0); - tracker->TrackFieldWithSize("md", digest_ ? md_len_ : 0); + tracker->TraitTrackInline(digest_, "md"); } #if NCRYPTO_USE_BORINGSSL_EVP_DO_ALL_FALLBACK @@ -537,10 +537,7 @@ void Hash::HashDigest(const FunctionCallbackInfo& args) { } HashConfig::HashConfig(HashConfig&& other) noexcept - : mode(other.mode), - in(std::move(other.in)), - digest(other.digest), - length(other.length) {} + : in(std::move(other.in)), digest(other.digest), length(other.length) {} HashConfig& HashConfig::operator=(HashConfig&& other) noexcept { if (&other == this) return *this; @@ -549,8 +546,7 @@ HashConfig& HashConfig::operator=(HashConfig&& other) noexcept { } void HashConfig::MemoryInfo(MemoryTracker* tracker) const { - // If the Job is sync, then the HashConfig does not own the data. - if (IsCryptoJobAsync(mode)) tracker->TrackFieldWithSize("in", in.size()); + tracker->TraitTrackInline(in, "in"); } MaybeLocal HashTraits::EncodeOutput(Environment* env, @@ -566,8 +562,6 @@ Maybe HashTraits::AdditionalConfig( HashConfig* params) { Environment* env = Environment::GetCurrent(args); - params->mode = mode; - CHECK(args[offset]->IsString()); // Hash algorithm Utf8Value digest(env->isolate(), args[offset]); params->digest = ncrypto::getDigestByName(*digest); @@ -796,8 +790,7 @@ bool DigestUpdateBytepad(ncrypto::EVPMDCtxPointer* ctx, } // namespace CShakeConfig::CShakeConfig(CShakeConfig&& other) noexcept - : mode(other.mode), - in(std::move(other.in)), + : in(std::move(other.in)), function_name(std::move(other.function_name)), customization(std::move(other.customization)), variant(other.variant), @@ -810,12 +803,9 @@ CShakeConfig& CShakeConfig::operator=(CShakeConfig&& other) noexcept { } void CShakeConfig::MemoryInfo(MemoryTracker* tracker) const { - // If the Job is sync, then the CShakeConfig does not own the data. - if (IsCryptoJobAsync(mode)) { - tracker->TrackFieldWithSize("in", in.size()); - tracker->TrackFieldWithSize("function_name", function_name.size()); - tracker->TrackFieldWithSize("customization", customization.size()); - } + tracker->TraitTrackInline(in, "in"); + tracker->TraitTrackInline(function_name, "function_name"); + tracker->TraitTrackInline(customization, "customization"); } MaybeLocal CShakeTraits::EncodeOutput(Environment* env, @@ -831,8 +821,6 @@ Maybe CShakeTraits::AdditionalConfig( CShakeConfig* params) { Environment* env = Environment::GetCurrent(args); - params->mode = mode; - CHECK(args[offset]->IsString()); // Algorithm name Utf8Value algorithm_name(env->isolate(), args[offset]); std::string_view algorithm_str = algorithm_name.ToStringView(); diff --git a/src/crypto/crypto_hash.h b/src/crypto/crypto_hash.h index 533f43c391574b..3ae6a16c2579ae 100644 --- a/src/crypto/crypto_hash.h +++ b/src/crypto/crypto_hash.h @@ -42,7 +42,6 @@ class Hash final : public BaseObject { }; struct HashConfig final : public MemoryRetainer { - CryptoJobMode mode; ByteSource in; const EVP_MD* digest; unsigned int length; @@ -108,7 +107,6 @@ struct CShakeParams final { bool DeriveCShakeBits(const CShakeParams& params, ByteSource* out); struct CShakeConfig final : public MemoryRetainer { - CryptoJobMode mode; ByteSource in; ByteSource function_name; ByteSource customization; diff --git a/src/crypto/crypto_hkdf.cc b/src/crypto/crypto_hkdf.cc index eb40ddad41c6e3..627401149e9c44 100644 --- a/src/crypto/crypto_hkdf.cc +++ b/src/crypto/crypto_hkdf.cc @@ -20,8 +20,7 @@ using v8::Value; namespace crypto { HKDFConfig::HKDFConfig(HKDFConfig&& other) noexcept - : mode(other.mode), - length(other.length), + : length(other.length), digest(other.digest), key(std::move(other.key)), key_data(std::move(other.key_data)), @@ -47,8 +46,6 @@ Maybe HKDFTraits::AdditionalConfig( HKDFConfig* params) { Environment* env = Environment::GetCurrent(args); - params->mode = mode; - CHECK(args[offset]->IsString()); // Hash CHECK(KeyObjectHandle::HasInstance(env, args[offset + 1]) || IsAnyBufferSource(args[offset + 1])); // Key @@ -140,13 +137,12 @@ bool HKDFTraits::DeriveBits(Environment* env, } void HKDFConfig::MemoryInfo(MemoryTracker* tracker) const { - if (key) tracker->TrackField("key", key); - // If the job is sync, then the HKDFConfig does not own the data - if (IsCryptoJobAsync(mode)) { - if (!key) tracker->TrackFieldWithSize("key", key_data.size()); - tracker->TrackFieldWithSize("salt", salt.size()); - tracker->TrackFieldWithSize("info", info.size()); - } + if (key) + tracker->TrackField("key", key); + else + tracker->TraitTrackInline(key_data, "key"); + tracker->TraitTrackInline(salt, "salt"); + tracker->TraitTrackInline(info, "info"); } } // namespace crypto diff --git a/src/crypto/crypto_hkdf.h b/src/crypto/crypto_hkdf.h index bda6df6341219a..20b2f9dfebf8fc 100644 --- a/src/crypto/crypto_hkdf.h +++ b/src/crypto/crypto_hkdf.h @@ -12,7 +12,6 @@ namespace node { namespace crypto { struct HKDFConfig final : public MemoryRetainer { - CryptoJobMode mode; size_t length; ncrypto::Digest digest; KeyObjectData key; diff --git a/src/crypto/crypto_hmac.cc b/src/crypto/crypto_hmac.cc index 42f3b53da0eaec..7b5fa8605f9b4b 100644 --- a/src/crypto/crypto_hmac.cc +++ b/src/crypto/crypto_hmac.cc @@ -154,8 +154,7 @@ void Hmac::HmacDigest(const FunctionCallbackInfo& args) { } HmacConfig::HmacConfig(HmacConfig&& other) noexcept - : job_mode(other.job_mode), - mode(other.mode), + : mode(other.mode), key(std::move(other.key)), data(std::move(other.data)), signature(std::move(other.signature)), @@ -169,11 +168,8 @@ HmacConfig& HmacConfig::operator=(HmacConfig&& other) noexcept { void HmacConfig::MemoryInfo(MemoryTracker* tracker) const { tracker->TrackField("key", key); - // If the job is sync, then the HmacConfig does not own the data - if (IsCryptoJobAsync(job_mode)) { - tracker->TrackFieldWithSize("data", data.size()); - tracker->TrackFieldWithSize("signature", signature.size()); - } + tracker->TraitTrackInline(data, "data"); + tracker->TraitTrackInline(signature, "signature"); } Maybe HmacTraits::AdditionalConfig( @@ -183,8 +179,6 @@ Maybe HmacTraits::AdditionalConfig( HmacConfig* params) { Environment* env = Environment::GetCurrent(args); - params->job_mode = mode; - CHECK(args[offset]->IsUint32()); // SignConfiguration::Mode params->mode = static_cast(args[offset].As()->Value()); diff --git a/src/crypto/crypto_hmac.h b/src/crypto/crypto_hmac.h index 5b93dea1f95e3d..f12ffad7fc8fe2 100644 --- a/src/crypto/crypto_hmac.h +++ b/src/crypto/crypto_hmac.h @@ -40,7 +40,6 @@ class Hmac : public BaseObject { }; struct HmacConfig final : public MemoryRetainer { - CryptoJobMode job_mode; SignConfiguration::Mode mode; KeyObjectData key; ByteSource data; diff --git a/src/crypto/crypto_kem.cc b/src/crypto/crypto_kem.cc index 2cbeed3660d131..726912b57f2931 100644 --- a/src/crypto/crypto_kem.cc +++ b/src/crypto/crypto_kem.cc @@ -27,10 +27,7 @@ using v8::Value; namespace crypto { KEMConfiguration::KEMConfiguration(KEMConfiguration&& other) noexcept - : job_mode(other.job_mode), - mode(other.mode), - key(std::move(other.key)), - ciphertext(std::move(other.ciphertext)) {} + : key(std::move(other.key)), ciphertext(std::move(other.ciphertext)) {} KEMConfiguration& KEMConfiguration::operator=( KEMConfiguration&& other) noexcept { @@ -41,9 +38,7 @@ KEMConfiguration& KEMConfiguration::operator=( void KEMConfiguration::MemoryInfo(MemoryTracker* tracker) const { tracker->TrackField("key", key); - if (IsCryptoJobAsync(job_mode)) { - tracker->TrackFieldWithSize("ciphertext", ciphertext.size()); - } + tracker->TraitTrackInline(ciphertext, "ciphertext"); } namespace { @@ -75,9 +70,6 @@ Maybe KEMEncapsulateTraits::AdditionalConfig( const FunctionCallbackInfo& args, unsigned int offset, KEMConfiguration* params) { - params->job_mode = mode; - params->mode = KEMMode::Encapsulate; - unsigned int key_offset = offset; auto public_key_data = KeyObjectData::GetPublicOrPrivateKeyFromJs(args, &key_offset); @@ -126,8 +118,12 @@ void KEMEncapsulateJob::DoThreadPoolWork() { ncrypto::ClearErrorOnReturn clear_error_on_return; AdditionalParams* params = CryptoJob::params(); Mutex::ScopedLock lock(params->key.mutex()); - out_ = ncrypto::KEM::Encapsulate(params->key.GetAsymmetricKey()); - if (!out_) { + auto result = ncrypto::KEM::Encapsulate(params->key.GetAsymmetricKey()); + if (result) { + out_.emplace(); + out_->ciphertext = ByteSource::Allocated(result->ciphertext.release()); + out_->shared_key = ByteSource::Allocated(result->shared_key.release()); + } else { CryptoErrorStore* errors = CryptoJob::errors(); errors->Insert(NodeCryptoError::ENCAPSULATION_FAILED); errors->SetNodeErrorCode("ERR_CRYPTO_OPERATION_FAILED"); @@ -149,8 +145,8 @@ Maybe KEMEncapsulateJob::ToResult(Local* err, CHECK(errors->Empty()); *err = v8::Undefined(env->isolate()); - ByteSource ciphertext = ByteSource::Allocated(out_->ciphertext.release()); - ByteSource shared_key = ByteSource::Allocated(out_->shared_key.release()); + ByteSource ciphertext = std::move(out_->ciphertext); + ByteSource shared_key = std::move(out_->shared_key); if (mode() == kCryptoJobWebCrypto) { Local output = Object::New(env->isolate()); @@ -188,8 +184,8 @@ Maybe KEMEncapsulateJob::ToResult(Local* err, void KEMEncapsulateJob::MemoryInfo(MemoryTracker* tracker) const { if (out_) { - tracker->TrackFieldWithSize("ciphertext", out_->ciphertext.size()); - tracker->TrackFieldWithSize("shared_key", out_->shared_key.size()); + tracker->TraitTrackInline(out_->ciphertext, "ciphertext"); + tracker->TraitTrackInline(out_->shared_key, "shared_key"); } CryptoJob::MemoryInfo(tracker); } @@ -202,9 +198,6 @@ Maybe KEMDecapsulateTraits::AdditionalConfig( KEMConfiguration* params) { Environment* env = Environment::GetCurrent(args); - params->job_mode = mode; - params->mode = KEMMode::Decapsulate; - unsigned int key_offset = offset; auto private_key_data = KeyObjectData::GetPrivateKeyFromJs(args, &key_offset, true); diff --git a/src/crypto/crypto_kem.h b/src/crypto/crypto_kem.h index 70eb96d57c6387..dc60001e2d13f1 100644 --- a/src/crypto/crypto_kem.h +++ b/src/crypto/crypto_kem.h @@ -18,8 +18,6 @@ namespace crypto { enum class KEMMode { Encapsulate, Decapsulate }; struct KEMConfiguration final : public MemoryRetainer { - CryptoJobMode job_mode; - KEMMode mode; KeyObjectData key; ByteSource ciphertext; @@ -67,7 +65,12 @@ class KEMEncapsulateJob final : public CryptoJob { void MemoryInfo(MemoryTracker* tracker) const override; private: - std::optional out_; + struct Output { + ByteSource ciphertext; + ByteSource shared_key; + }; + + std::optional out_; }; struct KEMDecapsulateTraits final { diff --git a/src/crypto/crypto_keygen.cc b/src/crypto/crypto_keygen.cc index 24b0f5aca2b4b3..fd456465e0eef1 100644 --- a/src/crypto/crypto_keygen.cc +++ b/src/crypto/crypto_keygen.cc @@ -54,7 +54,7 @@ EVPKeyCtxPointer NidKeyPairGenTraits::Setup(NidKeyPairGenConfig* params) { } void SecretKeyGenConfig::MemoryInfo(MemoryTracker* tracker) const { - if (out) tracker->TrackFieldWithSize("out", length); + tracker->TraitTrackInline(out, "out"); } Maybe SecretKeyGenTraits::AdditionalConfig( diff --git a/src/crypto/crypto_keys.cc b/src/crypto/crypto_keys.cc index 1404390f4bc8bc..42ea84371b9cf0 100644 --- a/src/crypto/crypto_keys.cc +++ b/src/crypto/crypto_keys.cc @@ -957,32 +957,21 @@ KeyObjectData::KeyObjectData(ByteSource symmetric_key) KeyObjectData::KeyObjectData(KeyType type, EVPKeyPointer&& pkey) : key_type_(type), data_(std::make_shared(std::move(pkey))) {} -void KeyObjectData::MemoryInfo(MemoryTracker* tracker) const { - if (!*this) return; - switch (GetKeyType()) { - case kKeyTypeSecret: { - if (data_->symmetric_key) { - tracker->TrackFieldWithSize("symmetric_key", - data_->symmetric_key.size()); - } - break; - } - case kKeyTypePrivate: - // Fall through - case kKeyTypePublic: { - if (data_->asymmetric_key) { - tracker->TrackFieldWithSize( - "key", - kSizeOf_EVP_PKEY + data_->asymmetric_key.rawPublicKeySize() + - data_->asymmetric_key.rawPrivateKeySize()); - } - break; - } - default: - UNREACHABLE(); +void KeyObjectData::Data::MemoryInfo(MemoryTracker* tracker) const { + if (asymmetric_key) { + tracker->TrackFieldWithSize("key", + kSizeOf_EVP_PKEY + + asymmetric_key.rawPublicKeySize() + + asymmetric_key.rawPrivateKeySize()); + } else { + tracker->TraitTrackInline(symmetric_key, "symmetric_key"); } } +void KeyObjectData::MemoryInfo(MemoryTracker* tracker) const { + tracker->TrackField("data", data_); +} + Mutex& KeyObjectData::mutex() const { if (!mutex_) mutex_ = std::make_shared(); return *mutex_.get(); diff --git a/src/crypto/crypto_keys.h b/src/crypto/crypto_keys.h index fd3b0b0d0fb7a7..9c06648a8a3f8b 100644 --- a/src/crypto/crypto_keys.h +++ b/src/crypto/crypto_keys.h @@ -115,13 +115,17 @@ class KeyObjectData final : public MemoryRetainer { KeyType key_type_; mutable std::shared_ptr mutex_; - struct Data { + struct Data final : public MemoryRetainer { const ByteSource symmetric_key; const ncrypto::EVPKeyPointer asymmetric_key; explicit Data(ByteSource symmetric_key) : symmetric_key(std::move(symmetric_key)) {} explicit Data(ncrypto::EVPKeyPointer asymmetric_key) : asymmetric_key(std::move(asymmetric_key)) {} + + void MemoryInfo(MemoryTracker* tracker) const override; + SET_MEMORY_INFO_NAME(KeyObjectData::Data) + SET_SELF_SIZE(Data) }; std::shared_ptr data_; diff --git a/src/crypto/crypto_kmac.cc b/src/crypto/crypto_kmac.cc index c77c21d0a1aeeb..e5b29370768d08 100644 --- a/src/crypto/crypto_kmac.cc +++ b/src/crypto/crypto_kmac.cc @@ -32,8 +32,7 @@ using v8::Uint32; using v8::Value; KmacConfig::KmacConfig(KmacConfig&& other) noexcept - : job_mode(other.job_mode), - mode(other.mode), + : mode(other.mode), key(std::move(other.key)), data(std::move(other.data)), signature(std::move(other.signature)), @@ -50,12 +49,9 @@ KmacConfig& KmacConfig::operator=(KmacConfig&& other) noexcept { void KmacConfig::MemoryInfo(MemoryTracker* tracker) const { tracker->TrackField("key", key); - // If the job is sync, then the KmacConfig does not own the data. - if (IsCryptoJobAsync(job_mode)) { - tracker->TrackFieldWithSize("data", data.size()); - tracker->TrackFieldWithSize("signature", signature.size()); - tracker->TrackFieldWithSize("customization", customization.size()); - } + tracker->TraitTrackInline(data, "data"); + tracker->TraitTrackInline(signature, "signature"); + tracker->TraitTrackInline(customization, "customization"); } Maybe KmacTraits::AdditionalConfig( @@ -65,8 +61,6 @@ Maybe KmacTraits::AdditionalConfig( KmacConfig* params) { Environment* env = Environment::GetCurrent(args); - params->job_mode = mode; - CHECK(args[offset]->IsUint32()); // SignConfiguration::Mode params->mode = static_cast(args[offset].As()->Value()); diff --git a/src/crypto/crypto_kmac.h b/src/crypto/crypto_kmac.h index f6300fb5478571..703b03c2c88254 100644 --- a/src/crypto/crypto_kmac.h +++ b/src/crypto/crypto_kmac.h @@ -15,7 +15,6 @@ namespace node::crypto { enum class KmacVariant { KMAC128, KMAC256 }; struct KmacConfig final : public MemoryRetainer { - CryptoJobMode job_mode; SignConfiguration::Mode mode; KeyObjectData key; ByteSource data; diff --git a/src/crypto/crypto_pbkdf2.cc b/src/crypto/crypto_pbkdf2.cc index 5c3fc438774334..bd7aa9feb4393a 100644 --- a/src/crypto/crypto_pbkdf2.cc +++ b/src/crypto/crypto_pbkdf2.cc @@ -22,8 +22,7 @@ using v8::Value; namespace crypto { PBKDF2Config::PBKDF2Config(PBKDF2Config&& other) noexcept - : mode(other.mode), - key(std::move(other.key)), + : key(std::move(other.key)), pass(std::move(other.pass)), salt(std::move(other.salt)), iterations(other.iterations), @@ -37,12 +36,11 @@ PBKDF2Config& PBKDF2Config::operator=(PBKDF2Config&& other) noexcept { } void PBKDF2Config::MemoryInfo(MemoryTracker* tracker) const { - // If the job is sync, PBKDF2Config does not own the data. - if (key) tracker->TrackField("key", key); - if (IsCryptoJobAsync(mode)) { - if (!key) tracker->TrackFieldWithSize("pass", pass.size()); - tracker->TrackFieldWithSize("salt", salt.size()); - } + if (key) + tracker->TrackField("key", key); + else + tracker->TraitTrackInline(pass, "pass"); + tracker->TraitTrackInline(salt, "salt"); } MaybeLocal PBKDF2Traits::EncodeOutput(Environment* env, @@ -65,8 +63,6 @@ Maybe PBKDF2Traits::AdditionalConfig( PBKDF2Config* params) { Environment* env = Environment::GetCurrent(args); - params->mode = mode; - CHECK(KeyObjectHandle::HasInstance(env, args[offset]) || IsAnyBufferSource(args[offset])); // pass ArrayBufferOrViewContents salt(args[offset + 1]); diff --git a/src/crypto/crypto_pbkdf2.h b/src/crypto/crypto_pbkdf2.h index 639fb4293ee1b4..515ee137a07941 100644 --- a/src/crypto/crypto_pbkdf2.h +++ b/src/crypto/crypto_pbkdf2.h @@ -26,7 +26,6 @@ namespace crypto { // The iteration count should be as high as possible. struct PBKDF2Config final : public MemoryRetainer { - CryptoJobMode mode; KeyObjectData key; ByteSource pass; ByteSource salt; diff --git a/src/crypto/crypto_rsa.cc b/src/crypto/crypto_rsa.cc index 56fbde663cd1bb..f5dd79f5fce913 100644 --- a/src/crypto/crypto_rsa.cc +++ b/src/crypto/crypto_rsa.cc @@ -219,14 +219,12 @@ WebCryptoCipherStatus RSA_Cipher(Environment* env, } // namespace RSACipherConfig::RSACipherConfig(RSACipherConfig&& other) noexcept - : mode(other.mode), - label(std::move(other.label)), + : label(std::move(other.label)), padding(other.padding), digest(other.digest) {} void RSACipherConfig::MemoryInfo(MemoryTracker* tracker) const { - if (IsCryptoJobAsync(mode)) - tracker->TrackFieldWithSize("label", label.size()); + tracker->TraitTrackInline(label, "label"); } Maybe RSACipherTraits::AdditionalConfig( @@ -237,7 +235,6 @@ Maybe RSACipherTraits::AdditionalConfig( RSACipherConfig* params) { Environment* env = Environment::GetCurrent(args); - params->mode = mode; params->padding = RSA_PKCS1_OAEP_PADDING; CHECK(args[offset]->IsUint32()); diff --git a/src/crypto/crypto_rsa.h b/src/crypto/crypto_rsa.h index 8ca657ea101fff..e0509bd95b9bfb 100644 --- a/src/crypto/crypto_rsa.h +++ b/src/crypto/crypto_rsa.h @@ -53,7 +53,6 @@ struct RsaKeyGenTraits final { using RSAKeyPairGenJob = KeyGenJob>; struct RSACipherConfig final : public MemoryRetainer { - CryptoJobMode mode = kCryptoJobAsync; ByteSource label; int padding = 0; ncrypto::Digest digest; diff --git a/src/crypto/crypto_scrypt.cc b/src/crypto/crypto_scrypt.cc index 91ed9fee71f052..12192d6417a357 100644 --- a/src/crypto/crypto_scrypt.cc +++ b/src/crypto/crypto_scrypt.cc @@ -22,14 +22,13 @@ namespace crypto { #ifndef OPENSSL_NO_SCRYPT ScryptConfig::ScryptConfig(ScryptConfig&& other) noexcept - : mode(other.mode), - pass(std::move(other.pass)), - salt(std::move(other.salt)), - N(other.N), - r(other.r), - p(other.p), - maxmem(other.maxmem), - length(other.length) {} + : pass(std::move(other.pass)), + salt(std::move(other.salt)), + N(other.N), + r(other.r), + p(other.p), + maxmem(other.maxmem), + length(other.length) {} ScryptConfig& ScryptConfig::operator=(ScryptConfig&& other) noexcept { if (&other == this) return *this; @@ -38,10 +37,8 @@ ScryptConfig& ScryptConfig::operator=(ScryptConfig&& other) noexcept { } void ScryptConfig::MemoryInfo(MemoryTracker* tracker) const { - if (IsCryptoJobAsync(mode)) { - tracker->TrackFieldWithSize("pass", pass.size()); - tracker->TrackFieldWithSize("salt", salt.size()); - } + tracker->TraitTrackInline(pass, "pass"); + tracker->TraitTrackInline(salt, "salt"); } MaybeLocal ScryptTraits::EncodeOutput(Environment* env, @@ -57,8 +54,6 @@ Maybe ScryptTraits::AdditionalConfig( ScryptConfig* params) { Environment* env = Environment::GetCurrent(args); - params->mode = mode; - ArrayBufferOrViewContents pass(args[offset]); ArrayBufferOrViewContents salt(args[offset + 1]); @@ -80,7 +75,7 @@ Maybe ScryptTraits::AdditionalConfig( CHECK(args[offset + 3]->IsUint32()); // r CHECK(args[offset + 4]->IsUint32()); // p CHECK(args[offset + 5]->IsNumber()); // maxmem - CHECK(args[offset + 6]->IsInt32()); // length + CHECK(args[offset + 6]->IsInt32()); // length params->N = args[offset + 2].As()->Value(); params->r = args[offset + 3].As()->Value(); diff --git a/src/crypto/crypto_scrypt.h b/src/crypto/crypto_scrypt.h index b06fbbe0692adb..cc605991c354f4 100644 --- a/src/crypto/crypto_scrypt.h +++ b/src/crypto/crypto_scrypt.h @@ -25,7 +25,6 @@ namespace crypto { // at least 16 bytes in length. struct ScryptConfig final : public MemoryRetainer { - CryptoJobMode mode; ByteSource pass; ByteSource salt; uint32_t N; diff --git a/src/crypto/crypto_sig.cc b/src/crypto/crypto_sig.cc index de9e62a2a1f13c..7a272b16ffd239 100644 --- a/src/crypto/crypto_sig.cc +++ b/src/crypto/crypto_sig.cc @@ -684,8 +684,7 @@ void Verify::VerifyFinal(const FunctionCallbackInfo& args) { } SignConfiguration::SignConfiguration(SignConfiguration&& other) noexcept - : job_mode(other.job_mode), - mode(other.mode), + : mode(other.mode), key(std::move(other.key)), data(std::move(other.data)), signature(std::move(other.signature)), @@ -705,11 +704,9 @@ SignConfiguration& SignConfiguration::operator=( void SignConfiguration::MemoryInfo(MemoryTracker* tracker) const { tracker->TrackField("key", key); - if (IsCryptoJobAsync(job_mode)) { - tracker->TrackFieldWithSize("data", data.size()); - tracker->TrackFieldWithSize("signature", signature.size()); - tracker->TrackFieldWithSize("context_string", context_string.size()); - } + tracker->TraitTrackInline(data, "data"); + tracker->TraitTrackInline(signature, "signature"); + tracker->TraitTrackInline(context_string, "context_string"); } Maybe SignTraits::AdditionalConfig( @@ -720,8 +717,6 @@ Maybe SignTraits::AdditionalConfig( ClearErrorOnReturn clear_error_on_return; Environment* env = Environment::GetCurrent(args); - params->job_mode = mode; - CHECK(args[offset]->IsUint32()); // Sign Mode params->mode = diff --git a/src/crypto/crypto_sig.h b/src/crypto/crypto_sig.h index 208c40eff1e68f..a3d194db3f2b18 100644 --- a/src/crypto/crypto_sig.h +++ b/src/crypto/crypto_sig.h @@ -104,7 +104,6 @@ struct SignConfiguration final : public MemoryRetainer { kHasContextString = 4 }; - CryptoJobMode job_mode; Mode mode; KeyObjectData key; ByteSource data; diff --git a/src/crypto/crypto_turboshake.cc b/src/crypto/crypto_turboshake.cc index 06b2ef9d6f5aea..6a05bf10fb8fdc 100644 --- a/src/crypto/crypto_turboshake.cc +++ b/src/crypto/crypto_turboshake.cc @@ -405,8 +405,7 @@ void KT256(const uint8_t* message, // ============================================================================ TurboShakeConfig::TurboShakeConfig(TurboShakeConfig&& other) noexcept - : job_mode(other.job_mode), - variant(other.variant), + : variant(other.variant), output_length(other.output_length), domain_separation(other.domain_separation), data(std::move(other.data)) {} @@ -419,10 +418,7 @@ TurboShakeConfig& TurboShakeConfig::operator=( } void TurboShakeConfig::MemoryInfo(MemoryTracker* tracker) const { - if (IsCryptoJobAsync(job_mode)) { - // TODO(addaleax): Implement MemoryRetainer protocol for ByteSource - tracker->TrackFieldWithSize("data", data.size()); - } + tracker->TraitTrackInline(data, "data"); } Maybe TurboShakeTraits::AdditionalConfig( @@ -432,8 +428,6 @@ Maybe TurboShakeTraits::AdditionalConfig( TurboShakeConfig* params) { Environment* env = Environment::GetCurrent(args); - params->job_mode = mode; - // args[offset + 0] = algorithm name (string) CHECK(args[offset]->IsString()); Utf8Value algorithm_name(env->isolate(), args[offset]); @@ -513,8 +507,7 @@ MaybeLocal TurboShakeTraits::EncodeOutput(Environment* env, KangarooTwelveConfig::KangarooTwelveConfig( KangarooTwelveConfig&& other) noexcept - : job_mode(other.job_mode), - variant(other.variant), + : variant(other.variant), output_length(other.output_length), data(std::move(other.data)), customization(std::move(other.customization)) {} @@ -527,11 +520,8 @@ KangarooTwelveConfig& KangarooTwelveConfig::operator=( } void KangarooTwelveConfig::MemoryInfo(MemoryTracker* tracker) const { - if (IsCryptoJobAsync(job_mode)) { - // TODO(addaleax): Implement MemoryRetainer protocol for ByteSource - tracker->TrackFieldWithSize("data", data.size()); - tracker->TrackFieldWithSize("customization", customization.size()); - } + tracker->TraitTrackInline(data, "data"); + tracker->TraitTrackInline(customization, "customization"); } Maybe KangarooTwelveTraits::AdditionalConfig( @@ -541,8 +531,6 @@ Maybe KangarooTwelveTraits::AdditionalConfig( KangarooTwelveConfig* params) { Environment* env = Environment::GetCurrent(args); - params->job_mode = mode; - // args[offset + 0] = algorithm name (string) CHECK(args[offset]->IsString()); Utf8Value algorithm_name(env->isolate(), args[offset]); diff --git a/src/crypto/crypto_turboshake.h b/src/crypto/crypto_turboshake.h index dbc09db532608d..728c9f50a7a616 100644 --- a/src/crypto/crypto_turboshake.h +++ b/src/crypto/crypto_turboshake.h @@ -10,7 +10,6 @@ namespace node::crypto { enum class TurboShakeVariant { TurboSHAKE128, TurboSHAKE256 }; struct TurboShakeConfig final : public MemoryRetainer { - CryptoJobMode job_mode; TurboShakeVariant variant; uint32_t output_length; // Output length in bytes uint8_t domain_separation; // Domain separation byte (0x01–0x7F) @@ -55,7 +54,6 @@ using TurboShakeJob = DeriveBitsJob; enum class KangarooTwelveVariant { KT128, KT256 }; struct KangarooTwelveConfig final : public MemoryRetainer { - CryptoJobMode job_mode; KangarooTwelveVariant variant; uint32_t output_length; // Output length in bytes ByteSource data; diff --git a/src/crypto/crypto_util.cc b/src/crypto/crypto_util.cc index 711984e5e4f23f..080f2cf51cecd2 100644 --- a/src/crypto/crypto_util.cc +++ b/src/crypto/crypto_util.cc @@ -56,6 +56,24 @@ using v8::Uint32; using v8::Uint8Array; using v8::Value; +void MemoryRetainerTraits::MemoryInfo( + MemoryTracker* tracker, const crypto::ByteSource& value) { + // Foreign ByteSources do not own the memory that they reference. + if (value.allocated_data_ != nullptr) { + tracker->TrackFieldWithSize("data", value.size_); + } +} + +const char* MemoryRetainerTraits::MemoryInfoName( + const crypto::ByteSource& value) { + return "ByteSource"; +} + +size_t MemoryRetainerTraits::SelfSize( + const crypto::ByteSource& value) { + return sizeof(value); +} + namespace crypto { int PasswordCallback(char* buf, int size, int rwflag, void* u) { diff --git a/src/crypto/crypto_util.h b/src/crypto/crypto_util.h index c27b745ce83c8e..76afc3dd24a36f 100644 --- a/src/crypto/crypto_util.h +++ b/src/crypto/crypto_util.h @@ -26,6 +26,20 @@ #define NODE_OPENSSL_HAS_CERT_COMP 1 #endif +namespace node { +namespace crypto { +class ByteSource; +} + +template <> +struct MemoryRetainerTraits { + static void MemoryInfo(MemoryTracker* tracker, + const crypto::ByteSource& value); + static const char* MemoryInfoName(const crypto::ByteSource& value); + static size_t SelfSize(const crypto::ByteSource& value); +}; +} // namespace node + namespace node::crypto { // Currently known sizes of commonly used OpenSSL struct sizes. // OpenSSL considers it's various structs to be opaque and the @@ -250,6 +264,7 @@ class ByteSource final { Environment* env, v8::Local value); private: + friend struct node::MemoryRetainerTraits; friend void TruncateToBitLength(size_t length_bits, ByteSource* bytes); const void* data_ = nullptr; @@ -610,7 +625,7 @@ class DeriveBitsJob final : public CryptoJob { SET_SELF_SIZE(DeriveBitsJob) void MemoryInfo(MemoryTracker* tracker) const override { - tracker->TrackFieldWithSize("out", out_.size()); + tracker->TraitTrackInline(out_, "out"); CryptoJob::MemoryInfo(tracker); }