Skip to content

Commit e71268d

Browse files
committed
Migrate to pki-types PEM decoder
The job that the rustls-pemfile crate was doing has now been folded into the pki-types crate where we can offer a more integrated experience (and also avoid timing side-channels in base64 decoding of private key material). This branch replaces rustls-ffi's usage of rustls-pemfile with pki-types >1.10.
1 parent 58bb1f0 commit e71268d

File tree

4 files changed

+50
-50
lines changed

4 files changed

+50
-50
lines changed

Cargo.lock

Lines changed: 2 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,9 @@ cert_compression = ["rustls/brotli", "rustls/zlib"]
2828
[dependencies]
2929
# Keep in sync with RUSTLS_CRATE_VERSION in build.rs
3030
rustls = { version = "0.23.13", default-features = false, features = ["std", "tls12"] }
31-
pki-types = { package = "rustls-pki-types", version = "1", features = ["std"] }
31+
pki-types = { package = "rustls-pki-types", version = "1.10", features = ["std"] }
3232
webpki = { package = "rustls-webpki", version = "0.102.0", default-features = false, features = ["std"] }
3333
libc = "0.2"
34-
rustls-pemfile = "2"
3534
log = "0.4.22"
3635
rustls-platform-verifier = "0.3"
3736

src/cipher.rs

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
11
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;
53
use std::marker::PhantomData;
64
use std::ptr::null;
75
use std::slice;
86
use std::sync::Arc;
97

10-
use pki_types::{CertificateDer, CertificateRevocationListDer};
8+
use pki_types::pem::PemObject;
9+
use pki_types::{CertificateDer, CertificateRevocationListDer, PrivateKeyDer};
1110
use rustls::client::danger::ServerCertVerifier;
1211
use rustls::client::WebPkiServerVerifier;
1312
use rustls::crypto::CryptoProvider;
1413
use rustls::server::danger::ClientCertVerifier;
1514
use rustls::server::WebPkiClientVerifier;
1615
use rustls::sign::CertifiedKey;
1716
use rustls::{DistinguishedName, RootCertStore, SupportedCipherSuite};
18-
use rustls_pemfile::{certs, crls};
1917
use webpki::{ExpirationPolicy, RevocationCheckDepth, UnknownStatusPolicy};
2018

2119
use crate::crypto_provider::{rustls_crypto_provider, rustls_signing_key};
@@ -167,12 +165,11 @@ impl rustls_certified_key {
167165
Some(default_provider) => default_provider,
168166
None => return rustls_result::NoDefaultCryptoProvider,
169167
};
170-
let private_key_pem = try_slice!(private_key, private_key_len);
171168

172169
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,
176173
};
177174

178175
let private_key = match default_provider
@@ -228,14 +225,15 @@ impl rustls_certified_key {
228225
certified_key_out: *mut *const rustls_certified_key,
229226
) -> rustls_result {
230227
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);
232229
let signing_key = try_box_from_ptr!(signing_key);
233230
let certified_key_out = try_ref_from_ptr_ptr!(certified_key_out);
234231

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+
};
239237

240238
set_arc_mut_ptr(
241239
certified_key_out,
@@ -389,17 +387,17 @@ impl rustls_root_cert_store_builder {
389387
Some(b) => b,
390388
};
391389

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+
398396
// We first copy into a temporary root store so we can uphold our
399397
// API guideline that there are no partial failures or partial
400398
// successes.
401399
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);
403401
if strict && (rejected > 0 || parsed == 0) {
404402
return rustls_result::CertificateParseError;
405403
}
@@ -444,17 +442,15 @@ impl rustls_root_cert_store_builder {
444442
Ok(s) => s,
445443
Err(_) => return rustls_result::Io,
446444
};
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,
450448
Err(_) => return rustls_result::Io,
451449
};
452450

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<_>, _>>() {
456452
Ok(certs) => certs,
457-
Err(_) => return rustls_result::Io,
453+
Err(_) => return rustls_result::CertificateParseError,
458454
};
459455

460456
// 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 {
682678
Some(v) => v,
683679
};
684680

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,
690688
Err(_) => return rustls_result::CertificateRevocationListParseError,
691689
};
690+
692691
if crls_der.is_empty() {
693692
return rustls_result::CertificateRevocationListParseError;
694693
}
@@ -993,13 +992,16 @@ impl ServerCertVerifierBuilder {
993992
Some(v) => v,
994993
};
995994

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,
10011002
Err(_) => return rustls_result::CertificateRevocationListParseError,
10021003
};
1004+
10031005
if crls_der.is_empty() {
10041006
return rustls_result::CertificateRevocationListParseError;
10051007
}

src/crypto_provider.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
use libc::size_t;
2-
use std::io::Cursor;
3-
use std::slice;
4-
use std::sync::Arc;
5-
2+
use pki_types::pem::PemObject;
3+
use pki_types::PrivateKeyDer;
64
#[cfg(feature = "aws-lc-rs")]
75
use rustls::crypto::aws_lc_rs;
86
#[cfg(feature = "ring")]
97
use rustls::crypto::ring;
108
use rustls::crypto::CryptoProvider;
119
use rustls::sign::SigningKey;
1210
use rustls::SupportedCipherSuite;
11+
use std::slice;
12+
use std::sync::Arc;
1313

1414
use crate::cipher::rustls_supported_ciphersuite;
1515
use crate::error::map_error;
@@ -324,9 +324,9 @@ pub extern "C" fn rustls_crypto_provider_load_key(
324324
let private_key_pem = try_slice!(private_key, private_key_len);
325325
let signing_key_out = try_mut_from_ptr_ptr!(signing_key_out);
326326

327-
let private_key_der = match rustls_pemfile::private_key(&mut Cursor::new(private_key_pem)) {
328-
Ok(Some(p)) => p,
329-
_ => return rustls_result::PrivateKeyParseError,
327+
let private_key_der = match PrivateKeyDer::from_pem_slice(private_key_pem) {
328+
Ok(der) => der,
329+
Err(_) => return rustls_result::PrivateKeyParseError,
330330
};
331331

332332
let private_key = match provider.key_provider.load_private_key(private_key_der) {

0 commit comments

Comments
 (0)