Skip to main content

ssh_vault/vault/
online.rs

1use anyhow::Result;
2use base58::ToBase58;
3use ssh_key::{HashAlg, PublicKey};
4use std::fmt::Write;
5
6/// Build the URL for retrieving a generated private key helper.
7///
8/// # Errors
9///
10/// Returns an error if the URL cannot be formatted.
11pub fn get_private_key_id(key: &PublicKey, user: &str) -> Result<String> {
12    match user {
13        "new" => {
14            let fingerprint = key.fingerprint(HashAlg::Sha256);
15            let mut url = String::from("https://ssh-keys.online/key/");
16            write!(url, "{}", fingerprint.as_bytes().to_base58())?;
17            Ok(url)
18        }
19        _ => Ok(String::new()),
20    }
21}
22
23#[cfg(test)]
24#[allow(clippy::unwrap_used)]
25mod tests {
26    use super::*;
27    use ssh_key::PublicKey;
28
29    #[test]
30    fn test_get_private_key_id() {
31        let key = PublicKey::from_openssh(
32            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIlI7XymEyB/xiPQGEuiIzt7z5VDNDzuYpr3v6+hbyDN",
33        )
34        .unwrap();
35        let id = get_private_key_id(&key, "new").unwrap();
36        assert_eq!(
37            id,
38            "https://ssh-keys.online/key/59fKS1A4ZEQysHCbWSKUkR4n3a9pfN8g8BLwrp1eVJis"
39        );
40    }
41
42    #[test]
43    fn test_get_private_key_id_random_user() {
44        let key = PublicKey::from_openssh(
45            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIlI7XymEyB/xiPQGEuiIzt7z5VDNDzuYpr3v6+hbyDN",
46        )
47        .unwrap();
48        let id = get_private_key_id(&key, "random").unwrap();
49        assert_eq!(id, "");
50    }
51}