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.