From 17d5d9492106f34510451562cc65160d3a55c060 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Mon, 5 Oct 2020 12:48:31 -0700 Subject: [PATCH] src: replace more toLocalCheckeds in crypto_* Signed-off-by: James M Snell PR-URL: https://github.com/nodejs/node/pull/35509 Reviewed-By: Anna Henningsen Reviewed-By: Rich Trott --- src/crypto/crypto_cipher.cc | 6 +++--- src/crypto/crypto_common.cc | 2 +- src/crypto/crypto_dh.cc | 8 ++++---- src/crypto/crypto_ecdh.cc | 6 ++---- src/crypto/crypto_hash.cc | 2 +- src/crypto/crypto_hmac.cc | 2 +- src/crypto/crypto_keys.cc | 33 +++++++++++++++++++++------------ src/crypto/crypto_keys.h | 2 +- src/crypto/crypto_sig.cc | 4 ++-- src/crypto/crypto_spkac.cc | 2 +- src/crypto/crypto_util.cc | 37 +++++++++++++++++++++---------------- 11 files changed, 58 insertions(+), 46 deletions(-) diff --git a/src/crypto/crypto_cipher.cc b/src/crypto/crypto_cipher.cc index 2a745643ecbd44..f3939d3477c6ca 100644 --- a/src/crypto/crypto_cipher.cc +++ b/src/crypto/crypto_cipher.cc @@ -594,7 +594,7 @@ void CipherBase::GetAuthTag(const FunctionCallbackInfo& args) { args.GetReturnValue().Set( Buffer::Copy(env, cipher->auth_tag_, cipher->auth_tag_len_) - .ToLocalChecked()); + .FromMaybe(Local())); } void CipherBase::SetAuthTag(const FunctionCallbackInfo& args) { @@ -784,7 +784,7 @@ void CipherBase::Update(const FunctionCallbackInfo& args) { } CHECK(out.data() != nullptr || out.size() == 0); - args.GetReturnValue().Set(out.ToBuffer().ToLocalChecked()); + args.GetReturnValue().Set(out.ToBuffer().FromMaybe(Local())); }); } @@ -875,7 +875,7 @@ void CipherBase::Final(const FunctionCallbackInfo& args) { return ThrowCryptoError(env, ERR_get_error(), msg); } - args.GetReturnValue().Set(out.ToBuffer().ToLocalChecked()); + args.GetReturnValue().Set(out.ToBuffer().FromMaybe(Local())); } template GetPeerCert( // First and main certificate. X509Pointer first_cert(sk_X509_value(peer_certs.get(), 0)); CHECK(first_cert); - maybe_cert = X509ToObject(env, first_cert.release()).ToLocalChecked(); + maybe_cert = X509ToObject(env, first_cert.release()); if (!maybe_cert.ToLocal(&result)) return MaybeLocal(); diff --git a/src/crypto/crypto_dh.cc b/src/crypto/crypto_dh.cc index b907e7b7a4c5e4..8a968200687dfb 100644 --- a/src/crypto/crypto_dh.cc +++ b/src/crypto/crypto_dh.cc @@ -253,7 +253,7 @@ void DiffieHellman::GenerateKeys(const FunctionCallbackInfo& args) { CHECK_EQ(size, BN_bn2binpad( pub_key, reinterpret_cast(data.data()), size)); - args.GetReturnValue().Set(data.ToBuffer().ToLocalChecked()); + args.GetReturnValue().Set(data.ToBuffer().FromMaybe(Local())); } @@ -275,7 +275,7 @@ void DiffieHellman::GetField(const FunctionCallbackInfo& args, CHECK_EQ( size, BN_bn2binpad(num, reinterpret_cast(data.data()), size)); - args.GetReturnValue().Set(data.ToBuffer().ToLocalChecked()); + args.GetReturnValue().Set(data.ToBuffer().FromMaybe(Local())); } void DiffieHellman::GetPrime(const FunctionCallbackInfo& args) { @@ -357,7 +357,7 @@ void DiffieHellman::ComputeSecret(const FunctionCallbackInfo& args) { CHECK_GE(size, 0); ZeroPadDiffieHellmanSecret(static_cast(size), &ret); - args.GetReturnValue().Set(ret.ToBuffer().ToLocalChecked()); + args.GetReturnValue().Set(ret.ToBuffer().FromMaybe(Local())); } void DiffieHellman::SetKey(const FunctionCallbackInfo& args, @@ -613,7 +613,7 @@ void DiffieHellman::Stateless(const FunctionCallbackInfo& args) { if (out.size() == 0) return ThrowCryptoError(env, ERR_get_error(), "diffieHellman failed"); - args.GetReturnValue().Set(out.ToBuffer().ToLocalChecked()); + args.GetReturnValue().Set(out.ToBuffer().FromMaybe(Local())); } Maybe DHBitsTraits::AdditionalConfig( diff --git a/src/crypto/crypto_ecdh.cc b/src/crypto/crypto_ecdh.cc index 07ce1c21480e24..9da31b0b5778c0 100644 --- a/src/crypto/crypto_ecdh.cc +++ b/src/crypto/crypto_ecdh.cc @@ -197,8 +197,7 @@ void ECDH::ComputeSecret(const FunctionCallbackInfo& args) { if (!r) return THROW_ERR_CRYPTO_OPERATION_FAILED(env, "Failed to compute ECDH key"); - Local buf = out.ToBuffer().ToLocalChecked(); - args.GetReturnValue().Set(buf); + args.GetReturnValue().Set(out.ToBuffer().FromMaybe(Local())); } void ECDH::GetPublicKey(const FunctionCallbackInfo& args) { @@ -244,8 +243,7 @@ void ECDH::GetPrivateKey(const FunctionCallbackInfo& args) { reinterpret_cast(out.data()), size)); - Local buf = out.ToBuffer().ToLocalChecked(); - args.GetReturnValue().Set(buf); + args.GetReturnValue().Set(out.ToBuffer().FromMaybe(Local())); } void ECDH::SetPrivateKey(const FunctionCallbackInfo& args) { diff --git a/src/crypto/crypto_hash.cc b/src/crypto/crypto_hash.cc index e3cda069c594ab..f858e6be9e9e3d 100644 --- a/src/crypto/crypto_hash.cc +++ b/src/crypto/crypto_hash.cc @@ -198,7 +198,7 @@ void Hash::HashDigest(const FunctionCallbackInfo& args) { env->isolate()->ThrowException(error); return; } - args.GetReturnValue().Set(rc.ToLocalChecked()); + args.GetReturnValue().Set(rc.FromMaybe(Local())); } HashConfig::HashConfig(HashConfig&& other) noexcept diff --git a/src/crypto/crypto_hmac.cc b/src/crypto/crypto_hmac.cc index 7f4682e900cc12..ff7c1603020b50 100644 --- a/src/crypto/crypto_hmac.cc +++ b/src/crypto/crypto_hmac.cc @@ -134,7 +134,7 @@ void Hmac::HmacDigest(const FunctionCallbackInfo& args) { env->isolate()->ThrowException(error); return; } - args.GetReturnValue().Set(rc.ToLocalChecked()); + args.GetReturnValue().Set(rc.FromMaybe(Local())); } HmacConfig::HmacConfig(HmacConfig&& other) noexcept diff --git a/src/crypto/crypto_keys.cc b/src/crypto/crypto_keys.cc index 5504e91d92d8b0..f5538e54d7e11b 100644 --- a/src/crypto/crypto_keys.cc +++ b/src/crypto/crypto_keys.cc @@ -266,20 +266,22 @@ ParseKeyResult ParsePrivateKey(EVPKeyPointer* pkey, return ParseKeyResult::kParseKeyFailed; } -Local BIOToStringOrBuffer(Environment* env, - BIO* bio, - PKFormatType format) { +MaybeLocal BIOToStringOrBuffer( + Environment* env, + BIO* bio, + PKFormatType format) { BUF_MEM* bptr; BIO_get_mem_ptr(bio, &bptr); if (format == kKeyFormatPEM) { // PEM is an ASCII format, so we will return it as a string. return String::NewFromUtf8(env->isolate(), bptr->data, NewStringType::kNormal, - bptr->length).ToLocalChecked(); + bptr->length).FromMaybe(Local()); } else { CHECK_EQ(format, kKeyFormatDER); // DER is binary, return it as a buffer. - return Buffer::Copy(env, bptr->data, bptr->length).ToLocalChecked(); + return Buffer::Copy(env, bptr->data, bptr->length) + .FromMaybe(Local()); } } @@ -1108,13 +1110,13 @@ void KeyObjectHandle::Export(const FunctionCallbackInfo& args) { } if (!result.IsEmpty()) - args.GetReturnValue().Set(result.ToLocalChecked()); + args.GetReturnValue().Set(result.FromMaybe(Local())); } -Local KeyObjectHandle::ExportSecretKey() const { +MaybeLocal KeyObjectHandle::ExportSecretKey() const { const char* buf = data_->GetSymmetricKey(); unsigned int len = data_->GetSymmetricKeySize(); - return Buffer::Copy(env(), buf, len).ToLocalChecked(); + return Buffer::Copy(env(), buf, len).FromMaybe(Local()); } MaybeLocal KeyObjectHandle::ExportPublicKey( @@ -1183,7 +1185,9 @@ void NativeKeyObject::CreateNativeKeyObjectClass( KeyObjectHandle::kInternalFieldCount); t->Inherit(BaseObject::GetConstructorTemplate(env)); - Local ctor = t->GetFunction(env->context()).ToLocalChecked(); + Local ctor; + if (!t->GetFunction(env->context()).ToLocal(&ctor)) + return; Local recv = Undefined(env->isolate()); Local ret_v; @@ -1210,7 +1214,10 @@ BaseObjectPtr NativeKeyObject::KeyObjectTransferData::Deserialize( return {}; } - Local handle = KeyObjectHandle::Create(env, data_).ToLocalChecked(); + Local handle; + if (!KeyObjectHandle::Create(env, data_).ToLocal(&handle)) + return {}; + Local key_ctor; Local arg = FIXED_ONE_BYTE_STRING(env->isolate(), "internal/crypto/keys"); @@ -1232,8 +1239,10 @@ BaseObjectPtr NativeKeyObject::KeyObjectTransferData::Deserialize( CHECK(false); } - Local key = - key_ctor->NewInstance(context, 1, &handle).ToLocalChecked(); + Local key; + if (!key_ctor->NewInstance(context, 1, &handle).ToLocal(&key)) + return {}; + return BaseObjectPtr(Unwrap(key.As())); } diff --git a/src/crypto/crypto_keys.h b/src/crypto/crypto_keys.h index 2fc28c75745dd3..1799ec01ed793e 100644 --- a/src/crypto/crypto_keys.h +++ b/src/crypto/crypto_keys.h @@ -196,7 +196,7 @@ class KeyObjectHandle : public BaseObject { static void Export(const v8::FunctionCallbackInfo& args); - v8::Local ExportSecretKey() const; + v8::MaybeLocal ExportSecretKey() const; v8::MaybeLocal ExportPublicKey( const PublicKeyEncodingConfig& config) const; v8::MaybeLocal ExportPrivateKey( diff --git a/src/crypto/crypto_sig.cc b/src/crypto/crypto_sig.cc index 3913843f778b4d..59a9569ce8143c 100644 --- a/src/crypto/crypto_sig.cc +++ b/src/crypto/crypto_sig.cc @@ -377,7 +377,7 @@ void Sign::SignFinal(const FunctionCallbackInfo& args) { if (ret.error != kSignOk) return crypto::CheckThrow(env, ret.error); - args.GetReturnValue().Set(ret.signature.ToBuffer().ToLocalChecked()); + args.GetReturnValue().Set(ret.signature.ToBuffer().FromMaybe(Local())); } Verify::Verify(Environment* env, Local wrap) @@ -581,7 +581,7 @@ void Sign::SignSync(const FunctionCallbackInfo& args) { signature = ConvertSignatureToP1363(env, key, std::move(signature)); } - args.GetReturnValue().Set(signature.ToBuffer().ToLocalChecked()); + args.GetReturnValue().Set(signature.ToBuffer().FromMaybe(Local())); } void Verify::VerifySync(const FunctionCallbackInfo& args) { diff --git a/src/crypto/crypto_spkac.cc b/src/crypto/crypto_spkac.cc index 5688f9d86eae86..0f5698d8e80082 100644 --- a/src/crypto/crypto_spkac.cc +++ b/src/crypto/crypto_spkac.cc @@ -82,7 +82,7 @@ void ExportPublicKey(const FunctionCallbackInfo& args) { if (pkey.data() == nullptr) return args.GetReturnValue().SetEmptyString(); - args.GetReturnValue().Set(pkey.ToBuffer().ToLocalChecked()); + args.GetReturnValue().Set(pkey.ToBuffer().FromMaybe(Local())); } OpenSSLBuffer ExportChallenge(const ArrayBufferOrViewContents& input) { diff --git a/src/crypto/crypto_util.cc b/src/crypto/crypto_util.cc index c223c0b9fde008..c8a02cc335b66a 100644 --- a/src/crypto/crypto_util.cc +++ b/src/crypto/crypto_util.cc @@ -178,10 +178,14 @@ MaybeLocal CryptoErrorVector::ToException( if (copy.empty()) copy.push_back("no error"); // But possibly a bug... // Use last element as the error message, everything else goes // into the .opensslErrorStack property on the exception object. - auto exception_string = - String::NewFromUtf8(env->isolate(), copy.back().data(), - NewStringType::kNormal, copy.back().size()) - .ToLocalChecked(); + Local exception_string; + if (!String::NewFromUtf8( + env->isolate(), + copy.back().data(), + NewStringType::kNormal, + copy.back().size()).ToLocal(&exception_string)) { + return MaybeLocal(); + } copy.pop_back(); return copy.ToException(env, exception_string); } @@ -192,11 +196,12 @@ MaybeLocal CryptoErrorVector::ToException( if (!empty()) { CHECK(exception_v->IsObject()); Local exception = exception_v.As(); - Maybe ok = exception->Set(env->context(), - env->openssl_error_stack(), - ToV8Value(env->context(), *this).ToLocalChecked()); - if (ok.IsNothing()) + Local stack; + if (!ToV8Value(env->context(), *this).ToLocal(&stack) || + exception->Set(env->context(), env->openssl_error_stack(), stack) + .IsNothing()) { return MaybeLocal(); + } } return exception_v; @@ -470,18 +475,18 @@ void ThrowCryptoError(Environment* env, message = message_buffer; } HandleScope scope(env->isolate()); - Local exception_string = - String::NewFromUtf8(env->isolate(), message).ToLocalChecked(); - CryptoErrorVector errors; - errors.Capture(); + Local exception_string; Local exception; - if (!errors.ToException(env, exception_string).ToLocal(&exception)) - return; Local obj; - if (!exception->ToObject(env->context()).ToLocal(&obj)) + if (!String::NewFromUtf8(env->isolate(), message).ToLocal(&exception_string)) return; - if (error::Decorate(env, obj, err).IsNothing()) + CryptoErrorVector errors; + errors.Capture(); + if (!errors.ToException(env, exception_string).ToLocal(&exception) || + !exception->ToObject(env->context()).ToLocal(&obj) || + error::Decorate(env, obj, err).IsNothing()) { return; + } env->isolate()->ThrowException(exception); }