@@ -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!(), | ||||
} | } | ||||
} | } |