From 8d4e93147fbfcc2665ef7fdd95d1c05d66e29007 Mon Sep 17 00:00:00 2001 From: Isabelle L Date: Wed, 27 May 2020 17:41:53 -0500 Subject: [PATCH] moved initialize_connection into crate --- src/lib.rs | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index beee67f..9b6810a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -26,7 +26,8 @@ pub mod encrypt; // namespacing use encrypt::{EncryptKind, Encryption}; use futures_util::io::{AsyncReadExt, AsyncWriteExt}; -use ring::digest; +use orion::aead; +use ring::{agreement as agree, digest, rand}; use std::convert::TryInto; use std::marker::Unpin; use thiserror::Error; @@ -167,6 +168,8 @@ pub enum IlmpError { StringParse(#[from] std::string::FromUtf8Error), #[error("orion error")] Orion(#[from] orion::errors::UnknownCryptoError), + #[error("ring fucking broke")] + Ring, } /// reads a `Packet` from a stream @@ -237,3 +240,38 @@ where } } } + +/// uses ring's agree to generate key material and key +pub async fn initialize_connection(read: &mut R, write: &mut W) -> Result +where + R: AsyncReadExt + Unpin, + W: AsyncWriteExt + Unpin, +{ + // create / send agree key + let rng = rand::SystemRandom::new(); + let my_priv_key = + agree::EphemeralPrivateKey::generate(&agree::X25519, &rng).expect("ring broke"); + let my_pub_key = my_priv_key.compute_public_key().expect("ring broke"); + let agree_packet = Agreement::new(my_pub_key.as_ref().into()); + 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 agree_packet = Agreement::from_packet(packet)?; + let peer_pub_key = agree::UnparsedPublicKey::new(&agree::X25519, agree_packet.public_key); + + // generate aead key + agree::agree_ephemeral( + my_priv_key, + &peer_pub_key, + IlmpError::Ring, + |key_material| { + let key_material = digest::digest(&digest::SHA256, key_material.as_ref().into()) + .as_ref() + .to_vec(); + Ok(aead::SecretKey::from_slice(&key_material)?) + }, + ) +}