@@ -1054,30 +1054,41 @@ void SecureContext::LoadPKCS12(const FunctionCallbackInfo<Value>& args) {
10541054 STACK_OF (X509)* extra_certs_ptr = nullptr ;
10551055 if (d2i_PKCS12_bio (in.get (), &p12_ptr) &&
10561056 (p12.reset (p12_ptr), true ) && // Move ownership to the smart pointer.
1057- PKCS12_parse (p12.get (), pass.data (),
1058- &pkey_ptr,
1059- &cert_ptr,
1060- &extra_certs_ptr) &&
1061- (pkey.reset (pkey_ptr), cert.reset (cert_ptr),
1062- extra_certs.reset (extra_certs_ptr), true ) && // Move ownership.
1063- SSL_CTX_use_certificate_chain (sc->ctx_ .get (),
1064- std::move (cert),
1065- extra_certs.get (),
1066- &sc->cert_ ,
1067- &sc->issuer_ ) &&
1068- SSL_CTX_use_PrivateKey (sc->ctx_ .get (), pkey.get ())) {
1069- // Add CA certs too
1070- for (int i = 0 ; i < sk_X509_num (extra_certs.get ()); i++) {
1071- X509* ca = sk_X509_value (extra_certs.get (), i);
1072-
1073- if (cert_store == GetOrCreateRootCertStore ()) {
1074- cert_store = NewRootCertStore ();
1075- SSL_CTX_set_cert_store (sc->ctx_ .get (), cert_store);
1057+ PKCS12_parse (
1058+ p12.get (), pass.data (), &pkey_ptr, &cert_ptr, &extra_certs_ptr) &&
1059+ (pkey.reset (pkey_ptr),
1060+ cert.reset (cert_ptr), // Move ownership.
1061+ extra_certs.reset (extra_certs_ptr),
1062+ true )) {
1063+ if (pkey.get () == nullptr ) {
1064+ return THROW_ERR_CRYPTO_OPERATION_FAILED (
1065+ env, " Unable to load private key from PFX data" );
1066+ }
1067+
1068+ if (cert.get () == nullptr ) {
1069+ return THROW_ERR_CRYPTO_OPERATION_FAILED (
1070+ env, " Unable to load certificate from PFX data" );
1071+ }
1072+
1073+ if (SSL_CTX_use_certificate_chain (sc->ctx_ .get (),
1074+ std::move (cert),
1075+ extra_certs.get (),
1076+ &sc->cert_ ,
1077+ &sc->issuer_ ) &&
1078+ SSL_CTX_use_PrivateKey (sc->ctx_ .get (), pkey.get ())) {
1079+ // Add CA certs too
1080+ for (int i = 0 ; i < sk_X509_num (extra_certs.get ()); i++) {
1081+ X509* ca = sk_X509_value (extra_certs.get (), i);
1082+
1083+ if (cert_store == GetOrCreateRootCertStore ()) {
1084+ cert_store = NewRootCertStore ();
1085+ SSL_CTX_set_cert_store (sc->ctx_ .get (), cert_store);
1086+ }
1087+ X509_STORE_add_cert (cert_store, ca);
1088+ SSL_CTX_add_client_CA (sc->ctx_ .get (), ca);
10761089 }
1077- X509_STORE_add_cert (cert_store, ca);
1078- SSL_CTX_add_client_CA (sc->ctx_ .get (), ca);
1090+ ret = true ;
10791091 }
1080- ret = true ;
10811092 }
10821093
10831094 if (!ret) {
0 commit comments