@@ -20,8 +20,8 @@ packet kind has defined values for packets but leaves many open for user defined | |||
| byte | packet kind | | |||
| ----------- | ---------------------------------------------------- | | |||
| `0x00` | message - a simple text packet | | |||
| `0x01-0xfc` | valid for custom packet usage | | |||
| `0x00-0xfb` | valid for custom packet usage | | |||
| `0xfc` | message - a simple text packet | | |||
| `0xfd` | leave - announces a disconnect | | |||
| `0xfe` | join - announces a new connection | | |||
| `0xff` | agreement - used to help generate an agreed upon key | | |||
@@ -18,11 +18,7 @@ impl Agreement { | |||
pub fn new(public_key: Vec<u8>) -> Agreement { | |||
let timestamp = Utc::now().timestamp(); | |||
let message_id = Uuid::new_v4().as_u128(); | |||
Agreement { | |||
timestamp, | |||
message_id, | |||
public_key, | |||
} | |||
Agreement { timestamp, message_id, public_key } | |||
} | |||
} | |||
@@ -31,9 +31,7 @@ impl Encryption for SymmetricEncrypt { | |||
fn encrypt(&self, packet: &mut Packet) -> Result<()> { | |||
packet.contents = aead::seal(self.key().unwrap(), &packet.contents)?; | |||
packet.integrity_hash = digest::digest(&digest::SHA256, &packet.contents) | |||
.as_ref() | |||
.to_vec(); | |||
packet.integrity_hash = digest::digest(&digest::SHA256, &packet.contents).as_ref().to_vec(); | |||
Ok(()) | |||
} | |||
@@ -52,9 +50,7 @@ impl SymmetricEncrypt { | |||
#[doc(hidden)] | |||
/// dear future izzy, this is a really bad idea | |||
pub fn clone(&self) -> Result<SymmetricEncrypt> { | |||
Ok(SymmetricEncrypt::new(aead::SecretKey::from_slice( | |||
self.0.unprotected_as_bytes(), | |||
)?)) | |||
Ok(SymmetricEncrypt::new(aead::SecretKey::from_slice(self.0.unprotected_as_bytes())?)) | |||
} | |||
} | |||
@@ -16,11 +16,7 @@ impl Join { | |||
let timestamp = Utc::now().timestamp(); | |||
let message_id = Uuid::new_v4().as_u128(); | |||
Join { | |||
timestamp, | |||
message_id, | |||
username, | |||
} | |||
Join { timestamp, message_id, username } | |||
} | |||
} | |||
@@ -16,11 +16,7 @@ impl Leave { | |||
let timestamp = Utc::now().timestamp(); | |||
let message_id = Uuid::new_v4().as_u128(); | |||
Leave { | |||
timestamp, | |||
message_id, | |||
username, | |||
} | |||
Leave { timestamp, message_id, username } | |||
} | |||
} | |||
@@ -65,12 +65,7 @@ impl Packet { | |||
/// create a new `Packet` | |||
pub fn new(kind: u8, contents: Vec<u8>, encrypt_flag: EncryptFlag) -> Packet { | |||
let integrity_hash = digest::digest(&digest::SHA256, &contents).as_ref().to_vec(); | |||
Packet { | |||
kind, | |||
integrity_hash, | |||
contents, | |||
encrypt_flag, | |||
} | |||
Packet { kind, integrity_hash, contents, encrypt_flag } | |||
} | |||
// generate a checksum from the packet | |||
@@ -112,18 +107,12 @@ impl Packet { | |||
/// verifies SHA256 integrity | |||
pub fn verify_integrity(&self) -> Result<()> { | |||
let expected = digest::digest(&digest::SHA256, &self.contents) | |||
.as_ref() | |||
.to_vec(); | |||
let expected = digest::digest(&digest::SHA256, &self.contents).as_ref().to_vec(); | |||
if expected == self.integrity_hash { | |||
Ok(()) | |||
} else { | |||
Err(IlmpError::BadHashIntegrity { | |||
found: self.integrity_hash.clone(), | |||
expected, | |||
} | |||
.into()) | |||
Err(IlmpError::BadHashIntegrity { found: self.integrity_hash.clone(), expected }.into()) | |||
} | |||
} | |||
@@ -184,12 +173,7 @@ where | |||
let mut contents: Vec<u8> = vec![0; length]; | |||
stream.read(&mut contents).await?; | |||
let mut packet = Packet { | |||
kind, | |||
contents, | |||
integrity_hash, | |||
encrypt_flag, | |||
}; | |||
let mut packet = Packet { kind, contents, integrity_hash, encrypt_flag }; | |||
packet.verify_checksum(checksum)?; | |||
packet.verify_integrity()?; | |||
@@ -259,9 +243,7 @@ where | |||
crate::write(write, agree_packet, &encrypt::NoEncrypt::new()).await?; | |||
// receive peer's pub key | |||
let packet = crate::read(read, &encrypt::NoEncrypt::new()) | |||
.await? | |||
.unwrap(); | |||
let packet = crate::read(read, &encrypt::NoEncrypt::new()).await?.unwrap(); | |||
let agree_packet = Agreement::from_packet(packet)?; | |||
let peer_pub_key = agree::UnparsedPublicKey::new(&agree::X25519, agree_packet.public_key); | |||
@@ -271,9 +253,8 @@ where | |||
&peer_pub_key, | |||
IlmpError::Ring(ring::error::Unspecified), | |||
|key_material| { | |||
let key_material = digest::digest(&digest::SHA256, key_material.as_ref().into()) | |||
.as_ref() | |||
.to_vec(); | |||
let key_material = | |||
digest::digest(&digest::SHA256, key_material.as_ref().into()).as_ref().to_vec(); | |||
Ok(aead::SecretKey::from_slice(&key_material)?) | |||
}, | |||
) | |||
@@ -18,19 +18,14 @@ impl Message { | |||
let timestamp = Utc::now().timestamp(); | |||
let message_id = Uuid::new_v4().as_u128(); | |||
Message { | |||
username, | |||
message_id, | |||
timestamp, | |||
contents, | |||
} | |||
Message { username, message_id, timestamp, contents } | |||
} | |||
} | |||
impl crate::Sendable for Message { | |||
fn to_packet(&self, encrypt_flag: crate::EncryptFlag) -> Result<Packet> { | |||
let contents: Vec<u8> = serde_json::to_string(&self)?.into_bytes(); | |||
let kind = 0x00; | |||
let kind = 0xfc; | |||
Ok(Packet::new(kind, contents, encrypt_flag)) | |||
} | |||
@@ -41,6 +36,6 @@ impl crate::Sendable for Message { | |||
} | |||
fn packet_kind(&self) -> u8 { | |||
0x00 | |||
0xfc | |||
} | |||
} |