From d1d31a4ee9ec44990d7ad53a3e489e6df4cd5de9 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Tue, 12 Sep 2023 00:29:37 +0800 Subject: [PATCH] feat: pem_to_der_bytes --- src/compress.rs | 1 - src/crypto_rsa.rs | 28 ++++++++++++++-------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/compress.rs b/src/compress.rs index 810887f..8a44cc1 100644 --- a/src/compress.rs +++ b/src/compress.rs @@ -3,7 +3,6 @@ use std::io::Write; use flate2::Compression; use flate2::write::{GzDecoder, GzEncoder}; use rust_util::{simple_error, XResult}; -use x509_parser::nom::AsBytes; pub struct GzStreamEncoder { gz_encoder: GzEncoder>, diff --git a/src/crypto_rsa.rs b/src/crypto_rsa.rs index 9131e0c..9bc4ab4 100644 --- a/src/crypto_rsa.rs +++ b/src/crypto_rsa.rs @@ -11,7 +11,7 @@ use crate::util::decode_base64; /// Parse RSA Subject Public Key Info(SPKI) to Rsa Public Key pub fn parse_spki(pem: &str) -> XResult { - let der = normalize_public_key_pem(pem)?; + let der = pem_to_der_bytes(pem)?; let spki = opt_result!(SubjectPublicKeyInfo::from_der(&der), "Parse SKPI failed: {}").1; let public_key_der = spki.subject_public_key.data; let public_key = opt_result!(RSAPublicKey::from_der(&public_key_der), "Parse RSA public key failed: {}").1; @@ -22,19 +22,19 @@ pub fn parse_spki(pem: &str) -> XResult { Ok(rsa_public_key) } -fn normalize_public_key_pem(pem: &str) -> XResult> { +fn pem_to_der_bytes(pem: &str) -> XResult> { let mut pem = pem.trim().to_owned(); - if pem.starts_with("-----BEGIN PUBLIC KEY-----") { - pem = pem.chars().skip("-----BEGIN PUBLIC KEY-----".len()).collect::(); - } - if pem.ends_with("-----END PUBLIC KEY-----") { - pem = pem.chars().take(pem.len() - "-----END PUBLIC KEY-----".len()).collect::(); - } - if pem.starts_with("-----BEGIN PRIVATE KEY-----") { - pem = pem.chars().skip("-----BEGIN PRIVATE KEY-----".len()).collect::(); - } - if pem.ends_with("-----END PRIVATE KEY-----") { - pem = pem.chars().take(pem.len() - "-----END PRIVATE KEY-----".len()).collect::(); + if pem.starts_with("-----BEGIN") { + let mut filter_lines = vec![]; + let lines = pem.lines().skip(1); + for ln in lines { + if ln.starts_with("-----END") { + break; + } else { + filter_lines.push(ln.to_string()); + } + } + pem = filter_lines.join(""); } pem = pem.chars().filter(|c| *c != '\n' && *c != '\r').clone().collect::(); @@ -109,7 +109,7 @@ qaCoQsuRtnowGKzrbVdinukd1wj0LkBuz2oNMB3qsXyq7QtOxiFTuKkMOoQNUiCE KQIDAQAB -----END PUBLIC KEY-----"; let public_key = parse_spki(public_key_pem).unwrap(); - let private_key_der = normalize_public_key_pem(&private_key_pem).unwrap(); + let private_key_der = pem_to_der_bytes(&private_key_pem).unwrap(); let private_key_info = PrivateKeyInfo::from_der(&private_key_der).unwrap(); let private_key = RsaPrivateKey::try_from(private_key_info).unwrap(); let mut rng = rand::thread_rng();