1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use anyhow::Result;
use base58::ToBase58;
use ssh_key::{HashAlg, PublicKey};
use std::fmt::Write;

pub fn get_private_key_id(key: &PublicKey, user: &str) -> Result<String> {
    match user {
        "new" => {
            let fingerprint = key.fingerprint(HashAlg::Sha256);
            let mut url = String::from("https://ssh-keys.online/key/");
            write!(url, "{}", fingerprint.as_bytes().to_base58())?;
            Ok(url)
        }
        _ => Ok(String::new()),
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use ssh_key::PublicKey;

    #[test]
    fn test_get_private_key_id() {
        let key = PublicKey::from_openssh(
            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIlI7XymEyB/xiPQGEuiIzt7z5VDNDzuYpr3v6+hbyDN",
        )
        .unwrap();
        let id = get_private_key_id(&key, "new").unwrap();
        assert_eq!(
            id,
            "https://ssh-keys.online/key/59fKS1A4ZEQysHCbWSKUkR4n3a9pfN8g8BLwrp1eVJis"
        );
    }

    #[test]
    fn test_get_private_key_id_random_user() {
        let key = PublicKey::from_openssh(
            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIlI7XymEyB/xiPQGEuiIzt7z5VDNDzuYpr3v6+hbyDN",
        )
        .unwrap();
        let id = get_private_key_id(&key, "random").unwrap();
        assert_eq!(id, "");
    }
}