| @@ -1,30 +1,33 @@ | |||||
| use crate::{Packet, PacketKind, Result}; | use crate::{Packet, PacketKind, Result}; | ||||
| use chrono::prelude::*; | use chrono::prelude::*; | ||||
| use serde::{Deserialize, Serialize}; | use serde::{Deserialize, Serialize}; | ||||
| use uuid::Uuid; | |||||
| #[derive(Debug, Clone, Serialize, Deserialize)] | #[derive(Debug, Clone, Serialize, Deserialize)] | ||||
| pub struct AsymmetricKey { | |||||
| pub struct Agreement { | |||||
| pub timestamp: i64, | pub timestamp: i64, | ||||
| pub message_id: u128, | |||||
| pub public_key: Vec<u8>, | pub public_key: Vec<u8>, | ||||
| } | } | ||||
| impl AsymmetricKey { | |||||
| pub fn new(public_key: Vec<u8>) -> AsymmetricKey { | |||||
| impl Agreement { | |||||
| pub fn new(public_key: Vec<u8>) -> Agreement { | |||||
| let timestamp = Utc::now().timestamp(); | let timestamp = Utc::now().timestamp(); | ||||
| AsymmetricKey { public_key, timestamp } | |||||
| let message_id = Uuid::new_v4().as_u128(); | |||||
| Agreement { timestamp, message_id, public_key } | |||||
| } | } | ||||
| } | } | ||||
| impl crate::Sendable for AsymmetricKey { | |||||
| impl crate::Sendable for Agreement { | |||||
| fn to_packet(&self, encrypt_kind: crate::EncryptKind) -> Result<Packet> { | fn to_packet(&self, encrypt_kind: crate::EncryptKind) -> Result<Packet> { | ||||
| let contents: Vec<u8> = serde_json::to_string(&self)?.into_bytes(); | let contents: Vec<u8> = serde_json::to_string(&self)?.into_bytes(); | ||||
| let kind = PacketKind::AsymmetricKey; | |||||
| let kind = PacketKind::Agreement; | |||||
| Ok(Packet::new(kind, contents, encrypt_kind)) | Ok(Packet::new(kind, contents, encrypt_kind)) | ||||
| } | } | ||||
| fn from_packet(packet: Packet) -> Result<AsymmetricKey> { | |||||
| fn from_packet(packet: Packet) -> Result<Self> { | |||||
| let contents = &String::from_utf8(packet.contents)?; | let contents = &String::from_utf8(packet.contents)?; | ||||
| let asymmetric_key: AsymmetricKey = serde_json::from_str(contents)?; | |||||
| Ok(asymmetric_key) | |||||
| let agreement: Agreement = serde_json::from_str(contents)?; | |||||
| Ok(agreement) | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,85 @@ | |||||
| use crate::Packet; | |||||
| /// trait that allows for me to be lazy | |||||
| pub trait Encryption { | |||||
| fn kind(&self) -> EncryptKind; | |||||
| fn key(&self) -> Option<Vec<u8>>; | |||||
| fn encrypt(&self, packet: Packet) -> Packet; | |||||
| fn decrypt(&self, packet: Packet) -> Packet; | |||||
| } | |||||
| /// uses ring's aead module | |||||
| pub struct SymmetricEncrypt(Vec<u8>); | |||||
| impl Encryption for SymmetricEncrypt { | |||||
| fn kind(&self) -> EncryptKind { | |||||
| EncryptKind::Symmetric | |||||
| } | |||||
| fn key(&self) -> Option<Vec<u8>> { | |||||
| Some(self.0.clone()) | |||||
| } | |||||
| fn encrypt(&self, _packet: Packet) -> Packet { | |||||
| todo!() | |||||
| } | |||||
| fn decrypt(&self, _packet: Packet) -> Packet { | |||||
| todo!() | |||||
| } | |||||
| } | |||||
| impl SymmetricEncrypt { | |||||
| pub fn new(key: Vec<u8>) -> SymmetricEncrypt { | |||||
| SymmetricEncrypt(key) | |||||
| } | |||||
| } | |||||
| /// literally not encryption whatsoever | |||||
| pub struct NoEncrypt; | |||||
| impl Encryption for NoEncrypt { | |||||
| fn kind(&self) -> EncryptKind { | |||||
| EncryptKind::None | |||||
| } | |||||
| // lol | |||||
| fn key(&self) -> Option<Vec<u8>> { | |||||
| None | |||||
| } | |||||
| // lol | |||||
| fn encrypt(&self, packet: Packet) -> Packet { | |||||
| packet | |||||
| } | |||||
| // lol | |||||
| fn decrypt(&self, packet: Packet) -> Packet { | |||||
| packet | |||||
| } | |||||
| } | |||||
| impl NoEncrypt { | |||||
| pub fn new() -> NoEncrypt { | |||||
| NoEncrypt | |||||
| } | |||||
| } | |||||
| /// encryption kind | |||||
| #[derive(Debug, Clone, Copy, PartialEq, Eq)] | |||||
| #[repr(u8)] | |||||
| pub enum EncryptKind { | |||||
| None = 0x00, | |||||
| Symmetric = 0xff, | |||||
| } | |||||
| impl EncryptKind { | |||||
| /// returns `EncryptKind` from u8 if returned value is valid | |||||
| pub fn from_u8(kind: u8) -> Option<EncryptKind> { | |||||
| match kind { | |||||
| 0x00 => Some(EncryptKind::None), | |||||
| 0xff => Some(EncryptKind::Symmetric), | |||||
| _ => None, | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -17,11 +17,14 @@ | |||||
| mod message; | mod message; | ||||
| pub use message::Message; | pub use message::Message; | ||||
| mod asymmetric_key; | |||||
| pub use asymmetric_key::AsymmetricKey; | |||||
| mod agreement; | |||||
| pub use agreement::Agreement; | |||||
| /// encryption types and functions | |||||
| pub mod encrypt; | |||||
| use encrypt::{EncryptKind, Encryption}; | |||||
| use futures_util::io::{AsyncReadExt, AsyncWriteExt}; | use futures_util::io::{AsyncReadExt, AsyncWriteExt}; | ||||
| use ring::{rand, signature::{self, KeyPair},digest}; | |||||
| use ring::digest; | |||||
| use std::convert::TryInto; | use std::convert::TryInto; | ||||
| use std::marker::Unpin; | use std::marker::Unpin; | ||||
| use thiserror::Error; | use thiserror::Error; | ||||
| @@ -117,7 +120,7 @@ impl Packet { | |||||
| #[repr(u8)] | #[repr(u8)] | ||||
| pub enum PacketKind { | pub enum PacketKind { | ||||
| Message = 0x00, | Message = 0x00, | ||||
| AsymmetricKey = 0xff, | |||||
| Agreement = 0xff, | |||||
| } | } | ||||
| impl PacketKind { | impl PacketKind { | ||||
| @@ -125,87 +128,7 @@ impl PacketKind { | |||||
| pub fn from_u8(kind: u8) -> Option<PacketKind> { | pub fn from_u8(kind: u8) -> Option<PacketKind> { | ||||
| match kind { | match kind { | ||||
| 0x00 => Some(PacketKind::Message), | 0x00 => Some(PacketKind::Message), | ||||
| 0xff => Some(PacketKind::AsymmetricKey), | |||||
| _ => None, | |||||
| } | |||||
| } | |||||
| } | |||||
| pub trait Encryption { | |||||
| fn kind(&self) -> EncryptKind; | |||||
| fn key(&self) -> Option<Vec<u8>>; | |||||
| } | |||||
| pub struct AsymmetricEncrypt(Vec<u8>); | |||||
| impl Encryption for AsymmetricEncrypt { | |||||
| fn kind(&self) -> EncryptKind { | |||||
| EncryptKind::Asymmetric | |||||
| } | |||||
| fn key(&self) -> Option<Vec<u8>> { | |||||
| Some(self.0.clone()) | |||||
| } | |||||
| } | |||||
| impl AsymmetricEncrypt { | |||||
| pub fn new(key: Vec<u8>) -> AsymmetricEncrypt { | |||||
| AsymmetricEncrypt(key) | |||||
| } | |||||
| } | |||||
| pub struct SymmetricEncrypt(Vec<u8>); | |||||
| impl Encryption for SymmetricEncrypt { | |||||
| fn kind(&self) -> EncryptKind { | |||||
| EncryptKind::Symmetric | |||||
| } | |||||
| fn key(&self) -> Option<Vec<u8>> { | |||||
| Some(self.0.clone()) | |||||
| } | |||||
| } | |||||
| impl SymmetricEncrypt { | |||||
| pub fn new(key: Vec<u8>) -> SymmetricEncrypt { | |||||
| SymmetricEncrypt(key) | |||||
| } | |||||
| } | |||||
| pub struct NoEncrypt; | |||||
| impl Encryption for NoEncrypt { | |||||
| fn kind(&self) -> EncryptKind { | |||||
| EncryptKind::None | |||||
| } | |||||
| fn key(&self) -> Option<Vec<u8>> { | |||||
| None | |||||
| } | |||||
| } | |||||
| impl NoEncrypt { | |||||
| pub fn new() -> NoEncrypt { | |||||
| NoEncrypt | |||||
| } | |||||
| } | |||||
| /// encryption kind | |||||
| #[derive(Debug, Clone, Copy, PartialEq, Eq)] | |||||
| #[repr(u8)] | |||||
| pub enum EncryptKind { | |||||
| None = 0x00, | |||||
| Asymmetric = 0x80, | |||||
| Symmetric = 0xff, | |||||
| } | |||||
| impl EncryptKind { | |||||
| /// returns `EncryptKind` from u8 if returned value is valid | |||||
| pub fn from_u8(kind: u8) -> Option<EncryptKind> { | |||||
| match kind { | |||||
| 0x00 => Some(EncryptKind::None), | |||||
| 0x80 => Some(EncryptKind::Asymmetric), | |||||
| 0xff => Some(EncryptKind::Symmetric), | |||||
| 0xff => Some(PacketKind::Agreement), | |||||
| _ => None, | _ => None, | ||||
| } | } | ||||
| } | } | ||||
| @@ -272,11 +195,6 @@ where | |||||
| stream.write(&network_packet.0).await?; | stream.write(&network_packet.0).await?; | ||||
| Ok(()) | Ok(()) | ||||
| } | } | ||||
| EncryptKind::Asymmetric => { | |||||
| let | |||||
| let mut packet = packet; | |||||
| packet.contents | |||||
| }, | |||||
| EncryptKind::Symmetric => todo!(), | EncryptKind::Symmetric => todo!(), | ||||
| } | } | ||||
| } | } | ||||