diff --git a/src/crypto_rsa.rs b/src/crypto_rsa.rs index 28289bf..9c684f3 100644 --- a/src/crypto_rsa.rs +++ b/src/crypto_rsa.rs @@ -4,11 +4,11 @@ use x509_parser::prelude::FromDer; use x509_parser::public_key::RSAPublicKey; use x509_parser::x509::SubjectPublicKeyInfo; -use crate::util::decode_base64; +use crate::util; /// Parse RSA Subject Public Key Info(SPKI) to Rsa Public Key pub fn parse_spki(pem: &str) -> XResult { - let der = pem_to_der_bytes(pem)?; + let der = util::parse_pem(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; @@ -19,25 +19,6 @@ pub fn parse_spki(pem: &str) -> XResult { Ok(rsa_public_key) } -fn pem_to_der_bytes(pem: &str) -> XResult> { - let mut pem = pem.trim().to_owned(); - 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::(); - - Ok(opt_result!(decode_base64(&pem), "Decode PEM failed: {}")) -} - #[test] fn test_parse_spki() { use rsa::traits::PublicKeyParts; diff --git a/src/util.rs b/src/util.rs index d741e50..71d9df0 100644 --- a/src/util.rs +++ b/src/util.rs @@ -5,7 +5,7 @@ use std::path::{Path, PathBuf}; use base64::Engine; use base64::engine::general_purpose; use rand::random; -use rust_util::{information, print_ex, simple_error, util_term, warning, XResult}; +use rust_util::{information, opt_result, print_ex, simple_error, util_term, warning, XResult}; use zeroize::Zeroize; use crate::consts::TINY_ENC_FILE_EXT; @@ -109,6 +109,25 @@ pub fn simple_kdf(input: &[u8]) -> Vec { input } +pub fn parse_pem(pem: &str) -> XResult> { + let mut pem = pem.trim().to_owned(); + 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::(); + + Ok(opt_result!(decode_base64(&pem), "Decode PEM failed: {}")) +} + pub fn to_pem(bs: &[u8], name: &str) -> String { let bs_base64 = encode_base64(bs); let mut pem = String::with_capacity(bs.len() + 64);