Browse Source

added write method that doesn't convert from sendable for use on server side

master
Isabelle L. 5 years ago
parent
commit
17e1dbf4f9
1 changed files with 30 additions and 34 deletions
  1. +30
    -34
      src/lib.rs

+ 30
- 34
src/lib.rs View File

@@ -47,7 +47,7 @@ pub trait Sendable: Sized {
} }


/// data to be sent /// data to be sent
#[derive(Debug)]
#[derive(Debug, Clone)]
pub struct Packet { pub struct Packet {
pub kind: PacketKind, pub kind: PacketKind,
pub encrypt_kind: EncryptKind, pub encrypt_kind: EncryptKind,
@@ -59,12 +59,7 @@ impl Packet {
/// create a new `Packet` /// create a new `Packet`
pub fn new(kind: PacketKind, contents: Vec<u8>, encrypt_kind: EncryptKind) -> Packet { pub fn new(kind: PacketKind, contents: Vec<u8>, encrypt_kind: EncryptKind) -> 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_kind,
}
Packet { kind, integrity_hash, contents, encrypt_kind }
} }


// generate a checksum from the packet // generate a checksum from the packet
@@ -106,19 +101,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 {
println!("bad integrity");
Err(IlmpError::BadHashIntegrity {
found: self.integrity_hash.clone(),
expected,
}
.into())
Err(IlmpError::BadHashIntegrity { found: self.integrity_hash.clone(), expected }.into())
} }
} }


@@ -129,7 +117,6 @@ impl Packet {
if found == expected { if found == expected {
Ok(()) Ok(())
} else { } else {
println!("bad checksum");
Err(IlmpError::BadChecksumIntegrity { expected, found }) Err(IlmpError::BadChecksumIntegrity { expected, found })
} }
} }
@@ -187,7 +174,6 @@ where
if check == 0 { if check == 0 {
return Ok(None); return Ok(None);
} }
print!("reading packet... ");


let kind = PacketKind::from_u8(info_buf[0]).unwrap(); let kind = PacketKind::from_u8(info_buf[0]).unwrap();
let encrypt_kind = EncryptKind::from_u8(info_buf[1]).unwrap(); let encrypt_kind = EncryptKind::from_u8(info_buf[1]).unwrap();
@@ -200,12 +186,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_kind,
};
let mut packet = Packet { kind, contents, integrity_hash, encrypt_kind };


packet.verify_checksum(checksum)?; packet.verify_checksum(checksum)?;
packet.verify_integrity()?; packet.verify_integrity()?;
@@ -213,7 +194,6 @@ where
if packet.encrypt_kind == EncryptKind::Symmetric { if packet.encrypt_kind == EncryptKind::Symmetric {
encryption.decrypt(&mut packet)?; encryption.decrypt(&mut packet)?;
} }
println!("[ Ok ]");
Ok(Some(packet)) Ok(Some(packet))
} }


@@ -224,12 +204,10 @@ where
P: Sendable, P: Sendable,
E: Encryption, E: Encryption,
{ {
print!("sending packet... ");
match encryption.kind() { match encryption.kind() {
EncryptKind::None => { EncryptKind::None => {
let network_packet = packet.to_packet(encryption.kind())?.to_network_packet(); let network_packet = packet.to_packet(encryption.kind())?.to_network_packet();
stream.write(&network_packet.0).await?; stream.write(&network_packet.0).await?;
println!("[ Ok ]");
Ok(()) Ok(())
} }
EncryptKind::Symmetric => { EncryptKind::Symmetric => {
@@ -237,7 +215,28 @@ where
encryption.encrypt(&mut packet)?; encryption.encrypt(&mut packet)?;
let network_packet = packet.to_network_packet(); let network_packet = packet.to_network_packet();
stream.write(&network_packet.0).await?; stream.write(&network_packet.0).await?;
println!("[ Ok ]");
Ok(())
}
}
}

/// writes a packet directly without conversion
pub async fn write_packet<S, E>(stream: &mut S, packet: Packet, encryption: &E) -> Result<()>
where
S: AsyncWriteExt + Unpin,
E: Encryption,
{
match encryption.kind() {
EncryptKind::None => {
let network_packet = packet.to_network_packet();
stream.write(&network_packet.0).await?;
Ok(())
}
EncryptKind::Symmetric => {
let mut packet = packet;
encryption.encrypt(&mut packet)?;
let network_packet = packet.to_network_packet();
stream.write(&network_packet.0).await?;
Ok(()) Ok(())
} }
} }
@@ -257,9 +256,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);


@@ -269,9 +266,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)?)
}, },
) )


Loading…
Cancel
Save