feat: pem_to_der_bytes

This commit is contained in:
2023-09-12 00:29:37 +08:00
parent ad52c9c946
commit d1d31a4ee9
2 changed files with 14 additions and 15 deletions

View File

@@ -3,7 +3,6 @@ use std::io::Write;
use flate2::Compression; use flate2::Compression;
use flate2::write::{GzDecoder, GzEncoder}; use flate2::write::{GzDecoder, GzEncoder};
use rust_util::{simple_error, XResult}; use rust_util::{simple_error, XResult};
use x509_parser::nom::AsBytes;
pub struct GzStreamEncoder { pub struct GzStreamEncoder {
gz_encoder: GzEncoder<Vec<u8>>, gz_encoder: GzEncoder<Vec<u8>>,

View File

@@ -11,7 +11,7 @@ use crate::util::decode_base64;
/// Parse RSA Subject Public Key Info(SPKI) to Rsa Public Key /// Parse RSA Subject Public Key Info(SPKI) to Rsa Public Key
pub fn parse_spki(pem: &str) -> XResult<RsaPublicKey> { pub fn parse_spki(pem: &str) -> XResult<RsaPublicKey> {
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 spki = opt_result!(SubjectPublicKeyInfo::from_der(&der), "Parse SKPI failed: {}").1;
let public_key_der = spki.subject_public_key.data; 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; 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<RsaPublicKey> {
Ok(rsa_public_key) Ok(rsa_public_key)
} }
fn normalize_public_key_pem(pem: &str) -> XResult<Vec<u8>> { fn pem_to_der_bytes(pem: &str) -> XResult<Vec<u8>> {
let mut pem = pem.trim().to_owned(); let mut pem = pem.trim().to_owned();
if pem.starts_with("-----BEGIN PUBLIC KEY-----") { if pem.starts_with("-----BEGIN") {
pem = pem.chars().skip("-----BEGIN PUBLIC KEY-----".len()).collect::<String>(); let mut filter_lines = vec![];
} let lines = pem.lines().skip(1);
if pem.ends_with("-----END PUBLIC KEY-----") { for ln in lines {
pem = pem.chars().take(pem.len() - "-----END PUBLIC KEY-----".len()).collect::<String>(); if ln.starts_with("-----END") {
} break;
if pem.starts_with("-----BEGIN PRIVATE KEY-----") { } else {
pem = pem.chars().skip("-----BEGIN PRIVATE KEY-----".len()).collect::<String>(); filter_lines.push(ln.to_string());
} }
if pem.ends_with("-----END PRIVATE KEY-----") { }
pem = pem.chars().take(pem.len() - "-----END PRIVATE KEY-----".len()).collect::<String>(); pem = filter_lines.join("");
} }
pem = pem.chars().filter(|c| *c != '\n' && *c != '\r').clone().collect::<String>(); pem = pem.chars().filter(|c| *c != '\n' && *c != '\r').clone().collect::<String>();
@@ -109,7 +109,7 @@ qaCoQsuRtnowGKzrbVdinukd1wj0LkBuz2oNMB3qsXyq7QtOxiFTuKkMOoQNUiCE
KQIDAQAB KQIDAQAB
-----END PUBLIC KEY-----"; -----END PUBLIC KEY-----";
let public_key = parse_spki(public_key_pem).unwrap(); 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_info = PrivateKeyInfo::from_der(&private_key_der).unwrap();
let private_key = RsaPrivateKey::try_from(private_key_info).unwrap(); let private_key = RsaPrivateKey::try_from(private_key_info).unwrap();
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();