54 #define THROW_AND_RETURN_IF_NOT_STRING_OR_BUFFER(val, prefix) \ 56 if (!Buffer::HasInstance(val) && !val->IsString()) { \ 57 return env->ThrowTypeError(prefix " must be a string or a buffer"); \ 61 #define THROW_AND_RETURN_IF_NOT_BUFFER(val, prefix) \ 63 if (!Buffer::HasInstance(val)) { \ 64 return env->ThrowTypeError(prefix " must be a buffer"); \ 68 #define THROW_AND_RETURN_IF_NOT_STRING(val, prefix) \ 70 if (!val->IsString()) { \ 71 return env->ThrowTypeError(prefix " must be a string"); \ 75 static const char PUBLIC_KEY_PFX[] =
"-----BEGIN PUBLIC KEY-----";
76 static const int PUBLIC_KEY_PFX_LEN =
sizeof(PUBLIC_KEY_PFX) - 1;
77 static const char PUBRSA_KEY_PFX[] =
"-----BEGIN RSA PUBLIC KEY-----";
78 static const int PUBRSA_KEY_PFX_LEN =
sizeof(PUBRSA_KEY_PFX) - 1;
79 static const char CERTIFICATE_PFX[] =
"-----BEGIN CERTIFICATE-----";
80 static const int CERTIFICATE_PFX_LEN =
sizeof(CERTIFICATE_PFX) - 1;
82 static const int X509_NAME_FLAGS = ASN1_STRFLGS_ESC_CTRL
83 | ASN1_STRFLGS_UTF8_CONVERT
84 | XN_FLAG_SEP_MULTILINE
90 using v8::AccessorSignature;
96 using v8::EscapableHandleScope;
100 using v8::FunctionCallbackInfo;
101 using v8::FunctionTemplate;
102 using v8::HandleScope;
107 using v8::MaybeLocal;
110 using v8::ObjectTemplate;
111 using v8::Persistent;
112 using v8::PropertyAttribute;
113 using v8::PropertyCallbackInfo;
123 static const uint8_t CNNIC_ROOT_CA_SUBJECT_DATA[] =
124 "\x30\x32\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x43\x4E\x31\x0E\x30" 125 "\x0C\x06\x03\x55\x04\x0A\x13\x05\x43\x4E\x4E\x49\x43\x31\x13\x30\x11\x06" 126 "\x03\x55\x04\x03\x13\x0A\x43\x4E\x4E\x49\x43\x20\x52\x4F\x4F\x54";
127 static const uint8_t* cnnic_p = CNNIC_ROOT_CA_SUBJECT_DATA;
128 static X509_NAME* cnnic_name =
129 d2i_X509_NAME(
nullptr, &cnnic_p,
sizeof(CNNIC_ROOT_CA_SUBJECT_DATA)-1);
133 static const uint8_t CNNIC_EV_ROOT_CA_SUBJECT_DATA[] =
134 "\x30\x81\x8A\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x43\x4E\x31\x32" 135 "\x30\x30\x06\x03\x55\x04\x0A\x0C\x29\x43\x68\x69\x6E\x61\x20\x49\x6E\x74" 136 "\x65\x72\x6E\x65\x74\x20\x4E\x65\x74\x77\x6F\x72\x6B\x20\x49\x6E\x66\x6F" 137 "\x72\x6D\x61\x74\x69\x6F\x6E\x20\x43\x65\x6E\x74\x65\x72\x31\x47\x30\x45" 138 "\x06\x03\x55\x04\x03\x0C\x3E\x43\x68\x69\x6E\x61\x20\x49\x6E\x74\x65\x72" 139 "\x6E\x65\x74\x20\x4E\x65\x74\x77\x6F\x72\x6B\x20\x49\x6E\x66\x6F\x72\x6D" 140 "\x61\x74\x69\x6F\x6E\x20\x43\x65\x6E\x74\x65\x72\x20\x45\x56\x20\x43\x65" 141 "\x72\x74\x69\x66\x69\x63\x61\x74\x65\x73\x20\x52\x6F\x6F\x74";
142 static const uint8_t* cnnic_ev_p = CNNIC_EV_ROOT_CA_SUBJECT_DATA;
143 static X509_NAME *cnnic_ev_name =
144 d2i_X509_NAME(
nullptr, &cnnic_ev_p,
145 sizeof(CNNIC_EV_ROOT_CA_SUBJECT_DATA)-1);
147 static Mutex* mutexes;
149 static const char*
const root_certs[] = {
153 static std::string extra_root_certs_file;
155 static X509_STORE* root_cert_store;
158 template void SSLWrap<TLSWrap>::AddMethods(Environment* env,
159 Local<FunctionTemplate>
t);
160 template void SSLWrap<TLSWrap>::InitNPN(SecureContext* sc);
161 template void SSLWrap<TLSWrap>::SetSNIContext(SecureContext* sc);
162 template int SSLWrap<TLSWrap>::SetCACerts(SecureContext* sc);
163 template SSL_SESSION* SSLWrap<TLSWrap>::GetSessionCallback(
168 template int SSLWrap<TLSWrap>::NewSessionCallback(SSL* s,
170 template void SSLWrap<TLSWrap>::OnClientHello(
172 const ClientHelloParser::ClientHello& hello);
174 #ifndef OPENSSL_NO_NEXTPROTONEG 175 template int SSLWrap<TLSWrap>::AdvertiseNextProtoCallback(
177 const unsigned char**
data,
180 template int SSLWrap<TLSWrap>::SelectNextProtoCallback(
183 unsigned char* outlen,
184 const unsigned char* in,
189 #ifdef NODE__HAVE_TLSEXT_STATUS_CB 190 template int SSLWrap<TLSWrap>::TLSExtStatusCallback(SSL* s,
void* arg);
193 template void SSLWrap<TLSWrap>::DestroySSL();
194 template int SSLWrap<TLSWrap>::SSLCertCallback(SSL* s,
void* arg);
195 template void SSLWrap<TLSWrap>::WaitForCertCb(CertCb cb,
void* arg);
197 #ifdef TLSEXT_TYPE_application_layer_protocol_negotiation 198 template int SSLWrap<TLSWrap>::SelectALPNCallback(
200 const unsigned char** out,
201 unsigned char* outlen,
202 const unsigned char* in,
205 #endif // TLSEXT_TYPE_application_layer_protocol_negotiation 207 static void crypto_threadid_cb(CRYPTO_THREADID* tid) {
208 static_assert(
sizeof(uv_thread_t) <=
sizeof(
void*),
209 "uv_thread_t does not fit in a pointer");
210 CRYPTO_THREADID_set_pointer(tid, reinterpret_cast<void*>(uv_thread_self()));
214 static void crypto_lock_init(
void) {
215 mutexes =
new Mutex[CRYPTO_num_locks()];
219 static void crypto_lock_cb(
int mode,
int n,
const char*
file,
int line) {
220 CHECK(!(mode & CRYPTO_LOCK) ^ !(mode & CRYPTO_UNLOCK));
221 CHECK(!(mode & CRYPTO_READ) ^ !(mode & CRYPTO_WRITE));
223 auto mutex = &mutexes[
n];
224 if (mode & CRYPTO_LOCK)
231 static int PasswordCallback(
char *
buf,
int size,
int rwflag,
void *u) {
233 size_t buflen =
static_cast<size_t>(size);
234 size_t len = strlen(static_cast<const char*>(u));
235 len = len > buflen ? buflen :
len;
249 static int NoPasswordCallback(
char *buf,
int size,
int rwflag,
void *u) {
256 const char* default_message =
nullptr) {
257 HandleScope scope(env->isolate());
258 if (err != 0 || default_message ==
nullptr) {
259 char errmsg[128] = { 0 };
260 ERR_error_string_n(err, errmsg,
sizeof(errmsg));
261 env->ThrowError(errmsg);
263 env->ThrowError(default_message);
290 int status = RAND_status();
296 if (RAND_poll() == 0)
308 return RAND_bytes(buffer, length) != -1;
314 t->InstanceTemplate()->SetInternalFieldCount(1);
315 Local<String> secureContextString =
316 FIXED_ONE_BYTE_STRING(env->isolate(),
"SecureContext");
317 t->SetClassName(secureContextString);
320 env->SetProtoMethod(t,
"setKey", SecureContext::SetKey);
321 env->SetProtoMethod(t,
"setCert", SecureContext::SetCert);
322 env->SetProtoMethod(t,
"addCACert", SecureContext::AddCACert);
323 env->SetProtoMethod(t,
"addCRL", SecureContext::AddCRL);
324 env->SetProtoMethod(t,
"addRootCerts", SecureContext::AddRootCerts);
325 env->SetProtoMethod(t,
"setCiphers", SecureContext::SetCiphers);
326 env->SetProtoMethod(t,
"setECDHCurve", SecureContext::SetECDHCurve);
327 env->SetProtoMethod(t,
"setDHParam", SecureContext::SetDHParam);
328 env->SetProtoMethod(t,
"setOptions", SecureContext::SetOptions);
329 env->SetProtoMethod(t,
"setSessionIdContext",
330 SecureContext::SetSessionIdContext);
331 env->SetProtoMethod(t,
"setSessionTimeout",
332 SecureContext::SetSessionTimeout);
333 env->SetProtoMethod(t,
"close", SecureContext::Close);
334 env->SetProtoMethod(t,
"loadPKCS12", SecureContext::LoadPKCS12);
335 env->SetProtoMethod(t,
"getTicketKeys", SecureContext::GetTicketKeys);
336 env->SetProtoMethod(t,
"setTicketKeys", SecureContext::SetTicketKeys);
337 env->SetProtoMethod(t,
"setFreeListLength", SecureContext::SetFreeListLength);
338 env->SetProtoMethod(t,
339 "enableTicketKeyCallback",
340 SecureContext::EnableTicketKeyCallback);
341 env->SetProtoMethod(t,
"getCertificate", SecureContext::GetCertificate<true>);
342 env->SetProtoMethod(t,
"getIssuer", SecureContext::GetCertificate<false>);
344 t->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"kTicketKeyReturnIndex"),
345 Integer::NewFromUnsigned(env->isolate(), kTicketKeyReturnIndex));
346 t->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"kTicketKeyHMACIndex"),
347 Integer::NewFromUnsigned(env->isolate(), kTicketKeyHMACIndex));
348 t->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"kTicketKeyAESIndex"),
349 Integer::NewFromUnsigned(env->isolate(), kTicketKeyAESIndex));
350 t->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"kTicketKeyNameIndex"),
351 Integer::NewFromUnsigned(env->isolate(), kTicketKeyNameIndex));
352 t->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"kTicketKeyIVIndex"),
353 Integer::NewFromUnsigned(env->isolate(), kTicketKeyIVIndex));
355 t->PrototypeTemplate()->SetAccessor(
356 FIXED_ONE_BYTE_STRING(env->isolate(),
"_external"),
361 static_cast<PropertyAttribute
>(ReadOnly | DontDelete),
364 target->Set(secureContextString, t->GetFunction());
365 env->set_secure_context_constructor_template(t);
370 Environment* env = Environment::GetCurrent(args);
371 new SecureContext(env, args.This());
377 ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
378 Environment* env = sc->env();
380 const SSL_METHOD*
method = SSLv23_method();
382 if (args.Length() == 1 && args[0]->IsString()) {
383 const node::Utf8Value sslmethod(env->isolate(), args[0]);
389 if (strcmp(*sslmethod,
"SSLv2_method") == 0) {
390 return env->ThrowError(
"SSLv2 methods disabled");
391 }
else if (strcmp(*sslmethod,
"SSLv2_server_method") == 0) {
392 return env->ThrowError(
"SSLv2 methods disabled");
393 }
else if (strcmp(*sslmethod,
"SSLv2_client_method") == 0) {
394 return env->ThrowError(
"SSLv2 methods disabled");
395 }
else if (strcmp(*sslmethod,
"SSLv3_method") == 0) {
396 return env->ThrowError(
"SSLv3 methods disabled");
397 }
else if (strcmp(*sslmethod,
"SSLv3_server_method") == 0) {
398 return env->ThrowError(
"SSLv3 methods disabled");
399 }
else if (strcmp(*sslmethod,
"SSLv3_client_method") == 0) {
400 return env->ThrowError(
"SSLv3 methods disabled");
401 }
else if (strcmp(*sslmethod,
"SSLv23_method") == 0) {
402 method = SSLv23_method();
403 }
else if (strcmp(*sslmethod,
"SSLv23_server_method") == 0) {
404 method = SSLv23_server_method();
405 }
else if (strcmp(*sslmethod,
"SSLv23_client_method") == 0) {
406 method = SSLv23_client_method();
407 }
else if (strcmp(*sslmethod,
"TLSv1_method") == 0) {
408 method = TLSv1_method();
409 }
else if (strcmp(*sslmethod,
"TLSv1_server_method") == 0) {
410 method = TLSv1_server_method();
411 }
else if (strcmp(*sslmethod,
"TLSv1_client_method") == 0) {
412 method = TLSv1_client_method();
413 }
else if (strcmp(*sslmethod,
"TLSv1_1_method") == 0) {
414 method = TLSv1_1_method();
415 }
else if (strcmp(*sslmethod,
"TLSv1_1_server_method") == 0) {
416 method = TLSv1_1_server_method();
417 }
else if (strcmp(*sslmethod,
"TLSv1_1_client_method") == 0) {
418 method = TLSv1_1_client_method();
419 }
else if (strcmp(*sslmethod,
"TLSv1_2_method") == 0) {
420 method = TLSv1_2_method();
421 }
else if (strcmp(*sslmethod,
"TLSv1_2_server_method") == 0) {
422 method = TLSv1_2_server_method();
423 }
else if (strcmp(*sslmethod,
"TLSv1_2_client_method") == 0) {
424 method = TLSv1_2_client_method();
426 return env->ThrowError(
"Unknown method");
430 sc->ctx_ = SSL_CTX_new(method);
431 SSL_CTX_set_app_data(sc->ctx_, sc);
437 SSL_CTX_set_options(sc->ctx_, SSL_OP_NO_SSLv2);
438 SSL_CTX_set_options(sc->ctx_, SSL_OP_NO_SSLv3);
441 SSL_CTX_set_session_cache_mode(sc->ctx_,
442 SSL_SESS_CACHE_SERVER |
443 SSL_SESS_CACHE_NO_INTERNAL |
444 SSL_SESS_CACHE_NO_AUTO_CLEAR);
445 SSL_CTX_sess_set_get_cb(sc->ctx_, SSLWrap<Connection>::GetSessionCallback);
446 SSL_CTX_sess_set_new_cb(sc->ctx_, SSLWrap<Connection>::NewSessionCallback);
452 static BIO* LoadBIO(Environment* env, Local<Value> v) {
453 HandleScope scope(env->isolate());
456 const node::Utf8Value
s(env->isolate(), v);
457 return NodeBIO::NewFixed(*s, s.length());
468 void SecureContext::SetKey(
const FunctionCallbackInfo<Value>& args) {
469 Environment* env = Environment::GetCurrent(args);
472 ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
474 unsigned int len = args.Length();
476 return env->ThrowError(
"Private key argument is mandatory");
480 return env->ThrowError(
"Only private key and pass phrase are expected");
484 if (args[1]->IsUndefined() || args[1]->IsNull())
490 BIO *bio = LoadBIO(env, args[0]);
494 node::Utf8Value passphrase(env->isolate(), args[1]);
496 EVP_PKEY* key = PEM_read_bio_PrivateKey(bio,
499 len == 1 ?
nullptr : *passphrase);
503 unsigned long err = ERR_get_error();
505 return env->ThrowError(
"PEM_read_bio_PrivateKey");
510 int rv = SSL_CTX_use_PrivateKey(sc->ctx_, key);
515 unsigned long err = ERR_get_error();
517 return env->ThrowError(
"SSL_CTX_use_PrivateKey");
526 X509_STORE* store = SSL_CTX_get_cert_store(ctx);
527 X509_STORE_CTX store_ctx;
529 ret = X509_STORE_CTX_init(&store_ctx, store,
nullptr,
nullptr);
533 ret = X509_STORE_CTX_get1_issuer(issuer, &store_ctx, cert);
534 X509_STORE_CTX_cleanup(&store_ctx);
543 STACK_OF(X509)* extra_certs,
546 CHECK_EQ(*issuer,
nullptr);
547 CHECK_EQ(*cert,
nullptr);
549 int ret = SSL_CTX_use_certificate(ctx, x);
556 SSL_CTX_clear_extra_chain_certs(ctx);
558 for (
int i = 0; i < sk_X509_num(extra_certs); i++) {
559 X509* ca = sk_X509_value(extra_certs, i);
562 r = SSL_CTX_add1_chain_cert(ctx, ca);
575 if (*issuer !=
nullptr || X509_check_issued(ca, x) != X509_V_OK)
584 if (*issuer ==
nullptr) {
586 ret = ret < 0 ? 0 : 1;
591 *issuer = X509_dup(*issuer);
592 if (*issuer ==
nullptr) {
600 if (ret && x !=
nullptr) {
602 if (*cert ==
nullptr)
624 x = PEM_read_bio_X509_AUX(in,
nullptr, NoPasswordCallback,
nullptr);
627 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_PEM_LIB);
631 X509* extra =
nullptr;
633 unsigned long err = 0;
636 STACK_OF(X509)* extra_certs = sk_X509_new_null();
637 if (extra_certs ==
nullptr) {
638 SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_MALLOC_FAILURE);
642 while ((extra = PEM_read_bio_X509(in,
646 if (sk_X509_push(extra_certs, extra))
655 err = ERR_peek_last_error();
656 if (ERR_GET_LIB(err) == ERR_LIB_PEM &&
657 ERR_GET_REASON(err) == PEM_R_NO_START_LINE) {
669 if (extra_certs !=
nullptr)
670 sk_X509_pop_free(extra_certs, X509_free);
671 if (extra !=
nullptr)
680 void SecureContext::SetCert(
const FunctionCallbackInfo<Value>& args) {
681 Environment* env = Environment::GetCurrent(args);
684 ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
686 if (args.Length() != 1) {
687 return env->ThrowTypeError(
"Certificate argument is mandatory");
690 BIO* bio = LoadBIO(env, args[0]);
695 if (sc->issuer_ !=
nullptr) {
696 X509_free(sc->issuer_);
697 sc->issuer_ =
nullptr;
699 if (sc->cert_ !=
nullptr) {
700 X509_free(sc->cert_);
712 unsigned long err = ERR_get_error();
714 return env->ThrowError(
"SSL_CTX_use_certificate_chain");
721 #if OPENSSL_VERSION_NUMBER < 0x10100000L && !defined(OPENSSL_IS_BORINGSSL) 725 static int X509_STORE_up_ref(X509_STORE* store) {
726 CRYPTO_add(&store->references, 1, CRYPTO_LOCK_X509_STORE);
730 static int X509_up_ref(X509* cert) {
731 CRYPTO_add(&cert->references, 1, CRYPTO_LOCK_X509);
734 #endif // OPENSSL_VERSION_NUMBER < 0x10100000L && !OPENSSL_IS_BORINGSSL 737 static X509_STORE* NewRootCertStore() {
738 static std::vector<X509*> root_certs_vector;
739 if (root_certs_vector.empty()) {
740 for (
size_t i = 0; i < arraysize(root_certs); i++) {
741 BIO* bp = NodeBIO::NewFixed(root_certs[i], strlen(root_certs[i]));
742 X509 *x509 = PEM_read_bio_X509(bp,
nullptr, NoPasswordCallback,
nullptr);
746 CHECK_NE(x509,
nullptr);
748 root_certs_vector.push_back(x509);
752 X509_STORE* store = X509_STORE_new();
753 if (ssl_openssl_cert_store) {
754 X509_STORE_set_default_paths(store);
756 for (X509 *cert : root_certs_vector) {
758 X509_STORE_add_cert(store, cert);
766 void SecureContext::AddCACert(
const FunctionCallbackInfo<Value>& args) {
767 Environment* env = Environment::GetCurrent(args);
770 ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
771 ClearErrorOnReturn clear_error_on_return;
773 if (args.Length() != 1) {
774 return env->ThrowTypeError(
"CA certificate argument is mandatory");
777 BIO* bio = LoadBIO(env, args[0]);
782 X509_STORE* cert_store = SSL_CTX_get_cert_store(sc->ctx_);
784 PEM_read_bio_X509(bio,
nullptr, NoPasswordCallback,
nullptr)) {
785 if (cert_store == root_cert_store) {
786 cert_store = NewRootCertStore();
787 SSL_CTX_set_cert_store(sc->ctx_, cert_store);
789 X509_STORE_add_cert(cert_store, x509);
790 SSL_CTX_add_client_CA(sc->ctx_, x509);
798 void SecureContext::AddCRL(
const FunctionCallbackInfo<Value>& args) {
799 Environment* env = Environment::GetCurrent(args);
802 ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
804 if (args.Length() != 1) {
805 return env->ThrowTypeError(
"CRL argument is mandatory");
808 ClearErrorOnReturn clear_error_on_return;
810 BIO *bio = LoadBIO(env, args[0]);
815 PEM_read_bio_X509_CRL(bio,
nullptr, NoPasswordCallback,
nullptr);
817 if (crl ==
nullptr) {
819 return env->ThrowError(
"Failed to parse CRL");
822 X509_STORE* cert_store = SSL_CTX_get_cert_store(sc->ctx_);
823 if (cert_store == root_cert_store) {
824 cert_store = NewRootCertStore();
825 SSL_CTX_set_cert_store(sc->ctx_, cert_store);
828 X509_STORE_add_crl(cert_store, crl);
829 X509_STORE_set_flags(cert_store,
830 X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);
838 extra_root_certs_file =
file;
842 static unsigned long AddCertsFromFile(
846 MarkPopErrorOnReturn mark_pop_error_on_return;
848 BIO* bio = BIO_new_file(file,
"r");
850 return ERR_get_error();
854 PEM_read_bio_X509(bio,
nullptr, NoPasswordCallback,
nullptr)) {
855 X509_STORE_add_cert(store, x509);
860 unsigned long err = ERR_peek_error();
862 if (ERR_GET_LIB(err) == ERR_LIB_PEM &&
863 ERR_GET_REASON(err) == PEM_R_NO_START_LINE) {
870 void SecureContext::AddRootCerts(
const FunctionCallbackInfo<Value>& args) {
872 ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
873 ClearErrorOnReturn clear_error_on_return;
875 if (!root_cert_store) {
876 root_cert_store = NewRootCertStore();
878 if (!extra_root_certs_file.empty()) {
879 unsigned long err = AddCertsFromFile(
881 extra_root_certs_file.c_str());
884 "Ignoring extra certs from `%s`, load failed: %s\n",
885 extra_root_certs_file.c_str(),
886 ERR_error_string(err,
nullptr));
892 X509_STORE_up_ref(root_cert_store);
893 SSL_CTX_set_cert_store(sc->ctx_, root_cert_store);
897 void SecureContext::SetCiphers(
const FunctionCallbackInfo<Value>& args) {
899 ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
900 Environment* env = sc->env();
901 ClearErrorOnReturn clear_error_on_return;
903 if (args.Length() != 1) {
904 return env->ThrowTypeError(
"Ciphers argument is mandatory");
909 const node::Utf8Value ciphers(args.GetIsolate(), args[0]);
910 SSL_CTX_set_cipher_list(sc->ctx_, *ciphers);
914 void SecureContext::SetECDHCurve(
const FunctionCallbackInfo<Value>& args) {
916 ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
917 Environment* env = sc->env();
919 if (args.Length() != 1)
920 return env->ThrowTypeError(
"ECDH curve name argument is mandatory");
924 node::Utf8Value curve(env->isolate(), args[0]);
926 int nid = OBJ_sn2nid(*curve);
928 if (nid == NID_undef)
929 return env->ThrowTypeError(
"First argument should be a valid curve name");
931 EC_KEY* ecdh = EC_KEY_new_by_curve_name(nid);
934 return env->ThrowTypeError(
"First argument should be a valid curve name");
936 SSL_CTX_set_options(sc->ctx_, SSL_OP_SINGLE_ECDH_USE);
937 SSL_CTX_set_tmp_ecdh(sc->ctx_, ecdh);
943 void SecureContext::SetDHParam(
const FunctionCallbackInfo<Value>& args) {
945 ASSIGN_OR_RETURN_UNWRAP(&sc, args.This());
946 Environment* env = sc->env();
947 ClearErrorOnReturn clear_error_on_return;
951 if (args.Length() != 1)
952 return env->ThrowTypeError(
"DH argument is mandatory");
955 BIO* bio = LoadBIO(env, args[0]);
959 DH* dh = PEM_read_bio_DHparams(bio,
nullptr,
nullptr,
nullptr);
965 const int size = BN_num_bits(dh->p);
967 return env->ThrowError(
"DH parameter is less than 1024 bits");
968 }
else if (size < 2048) {
969 args.GetReturnValue().Set(FIXED_ONE_BYTE_STRING(
970 env->isolate(),
"DH parameter is less than 2048 bits"));
973 SSL_CTX_set_options(sc->ctx_, SSL_OP_SINGLE_DH_USE);
974 int r = SSL_CTX_set_tmp_dh(sc->ctx_, dh);
978 return env->ThrowTypeError(
"Error setting temp DH parameter");
982 void SecureContext::SetOptions(
const FunctionCallbackInfo<Value>& args) {
984 ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
986 if (args.Length() != 1 || !args[0]->IntegerValue()) {
987 return sc->env()->ThrowTypeError(
"Options must be an integer value");
992 static_cast<long>(args[0]->IntegerValue()));
996 void SecureContext::SetSessionIdContext(
997 const FunctionCallbackInfo<Value>& args) {
999 ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
1000 Environment* env = sc->env();
1002 if (args.Length() != 1) {
1003 return env->ThrowTypeError(
"Session ID context argument is mandatory");
1008 const node::Utf8Value sessionIdContext(args.GetIsolate(), args[0]);
1009 const unsigned char* sid_ctx =
1010 reinterpret_cast<const unsigned char*
>(*sessionIdContext);
1011 unsigned int sid_ctx_len = sessionIdContext.length();
1013 int r = SSL_CTX_set_session_id_context(sc->ctx_, sid_ctx, sid_ctx_len);
1019 Local<String> message;
1021 bio = BIO_new(BIO_s_mem());
1022 if (bio ==
nullptr) {
1023 message = FIXED_ONE_BYTE_STRING(args.GetIsolate(),
1024 "SSL_CTX_set_session_id_context error");
1026 ERR_print_errors(bio);
1027 BIO_get_mem_ptr(bio, &mem);
1028 message = OneByteString(args.GetIsolate(), mem->data, mem->length);
1032 args.GetIsolate()->ThrowException(Exception::TypeError(message));
1036 void SecureContext::SetSessionTimeout(
const FunctionCallbackInfo<Value>& args) {
1038 ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
1040 if (args.Length() != 1 || !args[0]->IsInt32()) {
1041 return sc->env()->ThrowTypeError(
1042 "Session timeout must be a 32-bit integer");
1045 int32_t sessionTimeout = args[0]->Int32Value();
1046 SSL_CTX_set_timeout(sc->ctx_, sessionTimeout);
1050 void SecureContext::Close(
const FunctionCallbackInfo<Value>& args) {
1052 ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
1058 void SecureContext::LoadPKCS12(
const FunctionCallbackInfo<Value>& args) {
1059 Environment* env = Environment::GetCurrent(args);
1062 PKCS12* p12 =
nullptr;
1063 EVP_PKEY* pkey =
nullptr;
1064 X509* cert =
nullptr;
1065 STACK_OF(X509)* extra_certs =
nullptr;
1066 char* pass =
nullptr;
1070 ASSIGN_OR_RETURN_UNWRAP(&sc, args.Holder());
1071 ClearErrorOnReturn clear_error_on_return;
1073 if (args.Length() < 1) {
1074 return env->ThrowTypeError(
"PFX certificate argument is mandatory");
1077 in = LoadBIO(env, args[0]);
1078 if (in ==
nullptr) {
1079 return env->ThrowError(
"Unable to load BIO");
1082 if (args.Length() >= 2) {
1085 pass =
new char[passlen + 1];
1087 pass[passlen] =
'\0';
1091 if (sc->issuer_ !=
nullptr) {
1092 X509_free(sc->issuer_);
1093 sc->issuer_ =
nullptr;
1095 if (sc->cert_ !=
nullptr) {
1096 X509_free(sc->cert_);
1097 sc->cert_ =
nullptr;
1100 X509_STORE* cert_store = SSL_CTX_get_cert_store(sc->ctx_);
1102 if (d2i_PKCS12_bio(in, &p12) &&
1103 PKCS12_parse(p12, pass, &pkey, &cert, &extra_certs) &&
1109 SSL_CTX_use_PrivateKey(sc->ctx_, pkey)) {
1111 for (
int i = 0; i < sk_X509_num(extra_certs); i++) {
1112 X509* ca = sk_X509_value(extra_certs, i);
1114 if (cert_store == root_cert_store) {
1115 cert_store = NewRootCertStore();
1116 SSL_CTX_set_cert_store(sc->ctx_, cert_store);
1118 X509_STORE_add_cert(cert_store, ca);
1119 SSL_CTX_add_client_CA(sc->ctx_, ca);
1124 if (pkey !=
nullptr)
1125 EVP_PKEY_free(pkey);
1126 if (cert !=
nullptr)
1128 if (extra_certs !=
nullptr)
1129 sk_X509_pop_free(extra_certs, X509_free);
1136 unsigned long err = ERR_get_error();
1137 const char* str = ERR_reason_error_string(err);
1138 return env->ThrowError(str);
1143 void SecureContext::GetTicketKeys(
const FunctionCallbackInfo<Value>& args) {
1144 #if !defined(OPENSSL_NO_TLSEXT) && defined(SSL_CTX_get_tlsext_ticket_keys) 1146 SecureContext*
wrap;
1147 ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
1149 Local<Object> buff =
Buffer::New(wrap->env(), 48).ToLocalChecked();
1150 if (SSL_CTX_get_tlsext_ticket_keys(wrap->ctx_,
1153 return wrap->env()->ThrowError(
"Failed to fetch tls ticket keys");
1156 args.GetReturnValue().Set(buff);
1157 #endif // !def(OPENSSL_NO_TLSEXT) && def(SSL_CTX_get_tlsext_ticket_keys) 1161 void SecureContext::SetTicketKeys(
const FunctionCallbackInfo<Value>& args) {
1162 #if !defined(OPENSSL_NO_TLSEXT) && defined(SSL_CTX_get_tlsext_ticket_keys) 1163 SecureContext*
wrap;
1164 ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
1165 Environment* env = wrap->env();
1167 if (args.Length() < 1) {
1168 return env->ThrowTypeError(
"Ticket keys argument is mandatory");
1174 return env->ThrowTypeError(
"Ticket keys length must be 48 bytes");
1177 if (SSL_CTX_set_tlsext_ticket_keys(wrap->ctx_,
1180 return env->ThrowError(
"Failed to fetch tls ticket keys");
1183 args.GetReturnValue().Set(
true);
1184 #endif // !def(OPENSSL_NO_TLSEXT) && def(SSL_CTX_get_tlsext_ticket_keys) 1188 void SecureContext::SetFreeListLength(
const FunctionCallbackInfo<Value>& args) {
1189 #if OPENSSL_VERSION_NUMBER < 0x10100000L && !defined(OPENSSL_IS_BORINGSSL) 1192 SecureContext*
wrap;
1193 ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
1195 wrap->ctx_->freelist_max_len = args[0]->Int32Value();
1202 void SecureContext::EnableTicketKeyCallback(
1203 const FunctionCallbackInfo<Value>& args) {
1204 SecureContext*
wrap;
1205 ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
1207 SSL_CTX_set_tlsext_ticket_key_cb(wrap->ctx_, TicketKeyCallback);
1211 int SecureContext::TicketKeyCallback(SSL* ssl,
1212 unsigned char* name,
1214 EVP_CIPHER_CTX* ectx,
1217 static const int kTicketPartSize = 16;
1219 SecureContext* sc =
static_cast<SecureContext*
>(
1220 SSL_CTX_get_app_data(SSL_get_SSL_CTX(ssl)));
1222 Environment* env = sc->env();
1223 HandleScope handle_scope(env->isolate());
1224 Context::Scope context_scope(env->context());
1226 Local<Value> argv[] = {
1228 reinterpret_cast<char*>(name),
1229 kTicketPartSize).ToLocalChecked(),
1231 reinterpret_cast<char*>(iv),
1232 kTicketPartSize).ToLocalChecked(),
1238 env->ticketkeycallback_string(),
1241 {0, 0}).ToLocalChecked();
1242 Local<Array> arr = ret.As<Array>();
1244 int r = arr->Get(kTicketKeyReturnIndex)->Int32Value();
1248 Local<Value> hmac = arr->Get(kTicketKeyHMACIndex);
1249 Local<Value> aes = arr->Get(kTicketKeyAESIndex);
1254 Local<Value> name_val = arr->Get(kTicketKeyNameIndex);
1255 Local<Value> iv_val = arr->Get(kTicketKeyIVIndex);
1272 const unsigned char* aes_key =
1275 EVP_EncryptInit_ex(ectx,
1281 EVP_DecryptInit_ex(ectx,
1294 void SecureContext::CtxGetter(Local<String> property,
1295 const PropertyCallbackInfo<Value>& info) {
1297 ASSIGN_OR_RETURN_UNWRAP(&sc, info.This());
1298 Local<External> ext =
External::New(info.GetIsolate(), sc->ctx_);
1299 info.GetReturnValue().Set(ext);
1303 template <
bool primary>
1304 void SecureContext::GetCertificate(
const FunctionCallbackInfo<Value>& args) {
1305 SecureContext*
wrap;
1306 ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
1307 Environment* env = wrap->env();
1313 cert = wrap->issuer_;
1314 if (cert ==
nullptr)
1315 return args.GetReturnValue().Set(Null(env->isolate()));
1317 int size = i2d_X509(cert,
nullptr);
1318 Local<Object> buff =
Buffer::New(env, size).ToLocalChecked();
1319 unsigned char* serialized =
reinterpret_cast<unsigned char*
>(
1321 i2d_X509(cert, &serialized);
1323 args.GetReturnValue().Set(buff);
1327 template <
class Base>
1328 void SSLWrap<Base>::AddMethods(Environment* env, Local<FunctionTemplate> t) {
1329 HandleScope scope(env->isolate());
1331 env->SetProtoMethod(t,
"getPeerCertificate", GetPeerCertificate);
1332 env->SetProtoMethod(t,
"getSession", GetSession);
1333 env->SetProtoMethod(t,
"setSession", SetSession);
1334 env->SetProtoMethod(t,
"loadSession", LoadSession);
1335 env->SetProtoMethod(t,
"isSessionReused", IsSessionReused);
1336 env->SetProtoMethod(t,
"isInitFinished", IsInitFinished);
1337 env->SetProtoMethod(t,
"verifyError", VerifyError);
1338 env->SetProtoMethod(t,
"getCurrentCipher", GetCurrentCipher);
1339 env->SetProtoMethod(t,
"endParser", EndParser);
1340 env->SetProtoMethod(t,
"certCbDone", CertCbDone);
1341 env->SetProtoMethod(t,
"renegotiate", Renegotiate);
1342 env->SetProtoMethod(t,
"shutdownSSL", Shutdown);
1343 env->SetProtoMethod(t,
"getTLSTicket", GetTLSTicket);
1344 env->SetProtoMethod(t,
"newSessionDone", NewSessionDone);
1345 env->SetProtoMethod(t,
"setOCSPResponse", SetOCSPResponse);
1346 env->SetProtoMethod(t,
"requestOCSP", RequestOCSP);
1347 env->SetProtoMethod(t,
"getEphemeralKeyInfo", GetEphemeralKeyInfo);
1348 env->SetProtoMethod(t,
"getProtocol", GetProtocol);
1350 #ifdef SSL_set_max_send_fragment 1351 env->SetProtoMethod(t,
"setMaxSendFragment", SetMaxSendFragment);
1352 #endif // SSL_set_max_send_fragment 1354 #ifndef OPENSSL_NO_NEXTPROTONEG 1355 env->SetProtoMethod(t,
"getNegotiatedProtocol", GetNegotiatedProto);
1356 #endif // OPENSSL_NO_NEXTPROTONEG 1358 #ifndef OPENSSL_NO_NEXTPROTONEG 1359 env->SetProtoMethod(t,
"setNPNProtocols", SetNPNProtocols);
1362 env->SetProtoMethod(t,
"getALPNNegotiatedProtocol", GetALPNNegotiatedProto);
1363 env->SetProtoMethod(t,
"setALPNProtocols", SetALPNProtocols);
1365 t->PrototypeTemplate()->SetAccessor(
1366 FIXED_ONE_BYTE_STRING(env->isolate(),
"_external"),
1371 static_cast<PropertyAttribute
>(ReadOnly | DontDelete),
1376 template <
class Base>
1377 void SSLWrap<Base>::InitNPN(SecureContext* sc) {
1378 #ifndef OPENSSL_NO_NEXTPROTONEG 1380 SSL_CTX_set_next_protos_advertised_cb(sc->ctx_,
1381 AdvertiseNextProtoCallback,
1385 SSL_CTX_set_next_proto_select_cb(sc->ctx_, SelectNextProtoCallback,
nullptr);
1386 #endif // OPENSSL_NO_NEXTPROTONEG 1388 #ifdef NODE__HAVE_TLSEXT_STATUS_CB 1390 SSL_CTX_set_tlsext_status_cb(sc->ctx_, TLSExtStatusCallback);
1391 SSL_CTX_set_tlsext_status_arg(sc->ctx_,
nullptr);
1392 #endif // NODE__HAVE_TLSEXT_STATUS_CB 1396 template <
class Base>
1397 SSL_SESSION* SSLWrap<Base>::GetSessionCallback(SSL* s,
1401 Base* w =
static_cast<Base*
>(SSL_get_app_data(s));
1404 SSL_SESSION* sess = w->next_sess_;
1405 w->next_sess_ =
nullptr;
1411 template <
class Base>
1412 int SSLWrap<Base>::NewSessionCallback(SSL* s, SSL_SESSION* sess) {
1413 Base* w =
static_cast<Base*
>(SSL_get_app_data(s));
1414 Environment* env = w->ssl_env();
1415 HandleScope handle_scope(env->isolate());
1416 Context::Scope context_scope(env->context());
1418 if (!w->session_callbacks_)
1422 int size = i2d_SSL_SESSION(sess,
nullptr);
1423 if (size > SecureContext::kMaxSessionSize)
1427 Local<Object> buff =
Buffer::New(env, size).ToLocalChecked();
1428 unsigned char* serialized =
reinterpret_cast<unsigned char*
>(
1430 memset(serialized, 0, size);
1431 i2d_SSL_SESSION(sess, &serialized);
1435 reinterpret_cast<char*>(sess->session_id),
1436 sess->session_id_length).ToLocalChecked();
1437 Local<Value> argv[] = { session, buff };
1438 w->new_session_wait_ =
true;
1439 w->MakeCallback(env->onnewsession_string(), arraysize(argv), argv);
1445 template <
class Base>
1446 void SSLWrap<Base>::OnClientHello(
void* arg,
1447 const ClientHelloParser::ClientHello& hello) {
1448 Base* w =
static_cast<Base*
>(arg);
1449 Environment* env = w->ssl_env();
1450 HandleScope handle_scope(env->isolate());
1451 Context::Scope context_scope(env->context());
1453 Local<Object> hello_obj =
Object::New(env->isolate());
1456 reinterpret_cast<const char*>(hello.session_id()),
1457 hello.session_size()).ToLocalChecked();
1458 hello_obj->Set(env->session_id_string(), buff);
1459 if (hello.servername() ==
nullptr) {
1460 hello_obj->Set(env->servername_string(), String::Empty(env->isolate()));
1462 Local<String> servername = OneByteString(env->isolate(),
1464 hello.servername_size());
1465 hello_obj->Set(env->servername_string(), servername);
1467 hello_obj->Set(env->tls_ticket_string(),
1469 hello_obj->Set(env->ocsp_request_string(),
1472 Local<Value> argv[] = { hello_obj };
1473 w->MakeCallback(env->onclienthello_string(), arraysize(argv), argv);
1477 static bool SafeX509ExtPrint(BIO* out, X509_EXTENSION* ext) {
1478 const X509V3_EXT_METHOD*
method = X509V3_EXT_get(ext);
1480 if (method != X509V3_EXT_get_nid(NID_subject_alt_name))
1483 const unsigned char*
p = ext->value->data;
1484 GENERAL_NAMES* names =
reinterpret_cast<GENERAL_NAMES*
>(ASN1_item_d2i(
1488 ASN1_ITEM_ptr(method->it)));
1492 for (
int i = 0; i < sk_GENERAL_NAME_num(names); i++) {
1493 GENERAL_NAME* gen = sk_GENERAL_NAME_value(names, i);
1496 BIO_write(out,
", ", 2);
1498 if (gen->type == GEN_DNS) {
1499 ASN1_IA5STRING* name = gen->d.dNSName;
1501 BIO_write(out,
"DNS:", 4);
1502 BIO_write(out, name->data, name->length);
1504 STACK_OF(CONF_VALUE)* nval = i2v_GENERAL_NAME(
1505 const_cast<X509V3_EXT_METHOD*>(method), gen, NULL);
1508 X509V3_EXT_val_prn(out, nval, 0, 0);
1509 sk_CONF_VALUE_pop_free(nval, X509V3_conf_free);
1512 sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free);
1518 static Local<Object> X509ToObject(Environment* env, X509* cert) {
1519 EscapableHandleScope scope(env->isolate());
1523 BIO* bio = BIO_new(BIO_s_mem());
1525 if (X509_NAME_print_ex(bio,
1526 X509_get_subject_name(cert),
1528 X509_NAME_FLAGS) > 0) {
1529 BIO_get_mem_ptr(bio, &mem);
1530 info->Set(env->subject_string(),
1531 String::NewFromUtf8(env->isolate(), mem->data,
1532 String::kNormalString, mem->length));
1534 (void) BIO_reset(bio);
1536 X509_NAME* issuer_name = X509_get_issuer_name(cert);
1537 if (X509_NAME_print_ex(bio, issuer_name, 0, X509_NAME_FLAGS) > 0) {
1538 BIO_get_mem_ptr(bio, &mem);
1539 info->Set(env->issuer_string(),
1540 String::NewFromUtf8(env->isolate(), mem->data,
1541 String::kNormalString, mem->length));
1543 (void) BIO_reset(bio);
1545 int nids[] = { NID_subject_alt_name, NID_info_access };
1546 Local<String> keys[] = { env->subjectaltname_string(),
1547 env->infoaccess_string() };
1548 CHECK_EQ(arraysize(nids), arraysize(keys));
1549 for (
size_t i = 0; i < arraysize(nids); i++) {
1550 int index = X509_get_ext_by_NID(cert, nids[i], -1);
1554 X509_EXTENSION* ext;
1557 ext = X509_get_ext(cert, index);
1558 CHECK_NE(ext,
nullptr);
1560 if (!SafeX509ExtPrint(bio, ext)) {
1561 rv = X509V3_EXT_print(bio, ext, 0, 0);
1565 BIO_get_mem_ptr(bio, &mem);
1567 String::NewFromUtf8(env->isolate(), mem->data,
1568 String::kNormalString, mem->length));
1570 (void) BIO_reset(bio);
1573 EVP_PKEY* pkey = X509_get_pubkey(cert);
1575 if (pkey !=
nullptr)
1576 rsa = EVP_PKEY_get1_RSA(pkey);
1578 if (rsa !=
nullptr) {
1579 BN_print(bio, rsa->n);
1580 BIO_get_mem_ptr(bio, &mem);
1581 info->Set(env->modulus_string(),
1582 String::NewFromUtf8(env->isolate(), mem->data,
1583 String::kNormalString, mem->length));
1584 (void) BIO_reset(bio);
1586 uint64_t exponent_word =
static_cast<uint64_t
>(BN_get_word(rsa->e));
1587 uint32_t lo =
static_cast<uint32_t
>(exponent_word);
1588 uint32_t hi =
static_cast<uint32_t
>(exponent_word >> 32);
1590 BIO_printf(bio,
"0x%x", lo);
1592 BIO_printf(bio,
"0x%x%08x", hi, lo);
1594 BIO_get_mem_ptr(bio, &mem);
1595 info->Set(env->exponent_string(),
1596 String::NewFromUtf8(env->isolate(), mem->data,
1597 String::kNormalString, mem->length));
1598 (void) BIO_reset(bio);
1601 if (pkey !=
nullptr) {
1602 EVP_PKEY_free(pkey);
1605 if (rsa !=
nullptr) {
1610 ASN1_TIME_print(bio, X509_get_notBefore(cert));
1611 BIO_get_mem_ptr(bio, &mem);
1612 info->Set(env->valid_from_string(),
1613 String::NewFromUtf8(env->isolate(), mem->data,
1614 String::kNormalString, mem->length));
1615 (void) BIO_reset(bio);
1617 ASN1_TIME_print(bio, X509_get_notAfter(cert));
1618 BIO_get_mem_ptr(bio, &mem);
1619 info->Set(env->valid_to_string(),
1620 String::NewFromUtf8(env->isolate(), mem->data,
1621 String::kNormalString, mem->length));
1624 unsigned int md_size, i;
1625 unsigned char md[EVP_MAX_MD_SIZE];
1626 if (X509_digest(cert, EVP_sha1(), md, &md_size)) {
1627 const char hex[] =
"0123456789ABCDEF";
1628 char fingerprint[EVP_MAX_MD_SIZE * 3];
1631 for (i = 0; i < md_size; i++) {
1632 fingerprint[3*i] = hex[(md[i] & 0xf0) >> 4];
1633 fingerprint[(3*i)+1] = hex[(md[i] & 0x0f)];
1634 fingerprint[(3*i)+2] =
':';
1638 fingerprint[(3*(md_size-1))+2] =
'\0';
1640 fingerprint[0] =
'\0';
1643 info->Set(env->fingerprint_string(),
1644 OneByteString(env->isolate(), fingerprint));
1647 STACK_OF(ASN1_OBJECT)* eku =
static_cast<STACK_OF(ASN1_OBJECT)*
>(
1648 X509_get_ext_d2i(cert, NID_ext_key_usage,
nullptr,
nullptr));
1649 if (eku !=
nullptr) {
1650 Local<Array> ext_key_usage =
Array::New(env->isolate());
1654 for (
int i = 0; i < sk_ASN1_OBJECT_num(eku); i++) {
1655 if (OBJ_obj2txt(buf,
sizeof(buf), sk_ASN1_OBJECT_value(eku, i), 1) >= 0)
1656 ext_key_usage->Set(j++, OneByteString(env->isolate(),
buf));
1659 sk_ASN1_OBJECT_pop_free(eku, ASN1_OBJECT_free);
1660 info->Set(env->ext_key_usage_string(), ext_key_usage);
1663 if (ASN1_INTEGER* serial_number = X509_get_serialNumber(cert)) {
1664 if (BIGNUM* bn = ASN1_INTEGER_to_BN(serial_number,
nullptr)) {
1665 if (
char* buf = BN_bn2hex(bn)) {
1666 info->Set(env->serial_number_string(),
1667 OneByteString(env->isolate(),
buf));
1675 int size = i2d_X509(cert,
nullptr);
1676 Local<Object> buff =
Buffer::New(env, size).ToLocalChecked();
1677 unsigned char* serialized =
reinterpret_cast<unsigned char*
>(
1679 i2d_X509(cert, &serialized);
1680 info->Set(env->raw_string(), buff);
1682 return scope.Escape(info);
1687 template <
class Base>
1688 void SSLWrap<Base>::GetPeerCertificate(
1689 const FunctionCallbackInfo<Value>& args) {
1691 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
1692 Environment* env = w->ssl_env();
1694 ClearErrorOnReturn clear_error_on_return;
1696 Local<Object> result;
1701 X509* cert = w->is_server() ? SSL_get_peer_certificate(w->ssl_) :
nullptr;
1702 STACK_OF(X509)* ssl_certs = SSL_get_peer_cert_chain(w->ssl_);
1703 STACK_OF(X509)* peer_certs =
nullptr;
1704 if (cert ==
nullptr && ssl_certs ==
nullptr)
1707 if (cert ==
nullptr && sk_X509_num(ssl_certs) == 0)
1711 if (args.Length() < 1 || !args[0]->IsTrue()) {
1712 result = X509ToObject(env,
1713 cert ==
nullptr ? sk_X509_value(ssl_certs, 0) : cert);
1718 peer_certs = sk_X509_new(
nullptr);
1719 if (cert !=
nullptr)
1720 sk_X509_push(peer_certs, cert);
1721 for (
int i = 0; i < sk_X509_num(ssl_certs); i++) {
1722 cert = X509_dup(sk_X509_value(ssl_certs, i));
1723 if (cert ==
nullptr)
1725 if (!sk_X509_push(peer_certs, cert))
1730 cert = sk_X509_value(peer_certs, 0);
1731 result = X509ToObject(env, cert);
1735 cert = sk_X509_delete(peer_certs, 0);
1736 while (sk_X509_num(peer_certs) > 0) {
1738 for (i = 0; i < sk_X509_num(peer_certs); i++) {
1739 X509* ca = sk_X509_value(peer_certs, i);
1740 if (X509_check_issued(ca, cert) != X509_V_OK)
1743 Local<Object> ca_info = X509ToObject(env, ca);
1744 info->Set(env->issuercert_string(), ca_info);
1751 cert = sk_X509_delete(peer_certs, i);
1756 if (i == sk_X509_num(peer_certs))
1761 while (X509_check_issued(cert, cert) != X509_V_OK) {
1766 Local<Object> ca_info = X509ToObject(env, ca);
1767 info->Set(env->issuercert_string(), ca_info);
1778 if (X509_check_issued(cert, cert) == X509_V_OK)
1779 info->Set(env->issuercert_string(), info);
1781 CHECK_NE(cert,
nullptr);
1784 if (cert !=
nullptr)
1786 if (peer_certs !=
nullptr)
1787 sk_X509_pop_free(peer_certs, X509_free);
1788 if (result.IsEmpty())
1790 args.GetReturnValue().Set(result);
1794 template <
class Base>
1795 void SSLWrap<Base>::GetSession(
const FunctionCallbackInfo<Value>& args) {
1796 Environment* env = Environment::GetCurrent(args);
1799 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
1801 SSL_SESSION* sess = SSL_get_session(w->ssl_);
1802 if (sess ==
nullptr)
1805 int slen = i2d_SSL_SESSION(sess,
nullptr);
1808 char* sbuf = Malloc(slen);
1809 unsigned char*
p =
reinterpret_cast<unsigned char*
>(sbuf);
1810 i2d_SSL_SESSION(sess, &p);
1811 args.GetReturnValue().Set(
Buffer::New(env, sbuf, slen).ToLocalChecked());
1815 template <
class Base>
1816 void SSLWrap<Base>::SetSession(
const FunctionCallbackInfo<Value>& args) {
1817 Environment* env = Environment::GetCurrent(args);
1820 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
1822 if (args.Length() < 1) {
1823 return env->ThrowError(
"Session argument is mandatory");
1828 char* sbuf =
new char[slen];
1831 const unsigned char*
p =
reinterpret_cast<const unsigned char*
>(sbuf);
1832 SSL_SESSION* sess = d2i_SSL_SESSION(
nullptr, &p, slen);
1836 if (sess ==
nullptr)
1839 int r = SSL_set_session(w->ssl_, sess);
1840 SSL_SESSION_free(sess);
1843 return env->ThrowError(
"SSL_set_session error");
1847 template <
class Base>
1848 void SSLWrap<Base>::LoadSession(
const FunctionCallbackInfo<Value>& args) {
1850 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
1856 const unsigned char*
p =
reinterpret_cast<unsigned char*
>(sbuf);
1857 SSL_SESSION* sess = d2i_SSL_SESSION(
nullptr, &p, slen);
1860 if (w->next_sess_ !=
nullptr)
1861 SSL_SESSION_free(w->next_sess_);
1862 w->next_sess_ = sess;
1867 template <
class Base>
1868 void SSLWrap<Base>::IsSessionReused(
const FunctionCallbackInfo<Value>& args) {
1870 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
1871 bool yes = SSL_session_reused(w->ssl_);
1872 args.GetReturnValue().Set(yes);
1876 template <
class Base>
1877 void SSLWrap<Base>::EndParser(
const FunctionCallbackInfo<Value>& args) {
1879 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
1880 w->hello_parser_.End();
1884 template <
class Base>
1885 void SSLWrap<Base>::Renegotiate(
const FunctionCallbackInfo<Value>& args) {
1887 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
1889 ClearErrorOnReturn clear_error_on_return;
1891 bool yes = SSL_renegotiate(w->ssl_) == 1;
1892 args.GetReturnValue().Set(yes);
1896 template <
class Base>
1897 void SSLWrap<Base>::Shutdown(
const FunctionCallbackInfo<Value>& args) {
1899 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
1901 int rv = SSL_shutdown(w->ssl_);
1902 args.GetReturnValue().Set(rv);
1906 template <
class Base>
1907 void SSLWrap<Base>::GetTLSTicket(
const FunctionCallbackInfo<Value>& args) {
1909 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
1910 Environment* env = w->ssl_env();
1912 SSL_SESSION* sess = SSL_get_session(w->ssl_);
1913 if (sess ==
nullptr || sess->tlsext_tick ==
nullptr)
1918 reinterpret_cast<char*>(sess->tlsext_tick),
1919 sess->tlsext_ticklen).ToLocalChecked();
1921 args.GetReturnValue().Set(buff);
1925 template <
class Base>
1926 void SSLWrap<Base>::NewSessionDone(
const FunctionCallbackInfo<Value>& args) {
1928 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
1929 w->new_session_wait_ =
false;
1930 w->NewSessionDoneCb();
1934 template <
class Base>
1935 void SSLWrap<Base>::SetOCSPResponse(
1936 const v8::FunctionCallbackInfo<v8::Value>& args) {
1937 #ifdef NODE__HAVE_TLSEXT_STATUS_CB 1939 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
1940 Environment* env = w->env();
1942 if (args.Length() < 1)
1943 return env->ThrowTypeError(
"OCSP response argument is mandatory");
1947 w->ocsp_response_.Reset(args.GetIsolate(), args[0].As<Object>());
1948 #endif // NODE__HAVE_TLSEXT_STATUS_CB 1952 template <
class Base>
1953 void SSLWrap<Base>::RequestOCSP(
1954 const v8::FunctionCallbackInfo<v8::Value>& args) {
1955 #ifdef NODE__HAVE_TLSEXT_STATUS_CB 1957 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
1959 SSL_set_tlsext_status_type(w->ssl_, TLSEXT_STATUSTYPE_ocsp);
1960 #endif // NODE__HAVE_TLSEXT_STATUS_CB 1964 template <
class Base>
1965 void SSLWrap<Base>::GetEphemeralKeyInfo(
1966 const v8::FunctionCallbackInfo<v8::Value>& args) {
1968 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
1969 Environment* env = Environment::GetCurrent(args);
1971 CHECK_NE(w->ssl_,
nullptr);
1975 return args.GetReturnValue().SetNull();
1981 if (SSL_get_server_tmp_key(w->ssl_, &key)) {
1982 switch (EVP_PKEY_id(key)) {
1984 info->Set(env->type_string(),
1985 FIXED_ONE_BYTE_STRING(env->isolate(),
"DH"));
1986 info->Set(env->size_string(),
1991 EC_KEY* ec = EVP_PKEY_get1_EC_KEY(key);
1992 int nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec));
1994 info->Set(env->type_string(),
1995 FIXED_ONE_BYTE_STRING(env->isolate(),
"ECDH"));
1996 info->Set(env->name_string(),
1997 OneByteString(args.GetIsolate(), OBJ_nid2sn(nid)));
1998 info->Set(env->size_string(),
2005 return args.GetReturnValue().Set(info);
2009 #ifdef SSL_set_max_send_fragment 2010 template <
class Base>
2011 void SSLWrap<Base>::SetMaxSendFragment(
2012 const v8::FunctionCallbackInfo<v8::Value>& args) {
2013 CHECK(args.Length() >= 1 && args[0]->IsNumber());
2016 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
2018 int rv = SSL_set_max_send_fragment(w->ssl_, args[0]->Int32Value());
2019 args.GetReturnValue().Set(rv);
2021 #endif // SSL_set_max_send_fragment 2024 template <
class Base>
2025 void SSLWrap<Base>::IsInitFinished(
const FunctionCallbackInfo<Value>& args) {
2027 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
2028 bool yes = SSL_is_init_finished(w->ssl_);
2029 args.GetReturnValue().Set(yes);
2033 template <
class Base>
2034 void SSLWrap<Base>::VerifyError(
const FunctionCallbackInfo<Value>& args) {
2036 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
2041 long x509_verify_error =
2042 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT;
2043 if (X509* peer_cert = SSL_get_peer_certificate(w->ssl_)) {
2044 X509_free(peer_cert);
2045 x509_verify_error = SSL_get_verify_result(w->ssl_);
2048 if (x509_verify_error == X509_V_OK)
2049 return args.GetReturnValue().SetNull();
2054 const char* reason = X509_verify_cert_error_string(x509_verify_error);
2055 const char* code = reason;
2056 #define CASE_X509_ERR(CODE) case X509_V_ERR_##CODE: code = #CODE; break; 2057 switch (x509_verify_error) {
2086 #undef CASE_X509_ERR 2088 Isolate* isolate = args.GetIsolate();
2089 Local<String> reason_string = OneByteString(isolate, reason);
2090 Local<Value> exception_value = Exception::Error(reason_string);
2091 Local<Object> exception_object = exception_value->ToObject(isolate);
2092 exception_object->Set(w->env()->code_string(), OneByteString(isolate, code));
2093 args.GetReturnValue().Set(exception_object);
2097 template <
class Base>
2098 void SSLWrap<Base>::GetCurrentCipher(
const FunctionCallbackInfo<Value>& args) {
2100 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
2101 Environment* env = w->ssl_env();
2103 const SSL_CIPHER* c = SSL_get_current_cipher(w->ssl_);
2108 const char* cipher_name = SSL_CIPHER_get_name(c);
2109 info->Set(env->name_string(), OneByteString(args.GetIsolate(), cipher_name));
2110 const char* cipher_version = SSL_CIPHER_get_version(c);
2111 info->Set(env->version_string(),
2112 OneByteString(args.GetIsolate(), cipher_version));
2113 args.GetReturnValue().Set(info);
2117 template <
class Base>
2118 void SSLWrap<Base>::GetProtocol(
const FunctionCallbackInfo<Value>& args) {
2120 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
2122 const char* tls_version = SSL_get_version(w->ssl_);
2123 args.GetReturnValue().Set(OneByteString(args.GetIsolate(), tls_version));
2127 #ifndef OPENSSL_NO_NEXTPROTONEG 2128 template <
class Base>
2129 int SSLWrap<Base>::AdvertiseNextProtoCallback(SSL* s,
2130 const unsigned char** data,
2133 Base* w =
static_cast<Base*
>(SSL_get_app_data(s));
2134 Environment* env = w->env();
2135 HandleScope handle_scope(env->isolate());
2136 Context::Scope context_scope(env->context());
2139 w->object()->GetPrivate(
2141 env->npn_buffer_private_symbol()).ToLocalChecked();
2143 if (npn_buffer->IsUndefined()) {
2145 *data =
reinterpret_cast<const unsigned char*
>(
"");
2149 *data =
reinterpret_cast<const unsigned char*
>(
Buffer::Data(npn_buffer));
2153 return SSL_TLSEXT_ERR_OK;
2157 template <
class Base>
2158 int SSLWrap<Base>::SelectNextProtoCallback(SSL* s,
2159 unsigned char** out,
2160 unsigned char* outlen,
2161 const unsigned char* in,
2164 Base* w =
static_cast<Base*
>(SSL_get_app_data(s));
2165 Environment* env = w->env();
2166 HandleScope handle_scope(env->isolate());
2167 Context::Scope context_scope(env->context());
2170 w->object()->GetPrivate(
2172 env->npn_buffer_private_symbol()).ToLocalChecked();
2174 if (npn_buffer->IsUndefined()) {
2177 *out =
reinterpret_cast<unsigned char*
>(
const_cast<char*
>(
"http/1.1"));
2182 w->object()->SetPrivate(
2184 env->selected_npn_buffer_private_symbol(),
2185 False(env->isolate())).FromJust());
2187 return SSL_TLSEXT_ERR_OK;
2191 const unsigned char* npn_protos =
2192 reinterpret_cast<const unsigned char*
>(
Buffer::Data(npn_buffer));
2195 int status = SSL_select_next_proto(out, outlen, in, inlen, npn_protos, len);
2196 Local<Value> result;
2198 case OPENSSL_NPN_UNSUPPORTED:
2199 result = Null(env->isolate());
2201 case OPENSSL_NPN_NEGOTIATED:
2202 result = OneByteString(env->isolate(), *out, *outlen);
2204 case OPENSSL_NPN_NO_OVERLAP:
2205 result = False(env->isolate());
2212 w->object()->SetPrivate(
2214 env->selected_npn_buffer_private_symbol(),
2215 result).FromJust());
2217 return SSL_TLSEXT_ERR_OK;
2221 template <
class Base>
2222 void SSLWrap<Base>::GetNegotiatedProto(
2223 const FunctionCallbackInfo<Value>& args) {
2225 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
2226 Environment* env = w->env();
2228 if (w->is_client()) {
2229 auto selected_npn_buffer =
2230 w->object()->GetPrivate(
2232 env->selected_npn_buffer_private_symbol()).ToLocalChecked();
2233 args.GetReturnValue().Set(selected_npn_buffer);
2237 const unsigned char* npn_proto;
2238 unsigned int npn_proto_len;
2240 SSL_get0_next_proto_negotiated(w->ssl_, &npn_proto, &npn_proto_len);
2243 return args.GetReturnValue().Set(
false);
2245 args.GetReturnValue().Set(
2246 OneByteString(args.GetIsolate(), npn_proto, npn_proto_len));
2250 template <
class Base>
2251 void SSLWrap<Base>::SetNPNProtocols(
const FunctionCallbackInfo<Value>& args) {
2253 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
2254 Environment* env = w->env();
2256 if (args.Length() < 1)
2257 return env->ThrowTypeError(
"NPN protocols argument is mandatory");
2262 w->object()->SetPrivate(
2264 env->npn_buffer_private_symbol(),
2265 args[0]).FromJust());
2267 #endif // OPENSSL_NO_NEXTPROTONEG 2269 #ifdef TLSEXT_TYPE_application_layer_protocol_negotiation 2270 template <
class Base>
2271 int SSLWrap<Base>::SelectALPNCallback(SSL* s,
2272 const unsigned char** out,
2273 unsigned char* outlen,
2274 const unsigned char* in,
2277 Base* w =
static_cast<Base*
>(SSL_get_app_data(s));
2278 Environment* env = w->env();
2279 HandleScope handle_scope(env->isolate());
2280 Context::Scope context_scope(env->context());
2282 Local<Value> alpn_buffer =
2283 w->object()->GetPrivate(
2285 env->alpn_buffer_private_symbol()).ToLocalChecked();
2287 const unsigned char* alpn_protos =
2288 reinterpret_cast<const unsigned char*
>(
Buffer::Data(alpn_buffer));
2290 int status = SSL_select_next_proto(const_cast<unsigned char**>(out), outlen,
2291 alpn_protos, alpn_protos_len, in, inlen);
2294 case OPENSSL_NPN_NO_OVERLAP:
2300 return SSL_TLSEXT_ERR_ALERT_WARNING;
2301 case OPENSSL_NPN_NEGOTIATED:
2302 return SSL_TLSEXT_ERR_OK;
2304 return SSL_TLSEXT_ERR_ALERT_FATAL;
2307 #endif // TLSEXT_TYPE_application_layer_protocol_negotiation 2310 template <
class Base>
2311 void SSLWrap<Base>::GetALPNNegotiatedProto(
2312 const FunctionCallbackInfo<v8::Value>& args) {
2313 #ifdef TLSEXT_TYPE_application_layer_protocol_negotiation 2315 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
2317 const unsigned char* alpn_proto;
2318 unsigned int alpn_proto_len;
2320 SSL_get0_alpn_selected(w->ssl_, &alpn_proto, &alpn_proto_len);
2323 return args.GetReturnValue().Set(
false);
2325 args.GetReturnValue().Set(
2326 OneByteString(args.GetIsolate(), alpn_proto, alpn_proto_len));
2327 #endif // TLSEXT_TYPE_application_layer_protocol_negotiation 2331 template <
class Base>
2332 void SSLWrap<Base>::SetALPNProtocols(
2333 const FunctionCallbackInfo<v8::Value>& args) {
2334 #ifdef TLSEXT_TYPE_application_layer_protocol_negotiation 2336 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
2337 Environment* env = w->env();
2339 return env->ThrowTypeError(
"Must give a Buffer as first argument");
2341 if (w->is_client()) {
2342 const unsigned char* alpn_protos =
2343 reinterpret_cast<const unsigned char*
>(
Buffer::Data(args[0]));
2345 int r = SSL_set_alpn_protos(w->ssl_, alpn_protos, alpn_protos_len);
2349 w->object()->SetPrivate(
2351 env->alpn_buffer_private_symbol(),
2352 args[0]).FromJust());
2354 SSL_CTX_set_alpn_select_cb(SSL_get_SSL_CTX(w->ssl_), SelectALPNCallback,
2357 #endif // TLSEXT_TYPE_application_layer_protocol_negotiation 2361 #ifdef NODE__HAVE_TLSEXT_STATUS_CB 2362 template <
class Base>
2363 int SSLWrap<Base>::TLSExtStatusCallback(SSL* s,
void* arg) {
2364 Base* w =
static_cast<Base*
>(SSL_get_app_data(s));
2365 Environment* env = w->env();
2366 HandleScope handle_scope(env->isolate());
2368 if (w->is_client()) {
2370 const unsigned char* resp;
2371 int len = SSL_get_tlsext_status_ocsp_resp(s, &resp);
2373 if (resp ==
nullptr) {
2374 arg = Null(env->isolate());
2377 Buffer::Copy(env, reinterpret_cast<const char*>(resp), len)
2381 w->MakeCallback(env->onocspresponse_string(), 1, &arg);
2387 if (w->ocsp_response_.IsEmpty())
2388 return SSL_TLSEXT_ERR_NOACK;
2390 Local<Object> obj = PersistentToLocal(env->isolate(), w->ocsp_response_);
2395 char* data = node::Malloc(len);
2396 memcpy(data, resp, len);
2398 if (!SSL_set_tlsext_status_ocsp_resp(s, data, len))
2400 w->ocsp_response_.Reset();
2402 return SSL_TLSEXT_ERR_OK;
2405 #endif // NODE__HAVE_TLSEXT_STATUS_CB 2408 template <
class Base>
2409 void SSLWrap<Base>::WaitForCertCb(CertCb cb,
void* arg) {
2415 template <
class Base>
2416 int SSLWrap<Base>::SSLCertCallback(SSL* s,
void* arg) {
2417 Base* w =
static_cast<Base*
>(SSL_get_app_data(s));
2419 if (!w->is_server())
2422 if (!w->is_waiting_cert_cb())
2425 if (w->cert_cb_running_)
2428 Environment* env = w->env();
2429 HandleScope handle_scope(env->isolate());
2430 Context::Scope context_scope(env->context());
2431 w->cert_cb_running_ =
true;
2435 const char* servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
2436 if (servername ==
nullptr) {
2437 info->Set(env->servername_string(), String::Empty(env->isolate()));
2439 Local<String> str = OneByteString(env->isolate(), servername,
2440 strlen(servername));
2441 info->Set(env->servername_string(), str);
2445 #ifdef NODE__HAVE_TLSEXT_STATUS_CB 2446 ocsp = s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp;
2449 info->Set(env->ocsp_request_string(),
Boolean::New(env->isolate(), ocsp));
2451 Local<Value> argv[] = { info };
2452 w->MakeCallback(env->oncertcb_string(), arraysize(argv), argv);
2454 if (!w->cert_cb_running_)
2462 template <
class Base>
2463 void SSLWrap<Base>::CertCbDone(
const FunctionCallbackInfo<Value>& args) {
2465 ASSIGN_OR_RETURN_UNWRAP(&w, args.Holder());
2466 Environment* env = w->env();
2468 CHECK(w->is_waiting_cert_cb() && w->cert_cb_running_);
2470 Local<Object>
object = w->object();
2471 Local<Value> ctx =
object->Get(env->sni_context_string());
2472 Local<FunctionTemplate> cons = env->secure_context_constructor_template();
2475 if (!ctx->IsObject())
2478 if (cons->HasInstance(ctx)) {
2480 ASSIGN_OR_RETURN_UNWRAP(&sc, ctx.As<Object>());
2481 w->sni_context_.Reset();
2482 w->sni_context_.Reset(env->isolate(),
ctx);
2487 X509* x509 = SSL_CTX_get0_certificate(sc->ctx_);
2488 EVP_PKEY* pkey = SSL_CTX_get0_privatekey(sc->ctx_);
2489 STACK_OF(X509)* chain;
2491 rv = SSL_CTX_get0_chain_certs(sc->ctx_, &chain);
2493 rv = SSL_use_certificate(w->ssl_, x509);
2495 rv = SSL_use_PrivateKey(w->ssl_, pkey);
2496 if (rv && chain !=
nullptr)
2497 rv = SSL_set1_chain(w->ssl_, chain);
2499 rv = w->SetCACerts(sc);
2501 unsigned long err = ERR_get_error();
2503 return env->ThrowError(
"CertCbDone");
2508 Local<Value> err = Exception::TypeError(env->sni_context_err_string());
2509 w->MakeCallback(env->onerror_string(), 1, &err);
2518 arg = w->cert_cb_arg_;
2520 w->cert_cb_running_ =
false;
2521 w->cert_cb_ =
nullptr;
2522 w->cert_cb_arg_ =
nullptr;
2528 template <
class Base>
2529 void SSLWrap<Base>::SSLGetter(Local<String> property,
2530 const PropertyCallbackInfo<Value>& info) {
2532 ASSIGN_OR_RETURN_UNWRAP(&base, info.This());
2533 SSL* ssl = base->ssl_;
2534 Local<External> ext =
External::New(info.GetIsolate(), ssl);
2535 info.GetReturnValue().Set(ext);
2539 template <
class Base>
2540 void SSLWrap<Base>::DestroySSL() {
2541 if (ssl_ ==
nullptr)
2545 env_->isolate()->AdjustAmountOfExternalAllocatedMemory(-kExternalSize);
2550 template <
class Base>
2551 void SSLWrap<Base>::SetSNIContext(SecureContext* sc) {
2553 CHECK_EQ(SSL_set_SSL_CTX(ssl_, sc->ctx_), sc->ctx_);
2559 template <
class Base>
2560 int SSLWrap<Base>::SetCACerts(SecureContext* sc) {
2561 int err = SSL_set1_verify_cert_store(ssl_, SSL_CTX_get_cert_store(sc->ctx_));
2565 STACK_OF(X509_NAME)* list = SSL_dup_CA_list(
2566 SSL_CTX_get_client_CA_list(sc->ctx_));
2569 SSL_set_client_CA_list(ssl_, list);
2574 void Connection::OnClientHelloParseEnd(
void* arg) {
2575 Connection* conn =
static_cast<Connection*
>(arg);
2578 int r = BIO_write(conn->bio_read_,
2579 reinterpret_cast<char*>(conn->hello_data_),
2580 conn->hello_offset_);
2581 conn->HandleBIOError(conn->bio_read_,
"BIO_write", r);
2582 conn->SetShutdownFlags();
2586 #ifdef SSL_PRINT_DEBUG 2587 # define DEBUG_PRINT(...) fprintf (stderr, __VA_ARGS__) 2589 # define DEBUG_PRINT(...) 2593 int Connection::HandleBIOError(BIO *bio,
const char*
func,
int rv) {
2597 int retry = BIO_should_retry(bio);
2600 if (BIO_should_write(bio)) {
2601 DEBUG_PRINT(
"[%p] BIO: %s want write. should retry %d\n",
2607 }
else if (BIO_should_read(bio)) {
2608 DEBUG_PRINT(
"[%p] BIO: %s want read. should retry %d\n", ssl_, func, retry);
2612 char ssl_error_buf[512];
2613 ERR_error_string_n(rv, ssl_error_buf,
sizeof(ssl_error_buf));
2615 HandleScope scope(ssl_env()->isolate());
2616 Local<Value> exception =
2617 Exception::Error(OneByteString(ssl_env()->isolate(), ssl_error_buf));
2618 object()->Set(ssl_env()->error_string(), exception);
2633 int Connection::HandleSSLError(
const char*
func,
2637 ClearErrorOnReturn clear_error_on_return;
2641 if (rv == 0 && zs == kZeroIsNotAnError)
2644 int err = SSL_get_error(ssl_, rv);
2646 if (err == SSL_ERROR_NONE) {
2649 }
else if (err == SSL_ERROR_WANT_WRITE) {
2650 DEBUG_PRINT(
"[%p] SSL: %s want write\n", ssl_, func);
2653 }
else if (err == SSL_ERROR_WANT_READ) {
2654 DEBUG_PRINT(
"[%p] SSL: %s want read\n", ssl_, func);
2657 }
else if (err == SSL_ERROR_WANT_X509_LOOKUP) {
2658 DEBUG_PRINT(
"[%p] SSL: %s want x509 lookup\n", ssl_, func);
2661 }
else if (err == SSL_ERROR_ZERO_RETURN) {
2662 HandleScope scope(ssl_env()->isolate());
2664 Local<Value> exception =
2665 Exception::Error(ssl_env()->zero_return_string());
2666 object()->Set(ssl_env()->error_string(), exception);
2669 }
else if (err == SSL_ERROR_SYSCALL && ss == kIgnoreSyscall) {
2673 HandleScope scope(ssl_env()->isolate());
2677 CHECK(err == SSL_ERROR_SSL || err == SSL_ERROR_SYSCALL);
2684 bio = BIO_new(BIO_s_mem());
2685 if (bio !=
nullptr) {
2686 ERR_print_errors(bio);
2687 BIO_get_mem_ptr(bio, &mem);
2688 Local<Value> exception = Exception::Error(
2689 OneByteString(ssl_env()->isolate(),
2692 object()->Set(ssl_env()->error_string(), exception);
2703 void Connection::SetShutdownFlags() {
2704 HandleScope scope(ssl_env()->isolate());
2706 int flags = SSL_get_shutdown(ssl_);
2708 if (flags & SSL_SENT_SHUTDOWN) {
2709 Local<String> sent_shutdown_key = ssl_env()->sent_shutdown_string();
2710 object()->Set(sent_shutdown_key, True(ssl_env()->isolate()));
2713 if (flags & SSL_RECEIVED_SHUTDOWN) {
2714 Local<String> received_shutdown_key = ssl_env()->received_shutdown_string();
2715 object()->Set(received_shutdown_key, True(ssl_env()->isolate()));
2720 void Connection::NewSessionDoneCb() {
2721 HandleScope scope(env()->isolate());
2723 MakeCallback(env()->onnewsessiondone_string(), 0,
nullptr);
2728 Local<FunctionTemplate> t = env->NewFunctionTemplate(
Connection::New);
2729 t->InstanceTemplate()->SetInternalFieldCount(1);
2730 t->SetClassName(FIXED_ONE_BYTE_STRING(env->isolate(),
"Connection"));
2732 AsyncWrap::AddWrapMethods(env, t);
2733 env->SetProtoMethod(t,
"encIn", Connection::EncIn);
2734 env->SetProtoMethod(t,
"clearOut", Connection::ClearOut);
2735 env->SetProtoMethod(t,
"clearIn", Connection::ClearIn);
2736 env->SetProtoMethod(t,
"encOut", Connection::EncOut);
2737 env->SetProtoMethod(t,
"clearPending", Connection::ClearPending);
2738 env->SetProtoMethod(t,
"encPending", Connection::EncPending);
2740 env->SetProtoMethod(t,
"close", Connection::Close);
2742 SSLWrap<Connection>::AddMethods(env, t);
2745 #ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB 2746 env->SetProtoMethod(t,
"getServername", Connection::GetServername);
2747 env->SetProtoMethod(t,
"setSNICallback", Connection::SetSNICallback);
2750 target->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"Connection"),
2756 return memcmp(a, b, CNNIC_WHITELIST_HASH_LEN);
2761 return X509_NAME_cmp(X509_get_subject_name(cert),
2762 X509_get_issuer_name(cert)) == 0;
2767 for (
int i = 0; i < sk_X509_num(sk); i++) {
2768 X509* cert = sk_X509_value(sk, i);
2777 const unsigned char* startcom_wosign_data;
2778 X509_NAME* startcom_wosign_name;
2780 for (
const auto& dn : StartComAndWoSignDNs) {
2781 startcom_wosign_data = dn.data;
2782 startcom_wosign_name = d2i_X509_NAME(
nullptr, &startcom_wosign_data,
2784 int cmp = X509_NAME_cmp(name, startcom_wosign_name);
2785 X509_NAME_free(startcom_wosign_name);
2799 time_t october_21_2016 =
static_cast<time_t
>(1477008000);
2800 if (X509_cmp_time(X509_get_notBefore(cert), &october_21_2016) < 0)
2813 unsigned char hash[CNNIC_WHITELIST_HASH_LEN];
2814 unsigned int hashlen = CNNIC_WHITELIST_HASH_LEN;
2816 STACK_OF(X509)* chain = X509_STORE_CTX_get1_chain(ctx);
2817 CHECK_NE(chain,
nullptr);
2818 CHECK_GT(sk_X509_num(chain), 0);
2821 X509* root_cert = sk_X509_value(chain, sk_X509_num(chain)-1);
2822 X509_NAME* root_name = X509_get_subject_name(root_cert);
2826 CHECK_NE(root_cert,
nullptr);
2827 root_name = X509_get_subject_name(root_cert);
2830 X509* leaf_cert = sk_X509_value(chain, 0);
2832 sk_X509_pop_free(chain, X509_free);
2833 return CHECK_CERT_REVOKED;
2838 if (X509_NAME_cmp(root_name, cnnic_name) == 0 ||
2839 X509_NAME_cmp(root_name, cnnic_ev_name) == 0) {
2840 int ret = X509_digest(leaf_cert, EVP_sha256(), hash,
2844 void* result = bsearch(hash, WhitelistedCNNICHashes,
2845 arraysize(WhitelistedCNNICHashes),
2846 CNNIC_WHITELIST_HASH_LEN,
compar);
2847 if (result ==
nullptr) {
2848 sk_X509_pop_free(chain, X509_free);
2849 return CHECK_CERT_REVOKED;
2853 sk_X509_pop_free(chain, X509_free);
2861 if (preverify_ok == 0 || X509_STORE_CTX_get_error(ctx) != X509_V_OK)
2865 SSL* ssl =
static_cast<SSL*
>(
2866 X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
2868 if (SSL_is_server(ssl))
2874 if (ret == CHECK_CERT_REVOKED)
2875 X509_STORE_CTX_set_error(ctx, X509_V_ERR_CERT_REVOKED);
2881 #ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB 2882 int Connection::SelectSNIContextCallback_(SSL *s,
int *ad,
void* arg) {
2883 Connection* conn =
static_cast<Connection*
>(SSL_get_app_data(s));
2884 Environment* env = conn->env();
2885 HandleScope scope(env->isolate());
2887 const char* servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
2890 conn->servername_.Reset(env->isolate(),
2891 OneByteString(env->isolate(), servername));
2894 if (!conn->sniObject_.IsEmpty()) {
2895 conn->sni_context_.Reset();
2897 Local<Object> sni_obj = PersistentToLocal(env->isolate(),
2900 Local<Value> arg = PersistentToLocal(env->isolate(), conn->servername_);
2903 env->onselect_string(),
2908 Local<FunctionTemplate> secure_context_constructor_template =
2909 env->secure_context_constructor_template();
2910 if (secure_context_constructor_template->HasInstance(ret)) {
2911 conn->sni_context_.Reset(env->isolate(), ret);
2913 ASSIGN_OR_RETURN_UNWRAP(&sc, ret.As<Object>(), SSL_TLSEXT_ERR_NOACK);
2914 conn->SetSNIContext(sc);
2916 return SSL_TLSEXT_ERR_NOACK;
2921 return SSL_TLSEXT_ERR_OK;
2926 Environment* env = Environment::GetCurrent(args);
2928 if (args.Length() < 1 || !args[0]->IsObject()) {
2929 env->ThrowError(
"First argument must be a tls module SecureContext");
2934 ASSIGN_OR_RETURN_UNWRAP(&sc, args[0].As<Object>());
2936 bool is_server = args[1]->BooleanValue();
2938 SSLWrap<Connection>::Kind kind =
2939 is_server ? SSLWrap<Connection>::kServer : SSLWrap<Connection>::kClient;
2940 Connection* conn =
new Connection(env, args.This(), sc, kind);
2944 SSL_set_app_data(conn->ssl_, conn);
2947 SSL_set_info_callback(conn->ssl_, SSLInfoCallback);
2951 SSL_set_cert_cb(conn->ssl_, SSLWrap<Connection>::SSLCertCallback, conn);
2953 #ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB 2955 SSL_CTX_set_tlsext_servername_callback(sc->ctx_, SelectSNIContextCallback_);
2956 }
else if (args[2]->IsString()) {
2957 const node::Utf8Value servername(env->isolate(), args[2]);
2958 SSL_set_tlsext_host_name(conn->ssl_, *servername);
2962 SSL_set_bio(conn->ssl_, conn->bio_read_, conn->bio_write_);
2964 #ifdef SSL_MODE_RELEASE_BUFFERS 2965 long mode = SSL_get_mode(conn->ssl_);
2966 SSL_set_mode(conn->ssl_, mode | SSL_MODE_RELEASE_BUFFERS);
2972 bool request_cert = args[2]->BooleanValue();
2973 if (!request_cert) {
2975 verify_mode = SSL_VERIFY_NONE;
2977 bool reject_unauthorized = args[3]->BooleanValue();
2978 verify_mode = SSL_VERIFY_PEER;
2979 if (reject_unauthorized)
2980 verify_mode |= SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
2984 verify_mode = SSL_VERIFY_NONE;
2992 SSL_set_accept_state(conn->ssl_);
2994 SSL_set_connect_state(conn->ssl_);
2999 void Connection::SSLInfoCallback(
const SSL *ssl_,
int where,
int ret) {
3000 if (!(where & (SSL_CB_HANDSHAKE_START | SSL_CB_HANDSHAKE_DONE)))
3005 SSL* ssl =
const_cast<SSL*
>(ssl_);
3006 Connection* conn =
static_cast<Connection*
>(SSL_get_app_data(ssl));
3007 Environment* env = conn->env();
3008 HandleScope handle_scope(env->isolate());
3009 Context::Scope context_scope(env->context());
3011 if (where & SSL_CB_HANDSHAKE_START) {
3012 conn->MakeCallback(env->onhandshakestart_string(), 0,
nullptr);
3015 if (where & SSL_CB_HANDSHAKE_DONE) {
3016 conn->MakeCallback(env->onhandshakedone_string(), 0,
nullptr);
3021 void Connection::EncIn(
const FunctionCallbackInfo<Value>& args) {
3023 ASSIGN_OR_RETURN_UNWRAP(&conn, args.Holder());
3024 Environment* env = conn->env();
3026 if (args.Length() < 3) {
3027 return env->ThrowTypeError(
3028 "Data, offset, and length arguments are mandatory");
3036 size_t off = args[1]->Int32Value();
3037 size_t len = args[2]->Int32Value();
3039 if (!Buffer::IsWithinBounds(off, len, buffer_length))
3040 return env->ThrowRangeError(
"offset + length > buffer.length");
3043 char* data = buffer_data +
off;
3045 if (conn->is_server() && !conn->hello_parser_.IsEnded()) {
3047 if (conn->hello_parser_.IsPaused()) {
3052 size_t available =
sizeof(conn->hello_data_) - conn->hello_offset_;
3053 size_t copied = len < available ? len : available;
3054 memcpy(conn->hello_data_ + conn->hello_offset_, data, copied);
3055 conn->hello_offset_ += copied;
3057 conn->hello_parser_.Parse(conn->hello_data_, conn->hello_offset_);
3058 bytes_written = copied;
3061 bytes_written = BIO_write(conn->bio_read_, data, len);
3062 conn->HandleBIOError(conn->bio_read_,
"BIO_write", bytes_written);
3063 conn->SetShutdownFlags();
3066 args.GetReturnValue().Set(bytes_written);
3070 void Connection::ClearOut(
const FunctionCallbackInfo<Value>& args) {
3072 ASSIGN_OR_RETURN_UNWRAP(&conn, args.Holder());
3073 Environment* env = conn->env();
3075 if (args.Length() < 3) {
3076 return env->ThrowTypeError(
3077 "Data, offset, and length arguments are mandatory");
3085 size_t off = args[1]->Int32Value();
3086 size_t len = args[2]->Int32Value();
3088 if (!Buffer::IsWithinBounds(off, len, buffer_length))
3089 return env->ThrowRangeError(
"offset + length > buffer.length");
3091 if (!SSL_is_init_finished(conn->ssl_)) {
3094 if (conn->is_server()) {
3095 rv = SSL_accept(conn->ssl_);
3096 conn->HandleSSLError(
"SSL_accept:ClearOut",
3101 rv = SSL_connect(conn->ssl_);
3102 conn->HandleSSLError(
"SSL_connect:ClearOut",
3109 return args.GetReturnValue().Set(rv);
3113 int bytes_read = SSL_read(conn->ssl_, buffer_data + off, len);
3114 conn->HandleSSLError(
"SSL_read:ClearOut",
3118 conn->SetShutdownFlags();
3120 args.GetReturnValue().Set(bytes_read);
3124 void Connection::ClearPending(
const FunctionCallbackInfo<Value>& args) {
3126 ASSIGN_OR_RETURN_UNWRAP(&conn, args.Holder());
3127 int bytes_pending = BIO_pending(conn->bio_read_);
3128 args.GetReturnValue().Set(bytes_pending);
3132 void Connection::EncPending(
const FunctionCallbackInfo<Value>& args) {
3134 ASSIGN_OR_RETURN_UNWRAP(&conn, args.Holder());
3135 int bytes_pending = BIO_pending(conn->bio_write_);
3136 args.GetReturnValue().Set(bytes_pending);
3140 void Connection::EncOut(
const FunctionCallbackInfo<Value>& args) {
3142 ASSIGN_OR_RETURN_UNWRAP(&conn, args.Holder());
3143 Environment* env = conn->env();
3145 if (args.Length() < 3) {
3146 return env->ThrowTypeError(
3147 "Data, offset, and length arguments are mandatory");
3155 size_t off = args[1]->Int32Value();
3156 size_t len = args[2]->Int32Value();
3158 if (!Buffer::IsWithinBounds(off, len, buffer_length))
3159 return env->ThrowRangeError(
"offset + length > buffer.length");
3161 int bytes_read = BIO_read(conn->bio_write_, buffer_data + off, len);
3163 conn->HandleBIOError(conn->bio_write_,
"BIO_read:EncOut", bytes_read);
3164 conn->SetShutdownFlags();
3166 args.GetReturnValue().Set(bytes_read);
3170 void Connection::ClearIn(
const FunctionCallbackInfo<Value>& args) {
3172 ASSIGN_OR_RETURN_UNWRAP(&conn, args.Holder());
3173 Environment* env = conn->env();
3175 if (args.Length() < 3) {
3176 return env->ThrowTypeError(
3177 "Data, offset, and length arguments are mandatory");
3185 size_t off = args[1]->Int32Value();
3186 size_t len = args[2]->Int32Value();
3188 if (!Buffer::IsWithinBounds(off, len, buffer_length))
3189 return env->ThrowRangeError(
"offset + length > buffer.length");
3191 if (!SSL_is_init_finished(conn->ssl_)) {
3193 if (conn->is_server()) {
3194 rv = SSL_accept(conn->ssl_);
3195 conn->HandleSSLError(
"SSL_accept:ClearIn",
3200 rv = SSL_connect(conn->ssl_);
3201 conn->HandleSSLError(
"SSL_connect:ClearIn",
3208 return args.GetReturnValue().Set(rv);
3212 int bytes_written = SSL_write(conn->ssl_, buffer_data + off, len);
3214 conn->HandleSSLError(
"SSL_write:ClearIn",
3216 len == 0 ? kZeroIsNotAnError : kZeroIsAnError,
3218 conn->SetShutdownFlags();
3220 args.GetReturnValue().Set(bytes_written);
3226 ASSIGN_OR_RETURN_UNWRAP(&conn, args.Holder());
3229 if (!SSL_is_init_finished(conn->ssl_)) {
3230 if (conn->is_server()) {
3231 rv = SSL_accept(conn->ssl_);
3232 conn->HandleSSLError(
"SSL_accept:Start",
3237 rv = SSL_connect(conn->ssl_);
3238 conn->HandleSSLError(
"SSL_connect:Start",
3244 args.GetReturnValue().Set(rv);
3248 void Connection::Close(
const FunctionCallbackInfo<Value>& args) {
3250 ASSIGN_OR_RETURN_UNWRAP(&conn, args.Holder());
3255 #ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB 3256 void Connection::GetServername(
const FunctionCallbackInfo<Value>& args) {
3258 ASSIGN_OR_RETURN_UNWRAP(&conn, args.Holder());
3260 if (conn->is_server() && !conn->servername_.IsEmpty()) {
3261 args.GetReturnValue().Set(conn->servername_);
3263 args.GetReturnValue().Set(
false);
3268 void Connection::SetSNICallback(
const FunctionCallbackInfo<Value>& args) {
3270 ASSIGN_OR_RETURN_UNWRAP(&conn, args.Holder());
3271 Environment* env = conn->env();
3273 if (args.Length() < 1 || !args[0]->IsFunction()) {
3274 return env->ThrowError(
"Must give a Function as first argument");
3278 obj->Set(env->onselect_string(), args[0]);
3279 conn->sniObject_.Reset(args.GetIsolate(), obj);
3285 Local<FunctionTemplate> t = env->NewFunctionTemplate(
New);
3287 t->InstanceTemplate()->SetInternalFieldCount(1);
3289 env->SetProtoMethod(t,
"init",
Init);
3290 env->SetProtoMethod(t,
"initiv", InitIv);
3291 env->SetProtoMethod(t,
"update", Update);
3292 env->SetProtoMethod(t,
"final", Final);
3293 env->SetProtoMethod(t,
"setAutoPadding", SetAutoPadding);
3294 env->SetProtoMethod(t,
"getAuthTag", GetAuthTag);
3295 env->SetProtoMethod(t,
"setAuthTag", SetAuthTag);
3296 env->SetProtoMethod(t,
"setAAD", SetAAD);
3298 target->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"CipherBase"),
3304 CHECK(args.IsConstructCall());
3305 CipherKind kind = args[0]->IsTrue() ? kCipher : kDecipher;
3306 Environment* env = Environment::GetCurrent(args);
3307 new CipherBase(env, args.This(), kind);
3312 const char* key_buf,
3314 HandleScope scope(env()->isolate());
3316 #ifdef NODE_FIPS_MODE 3318 return env()->ThrowError(
3319 "crypto.createCipher() is not supported in FIPS mode.");
3321 #endif // NODE_FIPS_MODE 3323 CHECK_EQ(initialised_,
false);
3324 const EVP_CIPHER*
const cipher = EVP_get_cipherbyname(cipher_type);
3325 if (cipher ==
nullptr) {
3326 return env()->ThrowError(
"Unknown cipher");
3329 unsigned char key[EVP_MAX_KEY_LENGTH];
3330 unsigned char iv[EVP_MAX_IV_LENGTH];
3332 int key_len = EVP_BytesToKey(cipher,
3335 reinterpret_cast<const unsigned char*>(key_buf),
3341 EVP_CIPHER_CTX_init(&ctx_);
3342 const bool encrypt = (kind_ == kCipher);
3343 EVP_CipherInit_ex(&ctx_, cipher,
nullptr,
nullptr,
nullptr, encrypt);
3345 int mode = EVP_CIPHER_CTX_mode(&ctx_);
3346 if (encrypt && (mode == EVP_CIPH_CTR_MODE || mode == EVP_CIPH_GCM_MODE ||
3347 mode == EVP_CIPH_CCM_MODE)) {
3352 if (mode == EVP_CIPH_WRAP_MODE)
3353 EVP_CIPHER_CTX_set_flags(&ctx_, EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
3355 CHECK_EQ(1, EVP_CIPHER_CTX_set_key_length(&ctx_, key_len));
3357 EVP_CipherInit_ex(&ctx_,
3360 reinterpret_cast<unsigned char*>(key),
3361 reinterpret_cast<unsigned char*>(iv),
3363 initialised_ =
true;
3369 ASSIGN_OR_RETURN_UNWRAP(&cipher, args.Holder());
3370 Environment* env = cipher->env();
3372 if (args.Length() < 2) {
3373 return env->ThrowError(
"Cipher type and key arguments are mandatory");
3379 const node::Utf8Value cipher_type(args.GetIsolate(), args[0]);
3382 cipher->Init(*cipher_type, key_buf, key_buf_len);
3386 void CipherBase::InitIv(
const char* cipher_type,
3391 HandleScope scope(env()->isolate());
3393 const EVP_CIPHER*
const cipher = EVP_get_cipherbyname(cipher_type);
3394 if (cipher ==
nullptr) {
3395 return env()->ThrowError(
"Unknown cipher");
3398 const int expected_iv_len = EVP_CIPHER_iv_length(cipher);
3399 const int mode = EVP_CIPHER_mode(cipher);
3400 const bool is_gcm_mode = (EVP_CIPH_GCM_MODE == mode);
3402 if (is_gcm_mode ==
false && iv_len != expected_iv_len) {
3403 return env()->ThrowError(
"Invalid IV length");
3406 EVP_CIPHER_CTX_init(&ctx_);
3408 if (mode == EVP_CIPH_WRAP_MODE)
3409 EVP_CIPHER_CTX_set_flags(&ctx_, EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
3411 const bool encrypt = (kind_ == kCipher);
3412 EVP_CipherInit_ex(&ctx_, cipher,
nullptr,
nullptr,
nullptr, encrypt);
3415 !EVP_CIPHER_CTX_ctrl(&ctx_, EVP_CTRL_GCM_SET_IVLEN, iv_len,
nullptr)) {
3416 EVP_CIPHER_CTX_cleanup(&ctx_);
3417 return env()->ThrowError(
"Invalid IV length");
3420 if (!EVP_CIPHER_CTX_set_key_length(&ctx_, key_len)) {
3421 EVP_CIPHER_CTX_cleanup(&ctx_);
3422 return env()->ThrowError(
"Invalid key length");
3425 EVP_CipherInit_ex(&ctx_,
3428 reinterpret_cast<const unsigned char*>(key),
3429 reinterpret_cast<const unsigned char*>(iv),
3431 initialised_ =
true;
3435 void CipherBase::InitIv(
const FunctionCallbackInfo<Value>& args) {
3437 ASSIGN_OR_RETURN_UNWRAP(&cipher, args.Holder());
3438 Environment* env = cipher->env();
3440 if (args.Length() < 3) {
3441 return env->ThrowError(
"Cipher type, key, and IV arguments are mandatory");
3448 const node::Utf8Value cipher_type(env->isolate(), args[0]);
3453 cipher->InitIv(*cipher_type, key_buf, key_len, iv_buf, iv_len);
3457 bool CipherBase::IsAuthenticatedMode()
const {
3459 CHECK_EQ(initialised_,
true);
3460 const EVP_CIPHER*
const cipher = EVP_CIPHER_CTX_cipher(&ctx_);
3461 int mode = EVP_CIPHER_mode(cipher);
3462 return mode == EVP_CIPH_GCM_MODE;
3466 void CipherBase::GetAuthTag(
const FunctionCallbackInfo<Value>& args) {
3467 Environment* env = Environment::GetCurrent(args);
3469 ASSIGN_OR_RETURN_UNWRAP(&cipher, args.Holder());
3472 if (cipher->initialised_ ||
3473 cipher->kind_ != kCipher ||
3474 cipher->auth_tag_len_ == 0) {
3475 return env->ThrowError(
"Attempting to get auth tag in unsupported state");
3479 Buffer::Copy(env, cipher->auth_tag_, cipher->auth_tag_len_)
3481 args.GetReturnValue().Set(buf);
3485 void CipherBase::SetAuthTag(
const FunctionCallbackInfo<Value>& args) {
3486 Environment* env = Environment::GetCurrent(args);
3491 ASSIGN_OR_RETURN_UNWRAP(&cipher, args.Holder());
3493 if (!cipher->initialised_ ||
3494 !cipher->IsAuthenticatedMode() ||
3495 cipher->kind_ != kDecipher) {
3496 return env->ThrowError(
"Attempting to set auth tag in unsupported state");
3502 if (cipher->auth_tag_len_ >
sizeof(cipher->auth_tag_))
3503 cipher->auth_tag_len_ =
sizeof(cipher->auth_tag_);
3505 memset(cipher->auth_tag_, 0,
sizeof(cipher->auth_tag_));
3506 memcpy(cipher->auth_tag_,
Buffer::Data(args[0]), cipher->auth_tag_len_);
3510 bool CipherBase::SetAAD(
const char* data,
unsigned int len) {
3511 if (!initialised_ || !IsAuthenticatedMode())
3514 if (!EVP_CipherUpdate(&ctx_,
3517 reinterpret_cast<const unsigned char*>(data),
3525 void CipherBase::SetAAD(
const FunctionCallbackInfo<Value>& args) {
3526 Environment* env = Environment::GetCurrent(args);
3531 ASSIGN_OR_RETURN_UNWRAP(&cipher, args.Holder());
3534 env->ThrowError(
"Attempting to set AAD in unsupported state");
3538 bool CipherBase::Update(
const char* data,
3540 unsigned char** out,
3546 if (kind_ == kDecipher && IsAuthenticatedMode() && auth_tag_len_ > 0) {
3547 EVP_CIPHER_CTX_ctrl(&ctx_,
3548 EVP_CTRL_GCM_SET_TAG,
3550 reinterpret_cast<unsigned char*>(auth_tag_));
3554 *out_len = len + EVP_CIPHER_CTX_block_size(&ctx_);
3555 *out = Malloc<unsigned char>(
static_cast<size_t>(*out_len));
3556 return EVP_CipherUpdate(&ctx_,
3559 reinterpret_cast<const unsigned char*>(data),
3564 void CipherBase::Update(
const FunctionCallbackInfo<Value>& args) {
3565 Environment* env = Environment::GetCurrent(args);
3568 ASSIGN_OR_RETURN_UNWRAP(&cipher, args.Holder());
3572 unsigned char* out =
nullptr;
3577 if (args[0]->IsString()) {
3578 StringBytes::InlineDecoder decoder;
3579 if (!decoder.Decode(env, args[0].As<String>(), args[1],
UTF8))
3581 r = cipher->Update(decoder.out(), decoder.size(), &out, &out_len);
3585 r = cipher->Update(buf, buflen, &out, &out_len);
3592 "Trying to add data in unsupported state");
3595 CHECK(out !=
nullptr || out_len == 0);
3597 Buffer::New(env, reinterpret_cast<char*>(out), out_len).ToLocalChecked();
3599 args.GetReturnValue().Set(buf);
3603 bool CipherBase::SetAutoPadding(
bool auto_padding) {
3606 return EVP_CIPHER_CTX_set_padding(&ctx_, auto_padding);
3610 void CipherBase::SetAutoPadding(
const FunctionCallbackInfo<Value>& args) {
3611 Environment* env = Environment::GetCurrent(args);
3614 ASSIGN_OR_RETURN_UNWRAP(&cipher, args.Holder());
3616 if (!cipher->SetAutoPadding(args.Length() < 1 || args[0]->BooleanValue()))
3617 env->ThrowError(
"Attempting to set auto padding in unsupported state");
3621 bool CipherBase::Final(
unsigned char** out,
int *out_len) {
3625 *out = Malloc<unsigned char>(
3626 static_cast<size_t>(EVP_CIPHER_CTX_block_size(&ctx_)));
3627 int r = EVP_CipherFinal_ex(&ctx_, *out, out_len);
3629 if (r == 1 && kind_ == kCipher && IsAuthenticatedMode()) {
3630 auth_tag_len_ =
sizeof(auth_tag_);
3631 r = EVP_CIPHER_CTX_ctrl(&ctx_, EVP_CTRL_GCM_GET_TAG, auth_tag_len_,
3632 reinterpret_cast<unsigned char*>(auth_tag_));
3636 EVP_CIPHER_CTX_cleanup(&ctx_);
3637 initialised_ =
false;
3643 void CipherBase::Final(
const FunctionCallbackInfo<Value>& args) {
3644 Environment* env = Environment::GetCurrent(args);
3647 ASSIGN_OR_RETURN_UNWRAP(&cipher, args.Holder());
3648 if (!cipher->initialised_)
return env->ThrowError(
"Unsupported state");
3650 unsigned char* out_value =
nullptr;
3654 const bool is_auth_mode = cipher->IsAuthenticatedMode();
3655 bool r = cipher->Final(&out_value, &out_len);
3657 if (out_len <= 0 || !r) {
3659 out_value =
nullptr;
3662 const char* msg = is_auth_mode ?
3663 "Unsupported state or unable to authenticate data" :
3664 "Unsupported state";
3674 reinterpret_cast<char*>(out_value),
3675 out_len).ToLocalChecked();
3676 args.GetReturnValue().Set(buf);
3681 Local<FunctionTemplate> t = env->NewFunctionTemplate(
New);
3683 t->InstanceTemplate()->SetInternalFieldCount(1);
3685 env->SetProtoMethod(t,
"init", HmacInit);
3686 env->SetProtoMethod(t,
"update", HmacUpdate);
3687 env->SetProtoMethod(t,
"digest", HmacDigest);
3689 target->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"Hmac"), t->GetFunction());
3693 void Hmac::New(
const FunctionCallbackInfo<Value>& args) {
3694 Environment* env = Environment::GetCurrent(args);
3695 new Hmac(env, args.This());
3699 void Hmac::HmacInit(
const char* hash_type,
const char* key,
int key_len) {
3700 HandleScope scope(env()->isolate());
3702 CHECK_EQ(initialised_,
false);
3703 const EVP_MD* md = EVP_get_digestbyname(hash_type);
3704 if (md ==
nullptr) {
3705 return env()->ThrowError(
"Unknown message digest");
3707 HMAC_CTX_init(&ctx_);
3711 if (!HMAC_Init_ex(&ctx_, key, key_len, md,
nullptr)) {
3714 initialised_ =
true;
3718 void Hmac::HmacInit(
const FunctionCallbackInfo<Value>& args) {
3720 ASSIGN_OR_RETURN_UNWRAP(&hmac, args.Holder());
3721 Environment* env = hmac->env();
3723 if (args.Length() < 2) {
3724 return env->ThrowError(
"Hash type and key arguments are mandatory");
3730 const node::Utf8Value hash_type(env->isolate(), args[0]);
3733 hmac->HmacInit(*hash_type, buffer_data, buffer_length);
3737 bool Hmac::HmacUpdate(
const char* data,
int len) {
3740 int r = HMAC_Update(&ctx_, reinterpret_cast<const unsigned char*>(data), len);
3745 void Hmac::HmacUpdate(
const FunctionCallbackInfo<Value>& args) {
3746 Environment* env = Environment::GetCurrent(args);
3749 ASSIGN_OR_RETURN_UNWRAP(&hmac, args.Holder());
3755 if (args[0]->IsString()) {
3756 StringBytes::InlineDecoder decoder;
3757 if (!decoder.Decode(env, args[0].As<String>(), args[1],
UTF8))
3759 r = hmac->HmacUpdate(decoder.out(), decoder.size());
3763 r = hmac->HmacUpdate(buf, buflen);
3767 return env->ThrowTypeError(
"HmacUpdate fail");
3772 void Hmac::HmacDigest(
const FunctionCallbackInfo<Value>& args) {
3773 Environment* env = Environment::GetCurrent(args);
3776 ASSIGN_OR_RETURN_UNWRAP(&hmac, args.Holder());
3779 if (args.Length() >= 1) {
3780 CHECK(args[0]->IsString());
3784 if (encoding ==
UCS2) {
3785 return env->ThrowError(
"hmac.digest() does not support UTF-16");
3788 unsigned char md_value[EVP_MAX_MD_SIZE];
3789 unsigned int md_len = 0;
3791 if (hmac->initialised_) {
3792 HMAC_Final(&hmac->ctx_, md_value, &md_len);
3793 HMAC_CTX_cleanup(&hmac->ctx_);
3794 hmac->initialised_ =
false;
3798 MaybeLocal<Value> rc =
3800 reinterpret_cast<const char*
>(md_value),
3805 CHECK(!error.IsEmpty());
3806 env->isolate()->ThrowException(error);
3809 args.GetReturnValue().Set(rc.ToLocalChecked());
3814 Local<FunctionTemplate> t = env->NewFunctionTemplate(
New);
3816 t->InstanceTemplate()->SetInternalFieldCount(1);
3818 env->SetProtoMethod(t,
"update", HashUpdate);
3819 env->SetProtoMethod(t,
"digest", HashDigest);
3821 target->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"Hash"), t->GetFunction());
3825 void Hash::New(
const FunctionCallbackInfo<Value>& args) {
3826 Environment* env = Environment::GetCurrent(args);
3828 if (args.Length() == 0 || !args[0]->IsString()) {
3829 return env->ThrowError(
"Must give hashtype string as argument");
3832 const node::Utf8Value hash_type(env->isolate(), args[0]);
3834 Hash* hash =
new Hash(env, args.This());
3835 if (!hash->HashInit(*hash_type)) {
3837 "Digest method not supported");
3842 bool Hash::HashInit(
const char* hash_type) {
3843 CHECK_EQ(initialised_,
false);
3844 const EVP_MD* md = EVP_get_digestbyname(hash_type);
3847 EVP_MD_CTX_init(&mdctx_);
3848 if (EVP_DigestInit_ex(&mdctx_, md,
nullptr) <= 0) {
3851 initialised_ =
true;
3857 bool Hash::HashUpdate(
const char* data,
int len) {
3860 EVP_DigestUpdate(&mdctx_, data, len);
3865 void Hash::HashUpdate(
const FunctionCallbackInfo<Value>& args) {
3866 Environment* env = Environment::GetCurrent(args);
3869 ASSIGN_OR_RETURN_UNWRAP(&hash, args.Holder());
3873 if (!hash->initialised_) {
3874 return env->ThrowError(
"Not initialized");
3876 if (hash->finalized_) {
3877 return env->ThrowError(
"Digest already called");
3882 if (args[0]->IsString()) {
3883 StringBytes::InlineDecoder decoder;
3884 if (!decoder.Decode(env, args[0].As<String>(), args[1],
UTF8))
3886 r = hash->HashUpdate(decoder.out(), decoder.size());
3890 r = hash->HashUpdate(buf, buflen);
3894 return env->ThrowTypeError(
"HashUpdate fail");
3899 void Hash::HashDigest(
const FunctionCallbackInfo<Value>& args) {
3900 Environment* env = Environment::GetCurrent(args);
3903 ASSIGN_OR_RETURN_UNWRAP(&hash, args.Holder());
3905 if (!hash->initialised_) {
3906 return env->ThrowError(
"Not initialized");
3908 if (hash->finalized_) {
3909 return env->ThrowError(
"Digest already called");
3913 if (args.Length() >= 1) {
3914 CHECK(args[0]->IsString());
3918 if (encoding ==
UCS2) {
3919 return env->ThrowError(
"hash.digest() does not support UTF-16");
3922 unsigned char md_value[EVP_MAX_MD_SIZE];
3923 unsigned int md_len;
3925 EVP_DigestFinal_ex(&hash->mdctx_, md_value, &md_len);
3926 EVP_MD_CTX_cleanup(&hash->mdctx_);
3927 hash->finalized_ =
true;
3930 MaybeLocal<Value> rc =
3932 reinterpret_cast<const char*
>(md_value),
3937 CHECK(!error.IsEmpty());
3938 env->isolate()->ThrowException(error);
3941 args.GetReturnValue().Set(rc.ToLocalChecked());
3945 void SignBase::CheckThrow(SignBase::Error error) {
3946 HandleScope scope(env()->isolate());
3949 case kSignUnknownDigest:
3950 return env()->ThrowError(
"Unknown message digest");
3952 case kSignNotInitialised:
3953 return env()->ThrowError(
"Not initialised");
3957 case kSignPrivateKey:
3958 case kSignPublicKey:
3960 unsigned long err = ERR_get_error();
3965 return env()->ThrowError(
"EVP_SignInit_ex failed");
3967 return env()->ThrowError(
"EVP_SignUpdate failed");
3968 case kSignPrivateKey:
3969 return env()->ThrowError(
"PEM_read_bio_PrivateKey failed");
3970 case kSignPublicKey:
3971 return env()->ThrowError(
"PEM_read_bio_PUBKEY failed");
3982 static bool ApplyRSAOptions(EVP_PKEY* pkey, EVP_PKEY_CTX* pkctx,
int padding,
3984 if (pkey->type == EVP_PKEY_RSA || pkey->type == EVP_PKEY_RSA2) {
3985 if (EVP_PKEY_CTX_set_rsa_padding(pkctx, padding) <= 0)
3987 if (padding == RSA_PKCS1_PSS_PADDING) {
3988 if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkctx, salt_len) <= 0)
3999 Local<FunctionTemplate> t = env->NewFunctionTemplate(
New);
4001 t->InstanceTemplate()->SetInternalFieldCount(1);
4003 env->SetProtoMethod(t,
"init", SignInit);
4004 env->SetProtoMethod(t,
"update", SignUpdate);
4005 env->SetProtoMethod(t,
"sign", SignFinal);
4007 target->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"Sign"), t->GetFunction());
4011 void Sign::New(
const FunctionCallbackInfo<Value>& args) {
4012 Environment* env = Environment::GetCurrent(args);
4013 new Sign(env, args.This());
4017 SignBase::Error Sign::SignInit(
const char* sign_type) {
4018 CHECK_EQ(initialised_,
false);
4019 const EVP_MD* md = EVP_get_digestbyname(sign_type);
4021 return kSignUnknownDigest;
4023 EVP_MD_CTX_init(&mdctx_);
4024 if (!EVP_DigestInit_ex(&mdctx_, md,
nullptr))
4026 initialised_ =
true;
4032 void Sign::SignInit(
const FunctionCallbackInfo<Value>& args) {
4034 ASSIGN_OR_RETURN_UNWRAP(&sign, args.Holder());
4035 Environment* env = sign->env();
4037 if (args.Length() == 0) {
4038 return env->ThrowError(
"Sign type argument is mandatory");
4043 const node::Utf8Value sign_type(args.GetIsolate(), args[0]);
4044 sign->CheckThrow(sign->SignInit(*sign_type));
4048 SignBase::Error Sign::SignUpdate(
const char* data,
int len) {
4050 return kSignNotInitialised;
4051 if (!EVP_DigestUpdate(&mdctx_, data, len))
4057 void Sign::SignUpdate(
const FunctionCallbackInfo<Value>& args) {
4058 Environment* env = Environment::GetCurrent(args);
4061 ASSIGN_OR_RETURN_UNWRAP(&sign, args.Holder());
4067 if (args[0]->IsString()) {
4068 StringBytes::InlineDecoder decoder;
4069 if (!decoder.Decode(env, args[0].As<String>(), args[1],
UTF8))
4071 err = sign->SignUpdate(decoder.out(), decoder.size());
4075 err = sign->SignUpdate(buf, buflen);
4078 sign->CheckThrow(err);
4081 static int Node_SignFinal(EVP_MD_CTX* mdctx,
unsigned char* md,
4082 unsigned int* sig_len, EVP_PKEY* pkey,
int padding,
4084 unsigned char m[EVP_MAX_MD_SIZE];
4087 EVP_PKEY_CTX* pkctx =
nullptr;
4090 if (!EVP_DigestFinal_ex(mdctx, m, &m_len))
4093 if (mdctx->digest->flags & EVP_MD_FLAG_PKEY_METHOD_SIGNATURE) {
4094 size_t sltmp =
static_cast<size_t>(EVP_PKEY_size(pkey));
4095 pkctx = EVP_PKEY_CTX_new(pkey,
nullptr);
4096 if (pkctx ==
nullptr)
4098 if (EVP_PKEY_sign_init(pkctx) <= 0)
4100 if (!ApplyRSAOptions(pkey, pkctx, padding, pss_salt_len))
4102 if (EVP_PKEY_CTX_set_signature_md(pkctx, mdctx->digest) <= 0)
4104 if (EVP_PKEY_sign(pkctx, md, &sltmp, m, m_len) <= 0)
4109 EVP_PKEY_CTX_free(pkctx);
4113 if (mdctx->digest->sign ==
nullptr) {
4114 EVPerr(EVP_F_EVP_SIGNFINAL, EVP_R_NO_SIGN_FUNCTION_CONFIGURED);
4118 return mdctx->digest->sign(mdctx->digest->type, m, m_len, md, sig_len,
4122 SignBase::Error Sign::SignFinal(
const char* key_pem,
4124 const char* passphrase,
4126 unsigned int* sig_len,
4130 return kSignNotInitialised;
4133 EVP_PKEY* pkey =
nullptr;
4136 bp = BIO_new_mem_buf(const_cast<char*>(key_pem), key_pem_len);
4140 pkey = PEM_read_bio_PrivateKey(bp,
4143 const_cast<char*>(passphrase));
4148 if (pkey ==
nullptr || 0 != ERR_peek_error())
4151 #ifdef NODE_FIPS_MODE 4153 if (FIPS_mode() && EVP_PKEY_DSA == pkey->type) {
4154 size_t L = BN_num_bits(pkey->pkey.dsa->p);
4155 size_t N = BN_num_bits(pkey->pkey.dsa->q);
4156 bool result =
false;
4158 if (L == 1024 && N == 160)
4160 else if (L == 2048 && N == 224)
4162 else if (L == 2048 && N == 256)
4164 else if (L == 3072 && N == 256)
4172 #endif // NODE_FIPS_MODE 4174 if (Node_SignFinal(&mdctx_, sig, sig_len, pkey, padding, salt_len))
4177 initialised_ =
false;
4180 if (pkey !=
nullptr)
4181 EVP_PKEY_free(pkey);
4185 EVP_MD_CTX_cleanup(&mdctx_);
4188 return kSignPrivateKey;
4194 void Sign::SignFinal(
const FunctionCallbackInfo<Value>& args) {
4195 Environment* env = Environment::GetCurrent(args);
4198 ASSIGN_OR_RETURN_UNWRAP(&sign, args.Holder());
4200 unsigned int len = args.Length();
4202 node::Utf8Value passphrase(env->isolate(), args[1]);
4208 CHECK(args[2]->IsInt32());
4209 Maybe<int32_t> maybe_padding = args[2]->Int32Value(env->context());
4210 CHECK(maybe_padding.IsJust());
4211 int padding = maybe_padding.ToChecked();
4213 CHECK(args[3]->IsInt32());
4214 Maybe<int32_t> maybe_salt_len = args[3]->Int32Value(env->context());
4215 CHECK(maybe_salt_len.IsJust());
4216 int salt_len = maybe_salt_len.ToChecked();
4218 ClearErrorOnReturn clear_error_on_return;
4219 unsigned char md_value[8192];
4220 unsigned int md_len =
sizeof(md_value);
4222 Error err = sign->SignFinal(
4225 len >= 2 && !args[1]->IsNull() ? *passphrase :
nullptr,
4231 return sign->CheckThrow(err);
4234 Buffer::Copy(env, reinterpret_cast<char*>(md_value), md_len)
4236 args.GetReturnValue().Set(rc);
4241 Local<FunctionTemplate> t = env->NewFunctionTemplate(
New);
4243 t->InstanceTemplate()->SetInternalFieldCount(1);
4245 env->SetProtoMethod(t,
"init", VerifyInit);
4246 env->SetProtoMethod(t,
"update", VerifyUpdate);
4247 env->SetProtoMethod(t,
"verify", VerifyFinal);
4249 target->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"Verify"),
4254 void Verify::New(
const FunctionCallbackInfo<Value>& args) {
4255 Environment* env = Environment::GetCurrent(args);
4256 new Verify(env, args.This());
4260 SignBase::Error Verify::VerifyInit(
const char* verify_type) {
4261 CHECK_EQ(initialised_,
false);
4262 const EVP_MD* md = EVP_get_digestbyname(verify_type);
4264 return kSignUnknownDigest;
4266 EVP_MD_CTX_init(&mdctx_);
4267 if (!EVP_DigestInit_ex(&mdctx_, md,
nullptr))
4269 initialised_ =
true;
4275 void Verify::VerifyInit(
const FunctionCallbackInfo<Value>& args) {
4277 ASSIGN_OR_RETURN_UNWRAP(&verify, args.Holder());
4278 Environment* env = verify->env();
4280 if (args.Length() == 0) {
4281 return env->ThrowError(
"Verify type argument is mandatory");
4286 const node::Utf8Value verify_type(args.GetIsolate(), args[0]);
4287 verify->CheckThrow(verify->VerifyInit(*verify_type));
4291 SignBase::Error Verify::VerifyUpdate(
const char* data,
int len) {
4293 return kSignNotInitialised;
4295 if (!EVP_DigestUpdate(&mdctx_, data, len))
4302 void Verify::VerifyUpdate(
const FunctionCallbackInfo<Value>& args) {
4303 Environment* env = Environment::GetCurrent(args);
4306 ASSIGN_OR_RETURN_UNWRAP(&verify, args.Holder());
4312 if (args[0]->IsString()) {
4313 StringBytes::InlineDecoder decoder;
4314 if (!decoder.Decode(env, args[0].As<String>(), args[1],
UTF8))
4316 err = verify->VerifyUpdate(decoder.out(), decoder.size());
4320 err = verify->VerifyUpdate(buf, buflen);
4323 verify->CheckThrow(err);
4327 SignBase::Error Verify::VerifyFinal(
const char* key_pem,
4333 bool* verify_result) {
4335 return kSignNotInitialised;
4337 ClearErrorOnReturn clear_error_on_return;
4339 EVP_PKEY* pkey =
nullptr;
4341 X509* x509 =
nullptr;
4343 unsigned char m[EVP_MAX_MD_SIZE];
4346 EVP_PKEY_CTX* pkctx =
nullptr;
4348 bp = BIO_new_mem_buf(const_cast<char*>(key_pem), key_pem_len);
4355 if (strncmp(key_pem, PUBLIC_KEY_PFX, PUBLIC_KEY_PFX_LEN) == 0) {
4356 pkey = PEM_read_bio_PUBKEY(bp,
nullptr, NoPasswordCallback,
nullptr);
4357 if (pkey ==
nullptr)
4359 }
else if (strncmp(key_pem, PUBRSA_KEY_PFX, PUBRSA_KEY_PFX_LEN) == 0) {
4361 PEM_read_bio_RSAPublicKey(bp,
nullptr, PasswordCallback,
nullptr);
4363 pkey = EVP_PKEY_new();
4365 EVP_PKEY_set1_RSA(pkey, rsa);
4368 if (pkey ==
nullptr)
4372 x509 = PEM_read_bio_X509(bp,
nullptr, NoPasswordCallback,
nullptr);
4373 if (x509 ==
nullptr)
4376 pkey = X509_get_pubkey(x509);
4377 if (pkey ==
nullptr)
4381 if (!EVP_DigestFinal_ex(&mdctx_, m, &m_len)) {
4387 pkctx = EVP_PKEY_CTX_new(pkey,
nullptr);
4388 if (pkctx ==
nullptr)
4390 if (EVP_PKEY_verify_init(pkctx) <= 0)
4392 if (!ApplyRSAOptions(pkey, pkctx, padding, saltlen))
4394 if (EVP_PKEY_CTX_set_signature_md(pkctx, mdctx_.digest) <= 0)
4396 r = EVP_PKEY_verify(pkctx,
4397 reinterpret_cast<const unsigned char*>(sig),
4403 EVP_PKEY_CTX_free(pkctx);
4406 if (pkey !=
nullptr)
4407 EVP_PKEY_free(pkey);
4410 if (x509 !=
nullptr)
4413 EVP_MD_CTX_cleanup(&mdctx_);
4414 initialised_ =
false;
4417 return kSignPublicKey;
4419 *verify_result = r == 1;
4424 void Verify::VerifyFinal(
const FunctionCallbackInfo<Value>& args) {
4425 Environment* env = Environment::GetCurrent(args);
4428 ASSIGN_OR_RETURN_UNWRAP(&verify, args.Holder());
4439 CHECK(args[2]->IsInt32());
4440 Maybe<int32_t> maybe_padding = args[2]->Int32Value(env->context());
4441 CHECK(maybe_padding.IsJust());
4442 int padding = maybe_padding.ToChecked();
4444 CHECK(args[3]->IsInt32());
4445 Maybe<int32_t> maybe_salt_len = args[3]->Int32Value(env->context());
4446 CHECK(maybe_salt_len.IsJust());
4447 int salt_len = maybe_salt_len.ToChecked();
4450 Error err = verify->VerifyFinal(kbuf, klen, hbuf, hlen, padding, salt_len,
4453 return verify->CheckThrow(err);
4454 args.GetReturnValue().Set(verify_result);
4458 template <PublicKeyCipher::Operation operation,
4459 PublicKeyCipher::EVP_PKEY_cipher_init_t EVP_PKEY_cipher_init,
4460 PublicKeyCipher::EVP_PKEY_cipher_t EVP_PKEY_cipher>
4461 bool PublicKeyCipher::Cipher(
const char* key_pem,
4463 const char* passphrase,
4465 const unsigned char* data,
4467 unsigned char** out,
4469 EVP_PKEY* pkey =
nullptr;
4470 EVP_PKEY_CTX* ctx =
nullptr;
4472 X509* x509 =
nullptr;
4475 bp = BIO_new_mem_buf(const_cast<char*>(key_pem), key_pem_len);
4481 if (operation == kPublic &&
4482 strncmp(key_pem, PUBLIC_KEY_PFX, PUBLIC_KEY_PFX_LEN) == 0) {
4483 pkey = PEM_read_bio_PUBKEY(bp,
nullptr,
nullptr,
nullptr);
4484 if (pkey ==
nullptr)
4486 }
else if (operation == kPublic &&
4487 strncmp(key_pem, PUBRSA_KEY_PFX, PUBRSA_KEY_PFX_LEN) == 0) {
4488 RSA* rsa = PEM_read_bio_RSAPublicKey(bp,
nullptr,
nullptr,
nullptr);
4490 pkey = EVP_PKEY_new();
4492 EVP_PKEY_set1_RSA(pkey, rsa);
4495 if (pkey ==
nullptr)
4497 }
else if (operation == kPublic &&
4498 strncmp(key_pem, CERTIFICATE_PFX, CERTIFICATE_PFX_LEN) == 0) {
4499 x509 = PEM_read_bio_X509(bp,
nullptr, NoPasswordCallback,
nullptr);
4500 if (x509 ==
nullptr)
4503 pkey = X509_get_pubkey(x509);
4504 if (pkey ==
nullptr)
4507 pkey = PEM_read_bio_PrivateKey(bp,
4510 const_cast<char*>(passphrase));
4511 if (pkey ==
nullptr)
4515 ctx = EVP_PKEY_CTX_new(pkey,
nullptr);
4518 if (EVP_PKEY_cipher_init(ctx) <= 0)
4520 if (EVP_PKEY_CTX_set_rsa_padding(ctx, padding) <= 0)
4523 if (EVP_PKEY_cipher(ctx,
nullptr, out_len, data, len) <= 0)
4526 *out = Malloc<unsigned char>(*out_len);
4528 if (EVP_PKEY_cipher(ctx, *out, out_len, data, len) <= 0)
4534 if (x509 !=
nullptr)
4536 if (pkey !=
nullptr)
4537 EVP_PKEY_free(pkey);
4541 EVP_PKEY_CTX_free(ctx);
4547 template <PublicKeyCipher::Operation operation,
4548 PublicKeyCipher::EVP_PKEY_cipher_init_t EVP_PKEY_cipher_init,
4549 PublicKeyCipher::EVP_PKEY_cipher_t EVP_PKEY_cipher>
4550 void PublicKeyCipher::Cipher(
const FunctionCallbackInfo<Value>& args) {
4551 Environment* env = Environment::GetCurrent(args);
4561 int padding = args[2]->Uint32Value();
4563 String::Utf8Value passphrase(args[3]);
4565 unsigned char* out_value =
nullptr;
4568 ClearErrorOnReturn clear_error_on_return;
4570 bool r = Cipher<operation, EVP_PKEY_cipher_init, EVP_PKEY_cipher>(
4573 args.Length() >= 3 && !args[2]->IsNull() ? *passphrase :
nullptr,
4575 reinterpret_cast<const unsigned char*
>(
buf),
4580 if (out_len == 0 || !r) {
4582 out_value =
nullptr;
4590 Local<Object> vbuf =
4591 Buffer::New(env, reinterpret_cast<char*>(out_value), out_len)
4593 args.GetReturnValue().Set(vbuf);
4598 Local<FunctionTemplate> t = env->NewFunctionTemplate(
New);
4600 const PropertyAttribute attributes =
4601 static_cast<PropertyAttribute
>(v8::ReadOnly | v8::DontDelete);
4603 t->InstanceTemplate()->SetInternalFieldCount(1);
4605 env->SetProtoMethod(t,
"generateKeys", GenerateKeys);
4606 env->SetProtoMethod(t,
"computeSecret", ComputeSecret);
4607 env->SetProtoMethod(t,
"getPrime", GetPrime);
4608 env->SetProtoMethod(t,
"getGenerator", GetGenerator);
4609 env->SetProtoMethod(t,
"getPublicKey", GetPublicKey);
4610 env->SetProtoMethod(t,
"getPrivateKey", GetPrivateKey);
4611 env->SetProtoMethod(t,
"setPublicKey", SetPublicKey);
4612 env->SetProtoMethod(t,
"setPrivateKey", SetPrivateKey);
4614 t->InstanceTemplate()->SetAccessor(
4615 env->verify_error_string(),
4616 DiffieHellman::VerifyErrorGetter,
4623 target->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"DiffieHellman"),
4626 Local<FunctionTemplate> t2 = env->NewFunctionTemplate(DiffieHellmanGroup);
4627 t2->InstanceTemplate()->SetInternalFieldCount(1);
4629 env->SetProtoMethod(t2,
"generateKeys", GenerateKeys);
4630 env->SetProtoMethod(t2,
"computeSecret", ComputeSecret);
4631 env->SetProtoMethod(t2,
"getPrime", GetPrime);
4632 env->SetProtoMethod(t2,
"getGenerator", GetGenerator);
4633 env->SetProtoMethod(t2,
"getPublicKey", GetPublicKey);
4634 env->SetProtoMethod(t2,
"getPrivateKey", GetPrivateKey);
4636 t2->InstanceTemplate()->SetAccessor(
4637 env->verify_error_string(),
4638 DiffieHellman::VerifyErrorGetter,
4645 target->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"DiffieHellmanGroup"),
4652 if (!DH_generate_parameters_ex(dh, primeLength, g, 0))
4654 bool result = VerifyContext();
4657 initialised_ =
true;
4664 dh->p = BN_bin2bn(reinterpret_cast<const unsigned char*>(p), p_len, 0);
4666 if (!BN_set_word(dh->g, g))
4668 bool result = VerifyContext();
4671 initialised_ =
true;
4678 dh->p = BN_bin2bn(reinterpret_cast<const unsigned char*>(p), p_len, 0);
4679 dh->g = BN_bin2bn(reinterpret_cast<const unsigned char*>(g), g_len, 0);
4680 bool result = VerifyContext();
4683 initialised_ =
true;
4688 void DiffieHellman::DiffieHellmanGroup(
4689 const FunctionCallbackInfo<Value>& args) {
4690 Environment* env = Environment::GetCurrent(args);
4691 DiffieHellman* diffieHellman =
new DiffieHellman(env, args.This());
4693 if (args.Length() != 1) {
4694 return env->ThrowError(
"Group name argument is mandatory");
4699 bool initialized =
false;
4701 const node::Utf8Value group_name(env->isolate(), args[0]);
4702 for (
size_t i = 0; i < arraysize(modp_groups); ++i) {
4703 const modp_group* it = modp_groups + i;
4705 if (!StringEqualNoCase(*group_name, it->name))
4708 initialized = diffieHellman->Init(it->prime,
4713 env->ThrowError(
"Initialization failed");
4717 env->ThrowError(
"Unknown group");
4722 Environment* env = Environment::GetCurrent(args);
4723 DiffieHellman* diffieHellman =
4724 new DiffieHellman(env, args.This());
4725 bool initialized =
false;
4727 if (args.Length() == 2) {
4728 if (args[0]->IsInt32()) {
4729 if (args[1]->IsInt32()) {
4730 initialized = diffieHellman->Init(args[0]->Int32Value(),
4731 args[1]->Int32Value());
4734 if (args[1]->IsInt32()) {
4735 initialized = diffieHellman->Init(
Buffer::Data(args[0]),
4737 args[1]->Int32Value());
4739 initialized = diffieHellman->Init(
Buffer::Data(args[0]),
4753 void DiffieHellman::GenerateKeys(
const FunctionCallbackInfo<Value>& args) {
4754 Environment* env = Environment::GetCurrent(args);
4756 DiffieHellman* diffieHellman;
4757 ASSIGN_OR_RETURN_UNWRAP(&diffieHellman, args.Holder());
4759 if (!diffieHellman->initialised_) {
4763 if (!DH_generate_key(diffieHellman->dh)) {
4767 size_t size = BN_num_bytes(diffieHellman->dh->pub_key);
4768 char* data = Malloc(size);
4769 BN_bn2bin(diffieHellman->dh->pub_key, reinterpret_cast<unsigned char*>(data));
4770 args.GetReturnValue().Set(
Buffer::New(env, data, size).ToLocalChecked());
4774 void DiffieHellman::GetField(
const FunctionCallbackInfo<Value>& args,
4775 BIGNUM* (DH::*field),
const char* err_if_null) {
4776 Environment* env = Environment::GetCurrent(args);
4779 ASSIGN_OR_RETURN_UNWRAP(&dh, args.Holder());
4780 if (!dh->initialised_)
return env->ThrowError(
"Not initialized");
4782 const BIGNUM* num = (dh->dh)->*field;
4783 if (num ==
nullptr)
return env->ThrowError(err_if_null);
4785 size_t size = BN_num_bytes(num);
4786 char* data = Malloc(size);
4787 BN_bn2bin(num, reinterpret_cast<unsigned char*>(data));
4788 args.GetReturnValue().Set(
Buffer::New(env, data, size).ToLocalChecked());
4791 void DiffieHellman::GetPrime(
const FunctionCallbackInfo<Value>& args) {
4792 GetField(args, &
DH::p,
"p is null");
4796 void DiffieHellman::GetGenerator(
const FunctionCallbackInfo<Value>& args) {
4797 GetField(args, &DH::g,
"g is null");
4801 void DiffieHellman::GetPublicKey(
const FunctionCallbackInfo<Value>& args) {
4802 GetField(args, &DH::pub_key,
4803 "No public key - did you forget to generate one?");
4807 void DiffieHellman::GetPrivateKey(
const FunctionCallbackInfo<Value>& args) {
4808 GetField(args, &DH::priv_key,
4809 "No private key - did you forget to generate one?");
4813 void DiffieHellman::ComputeSecret(
const FunctionCallbackInfo<Value>& args) {
4814 Environment* env = Environment::GetCurrent(args);
4816 DiffieHellman* diffieHellman;
4817 ASSIGN_OR_RETURN_UNWRAP(&diffieHellman, args.Holder());
4819 if (!diffieHellman->initialised_) {
4823 ClearErrorOnReturn clear_error_on_return;
4824 BIGNUM* key =
nullptr;
4826 if (args.Length() == 0) {
4827 return env->ThrowError(
"Other party's public key argument is mandatory");
4831 reinterpret_cast<unsigned char*>(
Buffer::Data(args[0])),
4836 int dataSize = DH_size(diffieHellman->dh);
4837 char* data = Malloc(dataSize);
4839 int size = DH_compute_key(reinterpret_cast<unsigned char*>(data),
4847 checked = DH_check_pub_key(diffieHellman->dh, key, &checkResult);
4853 }
else if (checkResult) {
4854 if (checkResult & DH_CHECK_PUBKEY_TOO_SMALL) {
4855 return env->ThrowError(
"Supplied key is too small");
4856 }
else if (checkResult & DH_CHECK_PUBKEY_TOO_LARGE) {
4857 return env->ThrowError(
"Supplied key is too large");
4859 return env->ThrowError(
"Invalid key");
4862 return env->ThrowError(
"Invalid key");
4875 if (size != dataSize) {
4876 CHECK(dataSize > size);
4877 memmove(data + dataSize - size, data, size);
4878 memset(data, 0, dataSize - size);
4881 auto rc =
Buffer::New(env->isolate(),
data, dataSize).ToLocalChecked();
4882 args.GetReturnValue().Set(rc);
4886 void DiffieHellman::SetKey(
const v8::FunctionCallbackInfo<v8::Value>& args,
4887 BIGNUM* (DH::*field),
const char* what) {
4888 Environment* env = Environment::GetCurrent(args);
4891 ASSIGN_OR_RETURN_UNWRAP(&dh, args.Holder());
4892 if (!dh->initialised_)
return env->ThrowError(
"Not initialized");
4894 BIGNUM** num = &((dh->dh)->*field);
4897 if (args.Length() == 0) {
4898 snprintf(errmsg,
sizeof(errmsg),
"%s argument is mandatory", what);
4899 return env->ThrowError(errmsg);
4903 snprintf(errmsg,
sizeof(errmsg),
"%s must be a buffer", what);
4904 return env->ThrowTypeError(errmsg);
4907 *num = BN_bin2bn(reinterpret_cast<unsigned char*>(
Buffer::Data(args[0])),
4909 CHECK_NE(*num,
nullptr);
4913 void DiffieHellman::SetPublicKey(
const FunctionCallbackInfo<Value>& args) {
4914 SetKey(args, &DH::pub_key,
"Public key");
4918 void DiffieHellman::SetPrivateKey(
const FunctionCallbackInfo<Value>& args) {
4919 SetKey(args, &DH::priv_key,
"Private key");
4923 void DiffieHellman::VerifyErrorGetter(Local<String> property,
4924 const PropertyCallbackInfo<Value>& args) {
4925 HandleScope scope(args.GetIsolate());
4927 DiffieHellman* diffieHellman;
4928 ASSIGN_OR_RETURN_UNWRAP(&diffieHellman, args.Holder());
4930 if (!diffieHellman->initialised_)
4934 args.GetReturnValue().Set(diffieHellman->verifyError_);
4938 bool DiffieHellman::VerifyContext() {
4940 if (!DH_check(dh, &codes))
4942 verifyError_ = codes;
4948 HandleScope scope(env->isolate());
4950 Local<FunctionTemplate> t = env->NewFunctionTemplate(
New);
4952 t->InstanceTemplate()->SetInternalFieldCount(1);
4954 env->SetProtoMethod(t,
"generateKeys", GenerateKeys);
4955 env->SetProtoMethod(t,
"computeSecret", ComputeSecret);
4956 env->SetProtoMethod(t,
"getPublicKey", GetPublicKey);
4957 env->SetProtoMethod(t,
"getPrivateKey", GetPrivateKey);
4958 env->SetProtoMethod(t,
"setPublicKey", SetPublicKey);
4959 env->SetProtoMethod(t,
"setPrivateKey", SetPrivateKey);
4961 target->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"ECDH"),
4966 void ECDH::New(
const FunctionCallbackInfo<Value>& args) {
4967 Environment* env = Environment::GetCurrent(args);
4969 MarkPopErrorOnReturn mark_pop_error_on_return;
4973 node::Utf8Value curve(env->isolate(), args[0]);
4975 int nid = OBJ_sn2nid(*curve);
4976 if (nid == NID_undef)
4977 return env->ThrowTypeError(
"First argument should be a valid curve name");
4979 EC_KEY* key = EC_KEY_new_by_curve_name(nid);
4981 return env->ThrowError(
"Failed to create EC_KEY using curve name");
4983 new ECDH(env, args.This(), key);
4987 void ECDH::GenerateKeys(
const FunctionCallbackInfo<Value>& args) {
4988 Environment* env = Environment::GetCurrent(args);
4991 ASSIGN_OR_RETURN_UNWRAP(&ecdh, args.Holder());
4993 if (!EC_KEY_generate_key(ecdh->key_))
4994 return env->ThrowError(
"Failed to generate EC_KEY");
4998 EC_POINT* ECDH::BufferToPoint(
char* data,
size_t len) {
5002 pub = EC_POINT_new(group_);
5003 if (pub ==
nullptr) {
5004 env()->ThrowError(
"Failed to allocate EC_POINT for a public key");
5008 r = EC_POINT_oct2point(
5011 reinterpret_cast<unsigned char*>(data),
5015 env()->ThrowError(
"Failed to translate Buffer to a EC_POINT");
5027 void ECDH::ComputeSecret(
const FunctionCallbackInfo<Value>& args) {
5028 Environment* env = Environment::GetCurrent(args);
5033 ASSIGN_OR_RETURN_UNWRAP(&ecdh, args.Holder());
5035 MarkPopErrorOnReturn mark_pop_error_on_return;
5037 if (!ecdh->IsKeyPairValid())
5038 return env->ThrowError(
"Invalid key pair");
5040 EC_POINT* pub = ecdh->BufferToPoint(
Buffer::Data(args[0]),
5046 int field_size = EC_GROUP_get_degree(ecdh->group_);
5047 size_t out_len = (field_size + 7) / 8;
5048 char* out = node::Malloc(out_len);
5050 int r = ECDH_compute_key(out, out_len, pub, ecdh->key_,
nullptr);
5054 return env->ThrowError(
"Failed to compute ECDH key");
5057 Local<Object> buf =
Buffer::New(env, out, out_len).ToLocalChecked();
5058 args.GetReturnValue().Set(buf);
5062 void ECDH::GetPublicKey(
const FunctionCallbackInfo<Value>& args) {
5063 Environment* env = Environment::GetCurrent(args);
5066 CHECK_EQ(args.Length(), 1);
5069 ASSIGN_OR_RETURN_UNWRAP(&ecdh, args.Holder());
5071 const EC_POINT* pub = EC_KEY_get0_public_key(ecdh->key_);
5073 return env->ThrowError(
"Failed to get ECDH public key");
5076 point_conversion_form_t form =
5077 static_cast<point_conversion_form_t
>(args[0]->Uint32Value());
5079 size = EC_POINT_point2oct(ecdh->group_, pub, form,
nullptr, 0,
nullptr);
5081 return env->ThrowError(
"Failed to get public key length");
5083 unsigned char* out = node::Malloc<unsigned char>(size);
5085 int r = EC_POINT_point2oct(ecdh->group_, pub, form, out, size,
nullptr);
5088 return env->ThrowError(
"Failed to get public key");
5092 Buffer::New(env, reinterpret_cast<char*>(out), size).ToLocalChecked();
5093 args.GetReturnValue().Set(buf);
5097 void ECDH::GetPrivateKey(
const FunctionCallbackInfo<Value>& args) {
5098 Environment* env = Environment::GetCurrent(args);
5101 ASSIGN_OR_RETURN_UNWRAP(&ecdh, args.Holder());
5103 const BIGNUM* b = EC_KEY_get0_private_key(ecdh->key_);
5105 return env->ThrowError(
"Failed to get ECDH private key");
5107 int size = BN_num_bytes(b);
5108 unsigned char* out = node::Malloc<unsigned char>(size);
5110 if (size != BN_bn2bin(b, out)) {
5112 return env->ThrowError(
"Failed to convert ECDH private key to Buffer");
5116 Buffer::New(env, reinterpret_cast<char*>(out), size).ToLocalChecked();
5117 args.GetReturnValue().Set(buf);
5121 void ECDH::SetPrivateKey(
const FunctionCallbackInfo<Value>& args) {
5122 Environment* env = Environment::GetCurrent(args);
5125 ASSIGN_OR_RETURN_UNWRAP(&ecdh, args.Holder());
5129 BIGNUM* priv = BN_bin2bn(
5130 reinterpret_cast<unsigned char*>(
Buffer::Data(args[0].As<Object>())),
5133 if (priv ==
nullptr)
5134 return env->ThrowError(
"Failed to convert Buffer to BN");
5136 if (!ecdh->IsKeyValidForCurve(priv)) {
5138 return env->ThrowError(
"Private key is not valid for specified curve.");
5141 int result = EC_KEY_set_private_key(ecdh->key_, priv);
5145 return env->ThrowError(
"Failed to convert BN to a private key");
5150 EC_KEY_set_public_key(ecdh->key_,
nullptr);
5152 MarkPopErrorOnReturn mark_pop_error_on_return;
5153 (void) &mark_pop_error_on_return;
5155 const BIGNUM* priv_key = EC_KEY_get0_private_key(ecdh->key_);
5156 CHECK_NE(priv_key,
nullptr);
5158 EC_POINT* pub = EC_POINT_new(ecdh->group_);
5159 CHECK_NE(pub,
nullptr);
5161 if (!EC_POINT_mul(ecdh->group_, pub, priv_key,
nullptr,
nullptr,
nullptr)) {
5163 return env->ThrowError(
"Failed to generate ECDH public key");
5166 if (!EC_KEY_set_public_key(ecdh->key_, pub)) {
5168 return env->ThrowError(
"Failed to set generated public key");
5175 void ECDH::SetPublicKey(
const FunctionCallbackInfo<Value>& args) {
5176 Environment* env = Environment::GetCurrent(args);
5179 ASSIGN_OR_RETURN_UNWRAP(&ecdh, args.Holder());
5183 MarkPopErrorOnReturn mark_pop_error_on_return;
5185 EC_POINT* pub = ecdh->BufferToPoint(
Buffer::Data(args[0].As<Object>()),
5188 return env->ThrowError(
"Failed to convert Buffer to EC_POINT");
5190 int r = EC_KEY_set_public_key(ecdh->key_, pub);
5193 return env->ThrowError(
"Failed to set EC_POINT as the public key");
5197 bool ECDH::IsKeyValidForCurve(
const BIGNUM* private_key) {
5198 CHECK_NE(group_,
nullptr);
5199 CHECK_NE(private_key,
nullptr);
5202 if (BN_cmp(private_key, BN_value_one()) < 0) {
5205 BIGNUM* order = BN_new();
5206 CHECK_NE(order,
nullptr);
5207 bool result = EC_GROUP_get_order(group_, order,
nullptr) &&
5208 BN_cmp(private_key, order) < 0;
5214 bool ECDH::IsKeyPairValid() {
5215 MarkPopErrorOnReturn mark_pop_error_on_return;
5216 (void) &mark_pop_error_on_return;
5217 return 1 == EC_KEY_check_key(key_);
5224 Local<Object>
object,
5225 const EVP_MD* digest,
5232 : AsyncWrap(env, object, AsyncWrap::PROVIDER_PBKDF2REQUEST),
5240 key_(
node::Malloc(keylen)),
5258 ClearWrap(
object());
5259 persistent().Reset();
5271 static void After(uv_work_t* work_req,
int status);
5272 void After(Local<Value> (*argv)[2]);
5276 uv_work_t work_req_;
5277 const EVP_MD* digest_;
5292 pass_, passlen_, reinterpret_cast<unsigned char*>(salt_), saltlen_,
5293 iter_, digest_, keylen_, reinterpret_cast<unsigned char*>(key_));
5294 OPENSSL_cleanse(pass_, passlen_);
5295 OPENSSL_cleanse(salt_, saltlen_);
5307 (*argv)[0] = Undefined(env()->isolate());
5308 (*argv)[1] =
Buffer::New(env(), key_, keylen_).ToLocalChecked();
5312 (*argv)[0] = Exception::Error(env()->pbkdf2_error_string());
5313 (*argv)[1] = Undefined(env()->isolate());
5319 HandleScope handle_scope(env()->isolate());
5320 Context::Scope context_scope(env()->context());
5321 Local<Value> argv[2];
5323 MakeCallback(env()->ondone_string(), arraysize(argv), argv);
5328 CHECK_EQ(status, 0);
5335 void PBKDF2(
const FunctionCallbackInfo<Value>& args) {
5336 Environment* env = Environment::GetCurrent(args);
5338 const EVP_MD* digest =
nullptr;
5339 const char* type_error =
nullptr;
5340 char* pass =
nullptr;
5341 char* salt =
nullptr;
5344 double raw_keylen = -1;
5350 if (args.Length() != 5 && args.Length() != 6) {
5351 type_error =
"Bad parameter";
5358 type_error =
"Bad password";
5364 pass = node::Malloc(passlen);
5369 type_error =
"Bad salt";
5373 salt = node::Malloc(saltlen);
5376 if (!args[2]->IsNumber()) {
5377 type_error =
"Iterations not a number";
5381 iter = args[2]->Int32Value();
5383 type_error =
"Bad iterations";
5387 if (!args[3]->IsNumber()) {
5388 type_error =
"Key length not a number";
5392 raw_keylen = args[3]->NumberValue();
5393 if (raw_keylen < 0.0 || isnan(raw_keylen) || isinf(raw_keylen) ||
5394 raw_keylen > INT_MAX) {
5395 type_error =
"Bad key length";
5399 keylen =
static_cast<int>(raw_keylen);
5401 if (args[4]->IsString()) {
5402 node::Utf8Value digest_name(env->isolate(), args[4]);
5403 digest = EVP_get_digestbyname(*digest_name);
5404 if (digest ==
nullptr) {
5405 type_error =
"Bad digest name";
5410 if (digest ==
nullptr) {
5411 digest = EVP_sha1();
5414 obj = env->pbkdf2_constructor_template()->
5415 NewInstance(env->context()).ToLocalChecked();
5426 if (args[5]->IsFunction()) {
5427 obj->Set(env->ondone_string(), args[5]);
5429 if (env->in_domain()) {
5430 obj->Set(env->context(),
5431 env->domain_string(),
5432 env->domain_array()->Get(env->context(), 0).ToLocalChecked())
5436 uv_queue_work(env->event_loop(),
5441 env->PrintSyncTrace();
5443 Local<Value> argv[2];
5447 if (argv[0]->IsObject())
5448 env->isolate()->ThrowException(argv[0]);
5450 args.GetReturnValue().Set(argv[1]);
5457 return env->ThrowTypeError(type_error);
5467 Local<Object>
object,
5471 : AsyncWrap(env, object, AsyncWrap::PROVIDER_RANDOMBYTESREQUEST),
5475 free_mode_(free_mode) {
5480 ClearWrap(
object());
5481 persistent().Reset();
5502 if (free_mode_ == FREE_DATA) {
5528 unsigned long error_;
5542 const int r = RAND_bytes(reinterpret_cast<unsigned char*>(req->
data()),
5548 }
else if (r == -1) {
5549 req->
set_error(static_cast<unsigned long>(-1));
5557 char errmsg[256] =
"Operation not supported";
5559 if (req->
error() !=
static_cast<unsigned long>(-1))
5560 ERR_error_string_n(req->
error(), errmsg,
sizeof errmsg);
5562 (*argv)[0] = Exception::Error(OneByteString(req->env()->isolate(), errmsg));
5563 (*argv)[1] = Null(req->env()->isolate());
5566 char* data =
nullptr;
5569 (*argv)[0] = Null(req->env()->isolate());
5570 Local<Value> buffer =
5571 req->object()->Get(req->env()->context(),
5572 req->env()->buffer_string()).ToLocalChecked();
5574 if (buffer->IsUint8Array()) {
5577 memcpy(buf, data, req->
size());
5578 (*argv)[1] = buffer;
5587 CHECK_EQ(status, 0);
5590 Environment* env = req->env();
5591 HandleScope handle_scope(env->isolate());
5592 Context::Scope context_scope(env->context());
5593 Local<Value> argv[2];
5595 req->MakeCallback(env->ondone_string(), arraysize(argv), argv);
5602 Local<Value> (*argv)[2]) {
5603 env->PrintSyncTrace();
5608 if (!(*argv)[0]->IsNull())
5609 env->isolate()->ThrowException((*argv)[0]);
5614 Environment* env = Environment::GetCurrent(args);
5616 if (!args[0]->IsUint32()) {
5617 return env->ThrowTypeError(
"size must be a number >= 0");
5620 const int64_t size = args[0]->IntegerValue();
5621 if (size < 0 || size > Buffer::kMaxLength)
5622 return env->ThrowRangeError(
"size is not a valid Smi");
5624 Local<Object> obj = env->randombytes_constructor_template()->
5625 NewInstance(env->context()).ToLocalChecked();
5626 char* data = node::Malloc(size);
5634 if (args[1]->IsFunction()) {
5635 obj->Set(env->ondone_string(), args[1]);
5637 if (env->in_domain()) {
5638 obj->Set(env->context(),
5639 env->domain_string(),
5640 env->domain_array()->Get(env->context(), 0).ToLocalChecked())
5644 uv_queue_work(env->event_loop(),
5648 args.GetReturnValue().Set(obj);
5650 Local<Value> argv[2];
5652 if (argv[0]->IsNull())
5653 args.GetReturnValue().Set(argv[1]);
5659 Environment* env = Environment::GetCurrent(args);
5661 CHECK(args[0]->IsUint8Array());
5662 CHECK(args[1]->IsUint32());
5663 CHECK(args[2]->IsUint32());
5665 int64_t offset = args[1]->IntegerValue();
5666 int64_t size = args[2]->IntegerValue();
5668 Local<Object> obj = env->randombytes_constructor_template()->
5669 NewInstance(env->context()).ToLocalChecked();
5670 obj->Set(env->context(), env->buffer_string(), args[0]).FromJust();
5680 if (args[3]->IsFunction()) {
5681 obj->Set(env->context(), env->ondone_string(), args[3]).FromJust();
5683 if (env->in_domain()) {
5684 obj->Set(env->context(),
5685 env->domain_string(),
5686 env->domain_array()->Get(env->context(), 0).ToLocalChecked())
5690 uv_queue_work(env->event_loop(),
5694 args.GetReturnValue().Set(obj);
5696 Local<Value> argv[2];
5698 if (argv[0]->IsNull())
5699 args.GetReturnValue().Set(argv[1]);
5705 Environment* env = Environment::GetCurrent(args);
5707 SSL_CTX* ctx = SSL_CTX_new(TLSv1_server_method());
5708 if (ctx ==
nullptr) {
5709 return env->ThrowError(
"SSL_CTX_new() failed.");
5712 SSL* ssl = SSL_new(ctx);
5713 if (ssl ==
nullptr) {
5715 return env->ThrowError(
"SSL_new() failed.");
5718 Local<Array> arr =
Array::New(env->isolate());
5719 STACK_OF(SSL_CIPHER)* ciphers = SSL_get_ciphers(ssl);
5721 for (
int i = 0; i < sk_SSL_CIPHER_num(ciphers); ++i) {
5722 const SSL_CIPHER* cipher = sk_SSL_CIPHER_value(ciphers, i);
5723 arr->Set(i, OneByteString(args.GetIsolate(), SSL_CIPHER_get_name(cipher)));
5729 args.GetReturnValue().Set(arr);
5736 : arr(Array::
New(env->isolate())),
5749 template <
class TypeName>
5750 static void array_push_back(
const TypeName* md,
5755 ctx->
arr->Set(ctx->
arr->Length(), OneByteString(ctx->
env()->isolate(), from));
5760 Environment* env = Environment::GetCurrent(args);
5762 EVP_CIPHER_do_all_sorted(array_push_back<EVP_CIPHER>, &ctx);
5763 args.GetReturnValue().Set(ctx.
arr);
5768 Environment* env = Environment::GetCurrent(args);
5770 EVP_MD_do_all_sorted(array_push_back<EVP_MD>, &ctx);
5771 args.GetReturnValue().Set(ctx.
arr);
5776 Environment* env = Environment::GetCurrent(args);
5777 const size_t num_curves = EC_get_builtin_curves(
nullptr, 0);
5778 Local<Array> arr =
Array::New(env->isolate(), num_curves);
5779 EC_builtin_curve* curves;
5782 curves = node::Malloc<EC_builtin_curve>(num_curves);
5784 if (EC_get_builtin_curves(curves, num_curves)) {
5785 for (
size_t i = 0; i < num_curves; i++) {
5786 arr->Set(i, OneByteString(env->isolate(), OBJ_nid2sn(curves[i].nid)));
5793 args.GetReturnValue().Set(arr);
5799 EVP_PKEY* pkey =
nullptr;
5800 NETSCAPE_SPKI* spki =
nullptr;
5802 spki = NETSCAPE_SPKI_b64_decode(data, len);
5803 if (spki ==
nullptr)
5806 pkey = X509_PUBKEY_get(spki->spkac->pubkey);
5807 if (pkey ==
nullptr)
5810 i = NETSCAPE_SPKI_verify(spki, pkey) > 0;
5813 if (pkey !=
nullptr)
5814 EVP_PKEY_free(pkey);
5816 if (spki !=
nullptr)
5817 NETSCAPE_SPKI_free(spki);
5824 Environment* env = Environment::GetCurrent(args);
5827 if (args.Length() < 1)
5828 return env->ThrowTypeError(
"Data argument is mandatory");
5834 return args.GetReturnValue().Set(i);
5837 CHECK_NE(data,
nullptr);
5841 args.GetReturnValue().Set(i);
5846 char* buf =
nullptr;
5847 EVP_PKEY* pkey =
nullptr;
5848 NETSCAPE_SPKI* spki =
nullptr;
5850 BIO* bio = BIO_new(BIO_s_mem());
5854 spki = NETSCAPE_SPKI_b64_decode(data, len);
5855 if (spki ==
nullptr)
5858 pkey = NETSCAPE_SPKI_get_pubkey(spki);
5859 if (pkey ==
nullptr)
5862 if (PEM_write_bio_PUBKEY(bio, pkey) <= 0)
5866 BIO_get_mem_ptr(bio, &ptr);
5868 *size = ptr->length;
5869 buf = Malloc(*size);
5870 memcpy(buf, ptr->data, *size);
5873 if (pkey !=
nullptr)
5874 EVP_PKEY_free(pkey);
5876 if (spki !=
nullptr)
5877 NETSCAPE_SPKI_free(spki);
5887 Environment* env = Environment::GetCurrent(args);
5889 if (args.Length() < 1)
5890 return env->ThrowTypeError(
"Public key argument is mandatory");
5896 return args.GetReturnValue().SetEmptyString();
5899 CHECK_NE(data,
nullptr);
5903 if (pkey ==
nullptr)
5904 return args.GetReturnValue().SetEmptyString();
5906 Local<Value> out =
Buffer::New(env, pkey, pkey_size).ToLocalChecked();
5907 args.GetReturnValue().Set(out);
5912 NETSCAPE_SPKI* sp =
nullptr;
5914 sp = NETSCAPE_SPKI_b64_decode(data, len);
5918 unsigned char* buf =
nullptr;
5919 ASN1_STRING_to_UTF8(&buf, sp->spkac->challenge);
5921 NETSCAPE_SPKI_free(sp);
5923 return reinterpret_cast<const char*
>(
buf);
5928 Environment* env = Environment::GetCurrent(args);
5930 if (args.Length() < 1)
5931 return env->ThrowTypeError(
"Challenge argument is mandatory");
5937 return args.GetReturnValue().SetEmptyString();
5940 CHECK_NE(data,
nullptr);
5943 if (cert ==
nullptr)
5944 return args.GetReturnValue().SetEmptyString();
5946 Local<Value> outString =
Encode(env->isolate(), cert, strlen(cert),
BUFFER);
5948 OPENSSL_free(const_cast<char*>(cert));
5950 args.GetReturnValue().Set(outString);
5954 Environment* env = Environment::GetCurrent(args);
5961 return env->ThrowTypeError(
"Input buffers must have the same length");
5967 return args.GetReturnValue().Set(CRYPTO_memcmp(buf1, buf2, buf_length) == 0);
5971 SSL_load_error_strings();
5972 OPENSSL_no_config();
5975 if (!openssl_config.empty()) {
5976 OPENSSL_load_builtin_modules();
5977 #ifndef OPENSSL_NO_ENGINE 5978 ENGINE_load_builtin_engines();
5981 CONF_modules_load_file(
5982 openssl_config.c_str(),
5984 CONF_MFLAGS_DEFAULT_SECTION);
5985 int err = ERR_get_error();
5988 "openssl config failed: %s\n",
5989 ERR_error_string(err, NULL));
5995 OpenSSL_add_all_algorithms();
5998 CRYPTO_set_locking_callback(crypto_lock_cb);
5999 CRYPTO_THREADID_set_callback(crypto_threadid_cb);
6001 #ifdef NODE_FIPS_MODE 6003 unsigned long err = 0;
6004 if (enable_fips_crypto || force_fips_crypto) {
6005 if (0 == FIPS_mode() && !FIPS_mode_set(1)) {
6006 err = ERR_get_error();
6010 fprintf(stderr,
"openssl fips failed: %s\n", ERR_error_string(err, NULL));
6013 #endif // NODE_FIPS_MODE 6018 sk_SSL_COMP_zero(SSL_COMP_get_compression_methods());
6020 #ifndef OPENSSL_NO_ENGINE 6021 ERR_load_ENGINE_strings();
6022 ENGINE_load_builtin_engines();
6023 #endif // !OPENSSL_NO_ENGINE 6027 #ifndef OPENSSL_NO_ENGINE 6029 Environment* env = Environment::GetCurrent(args);
6030 CHECK(args.Length() >= 2 && args[0]->IsString());
6031 unsigned int flags = args[1]->Uint32Value();
6033 ClearErrorOnReturn clear_error_on_return;
6035 const node::Utf8Value engine_id(env->isolate(), args[0]);
6036 ENGINE* engine = ENGINE_by_id(*engine_id);
6039 if (engine ==
nullptr) {
6040 engine = ENGINE_by_id(
"dynamic");
6041 if (engine !=
nullptr) {
6042 if (!ENGINE_ctrl_cmd_string(engine,
"SO_PATH", *engine_id, 0) ||
6043 !ENGINE_ctrl_cmd_string(engine,
"LOAD",
nullptr, 0)) {
6044 ENGINE_free(engine);
6050 if (engine ==
nullptr) {
6051 int err = ERR_get_error();
6054 snprintf(tmp,
sizeof(tmp),
"Engine \"%s\" was not found", *engine_id);
6055 return env->ThrowError(tmp);
6061 int r = ENGINE_set_default(engine, flags);
6062 ENGINE_free(engine);
6066 #endif // !OPENSSL_NO_ENGINE 6070 args.GetReturnValue().Set(1);
6072 args.GetReturnValue().Set(0);
6077 Environment* env = Environment::GetCurrent(args);
6078 #ifdef NODE_FIPS_MODE 6079 bool mode = args[0]->BooleanValue();
6080 if (force_fips_crypto) {
6081 return env->ThrowError(
6082 "Cannot set FIPS mode, it was forced with --force-fips at startup.");
6083 }
else if (!FIPS_mode_set(mode)) {
6084 unsigned long err = ERR_get_error();
6088 return env->ThrowError(
"Cannot set FIPS mode in a non-FIPS build.");
6093 Local<Value> unused,
6094 Local<Context> context,
6096 static uv_once_t init_once = UV_ONCE_INIT;
6099 Environment* env = Environment::GetCurrent(context);
6110 env->SetMethod(target,
"certVerifySpkac",
VerifySpkac);
6113 #ifndef OPENSSL_NO_ENGINE 6114 env->SetMethod(target,
"setEngine",
SetEngine);
6115 #endif // !OPENSSL_NO_ENGINE 6118 env->SetMethod(target,
"PBKDF2",
PBKDF2);
6119 env->SetMethod(target,
"randomBytes",
RandomBytes);
6123 env->SetMethod(target,
"getCiphers",
GetCiphers);
6124 env->SetMethod(target,
"getHashes",
GetHashes);
6125 env->SetMethod(target,
"getCurves",
GetCurves);
6126 env->SetMethod(target,
"publicEncrypt",
6127 PublicKeyCipher::Cipher<PublicKeyCipher::kPublic,
6128 EVP_PKEY_encrypt_init,
6130 env->SetMethod(target,
"privateDecrypt",
6131 PublicKeyCipher::Cipher<PublicKeyCipher::kPrivate,
6132 EVP_PKEY_decrypt_init,
6134 env->SetMethod(target,
"privateEncrypt",
6135 PublicKeyCipher::Cipher<PublicKeyCipher::kPrivate,
6138 env->SetMethod(target,
"publicDecrypt",
6139 PublicKeyCipher::Cipher<PublicKeyCipher::kPublic,
6140 EVP_PKEY_verify_recover_init,
6141 EVP_PKEY_verify_recover>);
6144 pb->SetClassName(FIXED_ONE_BYTE_STRING(env->isolate(),
"PBKDF2"));
6145 AsyncWrap::AddWrapMethods(env, pb);
6146 Local<ObjectTemplate> pbt = pb->InstanceTemplate();
6147 pbt->SetInternalFieldCount(1);
6148 env->set_pbkdf2_constructor_template(pbt);
6151 rb->SetClassName(FIXED_ONE_BYTE_STRING(env->isolate(),
"RandomBytes"));
6152 AsyncWrap::AddWrapMethods(env, rb);
6153 Local<ObjectTemplate> rbt = rb->InstanceTemplate();
6154 rbt->SetInternalFieldCount(1);
6155 env->set_randombytes_constructor_template(rbt);
void set_error(unsigned long err)
PBKDF2Request(Environment *env, Local< Object > object, const EVP_MD *digest, int passlen, char *pass, int saltlen, char *salt, int iter, int keylen)
void GetSSLCiphers(const FunctionCallbackInfo< Value > &args)
void PBKDF2(const FunctionCallbackInfo< Value > &args)
CheckResult CheckWhitelistedServerCert(X509_STORE_CTX *ctx)
void GetFipsCrypto(const FunctionCallbackInfo< Value > &args)
size_t self_size() const override
bool HasInstance(Local< Value > val)
void GetHashes(const FunctionCallbackInfo< Value > &args)
bool CheckStartComOrWoSign(X509_NAME *root_name, X509 *cert)
NODE_MODULE_CONTEXT_AWARE_BUILTIN(inspector, node::inspector::Agent::InitInspector)
void RandomBytesAfter(uv_work_t *work_req, int status)
void RandomBytesBuffer(const FunctionCallbackInfo< Value > &args)
void SetEngine(const FunctionCallbackInfo< Value > &args)
char * ExportPublicKey(const char *data, int len, size_t *size)
void ProcessEmitWarning(Environment *env, const char *fmt,...)
RandomBytesRequest(Environment *env, Local< Object > object, size_t size, char *data, FreeMode free_mode)
bool CertIsStartComOrWoSign(X509_NAME *name)
~RandomBytesRequest() override
union node::cares_wrap::@8::CaresAsyncData::@0 data
#define THROW_AND_RETURN_IF_NOT_STRING_OR_BUFFER(val, prefix)
const char * ExportChallenge(const char *data, int len)
~PBKDF2Request() override
void InitCrypto(Local< Object > target, Local< Value > unused, Local< Context > context, void *priv)
int SSL_CTX_get_issuer(SSL_CTX *ctx, X509 *cert, X509 **issuer)
void RandomBytesProcessSync(Environment *env, RandomBytesRequest *req, Local< Value >(*argv)[2])
void return_memory(char **d, size_t *len)
#define THROW_AND_RETURN_IF_NOT_BUFFER(val, prefix)
void UseExtraCaCerts(const std::string &file)
size_t Length(Local< Value > val)
CipherPushContext(Environment *env)
void Initialize(Local< Object > target, Local< Value > unused, Local< Context > context, void *priv)
#define THROW_AND_RETURN_IF_NOT_STRING(val, prefix)
void GetCiphers(const FunctionCallbackInfo< Value > &args)
char * Data(Local< Value > val)
int SSL_CTX_use_certificate_chain(SSL_CTX *ctx, X509 *x, STACK_OF(X509) *extra_certs, X509 **cert, X509 **issuer)
size_t self_size() const override
void ThrowCryptoError(Environment *env, unsigned long err, const char *default_message=nullptr)
void TimingSafeEqual(const FunctionCallbackInfo< Value > &args)
int VerifyCallback(int preverify_ok, X509_STORE_CTX *ctx)
enum encoding ParseEncoding(const char *encoding, enum encoding default_encoding)
static void After(uv_work_t *work_req, int status)
X509 * FindRoot(STACK_OF(X509) *sk)
Environment * env() const
MaybeLocal< Object > New(Isolate *isolate, Local< String > string, enum encoding enc)
MaybeLocal< Value > MakeCallback(Isolate *isolate, Local< Object > recv, Local< Function > callback, int argc, Local< Value > *argv, async_id asyncId, async_id triggerAsyncId)
#define CASE_X509_ERR(CODE)
void SetFipsCrypto(const FunctionCallbackInfo< Value > &args)
void GetCurves(const FunctionCallbackInfo< Value > &args)
static void Work(uv_work_t *work_req)
void RandomBytesWork(uv_work_t *work_req)
int IsSelfSigned(X509 *cert)
void RandomBytes(const FunctionCallbackInfo< Value > &args)
unsigned long error() const
void RandomBytesCheck(RandomBytesRequest *req, Local< Value >(*argv)[2])
bool EntropySource(unsigned char *buffer, size_t length)
bool VerifySpkac(const char *data, unsigned int len)
void set_data(char *data)
int Start(Isolate *isolate, IsolateData *isolate_data, int argc, const char *const *argv, int exec_argc, const char *const *exec_argv)
void Init(int *argc, const char **argv, int *exec_argc, const char ***exec_argv)
NODE_DEPRECATED("Use ParseEncoding(isolate, ...)", inline enum encoding ParseEncoding(v8::Local< v8::Value > encoding_v, enum encoding default_encoding=LATIN1) { return ParseEncoding(v8::Isolate::GetCurrent(), encoding_v, default_encoding);}) NODE_EXTERN void FatalException(v8 NODE_DEPRECATED("Use FatalException(isolate, ...)", inline void FatalException(const v8::TryCatch &try_catch) { return FatalException(v8::Isolate::GetCurrent(), try_catch);}) NODE_EXTERN v8 NODE_EXTERN v8::Local< v8::Value > Encode(v8::Isolate *isolate, const uint16_t *buf, size_t len)
MaybeLocal< Object > Copy(Isolate *isolate, const char *data, size_t length)
int compar(const void *a, const void *b)