From 359db9eaf8a15be96b08a0fded98827c1b8fd368 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sun, 3 Apr 2022 21:46:27 +0800 Subject: [PATCH] feat: pkiutil --- src/pkiutil.rs | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/src/pkiutil.rs b/src/pkiutil.rs index 57bf25f..7c0e0ce 100644 --- a/src/pkiutil.rs +++ b/src/pkiutil.rs @@ -1,25 +1,15 @@ +use openpgp_card::crypto_data::PublicKeyMaterial; use openssl::bn::BigNum; use openssl::rsa::Rsa; use pem::Pem; use sequoia_openpgp::crypto::mpi::PublicKey; -use openpgp_card::crypto_data::PublicKeyMaterial; use crate::digest::sha256_bytes; pub fn sequoia_openpgp_public_key_pem(public_key: &PublicKey) -> Option<(Vec, String)> { match public_key { PublicKey::RSA { e, n } => { - let rsa_pub_key = Rsa::from_public_components( - BigNum::from_slice(n.value()).unwrap(), - BigNum::from_slice(e.value()).unwrap(), - ); - let rsa_pub_key_bytes = rsa_pub_key.unwrap().public_key_to_der().unwrap(); - let rsa_pub_key_bytes_sha256 = sha256_bytes(&rsa_pub_key_bytes); - let pub_key_pem_obj = Pem { - tag: String::from("PUBLIC KEY"), - contents: rsa_pub_key_bytes, - }; - Some((rsa_pub_key_bytes_sha256, pem::encode(&pub_key_pem_obj))) + Some(internal_rsa_public_key_pem(n.value(), e.value())) } _ => { warning!("Not RSA public key: {:?}", public_key); @@ -31,17 +21,7 @@ pub fn sequoia_openpgp_public_key_pem(public_key: &PublicKey) -> Option<(Vec pub fn openpgp_card_public_key_pem(public_key: &PublicKeyMaterial) -> Option<(Vec, String)> { match public_key { PublicKeyMaterial::R(rsa_pub) => { - let rsa_pub_key = Rsa::from_public_components( - BigNum::from_slice(rsa_pub.n()).unwrap(), - BigNum::from_slice(rsa_pub.v()).unwrap(), - ); - let rsa_pub_key_bytes = rsa_pub_key.unwrap().public_key_to_der().unwrap(); - let rsa_pub_key_bytes_sha256 = sha256_bytes(&rsa_pub_key_bytes); - let pub_key_pem_obj = Pem { - tag: String::from("PUBLIC KEY"), - contents: rsa_pub_key_bytes, - }; - Some((rsa_pub_key_bytes_sha256, pem::encode(&pub_key_pem_obj))) + Some(internal_rsa_public_key_pem(rsa_pub.n(), rsa_pub.v())) } _ => { warning!("Not RSA public key: {:?}", public_key); @@ -49,3 +29,17 @@ pub fn openpgp_card_public_key_pem(public_key: &PublicKeyMaterial) -> Option<(Ve } } } + +fn internal_rsa_public_key_pem(n: &[u8], e: &[u8]) -> (Vec, String) { + let rsa_pub_key = Rsa::from_public_components( + BigNum::from_slice(n).unwrap(), + BigNum::from_slice(e).unwrap(), + ); + let rsa_pub_key_bytes = rsa_pub_key.unwrap().public_key_to_der().unwrap(); + let rsa_pub_key_bytes_sha256 = sha256_bytes(&rsa_pub_key_bytes); + let pub_key_pem_obj = Pem { + tag: String::from("PUBLIC KEY"), + contents: rsa_pub_key_bytes, + }; + (rsa_pub_key_bytes_sha256, pem::encode(&pub_key_pem_obj)) +}