feat: update parse pem
This commit is contained in:
@@ -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;
|
||||
|
||||
21
src/util.rs
21
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<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);
|
||||
|
||||
Reference in New Issue
Block a user