浏览代码

starting to impl encryption

master
Isabelle L. 5 年前
父节点
当前提交
f36f868af0
共有 6 个文件被更改,包括 79 次插入19 次删除
  1. +1
    -1
      Cargo.lock
  2. +1
    -1
      Cargo.toml
  3. +14
    -6
      src/client.rs
  4. +30
    -1
      src/lib.rs
  5. +9
    -2
      src/main.rs
  6. +24
    -8
      src/server.rs

+ 1
- 1
Cargo.lock 查看文件

@@ -477,7 +477,6 @@ dependencies = [
name = "msg"
version = "0.1.0"
dependencies = [
"anyhow",
"async-std",
"chrono",
"futures",
@@ -488,6 +487,7 @@ dependencies = [
"serde",
"serde_json",
"structopt",
"thiserror",
"toml",
"uuid",
]


+ 1
- 1
Cargo.toml 查看文件

@@ -18,4 +18,4 @@ toml = "0.5.6"
# ilmp = { git = "https://github.com/izzabelle/ilmp" }
ilmp = { path = "../ilmp"}
ring = "0.16.13"
anyhow = "1.0.31"
thiserror = "1.0.18"

+ 14
- 6
src/client.rs 查看文件

@@ -2,19 +2,27 @@
use crate::config::ClientConfig as Config;
use crate::Result;
use async_std::net::TcpStream;
use futures::io::ReadHalf;
use futures_util::io::AsyncReadExt;

/// wraps the client
pub async fn client(port: u16) -> Result<()> {
let _config = Config::load()?;

let mut stream = TcpStream::connect(format!("127.0.0.1:{}", &port)).await?;
println!("connection established to: {}:{}", stream.peer_addr()?.ip(), port);
println!(
"connection established to: {}:{}",
stream.peer_addr()?.ip(),
port
);

/*let (_read, mut write) = stream.split();*/
let message = ilmp::Message::new(
"Isabelle".to_owned(),
"oh god oh fuck this shit actually works".to_owned(),
);
ilmp::write(&mut stream, message);

let message =
ilmp::Message::new("Isabelle".to_string(), "new message protocol working".to_string());
ilmp::write(&mut stream, message).await?;
let (read, mut write) = stream.split();

loop {}
Ok(())
}

+ 30
- 1
src/lib.rs 查看文件

@@ -3,9 +3,38 @@ mod client;
mod config;
mod server;

use ring::{agreement, rand};
use thiserror::Error;

// re-exports
pub use client::client;
pub use server::server;

// lazy idiot error/result type
pub type Result<T> = anyhow::Result<T>;
pub type Result<T> = std::result::Result<T, MsgError>;
#[derive(Debug, Error)]
pub enum MsgError {
#[error("message protocol error")]
Ilmp(#[from] ilmp::IlmpError),
#[error("std::io error")]
StdIo(#[from] std::io::Error),
#[error("toml error")]
Toml(#[from] toml::de::Error),
}

pub struct AsymmetricKeys {
pub private: agreement::EphemeralPrivateKey,
pub public: agreement::PublicKey,
}

impl AsymmetricKeys {
pub fn generate() -> AsymmetricKeys {
let rng = rand::SystemRandom::new();
let private = agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng)
.expect("failed to create private key");
let public = private
.compute_public_key()
.expect("failed to create public key");
AsymmetricKeys { private, public }
}
}

+ 9
- 2
src/main.rs 查看文件

@@ -3,7 +3,10 @@ use structopt::StructOpt;

// cli options
#[derive(StructOpt)]
#[structopt(name = "msg", about = "I have no idea what i'm doing but this is async")]
#[structopt(
name = "msg",
about = "I have no idea what i'm doing but this is async"
)]
struct Opt {
/// start the application as a server
#[structopt(short = "s", long = "server")]
@@ -17,7 +20,11 @@ struct Opt {
#[async_std::main]
async fn main() {
let options = Opt::from_args();
let port = if let Some(port) = options.port { port } else { 1337 };
let port = if let Some(port) = options.port {
port
} else {
1337
};
match options.server {
true => {
if let Err(err) = msg::server(port).await {


+ 24
- 8
src/server.rs 查看文件

@@ -18,8 +18,15 @@ lazy_static! {

/// wraps the server
pub async fn server(port: u16) -> Result<()> {
let asym_keys = crate::AsymmetricKeys::generate();
let listener = TcpListener::bind(format!("127.0.0.1:{}", &port)).await?;
println!("online as server at: {}:{}", listener.local_addr()?.ip(), port);

println!(
"online as server at: {}:{}",
listener.local_addr()?.ip(),
port
);

let mut incoming = listener.incoming();

while let Some(stream) = incoming.next().await {
@@ -31,28 +38,37 @@ pub async fn server(port: u16) -> Result<()> {
let (read, write) = stream.split();
let stream_id = Uuid::new_v4();

WRITE_STREAMS.lock().expect("could not aqcuire lock").insert(stream_id.clone(), write);
WRITE_STREAMS
.lock()
.expect("could not aqcuire lock")
.insert(stream_id.clone(), write);

task::spawn(handle_stream(read, stream_id));
}

Ok(())
}

async fn handle_stream(mut stream: ReadHalf<TcpStream>, _stream_id: Uuid) -> Result<()> {
async fn handle_stream(mut stream: ReadHalf<TcpStream>, stream_id: Uuid) -> Result<()> {
loop {
let packet = ilmp::read(&mut stream).await?;
if let Some(packet) = packet {
let res = match packet.kind {
ilmp::PacketKind::Message => ilmp::Message::from_packet(packet),
_ => unimplemented!(),
};
println!("{:?}", res);
} else {
// if no packet was received the stream is closed
break;
}
}
/* println!("disconnecting");

WRITE_STREAMS.lock().expect("failed to aqcuire lock").remove(&stream_id);

Ok(())*/
println!("stream disconnected");
WRITE_STREAMS
.lock()
.expect("failed to aqcuire lock")
.remove(&stream_id);
Ok(())
}

/*async fn relay_packet<T: Clone + Sendable>(packet: T) -> Result<()> {


正在加载...
取消
保存