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