|
1 | 1 | use libc::{c_char, size_t};
|
2 |
| -use std::ffi::{CStr, OsStr}; |
3 |
| -use std::fs::File; |
4 |
| -use std::io::{BufReader, Cursor}; |
| 2 | +use std::ffi::CStr; |
5 | 3 | use std::marker::PhantomData;
|
6 | 4 | use std::ptr::null;
|
7 | 5 | use std::slice;
|
8 | 6 | use std::sync::Arc;
|
9 | 7 |
|
10 |
| -use pki_types::{CertificateDer, CertificateRevocationListDer}; |
| 8 | +use pki_types::pem::PemObject; |
| 9 | +use pki_types::{CertificateDer, CertificateRevocationListDer, PrivateKeyDer}; |
11 | 10 | use rustls::client::danger::ServerCertVerifier;
|
12 | 11 | use rustls::client::WebPkiServerVerifier;
|
13 | 12 | use rustls::crypto::CryptoProvider;
|
14 | 13 | use rustls::server::danger::ClientCertVerifier;
|
15 | 14 | use rustls::server::WebPkiClientVerifier;
|
16 | 15 | use rustls::sign::CertifiedKey;
|
17 | 16 | use rustls::{DistinguishedName, RootCertStore, SupportedCipherSuite};
|
18 |
| -use rustls_pemfile::{certs, crls}; |
19 | 17 | use webpki::{ExpirationPolicy, RevocationCheckDepth, UnknownStatusPolicy};
|
20 | 18 |
|
21 | 19 | use crate::crypto_provider::{rustls_crypto_provider, rustls_signing_key};
|
@@ -167,12 +165,11 @@ impl rustls_certified_key {
|
167 | 165 | Some(default_provider) => default_provider,
|
168 | 166 | None => return rustls_result::NoDefaultCryptoProvider,
|
169 | 167 | };
|
170 |
| - let private_key_pem = try_slice!(private_key, private_key_len); |
171 | 168 |
|
172 | 169 | let private_key_der =
|
173 |
| - match rustls_pemfile::private_key(&mut Cursor::new(private_key_pem)) { |
174 |
| - Ok(Some(p)) => p, |
175 |
| - _ => return rustls_result::PrivateKeyParseError, |
| 170 | + match PrivateKeyDer::from_pem_slice(try_slice!(private_key, private_key_len)) { |
| 171 | + Ok(der) => der, |
| 172 | + Err(_) => return rustls_result::PrivateKeyParseError, |
176 | 173 | };
|
177 | 174 |
|
178 | 175 | let private_key = match default_provider
|
@@ -228,14 +225,15 @@ impl rustls_certified_key {
|
228 | 225 | certified_key_out: *mut *const rustls_certified_key,
|
229 | 226 | ) -> rustls_result {
|
230 | 227 | ffi_panic_boundary! {
|
231 |
| - let mut cert_chain = try_slice!(cert_chain, cert_chain_len); |
| 228 | + let cert_chain = try_slice!(cert_chain, cert_chain_len); |
232 | 229 | let signing_key = try_box_from_ptr!(signing_key);
|
233 | 230 | let certified_key_out = try_ref_from_ptr_ptr!(certified_key_out);
|
234 | 231 |
|
235 |
| - let parsed_chain = match certs(&mut cert_chain).collect::<Result<Vec<_>, _>>() { |
236 |
| - Ok(v) => v, |
237 |
| - Err(_) => return rustls_result::CertificateParseError, |
238 |
| - }; |
| 232 | + let parsed_chain = |
| 233 | + match CertificateDer::pem_slice_iter(cert_chain).collect::<Result<Vec<_>, _>>() { |
| 234 | + Ok(parsed_chain) => parsed_chain, |
| 235 | + Err(_) => return rustls_result::CertificateParseError, |
| 236 | + }; |
239 | 237 |
|
240 | 238 | set_arc_mut_ptr(
|
241 | 239 | certified_key_out,
|
@@ -389,17 +387,17 @@ impl rustls_root_cert_store_builder {
|
389 | 387 | Some(b) => b,
|
390 | 388 | };
|
391 | 389 |
|
392 |
| - let certs_der: Result<Vec<CertificateDer>, _> = |
393 |
| - rustls_pemfile::certs(&mut Cursor::new(certs_pem)).collect(); |
394 |
| - let certs_der = match certs_der { |
395 |
| - Ok(vv) => vv, |
396 |
| - Err(_) => return rustls_result::CertificateParseError, |
397 |
| - }; |
| 390 | + let certs = |
| 391 | + match CertificateDer::pem_slice_iter(certs_pem).collect::<Result<Vec<_>, _>>() { |
| 392 | + Ok(certs) => certs, |
| 393 | + Err(_) => return rustls_result::CertificateParseError, |
| 394 | + }; |
| 395 | + |
398 | 396 | // We first copy into a temporary root store so we can uphold our
|
399 | 397 | // API guideline that there are no partial failures or partial
|
400 | 398 | // successes.
|
401 | 399 | let mut new_store = RootCertStore::empty();
|
402 |
| - let (parsed, rejected) = new_store.add_parsable_certificates(certs_der); |
| 400 | + let (parsed, rejected) = new_store.add_parsable_certificates(certs); |
403 | 401 | if strict && (rejected > 0 || parsed == 0) {
|
404 | 402 | return rustls_result::CertificateParseError;
|
405 | 403 | }
|
@@ -444,17 +442,15 @@ impl rustls_root_cert_store_builder {
|
444 | 442 | Ok(s) => s,
|
445 | 443 | Err(_) => return rustls_result::Io,
|
446 | 444 | };
|
447 |
| - let filename = OsStr::new(filename); |
448 |
| - let mut cafile = match File::open(filename) { |
449 |
| - Ok(f) => f, |
| 445 | + |
| 446 | + let certs = match CertificateDer::pem_file_iter(filename) { |
| 447 | + Ok(certs) => certs, |
450 | 448 | Err(_) => return rustls_result::Io,
|
451 | 449 | };
|
452 | 450 |
|
453 |
| - let mut bufreader = BufReader::new(&mut cafile); |
454 |
| - let certs: Result<Vec<CertificateDer>, _> = certs(&mut bufreader).collect(); |
455 |
| - let certs = match certs { |
| 451 | + let certs = match certs.collect::<Result<Vec<_>, _>>() { |
456 | 452 | Ok(certs) => certs,
|
457 |
| - Err(_) => return rustls_result::Io, |
| 453 | + Err(_) => return rustls_result::CertificateParseError, |
458 | 454 | };
|
459 | 455 |
|
460 | 456 | // We first copy into a temporary root store so we can uphold our
|
@@ -682,13 +678,16 @@ impl rustls_web_pki_client_cert_verifier_builder {
|
682 | 678 | Some(v) => v,
|
683 | 679 | };
|
684 | 680 |
|
685 |
| - let crl_pem = try_slice!(crl_pem, crl_pem_len); |
686 |
| - let crls_der: Result<Vec<CertificateRevocationListDer>, _> = |
687 |
| - crls(&mut Cursor::new(crl_pem)).collect(); |
688 |
| - let crls_der = match crls_der { |
689 |
| - Ok(vv) => vv, |
| 681 | + let crls_der = match CertificateRevocationListDer::pem_slice_iter(try_slice!( |
| 682 | + crl_pem, |
| 683 | + crl_pem_len |
| 684 | + )) |
| 685 | + .collect::<Result<Vec<_>, _>>() |
| 686 | + { |
| 687 | + Ok(crls_der) => crls_der, |
690 | 688 | Err(_) => return rustls_result::CertificateRevocationListParseError,
|
691 | 689 | };
|
| 690 | + |
692 | 691 | if crls_der.is_empty() {
|
693 | 692 | return rustls_result::CertificateRevocationListParseError;
|
694 | 693 | }
|
@@ -993,13 +992,16 @@ impl ServerCertVerifierBuilder {
|
993 | 992 | Some(v) => v,
|
994 | 993 | };
|
995 | 994 |
|
996 |
| - let crl_pem = try_slice!(crl_pem, crl_pem_len); |
997 |
| - let crls_der: Result<Vec<CertificateRevocationListDer>, _> = |
998 |
| - crls(&mut Cursor::new(crl_pem)).collect(); |
999 |
| - let crls_der = match crls_der { |
1000 |
| - Ok(vv) => vv, |
| 995 | + let crls_der = match CertificateRevocationListDer::pem_slice_iter(try_slice!( |
| 996 | + crl_pem, |
| 997 | + crl_pem_len |
| 998 | + )) |
| 999 | + .collect::<Result<Vec<_>, _>>() |
| 1000 | + { |
| 1001 | + Ok(crls_der) => crls_der, |
1001 | 1002 | Err(_) => return rustls_result::CertificateRevocationListParseError,
|
1002 | 1003 | };
|
| 1004 | + |
1003 | 1005 | if crls_der.is_empty() {
|
1004 | 1006 | return rustls_result::CertificateRevocationListParseError;
|
1005 | 1007 | }
|
|
0 commit comments