Skip to content

Commit

Permalink
crypto: use non-deprecated v8::Object::Set
Browse files Browse the repository at this point in the history
This commit updates node_crypto to use the non-deprecated Set functions
that return a v8::Maybe<bool>.

Backport-PR-URL: #20931
PR-URL: #17482
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
  • Loading branch information
danbev authored and rvagg committed Aug 16, 2018
1 parent 2cf2635 commit 4f3bf04
Showing 1 changed file with 86 additions and 55 deletions.
141 changes: 86 additions & 55 deletions src/node_crypto.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1630,26 +1630,31 @@ void SSLWrap<Base>::OnClientHello(void* arg,
Base* w = static_cast<Base*>(arg);
Environment* env = w->ssl_env();
HandleScope handle_scope(env->isolate());
Context::Scope context_scope(env->context());
Local<Context> context = env->context();
Context::Scope context_scope(context);

Local<Object> hello_obj = Object::New(env->isolate());
Local<Object> buff = Buffer::Copy(
env,
reinterpret_cast<const char*>(hello.session_id()),
hello.session_size()).ToLocalChecked();
hello_obj->Set(env->session_id_string(), buff);
hello_obj->Set(context, env->session_id_string(), buff).FromJust();
if (hello.servername() == nullptr) {
hello_obj->Set(env->servername_string(), String::Empty(env->isolate()));
hello_obj->Set(context,
env->servername_string(),
String::Empty(env->isolate())).FromJust();
} else {
Local<String> servername = OneByteString(env->isolate(),
hello.servername(),
hello.servername_size());
hello_obj->Set(env->servername_string(), servername);
hello_obj->Set(context, env->servername_string(), servername).FromJust();
}
hello_obj->Set(env->tls_ticket_string(),
Boolean::New(env->isolate(), hello.has_ticket()));
hello_obj->Set(env->ocsp_request_string(),
Boolean::New(env->isolate(), hello.ocsp_request()));
hello_obj->Set(context,
env->tls_ticket_string(),
Boolean::New(env->isolate(), hello.has_ticket())).FromJust();
hello_obj->Set(context,
env->ocsp_request_string(),
Boolean::New(env->isolate(), hello.ocsp_request())).FromJust();

Local<Value> argv[] = { hello_obj };
w->MakeCallback(env->onclienthello_string(), arraysize(argv), argv);
Expand Down Expand Up @@ -1694,7 +1699,7 @@ static bool SafeX509ExtPrint(BIO* out, X509_EXTENSION* ext) {

static Local<Object> X509ToObject(Environment* env, X509* cert) {
EscapableHandleScope scope(env->isolate());

Local<Context> context = env->context();
Local<Object> info = Object::New(env->isolate());

BIO* bio = BIO_new(BIO_s_mem());
Expand All @@ -1704,18 +1709,20 @@ static Local<Object> X509ToObject(Environment* env, X509* cert) {
0,
X509_NAME_FLAGS) > 0) {
BIO_get_mem_ptr(bio, &mem);
info->Set(env->subject_string(),
info->Set(context, env->subject_string(),
String::NewFromUtf8(env->isolate(), mem->data,
String::kNormalString, mem->length));
String::kNormalString,
mem->length)).FromJust();
}
(void) BIO_reset(bio);

X509_NAME* issuer_name = X509_get_issuer_name(cert);
if (X509_NAME_print_ex(bio, issuer_name, 0, X509_NAME_FLAGS) > 0) {
BIO_get_mem_ptr(bio, &mem);
info->Set(env->issuer_string(),
info->Set(context, env->issuer_string(),
String::NewFromUtf8(env->isolate(), mem->data,
String::kNormalString, mem->length));
String::kNormalString,
mem->length)).FromJust();
}
(void) BIO_reset(bio);

Expand All @@ -1740,9 +1747,10 @@ static Local<Object> X509ToObject(Environment* env, X509* cert) {
}

BIO_get_mem_ptr(bio, &mem);
info->Set(keys[i],
info->Set(context, keys[i],
String::NewFromUtf8(env->isolate(), mem->data,
String::kNormalString, mem->length));
String::kNormalString,
mem->length)).FromJust();

