diff --git a/ssh-key/src/public.rs b/ssh-key/src/public.rs index 44c47ae42..9481e8241 100644 --- a/ssh-key/src/public.rs +++ b/ssh-key/src/public.rs @@ -249,8 +249,8 @@ impl Encode for KeyData { #[cfg(feature = "ecdsa")] Self::Ecdsa(key) => key.encoded_len()?, Self::Ed25519(key) => key.encoded_len()?, - #[allow(unreachable_patterns)] - _ => return Err(Error::Algorithm), + #[cfg(feature = "alloc")] + Self::Rsa(key) => key.encoded_len()?, }; Ok(alg_len + key_len) @@ -264,8 +264,8 @@ impl Encode for KeyData { #[cfg(feature = "ecdsa")] Self::Ecdsa(key) => key.encode(encoder), Self::Ed25519(key) => key.encode(encoder), - #[allow(unreachable_patterns)] - _ => Err(Error::Algorithm), + #[cfg(feature = "alloc")] + Self::Rsa(key) => key.encode(encoder), } } } diff --git a/ssh-key/src/public/rsa.rs b/ssh-key/src/public/rsa.rs index 5855bff4a..d825fe122 100644 --- a/ssh-key/src/public/rsa.rs +++ b/ssh-key/src/public/rsa.rs @@ -1,7 +1,7 @@ //! Rivest–Shamir–Adleman (RSA) public keys. use crate::{ - base64::{self, Decode}, + base64::{self, Decode, Encode}, MPInt, Result, }; @@ -25,3 +25,14 @@ impl Decode for RsaPublicKey { Ok(Self { e, n }) } } + +impl Encode for RsaPublicKey { + fn encoded_len(&self) -> Result { + Ok(self.e.encoded_len()? + self.n.encoded_len()?) + } + + fn encode(&self, encoder: &mut base64::Encoder<'_>) -> Result<()> { + self.e.encode(encoder)?; + self.n.encode(encoder) + } +} diff --git a/ssh-key/tests/public_key.rs b/ssh-key/tests/public_key.rs index fcebbdf2c..12263db45 100644 --- a/ssh-key/tests/public_key.rs +++ b/ssh-key/tests/public_key.rs @@ -247,3 +247,17 @@ fn encode_ed25519_openssh() { let ossh_key = PublicKey::from_openssh(OSSH_ED25519_EXAMPLE).unwrap(); assert_eq!(OSSH_ED25519_EXAMPLE.trim_end(), &ossh_key.to_string()); } + +#[cfg(feature = "alloc")] +#[test] +fn encode_rsa_3072_openssh() { + let ossh_key = PublicKey::from_openssh(OSSH_RSA_3072_EXAMPLE).unwrap(); + assert_eq!(OSSH_RSA_3072_EXAMPLE.trim_end(), &ossh_key.to_string()); +} + +#[cfg(feature = "alloc")] +#[test] +fn encode_rsa_4096_openssh() { + let ossh_key = PublicKey::from_openssh(OSSH_RSA_4096_EXAMPLE).unwrap(); + assert_eq!(OSSH_RSA_4096_EXAMPLE.trim_end(), &ossh_key.to_string()); +}