From 9935a86f79b093fb2321864aa1723086d26bb721 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Wed, 17 Dec 2025 10:46:14 -0800 Subject: [PATCH] Add a function to load secret keys from any format. This resembles the similar function for public keys. --- src/lib/src/signature/keys.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/lib/src/signature/keys.rs b/src/lib/src/signature/keys.rs index 2b6bccc..53a141a 100644 --- a/src/lib/src/signature/keys.rs +++ b/src/lib/src/signature/keys.rs @@ -245,6 +245,33 @@ impl SecretKey { fp.read_to_string(&mut lines)?; Self::from_openssh(&lines) } + + /// Try to guess the secret key format. + pub fn from_any(data: &[u8]) -> Result { + if let Ok(sk) = Self::from_bytes(data) { + return Ok(sk); + } + if let Ok(sk) = Self::from_der(data) { + return Ok(sk); + } + let s = str::from_utf8(data).map_err(|_| WSError::ParseError)?; + if let Ok(sk) = Self::from_pem(s) { + return Ok(sk); + } + #[cfg(feature = "openssh")] + if let Ok(sk) = Self::from_openssh(s) { + return Ok(sk); + } + Err(WSError::ParseError) + } + + /// Load a key from a file, trying to guess its format. + pub fn from_any_file(file: impl AsRef) -> Result { + let mut fp = File::open(file)?; + let mut bytes = vec![]; + fp.read_to_end(&mut bytes)?; + Self::from_any(&bytes) + } } impl fmt::Debug for SecretKey {