(void) BIO_reset(bio);
}
Expand All @@ -1758,9 +1766,10 @@ static Local<Object> X509ToObject(Environment* env, X509* cert) {
RSA_get0_key(rsa, &n, &e, nullptr);
BN_print(bio, n);
BIO_get_mem_ptr(bio, &mem);
info->Set(env->modulus_string(),
info->Set(context, env->modulus_string(),
String::NewFromUtf8(env->isolate(), mem->data,
String::kNormalString, mem->length));
String::kNormalString,
mem->length)).FromJust();
(void) BIO_reset(bio);

uint64_t exponent_word = static_cast<uint64_t>(BN_get_word(e));
Expand All @@ -1772,9 +1781,10 @@ static Local<Object> X509ToObject(Environment* env, X509* cert) {
BIO_printf(bio, "0x%x%08x", hi, lo);
}
BIO_get_mem_ptr(bio, &mem);
info->Set(env->exponent_string(),
info->Set(context, env->exponent_string(),
String::NewFromUtf8(env->isolate(), mem->data,
String::kNormalString, mem->length));
String::kNormalString,
mem->length)).FromJust();
(void) BIO_reset(bio);
}

Expand All @@ -1789,16 +1799,18 @@ static Local<Object> X509ToObject(Environment* env, X509* cert) {

ASN1_TIME_print(bio, X509_get_notBefore(cert));
BIO_get_mem_ptr(bio, &mem);
info->Set(env->valid_from_string(),
info->Set(context, env->valid_from_string(),
String::NewFromUtf8(env->isolate(), mem->data,
String::kNormalString, mem->length));
String::kNormalString,
mem->length)).FromJust();
(void) BIO_reset(bio);

ASN1_TIME_print(bio, X509_get_notAfter(cert));
BIO_get_mem_ptr(bio, &mem);
info->Set(env->valid_to_string(),
info->Set(context, env->valid_to_string(),
String::NewFromUtf8(env->isolate(), mem->data,
String::kNormalString, mem->length));
String::kNormalString,
mem->length)).FromJust();
BIO_free_all(bio);

unsigned int md_size, i;
Expand All @@ -1819,8 +1831,8 @@ static Local<Object> X509ToObject(Environment* env, X509* cert) {
fingerprint[0] = '\0';
}

info->Set(env->fingerprint_string(),
OneByteString(env->isolate(), fingerprint));
info->Set(context, env->fingerprint_string(),
OneByteString(env->isolate(), fingerprint)).FromJust();
}

