feat: update parse pem

This commit is contained in:
2023-12-10 14:16:20 +08:00
parent 2c2f623df4
commit 90ecfe76ba
2 changed files with 22 additions and 22 deletions

View File

@@ -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<RsaPublicKey> {
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<RsaPublicKey> {
Ok(rsa_public_key)
}
fn pem_to_der_bytes(pem: &str) -> XResult<Vec<u8>> {
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::<String>();
Ok(opt_result!(decode_base64(&pem), "Decode PEM failed: {}"))
}
#[test]
fn test_parse_spki() {
use rsa::traits::PublicKeyParts;

View File

@@ -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<u8> {
input
}
pub fn parse_pem(pem: &str) -> XResult<Vec<u8>> {
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::<String>();
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);