@@ -1145,7 +1145,6 @@ static void IsExtraRootCertsFileLoaded(
1145
1145
return args.GetReturnValue ().Set (extra_root_certs_loaded);
1146
1146
}
1147
1147
1148
-
1149
1148
void SecureContext::AddRootCerts (const FunctionCallbackInfo<Value>& args) {
1150
1149
SecureContext* sc;
1151
1150
ASSIGN_OR_RETURN_UNWRAP (&sc, args.Holder ());
@@ -2176,6 +2175,39 @@ static Local<Object> X509ToObject(Environment* env, X509* cert) {
2176
2175
}
2177
2176
2178
2177
2178
+ static void ParseX509 (const FunctionCallbackInfo<Value>& args) {
2179
+ Environment* env = Environment::GetCurrent (args);
2180
+
2181
+ CHECK (args[0 ]->IsArrayBufferView ());
2182
+ ArrayBufferViewContents<unsigned char > buf (args[0 ].As <ArrayBufferView>());
2183
+ const unsigned char * data = buf.data ();
2184
+ unsigned data_len = buf.length ();
2185
+
2186
+ ClearErrorOnReturn clear_error_on_return;
2187
+ BIOPointer bio (LoadBIO (env, args[0 ]));
2188
+ if (!bio)
2189
+ return ThrowCryptoError (env, ERR_get_error ());
2190
+
2191
+ X509Pointer pem (PEM_read_bio_X509_AUX (
2192
+ bio.get (), nullptr , NoPasswordCallback, nullptr ));
2193
+
2194
+ if (!pem) {
2195
+ // Try as DER, but return the original PEM failure if it isn't DER.
2196
+ MarkPopErrorOnReturn mark_here;
2197
+
2198
+ X509Pointer der (d2i_X509 (nullptr , &data, data_len));
2199
+ if (der) {
2200
+ args.GetReturnValue ().Set (X509ToObject (env, der.get ()));
2201
+ }
2202
+ }
2203
+ if (!pem) {
2204
+ return ThrowCryptoError (env, ERR_get_error ());
2205
+ }
2206
+
2207
+ args.GetReturnValue ().Set (X509ToObject (env, pem.get ()));
2208
+ }
2209
+
2210
+
2179
2211
static Local<Object> AddIssuerChainToObject (X509Pointer* cert,
2180
2212
Local<Object> object,
2181
2213
StackOfX509&& peer_certs,
@@ -7358,6 +7390,8 @@ void Initialize(Local<Object> target,
7358
7390
// Exposed for testing purposes only.
7359
7391
env->SetMethodNoSideEffect (target, " isExtraRootCertsFileLoaded" ,
7360
7392
IsExtraRootCertsFileLoaded);
7393
+ env->SetMethodNoSideEffect (target, " parseX509" ,
7394
+ ParseX509);
7361
7395
7362
7396
env->SetMethodNoSideEffect (target, " ECDHConvertKey" , ConvertKey);
7363
7397
#ifndef OPENSSL_NO_ENGINE
0 commit comments