STACK_OF(ASN1_OBJECT)* eku = static_cast<STACK_OF(ASN1_OBJECT)*>(
Expand All @@ -1832,18 +1844,20 @@ static Local<Object> X509ToObject(Environment* env, X509* cert) {
int j = 0;
for (int i = 0; i < sk_ASN1_OBJECT_num(eku); i++) {
if (OBJ_obj2txt(buf, sizeof(buf), sk_ASN1_OBJECT_value(eku, i), 1) >= 0)
ext_key_usage->Set(j++, OneByteString(env->isolate(), buf));
ext_key_usage->Set(context,
j++,
OneByteString(env->isolate(), buf)).FromJust();
}

sk_ASN1_OBJECT_pop_free(eku, ASN1_OBJECT_free);
info->Set(env->ext_key_usage_string(), ext_key_usage);
info->Set(context, env->ext_key_usage_string(), ext_key_usage).FromJust();
}

if (ASN1_INTEGER* serial_number = X509_get_serialNumber(cert)) {
if (BIGNUM* bn = ASN1_INTEGER_to_BN(serial_number, nullptr)) {
if (char* buf = BN_bn2hex(bn)) {
info->Set(env->serial_number_string(),
OneByteString(env->isolate(), buf));
info->Set(context, env->serial_number_string(),
OneByteString(env->isolate(), buf)).FromJust();
OPENSSL_free(buf);
}
BN_free(bn);
Expand All @@ -1856,7 +1870,7 @@ static Local<Object> X509ToObject(Environment* env, X509* cert) {
unsigned char* serialized = reinterpret_cast<unsigned char*>(
Buffer::Data(buff));
i2d_X509(cert, &serialized);
info->Set(env->raw_string(), buff);
info->Set(context, env->raw_string(), buff).FromJust();

return scope.Escape(info);
}
Expand All @@ -1869,6 +1883,7 @@ void SSLWrap<Base>::GetPeerCertificate(
Base* w;
ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
Environment* env = w->ssl_env();
Local<Context> context = env->context();

ClearErrorOnReturn clear_error_on_return;

Expand Down Expand Up @@ -1920,7 +1935,7 @@ void SSLWrap<Base>::GetPeerCertificate(
continue;

Local<Object> ca_info = X509ToObject(env, ca);
info->Set(env->issuercert_string(), ca_info);
info->Set(context, env->issuercert_string(), ca_info).FromJust();
info = ca_info;

// NOTE: Intentionally freeing cert that is not used anymore
Expand All @@ -1943,7 +1958,7 @@ void SSLWrap<Base>::GetPeerCertificate(
break;

Local<Object> ca_info = X509ToObject(env, ca);
info->Set(env->issuercert_string(), ca_info);
info->Set(context, env->issuercert_string(), ca_info).FromJust();
info = ca_info;

// NOTE: Intentionally freeing cert that is not used anymore
Expand All @@ -1955,7 +1970,7 @@ void SSLWrap<Base>::GetPeerCertificate(

// Self-issued certificate
if (X509_check_issued(cert, cert) == X509_V_OK)
info->Set(env->issuercert_string(), info);
info->Set(context, env->issuercert_string(), info).FromJust();

CHECK_NE(cert, nullptr);

Expand Down Expand Up @@ -2151,6 +2166,7 @@ void SSLWrap<Base>::GetEphemeralKeyInfo(
Base* w;
ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
Environment* env = Environment::GetCurrent(args);
Local<Context> context = env->context();

CHECK_NE(w->ssl_, nullptr);

Expand All @@ -2165,22 +2181,24 @@ void SSLWrap<Base>::GetEphemeralKeyInfo(
if (SSL_get_server_tmp_key(w->ssl_, &key)) {
switch (EVP_PKEY_id(key)) {
case EVP_PKEY_DH:
info->Set(env->type_string(),
FIXED_ONE_BYTE_STRING(env->isolate(), "DH"));
info->Set(env->size_string(),
Integer::New(env->isolate(), EVP_PKEY_bits(key)));
info->Set(context, env->type_string(),
FIXED_ONE_BYTE_STRING(env->isolate(), "DH")).FromJust();
info->Set(context, env->size_string(),
Integer::New(env->isolate(), EVP_PKEY_bits(key))).FromJust();
break;
case EVP_PKEY_EC:
{
EC_KEY* ec = EVP_PKEY_get1_EC_KEY(key);
int nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec));
EC_KEY_free(ec);
info->Set(env->type_string(),
FIXED_ONE_BYTE_STRING(env->isolate(), "ECDH"));
info->Set(env->name_string(),
OneByteString(args.GetIsolate(), OBJ_nid2sn(nid)));
info->Set(env->size_string(),
Integer::New(env->isolate(), EVP_PKEY_bits(key)));
info->Set(context, env->type_string(),
FIXED_ONE_BYTE_STRING(env->isolate(), "ECDH")).FromJust();
info->Set(context, env->name_string(),
OneByteString(args.GetIsolate(),
OBJ_nid2sn(nid))).FromJust();
info->Set(context, env->size_string(),
Integer::New(env->isolate(),
EVP_PKEY_bits(key))).FromJust();
}
}
EVP_PKEY_free(key);
Expand Down Expand Up @@ -2273,7 +2291,8 @@ void SSLWrap<Base>::VerifyError(const FunctionCallbackInfo<Value>& args) {
Local<String> reason_string = OneByteString(isolate, reason);
Local<Value> exception_value = Exception::Error(reason_string);
Local<Object> exception_object = exception_value->ToObject(isolate);
exception_object->Set(w->env()->code_string(), OneByteString(isolate, code));
exception_object->Set(w->env()->context(), w->env()->code_string(),
OneByteString(isolate, code)).FromJust();
args.GetReturnValue().Set(exception_object);
}

Expand All @@ -2283,16 +2302,18 @@ void SSLWrap<Base>::GetCurrentCipher(const FunctionCallbackInfo<Value>& args) {
Base* w;
ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
Environment* env = w->ssl_env();
Local<Context> context = env->context();

const SSL_CIPHER* c = SSL_get_current_cipher(w->ssl_);
if (c == nullptr)
return;

Local<Object> info = Object::New(env->isolate());
const char* cipher_name = SSL_CIPHER_get_name(c);
info->Set(env->name_string(), OneByteString(args.GetIsolate(), cipher_name));
info->Set(env->version_string(),
OneByteString(args.GetIsolate(), "TLSv1/SSLv3"));
info->Set(context, env->name_string(),
OneByteString(args.GetIsolate(), cipher_name)).FromJust();
info->Set(context, env->version_string(),
OneByteString(args.GetIsolate(), "TLSv1/SSLv3")).FromJust();
args.GetReturnValue().Set(info);
}

Expand Down Expand Up @@ -2601,27 +2622,31 @@ int SSLWrap<Base>::SSLCertCallback(SSL* s, void* arg) {
return -1;

Environment* env = w->env();
Local<Context> context = env->context();
HandleScope handle_scope(env->isolate());
Context::Scope context_scope(env->context());
Context::Scope context_scope(context);
w->cert_cb_running_ = true;

Local<Object> info = Object::New(env->isolate());

const char* servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
if (servername == nullptr) {
info->Set(env->servername_string(), String::Empty(env->isolate()));
info->Set(context,
env->servername_string(),
String::Empty(env->isolate())).FromJust();
} else {
Local<String> str = OneByteString(env->isolate(), servername,
strlen(servername));
info->Set(env->servername_string(), str);
info->Set(context, env->servername_string(), str).FromJust();
}

bool ocsp = false;
#ifdef NODE__HAVE_TLSEXT_STATUS_CB
ocsp = SSL_get_tlsext_status_type(s) == TLSEXT_STATUSTYPE_ocsp;
#endif

info->Set(env->ocsp_request_string(), Boolean::New(env->isolate(), ocsp));
info->Set(context, env->ocsp_request_string(),
Boolean::New(env->isolate(), ocsp)).FromJust();

Local<Value> argv[] = { info };
w->MakeCallback(env->oncertcb_string(), arraysize(argv), argv);
Expand Down Expand Up @@ -5550,7 +5575,7 @@ void PBKDF2(const FunctionCallbackInfo<Value>& args) {
keylen);

if (args[5]->IsFunction()) {
obj->Set(env->ondone_string(), args[5]);
obj->Set(env->context(), env->ondone_string(), args[5]).FromJust();

if (env->in_domain()) {
obj->Set(env->context(),
Expand Down Expand Up @@ -5758,7 +5783,7 @@ void RandomBytes(const FunctionCallbackInfo<Value>& args) {
RandomBytesRequest::FREE_DATA);

if (args[1]->IsFunction()) {
obj->Set(env->ondone_string(), args[1]);
obj->Set(env->context(), env->ondone_string(), args[1]).FromJust();

if (env->in_domain()) {
obj->Set(env->context(),
Expand Down Expand Up @@ -5846,7 +5871,10 @@ void GetSSLCiphers(const FunctionCallbackInfo<Value>& args) {

for (int i = 0; i < sk_SSL_CIPHER_num(ciphers); ++i) {
const SSL_CIPHER* cipher = sk_SSL_CIPHER_value(ciphers, i);
arr->Set(i, OneByteString(args.GetIsolate(), SSL_CIPHER_get_name(cipher)));
arr->Set(env->context(),
i,
OneByteString(args.GetIsolate(),
SSL_CIPHER_get_name(cipher))).FromJust();
}

SSL_free(ssl);
Expand Down Expand Up @@ -5909,7 +5937,10 @@ void GetCurves(const FunctionCallbackInfo<Value>& args) {

if (EC_get_builtin_curves(curves, num_curves)) {
for (size_t i = 0; i < num_curves; i++) {
arr->Set(i, OneByteString(env->isolate(), OBJ_nid2sn(curves[i].nid)));
arr->Set(env->context(),
i,
OneByteString(env->isolate(),
OBJ_nid2sn(curves[i].nid))).FromJust();
}
}

Expand Down

0 comments on commit 4f3bf04

Please sign in to comment.