replace russh-keys with ssh-key which actually does what it's meant to
This commit is contained in:
		
							parent
							
								
									a73e2cd8d8
								
							
						
					
					
						commit
						0d242d16d7
					
				|  | @ -36,5 +36,5 @@ thiserror = "1.0" | ||||||
| anyhow = "1.0" | anyhow = "1.0" | ||||||
| 
 | 
 | ||||||
| itertools = "0.13.0" | itertools = "0.13.0" | ||||||
| russh-keys = "0.44.0" | ssh-key = {version = "0.6.6", features = ["ed25519", "encryption"]} | ||||||
| ed25519-dalek = "2.1.1" | ed25519-dalek = "2.1.1" | ||||||
|  | @ -1,4 +1,3 @@ | ||||||
| use russh_keys::PublicKeyBase64; |  | ||||||
| use sha2::Digest; | use sha2::Digest; | ||||||
| use zeroize::Zeroizing; | use zeroize::Zeroizing; | ||||||
| 
 | 
 | ||||||
|  | @ -149,7 +148,7 @@ pub mod cli { | ||||||
|         print!("Encrypt keypair with passphrase? [Y/n]: "); |         print!("Encrypt keypair with passphrase? [Y/n]: "); | ||||||
|         let encrypt = read_line()? != "n"; |         let encrypt = read_line()? != "n"; | ||||||
|         if encrypt { |         if encrypt { | ||||||
|             print!("Will encrypt keypair."); |             println!("Will encrypt keypair."); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         print!("Use hash algorithm (sha256, argon2) [argon2]: "); |         print!("Use hash algorithm (sha256, argon2) [argon2]: "); | ||||||
|  | @ -182,7 +181,7 @@ pub enum Error { | ||||||
|     #[error("Argon2 Error: {0}")] |     #[error("Argon2 Error: {0}")] | ||||||
|     Argon2(argon2::Error), |     Argon2(argon2::Error), | ||||||
|     #[error(transparent)] |     #[error(transparent)] | ||||||
|     SshKeys(#[from] russh_keys::Error), |     SshKeys(#[from] ssh_key::Error), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl From<argon2::Error> for Error { | impl From<argon2::Error> for Error { | ||||||
|  | @ -195,13 +194,18 @@ pub type Result<T> = core::result::Result<T, Error>; | ||||||
| 
 | 
 | ||||||
| pub struct KeyPair { | pub struct KeyPair { | ||||||
|     pub passphrase: Option<Zeroizing<String>>, |     pub passphrase: Option<Zeroizing<String>>, | ||||||
|     pub private_key: ed25519_dalek::SigningKey, |     pub inner: ssh_key::private::Ed25519Keypair, | ||||||
|     pub public_key: ed25519_dalek::VerifyingKey, |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl KeyPair { | impl KeyPair { | ||||||
|  |     fn public_key(&self) -> &[u8; 32] { | ||||||
|  |         &self.inner.public.0 | ||||||
|  |     } | ||||||
|  |     fn private_key(&self) -> [u8; 32] { | ||||||
|  |         self.inner.private.to_bytes() | ||||||
|  |     } | ||||||
|     pub fn fingerprint(&self) -> Vec<u8> { |     pub fn fingerprint(&self) -> Vec<u8> { | ||||||
|         sha2::Sha256::digest(self.public_key.as_bytes()).to_vec() |         sha2::Sha256::digest(self.public_key()).to_vec() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn fingerprint_base64(&self) -> String { |     pub fn fingerprint_base64(&self) -> String { | ||||||
|  | @ -213,27 +217,20 @@ impl KeyPair { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn encode_keys(&self) -> Result<(Zeroizing<String>, String)> { |     pub fn encode_keys(&self) -> Result<(Zeroizing<String>, String)> { | ||||||
|         let keypair = russh_keys::key::KeyPair::Ed25519(self.private_key.clone()); |         let keydata = ssh_key::private::KeypairData::Ed25519(self.inner.clone()); | ||||||
|         let public_key = keypair.clone_public_key()?; |  | ||||||
| 
 | 
 | ||||||
|         let mut private_key = Vec::new(); |         let keypair = match &self.passphrase { | ||||||
|         match &self.passphrase { |             Some(passphrase) => ssh_key::PrivateKey::new(keydata, "")? | ||||||
|             Some(passphrase) => { |                 .encrypt(&mut rand::rngs::OsRng, passphrase.as_bytes())?, | ||||||
|                 russh_keys::encode_pkcs8_pem_encrypted( |             None => ssh_key::PrivateKey::new(keydata, "")?, | ||||||
|                     &keypair, |         }; | ||||||
|                     passphrase.as_bytes(), |  | ||||||
|                     1, |  | ||||||
|                     &mut private_key, |  | ||||||
|                 )?; |  | ||||||
|             } |  | ||||||
|             None => { |  | ||||||
|                 russh_keys::encode_pkcs8_pem(&keypair, &mut private_key)?; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         let private_key = Zeroizing::new(core::str::from_utf8(&private_key).unwrap().to_string()); |         let public_key = keypair.public_key(); | ||||||
|         let public_key = format!("{} {}", public_key.name(), public_key.public_key_base64()); | 
 | ||||||
|         Ok((private_key, public_key)) |         Ok(( | ||||||
|  |             keypair.to_openssh(ssh_key::LineEnding::LF)?, | ||||||
|  |             public_key.to_openssh()?, | ||||||
|  |         )) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -282,10 +279,14 @@ pub fn generate_key(desc: KeygenDesc) -> Result<KeyPair> { | ||||||
|     let private_key = ed25519_dalek::SigningKey::from_bytes(&hash); |     let private_key = ed25519_dalek::SigningKey::from_bytes(&hash); | ||||||
|     let public_key = private_key.verifying_key(); |     let public_key = private_key.verifying_key(); | ||||||
| 
 | 
 | ||||||
|  |     let keypair = ssh_key::private::Ed25519Keypair { | ||||||
|  |         public: ssh_key::public::Ed25519PublicKey(public_key.to_bytes()), | ||||||
|  |         private: ssh_key::private::Ed25519PrivateKey::from_bytes(private_key.as_bytes()), | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|     return Ok(KeyPair { |     return Ok(KeyPair { | ||||||
|         passphrase: desc.encrypt.then_some(desc.passphrase), |         passphrase: desc.encrypt.then_some(desc.passphrase), | ||||||
|         private_key, |         inner: keypair, | ||||||
|         public_key, |  | ||||||
|     }); |     }); | ||||||
|     // let keypair = russh_keys::key::KeyPair::Ed25519(private_key);
 |     // let keypair = russh_keys::key::KeyPair::Ed25519(private_key);
 | ||||||
|     // let public_key = keypair.clone_public_key().expect("pubkey");
 |     // let public_key = keypair.clone_public_key().expect("pubkey");
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue