@@ -1052,34 +1052,60 @@ void SecureContext::LoadPKCS12(const FunctionCallbackInfo<Value>& args) {
1052
1052
EVP_PKEY* pkey_ptr = nullptr ;
1053
1053
X509* cert_ptr = nullptr ;
1054
1054
STACK_OF (X509)* extra_certs_ptr = nullptr ;
1055
- if (d2i_PKCS12_bio (in.get (), &p12_ptr) &&
1056
- (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);
1076
- }
1077
- X509_STORE_add_cert (cert_store, ca);
1078
- SSL_CTX_add_client_CA (sc->ctx_ .get (), ca);
1055
+
1056
+ if (!d2i_PKCS12_bio (in.get (), &p12_ptr)) {
1057
+ goto done;
1058
+ }
1059
+
1060
+ // Move ownership to the smart pointer:
1061
+ p12.reset (p12_ptr);
1062
+
1063
+ if (!PKCS12_parse (
1064
+ p12.get (), pass.data (), &pkey_ptr, &cert_ptr, &extra_certs_ptr)) {
1065
+ goto done;
1066
+ }
1067
+
1068
+ // Move ownership of the parsed data:
1069
+ pkey.reset (pkey_ptr);
1070
+ cert.reset (cert_ptr);
1071
+ extra_certs.reset (extra_certs_ptr);
1072
+
1073
+ if (!pkey) {
1074
+ return THROW_ERR_CRYPTO_OPERATION_FAILED (
1075
+ env, " Unable to load private key from PFX data" );
1076
+ }
1077
+
1078
+ if (!cert) {
1079
+ return THROW_ERR_CRYPTO_OPERATION_FAILED (
1080
+ env, " Unable to load certificate from PFX data" );
1081
+ }
1082
+
1083
+ if (!SSL_CTX_use_certificate_chain (sc->ctx_ .get (),
1084
+ std::move (cert),
1085
+ extra_certs.get (),
1086
+ &sc->cert_ ,
1087
+ &sc->issuer_ )) {
1088
+ goto done;
1089
+ }
1090
+
1091
+ if (!SSL_CTX_use_PrivateKey (sc->ctx_ .get (), pkey.get ())) {
1092
+ goto done;
1093
+ }
1094
+
1095
+ // Add CA certs too
1096
+ for (int i = 0 ; i < sk_X509_num (extra_certs.get ()); i++) {
1097
+ X509* ca = sk_X509_value (extra_certs.get (), i);
1098
+
1099
+ if (cert_store == GetOrCreateRootCertStore ()) {
1100
+ cert_store = NewRootCertStore ();
1101
+ SSL_CTX_set_cert_store (sc->ctx_ .get (), cert_store);
1079
1102
}
1080
- ret = true ;
1103
+ X509_STORE_add_cert (cert_store, ca);
1104
+ SSL_CTX_add_client_CA (sc->ctx_ .get (), ca);
1081
1105
}
1106
+ ret = true ;
1082
1107
1108
+ done:
1083
1109
if (!ret) {
1084
1110
// TODO(@jasnell): Should this use ThrowCryptoError?
1085
1111
unsigned long err = ERR_get_error (); // NOLINT(runtime/int)
0 commit comments