From 9830c18315a0c2e55d948eaa74892669df5e6dce Mon Sep 17 00:00:00 2001 From: Tommy Chen Date: Wed, 15 Feb 2023 00:30:47 +0800 Subject: [PATCH] Support EC and PKCS8 private keys (#316) * Support EC and PKCS8 private keys * Use iter instead of infinite loop in `load_keys` fn --- src/tls.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/tls.rs b/src/tls.rs index dbbfcde..fbfbae7 100644 --- a/src/tls.rs +++ b/src/tls.rs @@ -1,6 +1,7 @@ // Stream wrapper. -use rustls_pemfile::{certs, rsa_private_keys}; +use rustls_pemfile::{certs, read_one, Item}; +use std::iter; use std::path::Path; use std::sync::Arc; use tokio_rustls::rustls::{self, Certificate, PrivateKey}; @@ -17,9 +18,17 @@ pub fn load_certs(path: &Path) -> std::io::Result> { } pub fn load_keys(path: &Path) -> std::io::Result> { - rsa_private_keys(&mut std::io::BufReader::new(std::fs::File::open(path)?)) - .map_err(|_| std::io::Error::new(std::io::ErrorKind::InvalidInput, "invalid key")) - .map(|mut keys| keys.drain(..).map(PrivateKey).collect()) + let mut rd = std::io::BufReader::new(std::fs::File::open(path)?); + + iter::from_fn(|| read_one(&mut rd).transpose()) + .filter_map(|item| match item { + Err(err) => Some(Err(err)), + Ok(Item::RSAKey(key)) => Some(Ok(PrivateKey(key))), + Ok(Item::ECKey(key)) => Some(Ok(PrivateKey(key))), + Ok(Item::PKCS8Key(key)) => Some(Ok(PrivateKey(key))), + _ => None, + }) + .collect() } pub struct Tls {