diff --git a/src/crypto/crypto_cipher.cc b/src/crypto/crypto_cipher.cc index 2b895fc2d22e34..23275e68b81ddb 100644 --- a/src/crypto/crypto_cipher.cc +++ b/src/crypto/crypto_cipher.cc @@ -453,7 +453,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) { @@ -643,7 +643,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())); }); } @@ -734,7 +734,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_context.cc b/src/crypto/crypto_context.cc index 16a14ffcc89591..946dfc78ef2e4a 100644 --- a/src/crypto/crypto_context.cc +++ b/src/crypto/crypto_context.cc @@ -21,7 +21,6 @@ namespace node { using v8::Array; using v8::ArrayBufferView; -using v8::Boolean; using v8::Context; using v8::DontDelete; using v8::Exception; @@ -551,7 +550,9 @@ void SecureContext::SetEngineKey(const FunctionCallbackInfo& args) { const Utf8Value engine_id(env->isolate(), args[1]); EnginePointer engine = LoadEngineById(*engine_id, &errors); if (!engine) { - env->isolate()->ThrowException(errors.ToException(env).ToLocalChecked()); + Local exception; + if (errors.ToException(env).ToLocal(&exception)) + env->isolate()->ThrowException(exception); return; } @@ -1061,7 +1062,9 @@ void SecureContext::SetClientCertEngine( const node::Utf8Value engine_id(env->isolate(), args[0]); EnginePointer engine = LoadEngineById(*engine_id, &errors); if (!engine) { - env->isolate()->ThrowException(errors.ToException(env).ToLocalChecked()); + Local exception; + if (errors.ToException(env).ToLocal(&exception)) + env->isolate()->ThrowException(exception); return; } @@ -1079,7 +1082,10 @@ void SecureContext::GetTicketKeys(const FunctionCallbackInfo& args) { SecureContext* wrap; ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder()); - Local buff = Buffer::New(wrap->env(), 48).ToLocalChecked(); + Local buff; + if (!Buffer::New(wrap->env(), 48).ToLocal(&buff)) + return; + memcpy(Buffer::Data(buff), wrap->ticket_key_name_, 16); memcpy(Buffer::Data(buff) + 16, wrap->ticket_key_hmac_, 16); memcpy(Buffer::Data(buff) + 32, wrap->ticket_key_aes_, 16); @@ -1143,45 +1149,59 @@ int SecureContext::TicketKeyCallback(SSL* ssl, HandleScope handle_scope(env->isolate()); Context::Scope context_scope(env->context()); - Local argv[] = { - Buffer::Copy(env, - reinterpret_cast(name), - kTicketPartSize).ToLocalChecked(), - Buffer::Copy(env, - reinterpret_cast(iv), - kTicketPartSize).ToLocalChecked(), - Boolean::New(env->isolate(), enc != 0) - }; - - Local ret = node::MakeCallback(env->isolate(), - sc->object(), - env->ticketkeycallback_string(), - arraysize(argv), - argv, - {0, 0}).ToLocalChecked(); + Local argv[3]; + + if (!Buffer::Copy( + env, + reinterpret_cast(name), + kTicketPartSize).ToLocal(&argv[0]) || + !Buffer::Copy( + env, + reinterpret_cast(iv), + kTicketPartSize).ToLocal(&argv[1])) { + return -1; + } + + argv[2] = env != 0 ? v8::True(env->isolate()) : v8::False(env->isolate()); + + Local ret; + if (!node::MakeCallback( + env->isolate(), + sc->object(), + env->ticketkeycallback_string(), + arraysize(argv), + argv, + {0, 0}).ToLocal(&ret) || + !ret->IsArray()) { + return -1; + } Local arr = ret.As(); - int r = - arr->Get(env->context(), - kTicketKeyReturnIndex).ToLocalChecked() - ->Int32Value(env->context()).FromJust(); + Local val; + if (!arr->Get(env->context(), kTicketKeyReturnIndex).ToLocal(&val) || + !val->IsInt32()) { + return -1; + } + + int r = val.As()->Value(); if (r < 0) return r; - Local hmac = arr->Get(env->context(), - kTicketKeyHMACIndex).ToLocalChecked(); - Local aes = arr->Get(env->context(), - kTicketKeyAESIndex).ToLocalChecked(); - if (Buffer::Length(aes) != kTicketPartSize) + Local hmac; + Local aes; + + if (!arr->Get(env->context(), kTicketKeyHMACIndex).ToLocal(&hmac) || + !arr->Get(env->context(), kTicketKeyAESIndex).ToLocal(&aes) || + Buffer::Length(aes) != kTicketPartSize) { return -1; + } if (enc) { - Local name_val = arr->Get(env->context(), - kTicketKeyNameIndex).ToLocalChecked(); - Local iv_val = arr->Get(env->context(), - kTicketKeyIVIndex).ToLocalChecked(); - - if (Buffer::Length(name_val) != kTicketPartSize || + Local name_val; + Local iv_val; + if (!arr->Get(env->context(), kTicketKeyNameIndex).ToLocal(&name_val) || + !arr->Get(env->context(), kTicketKeyIVIndex).ToLocal(&iv_val) || + Buffer::Length(name_val) != kTicketPartSize || Buffer::Length(iv_val) != kTicketPartSize) { return -1; } @@ -1272,7 +1292,9 @@ void SecureContext::GetCertificate(const FunctionCallbackInfo& args) { return args.GetReturnValue().SetNull(); int size = i2d_X509(cert, nullptr); - Local buff = Buffer::New(env, size).ToLocalChecked(); + Local buff; + if (!Buffer::New(env, size).ToLocal(&buff)) + return; unsigned char* serialized = reinterpret_cast( Buffer::Data(buff)); i2d_X509(cert, &serialized); 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); }