From 9bdb348fa586051c82f33ed0b7c97d3014c9babd Mon Sep 17 00:00:00 2001 From: Thomas Gatzweiler Date: Sat, 15 Jul 2017 14:36:01 +0200 Subject: [PATCH] Add comments and better error handling --- src/bin/ssh-keygen.rs | 4 +- src/key/ed25519.rs | 106 ---------------------------------------- src/key/mod.rs | 26 ---------- src/key/rsa.rs | 70 -------------------------- src/lib.rs | 2 +- tests/crypto_systems.rs | 29 ----------- 6 files changed, 4 insertions(+), 233 deletions(-) delete mode 100644 src/key/ed25519.rs delete mode 100644 src/key/mod.rs delete mode 100644 src/key/rsa.rs delete mode 100644 tests/crypto_systems.rs diff --git a/src/bin/ssh-keygen.rs b/src/bin/ssh-keygen.rs index 14349aa..6ae50a1 100644 --- a/src/bin/ssh-keygen.rs +++ b/src/bin/ssh-keygen.rs @@ -2,8 +2,10 @@ extern crate ssh; use std::io::prelude::*; use std::fs::File; +use ssh::public_key; + pub fn main() { - let keypair = (ssh::key::ED25519.generate_key_pair)(None); + let keypair = (public_key::ED25519.generate_key_pair)(None); let mut buffer = File::create("key.pub").unwrap(); keypair.export(&mut buffer); } diff --git a/src/key/ed25519.rs b/src/key/ed25519.rs deleted file mode 100644 index 8612e44..0000000 --- a/src/key/ed25519.rs +++ /dev/null @@ -1,106 +0,0 @@ -use key::{KeyPair, CryptoSystem}; -use std::io::{self, Read, Write}; -use rand::{self, Rng}; -use crypto::ed25519; - -pub static ED25519: CryptoSystem = CryptoSystem { - id: "ed25519", - generate_key_pair: Ed25519KeyPair::generate, - import: Ed25519KeyPair::import, - read_public: Ed25519KeyPair::read_public -}; - -struct Ed25519KeyPair { - private: Option<[u8;64]>, - public: [u8;32], -} - -impl Ed25519KeyPair { - fn generate(_: Option) -> Box { - let mut seed = [0u8;32]; - let mut rng = rand::thread_rng(); - rng.fill_bytes(&mut seed); - - let (private, public) = ed25519::keypair(&seed); - Box::new(Ed25519KeyPair { - private: Some(private), - public: public - }) - } - - fn import(mut r: &mut Read) -> io::Result> { - use packet::ReadPacketExt; - let id = r.read_utf8()?; - assert_eq!(id, "ssh-ed25519"); - - let pub_len = r.read_uint32()?; - assert_eq!(pub_len, 32); - - let mut public = [0u8;32]; - r.read_exact(&mut public)?; - - let priv_len = r.read_uint32()?; - assert_eq!(priv_len, 64); - - let mut private = [0u8;64]; - r.read_exact(&mut private)?; - - Ok(Box::new(Ed25519KeyPair { - public: public, - private: Some(private) - })) - } - - fn read_public(mut r: &mut Read) -> io::Result> { - use packet::ReadPacketExt; - - let len = r.read_uint32()?; - assert_eq!(len, 32); - - let mut public = [0u8;32]; - r.read_exact(&mut public)?; - - Ok(Box::new(Ed25519KeyPair { - private: None, - public: public - })) - } -} - -impl KeyPair for Ed25519KeyPair { - fn system(&self) -> &'static CryptoSystem { &ED25519 } - - fn has_private(&self) -> bool { - self.private.is_some() - } - - fn verify(&self, data: &[u8], signature: &[u8]) -> Result { - Ok(ed25519::verify(data, &self.public, signature)) - } - - fn sign(&self, data: &[u8]) -> Result, ()> { - if let Some(private_key) = self.private { - let signature = ed25519::signature(data, &private_key); - Ok(signature.to_vec()) - } - else { - Err(()) - } - } - - fn write_public(&self, w: &mut Write) -> io::Result<()> { - use packet::WritePacketExt; - w.write_string("ssh-ed25519")?; - w.write_bytes(&self.public) - } - - fn export(&self, w: &mut Write) -> io::Result<()> { - use packet::WritePacketExt; - w.write_string("ssh-ed25519")?; - w.write_bytes(&self.public)?; - if let Some(private_key) = self.private { - w.write_bytes(&private_key)?; - } - Ok(()) - } -} diff --git a/src/key/mod.rs b/src/key/mod.rs deleted file mode 100644 index fd389a3..0000000 --- a/src/key/mod.rs +++ /dev/null @@ -1,26 +0,0 @@ -use std::io::{self, Read, Write}; - -//mod rsa; -mod ed25519; - -//pub use self::rsa::RSA; -pub use self::ed25519::ED25519; - -pub trait KeyPair { - fn system(&self) -> &'static CryptoSystem; - - fn has_private(&self) -> bool; - - fn verify(&self, data: &[u8], signature: &[u8]) -> Result; - fn sign(&self, data: &[u8]) -> Result, ()>; - - fn write_public(&self, w: &mut Write) -> io::Result<()>; - fn export(&self, w: &mut Write) -> io::Result<()>; -} - -pub struct CryptoSystem { - pub id: &'static str, - pub generate_key_pair: fn(bits: Option) -> Box, - pub import: fn(r: &mut Read) -> io::Result>, - pub read_public: fn(r: &mut Read) -> io::Result> -} diff --git a/src/key/rsa.rs b/src/key/rsa.rs deleted file mode 100644 index 4d92d40..0000000 --- a/src/key/rsa.rs +++ /dev/null @@ -1,70 +0,0 @@ -use key::{Key, PublicKey, PrivateKey, KeyPair, CryptoSystem}; -use std::io::{Read, Write, Result}; - -pub static RSA: CryptoSystem = CryptoSystem { - id: "rsa", - generate_key_pair: generate_key_pair, -}; - -pub fn generate_key_pair(size: u32) -> KeyPair { - let public = Box::new(RsaPublicKey::new()); - let private = Box::new(RsaPrivateKey::new()); - (public, private) -} - -pub struct RsaPublicKey {} - -impl RsaPublicKey { - pub fn new() -> RsaPublicKey { - RsaPublicKey {} - } -} - -impl Key for RsaPublicKey { - fn system(&self) -> &'static CryptoSystem { - &RSA - } - - fn read(&self, r: &mut Read) -> Result> { - Err(::std::io::Error::new(::std::io::ErrorKind::Other, "")) - } - - fn write(&self, w: &mut Write) -> Result<()> { - Ok(()) - } -} - -impl PublicKey for RsaPublicKey { - fn encrypt(&self, data: &[u8]) -> Vec { - Vec::new() - } -} - -pub struct RsaPrivateKey { -} - -impl RsaPrivateKey { - pub fn new() -> RsaPrivateKey { - RsaPrivateKey { } - } -} - -impl PrivateKey for RsaPrivateKey { - fn sign(&self, data: &[u8]) -> Vec { - Vec::new() - } -} - -impl Key for RsaPrivateKey { - fn system(&self) -> &'static CryptoSystem { - &RSA - } - - fn read(&self, r: &mut Read) -> Result> { - Err(::std::io::Error::new(::std::io::ErrorKind::Other, "")) - } - - fn write(&self, w: &mut Write) -> Result<()> { - Ok(()) - } -} diff --git a/src/lib.rs b/src/lib.rs index 6ccc8ae..fda7cbe 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,7 +12,7 @@ mod message; mod session; mod key_exchange; -pub mod key; +pub mod public_key; pub mod server; pub use self::server::{Server, ServerConfig}; diff --git a/tests/crypto_systems.rs b/tests/crypto_systems.rs deleted file mode 100644 index 8462742..0000000 --- a/tests/crypto_systems.rs +++ /dev/null @@ -1,29 +0,0 @@ -extern crate ssh; -extern crate rand; - -use rand::Rng; -use std::io::Cursor; -use ssh::key::{self, CryptoSystem, KeyPair}; - -fn test_export_import(keypair: &Box) -> Box { - let mut buffer = Vec::new(); - keypair.export(&mut buffer).unwrap(); - - (keypair.system().import)(&mut Cursor::new(buffer)).unwrap() -} - -fn test_crypto_system(system: &CryptoSystem, key_size: Option) { - let keypair = (system.generate_key_pair)(key_size); - let keypair2 = test_export_import(&keypair); - - let mut buffer = [0;4096]; - let mut rng = rand::thread_rng(); - rng.fill_bytes(&mut buffer); - - let signature = keypair.sign(&buffer).unwrap(); - let verified = keypair2.verify(&buffer, signature.as_slice()).unwrap(); - assert!(verified) -} - -#[test] -fn test_ed25519() { test_crypto_system(&key::ED25519, None); }