pub struct HandshakeState<D: DH, C: Cipher, H: Hash> { /* private fields */ }Expand description
Noise handshake state.
Implementations§
Source§impl<D, C, H> HandshakeState<D, C, H>
impl<D, C, H> HandshakeState<D, C, H>
Sourcepub fn new<P>(
pattern: HandshakePattern,
is_initiator: bool,
prologue: P,
s: Option<D::Key>,
e: Option<D::Key>,
rs: Option<D::Pubkey>,
re: Option<D::Pubkey>,
) -> Self
pub fn new<P>( pattern: HandshakePattern, is_initiator: bool, prologue: P, s: Option<D::Key>, e: Option<D::Key>, rs: Option<D::Pubkey>, re: Option<D::Pubkey>, ) -> Self
Initialize a handshake state.
If e is None, a new ephemeral key will be generated if necessary
when write_message.
§Setting Explicit Ephemeral Key
An explicit e should only be specified for testing purposes, or in
fallback patterns. If you do pass in an explicit e, HandshakeState
will use it as is and will not generate new ephemeral keys in
write_message.
Sourcepub fn get_next_message_overhead(&self) -> usize
pub fn get_next_message_overhead(&self) -> usize
Calculate the size overhead of the next message.
§Panics
If these is no more message to read/write, i.e., if the handshake is already completed.
Sourcepub fn write_message_vec(&mut self, payload: &[u8]) -> Result<Vec<u8>, Error>
pub fn write_message_vec(&mut self, payload: &[u8]) -> Result<Vec<u8>, Error>
Like write_message, but returns a Vec.
Sourcepub fn write_message(
&mut self,
payload: &[u8],
out: &mut [u8],
) -> Result<(), Error>
pub fn write_message( &mut self, payload: &[u8], out: &mut [u8], ) -> Result<(), Error>
Sourcepub fn read_message(&mut self, data: &[u8], out: &mut [u8]) -> Result<(), Error>
pub fn read_message(&mut self, data: &[u8], out: &mut [u8]) -> Result<(), Error>
Takes a handshake message, process it and update our internal
state, and write the encapsulated payload to out.
§Error Kinds
- DH: DH operation failed.
- NeedPSK: A PSK token is encountered but none is available.
- Decryption: Decryption failed.
§Error Recovery
If read_message fails, the whole
HandshakeState may be in invalid state and should not be used to
read or write any further messages. (But
get_re() and
get_rs() is allowed.) In case error recovery
is desirable, clone the HandshakeState before
calling read_message.
§Panics
-
If
out.len() + self.get_next_message_overhead() != data.len().(Notes that this implies
data.len() >= overhead.) -
If a required static key is not set.
-
If it is not our turn to read.
-
If the handshake has already completed.
Sourcepub fn read_message_vec(&mut self, data: &[u8]) -> Result<Vec<u8>, Error>
pub fn read_message_vec(&mut self, data: &[u8]) -> Result<Vec<u8>, Error>
Similar to read_message, but returns
result as a Vec.
In addition to possible errors from
read_message,
TooShort may be returned.
Sourcepub fn get_ciphers(&self) -> (CipherState<C>, CipherState<C>)
pub fn get_ciphers(&self) -> (CipherState<C>, CipherState<C>)
Get ciphers that can be used to encrypt/decrypt further messages. The
first CipherState is for initiator to responder, and the second for
responder to initiator.
Should be called after handshake is
completed.
Sourcepub fn get_is_initiator(&self) -> bool
pub fn get_is_initiator(&self) -> bool
Get whether this HandshakeState is created as initiator.
Sourcepub fn get_pattern(&self) -> &HandshakePattern
pub fn get_pattern(&self) -> &HandshakePattern
Get handshake pattern this HandshakeState uses.
Sourcepub fn is_write_turn(&self) -> bool
pub fn is_write_turn(&self) -> bool
Check whether it is our turn to send in the handshake state.