elaeis4/quicktap/src/noise/error.rs

58 lines
No EOL
2.7 KiB
Rust

//! `Noise_IKpsk2` handshake errors
#![allow(clippy::module_name_repetitions)]
use std::error::Error;
use std::fmt::{Display, Formatter};
/// Represents a error while doing Noise handshake operations
#[derive(Debug, Clone)]
pub enum NoiseError {
/// Represents an error while parsing a Noise packet
PacketParseError(NoisePacketParseError),
/// Represents an opaque error from ChaCha
ChaCha20Error(chacha20poly1305::Error),
/// Represents that the packet had a missing or incorrect cookie MAC.
PacketUnauthenticated,
/// Represents that the packet had the wrong i_i value
UnrelatedHandshakePacket,
/// Represents that the packet has been replayed and should be dropped
PacketReplayed
}
impl Error for NoiseError {}
impl Display for NoiseError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match &self {
Self::PacketParseError(err) => write!(f, "{}", err),
Self::ChaCha20Error(error) => write!(f, "Encryption error: {}", error),
Self::PacketUnauthenticated => write!(f, "Unauthenticated packet"),
Self::UnrelatedHandshakePacket => write!(f, "Unrelated handshake packet"),
Self::PacketReplayed => write!(f, "Packet was replayed")
}
}
}
/// Represents and error while parsing a Noise packet
#[derive(Debug, Clone)]
pub enum NoisePacketParseError {
/// Represents an invalid packet length while parsing a packet. The first was the expected length, the second was the actual length
InvalidLength(usize, usize),
/// Represents that the packet being parsed is of the incorrect type. The first value is the expected packet type, the second was the actual packet type
WrongPacketType(usize, usize),
/// Represents that the expected 3 bytes of reserved space are missing
MissingReserved,
/// Represents that the index expected to be present on the message is incorrect
WrongIndex(usize, usize),
/// Indicates that this packet has been replayed and should be ignored.
ReplayAttack,
}
impl Display for NoisePacketParseError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match &self {
Self::InvalidLength(expected, got) => write!(f, "Invalid packet length: expected {} got {}", expected, got),
Self::WrongPacketType(expected, got) => write!(f, "Incorrect packet type: expected {} got {}", expected, got),
Self::MissingReserved => write!(f, "Missing reserved bytes"),
Self::WrongIndex(expected, got) => write!(f, "Incorrect session index: expected {} got {}", expected, got),
Self::ReplayAttack => write!(f, "!!! !!! THIS PACKET HAS BEEN REPLAYED !!! !!! Something fishy is going on.")
}
}
}