use super::Protocol;
use super::cipher::Cipher;
use super::hash::Hash;
use super::pattern::Pattern;
use super::symmetric_state::SymmetricState;
use super::well_formed::DerivedHasPsk;
use crate::curve::Curve;
use crate::provider::CryptoKeyProvider;
pub(crate) struct HandshakeInner<Cu, Ci, H, CP>
where
Cu: Curve,
Ci: Cipher,
H: Hash,
CP: CryptoKeyProvider<Cu>,
{
pub(crate) symmetric: SymmetricState<Ci, H>,
pub(crate) e: Option<CP::PrivateKey>,
pub(crate) e_pub: Option<Cu::PublicKey>,
pub(crate) s: Option<CP::PrivateKey>,
pub(crate) s_pub: Option<Cu::PublicKey>,
pub(crate) re: Option<Cu::PublicKey>,
pub(crate) rs: Option<Cu::PublicKey>,
pub(crate) has_psk: bool,
pub(crate) provider: CP,
}
impl<Cu, Ci, H, CP> HandshakeInner<Cu, Ci, H, CP>
where
Cu: Curve,
Ci: Cipher,
H: Hash,
CP: CryptoKeyProvider<Cu>,
{
pub(crate) fn new<Proto>(provider: CP, prologue: &[u8]) -> Self
where
Proto: Protocol<Curve = Cu, Cipher = Ci, Hash = H>,
{
let protocol_name = format!(
"Noise_{}_{}_{}_{}",
<Proto::Pattern as Pattern>::NAME,
<Cu as Curve>::NAME,
<Ci as Cipher>::NAME,
<H as Hash>::NAME,
);
let mut symmetric = SymmetricState::<Ci, H>::initialize(&protocol_name);
symmetric.mix_hash(prologue);
HandshakeInner {
symmetric,
e: None,
e_pub: None,
s: None,
s_pub: None,
re: None,
rs: None,
has_psk: <Proto::Pattern as DerivedHasPsk>::HAS_PSK,
provider,
}
}
}