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)) +}