@@ -165,30 +165,19 @@ Dart_Handle X509Helper::WrappedX509Certificate(X509* certificate) {
165
165
}
166
166
167
167
static int SetTrustedCertificatesBytesPKCS12 (SSL_CTX* context,
168
- BIO * bio,
168
+ ScopedMemBIO * bio,
169
169
const char * password) {
170
- ScopedPKCS12 p12 (d2i_PKCS12_bio (bio, NULL ));
171
- if (p12.get () == NULL ) {
172
- return 0 ;
173
- }
170
+ CBS cbs;
171
+ CBS_init (&cbs, bio->data (), bio->length ());
174
172
175
173
EVP_PKEY* key = NULL ;
176
- X509* cert = NULL ;
177
- STACK_OF (X509)* ca_certs = NULL ;
178
- int status = PKCS12_parse (p12.get (), password, &key, &cert, &ca_certs);
174
+ ScopedX509Stack cert_stack (sk_X509_new_null ());
175
+ int status = PKCS12_get_key_and_certs (&key, cert_stack.get (), &cbs, password);
179
176
if (status == 0 ) {
180
177
return status;
181
178
}
182
179
183
- ScopedX509Stack cert_stack (ca_certs);
184
180
X509_STORE* store = SSL_CTX_get_cert_store (context);
185
- status = X509_STORE_add_cert (store, cert);
186
- // X509_STORE_add_cert increments the reference count of cert on success.
187
- X509_free (cert);
188
- if (status == 0 ) {
189
- return status;
190
- }
191
-
192
181
X509* ca;
193
182
while ((ca = sk_X509_shift (cert_stack.get ())) != NULL ) {
194
183
status = X509_STORE_add_cert (store, ca);
@@ -234,8 +223,7 @@ void SSLCertContext::SetTrustedCertificatesBytes(Dart_Handle cert_bytes,
234
223
if (SecureSocketUtils::NoPEMStartLine ()) {
235
224
ERR_clear_error ();
236
225
BIO_reset (bio.bio ());
237
- status =
238
- SetTrustedCertificatesBytesPKCS12 (context (), bio.bio (), password);
226
+ status = SetTrustedCertificatesBytesPKCS12 (context (), &bio, password);
239
227
}
240
228
} else {
241
229
// The PEM file was successfully parsed.
@@ -247,25 +235,14 @@ void SSLCertContext::SetTrustedCertificatesBytes(Dart_Handle cert_bytes,
247
235
}
248
236
249
237
static int SetClientAuthoritiesPKCS12 (SSL_CTX* context,
250
- BIO * bio,
238
+ ScopedMemBIO * bio,
251
239
const char * password) {
252
- ScopedPKCS12 p12 (d2i_PKCS12_bio (bio, NULL ));
253
- if (p12.get () == NULL ) {
254
- return 0 ;
255
- }
240
+ CBS cbs;
241
+ CBS_init (&cbs, bio->data (), bio->length ());
256
242
257
243
EVP_PKEY* key = NULL ;
258
- X509* cert = NULL ;
259
- STACK_OF (X509)* ca_certs = NULL ;
260
- int status = PKCS12_parse (p12.get (), password, &key, &cert, &ca_certs);
261
- if (status == 0 ) {
262
- return status;
263
- }
264
-
265
- ScopedX509Stack cert_stack (ca_certs);
266
- status = SSL_CTX_add_client_CA (context, cert);
267
- // SSL_CTX_add_client_CA increments the reference count of cert on success.
268
- X509_free (cert);
244
+ ScopedX509Stack cert_stack (sk_X509_new_null ());
245
+ int status = PKCS12_get_key_and_certs (&key, cert_stack.get (), &cbs, password);
269
246
if (status == 0 ) {
270
247
return status;
271
248
}
@@ -297,13 +274,13 @@ static int SetClientAuthoritiesPEM(SSL_CTX* context, BIO* bio) {
297
274
}
298
275
299
276
static int SetClientAuthorities (SSL_CTX* context,
300
- BIO * bio,
277
+ ScopedMemBIO * bio,
301
278
const char * password) {
302
- int status = SetClientAuthoritiesPEM (context, bio);
279
+ int status = SetClientAuthoritiesPEM (context, bio-> bio () );
303
280
if (status == 0 ) {
304
281
if (SecureSocketUtils::NoPEMStartLine ()) {
305
282
ERR_clear_error ();
306
- BIO_reset (bio);
283
+ BIO_reset (bio-> bio () );
307
284
status = SetClientAuthoritiesPKCS12 (context, bio, password);
308
285
}
309
286
} else {
@@ -319,7 +296,7 @@ void SSLCertContext::SetClientAuthoritiesBytes(
319
296
int status;
320
297
{
321
298
ScopedMemBIO bio (client_authorities_bytes);
322
- status = SetClientAuthorities (context (), bio. bio () , password);
299
+ status = SetClientAuthorities (context (), & bio, password);
323
300
}
324
301
325
302
SecureSocketUtils::CheckStatus (status, " TlsException" ,
@@ -543,35 +520,31 @@ void SSLCertContext::SetAlpnProtocolList(Dart_Handle protocols_handle,
543
520
}
544
521
545
522
static int UseChainBytesPKCS12 (SSL_CTX* context,
546
- BIO * bio,
523
+ ScopedMemBIO * bio,
547
524
const char * password) {
548
- ScopedPKCS12 p12 (d2i_PKCS12_bio (bio, NULL ));
549
- if (p12.get () == NULL ) {
550
- return 0 ;
551
- }
525
+ CBS cbs;
526
+ CBS_init (&cbs, bio->data (), bio->length ());
552
527
553
528
EVP_PKEY* key = NULL ;
554
- X509* cert = NULL ;
555
- STACK_OF (X509)* ca_certs = NULL ;
556
- int status = PKCS12_parse (p12.get (), password, &key, &cert, &ca_certs);
529
+ ScopedX509Stack certs (sk_X509_new_null ());
530
+ int status = PKCS12_get_key_and_certs (&key, certs.get (), &cbs, password);
557
531
if (status == 0 ) {
558
532
return status;
559
533
}
560
534
561
- ScopedX509 x509 (cert);
562
- ScopedX509Stack certs (ca_certs);
563
- status = SSL_CTX_use_certificate (context, x509.get ());
535
+ X509* ca = sk_X509_shift (certs.get ());
536
+ status = SSL_CTX_use_certificate (context, ca);
564
537
if (ERR_peek_error () != 0 ) {
565
538
// Key/certificate mismatch doesn't imply status is 0.
566
539
status = 0 ;
567
540
}
541
+ X509_free (ca);
568
542
if (status == 0 ) {
569
543
return status;
570
544
}
571
545
572
546
SSL_CTX_clear_chain_certs (context);
573
547
574
- X509* ca;
575
548
while ((ca = sk_X509_shift (certs.get ())) != NULL ) {
576
549
status = SSL_CTX_add0_chain_cert (context, ca);
577
550
// SSL_CTX_add0_chain_cert does not inc ref count, so don't free unless the
@@ -620,12 +593,14 @@ static int UseChainBytesPEM(SSL_CTX* context, BIO* bio) {
620
593
return SecureSocketUtils::NoPEMStartLine () ? status : 0 ;
621
594
}
622
595
623
- static int UseChainBytes (SSL_CTX* context, BIO* bio, const char * password) {
624
- int status = UseChainBytesPEM (context, bio);
596
+ static int UseChainBytes (SSL_CTX* context,
597
+ ScopedMemBIO* bio,
598
+ const char * password) {
599
+ int status = UseChainBytesPEM (context, bio->bio ());
625
600
if (status == 0 ) {
626
601
if (SecureSocketUtils::NoPEMStartLine ()) {
627
602
ERR_clear_error ();
628
- BIO_reset (bio);
603
+ BIO_reset (bio-> bio () );
629
604
status = UseChainBytesPKCS12 (context, bio, password);
630
605
}
631
606
} else {
@@ -638,7 +613,7 @@ static int UseChainBytes(SSL_CTX* context, BIO* bio, const char* password) {
638
613
int SSLCertContext::UseCertificateChainBytes (Dart_Handle cert_chain_bytes,
639
614
const char * password) {
640
615
ScopedMemBIO bio (cert_chain_bytes);
641
- return UseChainBytes (context (), bio. bio () , password);
616
+ return UseChainBytes (context (), & bio, password);
642
617
}
643
618
644
619
static X509* GetX509Certificate (Dart_NativeArguments args) {
0 commit comments