use crate::primitives::Str;
use nom::{
error::{ErrorKind, ParseError},
Err,
};
use core::str::Utf8Error;
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum OfflineSignatureParseError {
InvalidBitstream,
InvalidPublicKey,
UnsupportedPublicKey(u16),
InvalidSignature,
Expired,
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum DestinationParseError {
InvalidBitstream,
InvalidLength,
UnsupportedSigningKey(u16),
UnsupportedPrivateKey(u16),
UnsupportedCertificate(u8),
NotANullCertificate,
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum StrParseError {
InvalidBitstream,
Utf8(Utf8Error),
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum DateParseError {
InvalidBitstream,
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum MappingParseError {
InvalidBitstream,
Str(StrParseError),
}
impl From<StrParseError> for MappingParseError {
fn from(value: StrParseError) -> Self {
Self::Str(value)
}
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum LeaseSetParseError {
InvalidBitstream,
OfflineSignature(OfflineSignatureParseError),
Destination(DestinationParseError),
Options(MappingParseError),
NoSupportedPublicKey,
InvalidLeaseCount(u8),
NoValidLeases,
InvalidSignature,
InvalidOfflineSignature,
InvalidLeaseList,
}
impl From<OfflineSignatureParseError> for LeaseSetParseError {
fn from(value: OfflineSignatureParseError) -> Self {
Self::OfflineSignature(value)
}
}
impl From<DestinationParseError> for LeaseSetParseError {
fn from(value: DestinationParseError) -> Self {
Self::Destination(value)
}
}
impl From<MappingParseError> for LeaseSetParseError {
fn from(value: MappingParseError) -> Self {
Self::Options(value)
}
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum FlagsParseError {
InvalidBitstream,
OfflineSignature(OfflineSignatureParseError),
Destination(DestinationParseError),
DestinationMissing,
}
impl From<DestinationParseError> for FlagsParseError {
fn from(value: DestinationParseError) -> Self {
Self::Destination(value)
}
}
impl From<OfflineSignatureParseError> for FlagsParseError {
fn from(value: OfflineSignatureParseError) -> Self {
Self::OfflineSignature(value)
}
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum DatagramFlagsParseError {
InvalidBitstream,
InvalidLength,
UnknownVersion,
InvalidOptions(MappingParseError),
}
impl From<MappingParseError> for DatagramFlagsParseError {
fn from(value: MappingParseError) -> Self {
Self::InvalidOptions(value)
}
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum PacketParseError {
InvalidBitstream,
Flags(FlagsParseError),
PacketTooShort,
InvalidNackList,
}
impl From<FlagsParseError> for PacketParseError {
fn from(value: FlagsParseError) -> Self {
Self::Flags(value)
}
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum RouterIdentityParseError {
InvalidBitstream,
InvalidLength(usize),
InvalidCertificate((u8, u16)),
InvalidPublicKey(u16),
InvalidSigningKey(u16),
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum RouterInfoParseError {
InvalidBitstream,
InvalidOptions(MappingParseError),
InvalidDate(DateParseError),
InvalidIdentity(RouterIdentityParseError),
CapabilitiesMissing,
InvalidCapabilities(Str),
NetIdMissing,
InvalidSignature,
NoAddresses,
}
impl From<MappingParseError> for RouterInfoParseError {
fn from(value: MappingParseError) -> Self {
Self::InvalidOptions(value)
}
}
impl From<DateParseError> for RouterInfoParseError {
fn from(value: DateParseError) -> Self {
Self::InvalidDate(value)
}
}
impl From<RouterIdentityParseError> for RouterInfoParseError {
fn from(value: RouterIdentityParseError) -> Self {
Self::InvalidIdentity(value)
}
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum RouterAddressParseError {
InvalidBitstream,
Options(MappingParseError),
InvalidExpiration,
InvalidTransport,
InvalidOptions(MappingParseError),
Ntcp2StaticKeyMissing,
InvalidNtcp2StaticKey,
Ssu2StaticKeyMissing,
InvalidSsu2StaticKey,
Ssu2IntroKeyMissing,
InvalidSsu2IntroKey,
InvalidMtu,
InvalidPq,
}
impl From<MappingParseError> for RouterAddressParseError {
fn from(value: MappingParseError) -> Self {
Self::InvalidOptions(value)
}
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum TunnelBuildRecordParseError {
InvalidBitstream,
Options(MappingParseError),
InvalidHop(u8),
}
impl From<MappingParseError> for TunnelBuildRecordParseError {
fn from(value: MappingParseError) -> Self {
Self::Options(value)
}
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum DatabaseStoreParseError {
InvalidBitstream,
InvalidStoreType(u8),
CompressionFailed,
RouterInfo(RouterInfoParseError),
LeaseSet(LeaseSetParseError),
UnsupportedStoreType(u8),
}
impl From<RouterInfoParseError> for DatabaseStoreParseError {
fn from(value: RouterInfoParseError) -> Self {
Self::RouterInfo(value)
}
}
impl From<LeaseSetParseError> for DatabaseStoreParseError {
fn from(value: LeaseSetParseError) -> Self {
Self::LeaseSet(value)
}
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum DatabaseLookupParseError {
InvalidBitstream,
InvalidLookupType(u8),
TooLongIgnoreList(u16),
InvalidIgnoreList,
LookupEncryptionNotSupported,
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum DatabaseSearchReplyParseError {
InvalidBitstream,
InvalidReplyHashList,
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum TunnelDataParseError {
InvalidBitstream,
InvalidFragment(u8),
InvalidMessage(u8),
InvalidDelivery(u8),
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum GarlicParseError {
InvalidBitstream,
EncryptionNotSupported,
DelayNotSupported,
InvalidDelivery(u8),
InvalidMessage(u8),
InvalidSize,
InvalidAcks,
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum I2npParseError {
InvalidBitstream,
TooShortHeader,
InvalidMessage(u8),
EmptyPayload,
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum Ntcp2ParseError {
InvalidBitstream,
EmptyRouterInfo,
I2npMessage(I2npParseError),
InvalidBlock(u8),
}
impl From<I2npParseError> for Ntcp2ParseError {
fn from(value: I2npParseError) -> Self {
Self::I2npMessage(value)
}
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum Ssu2ParseError {
InvalidBitstream,
EmptyRouterInfo,
CompressionFailure,
RouterInfo(RouterInfoParseError),
I2npMessage(I2npParseError),
InvalidMessageTypeFirstFrag(u8),
EmptyFirstFragment,
FirstFragmentTooShort,
EmptyFollowOnFragment,
FollowOnFragmentTooShort,
InvalidBlock(u8),
UnknownPeerTestMessage(u8),
InvalidAddressBlock(u16),
}
impl From<I2npParseError> for Ssu2ParseError {
fn from(value: I2npParseError) -> Self {
Self::I2npMessage(value)
}
}
impl From<RouterInfoParseError> for Ssu2ParseError {
fn from(value: RouterInfoParseError) -> Self {
Self::RouterInfo(value)
}
}
macro_rules! derive_nom_parse_error {
($error:ident) => {
impl ParseError<&[u8]> for $error {
fn from_error_kind(_: &[u8], _: ErrorKind) -> Self {
Self::InvalidBitstream
}
fn append(_: &[u8], _: ErrorKind, _: Self) -> Self {
Self::InvalidBitstream
}
}
impl From<Err<$error>> for $error {
fn from(value: Err<$error>) -> Self {
match value {
Err::Incomplete(_) => $error::InvalidBitstream,
Err::Error(error) | Err::Failure(error) => error,
}
}
}
};
}
derive_nom_parse_error!(DatabaseLookupParseError);
derive_nom_parse_error!(DatabaseSearchReplyParseError);
derive_nom_parse_error!(DatabaseStoreParseError);
derive_nom_parse_error!(DateParseError);
derive_nom_parse_error!(DestinationParseError);
derive_nom_parse_error!(FlagsParseError);
derive_nom_parse_error!(DatagramFlagsParseError);
derive_nom_parse_error!(GarlicParseError);
derive_nom_parse_error!(I2npParseError);
derive_nom_parse_error!(LeaseSetParseError);
derive_nom_parse_error!(MappingParseError);
derive_nom_parse_error!(Ntcp2ParseError);
derive_nom_parse_error!(OfflineSignatureParseError);
derive_nom_parse_error!(PacketParseError);
derive_nom_parse_error!(RouterAddressParseError);
derive_nom_parse_error!(RouterIdentityParseError);
derive_nom_parse_error!(RouterInfoParseError);
derive_nom_parse_error!(Ssu2ParseError);
derive_nom_parse_error!(StrParseError);
derive_nom_parse_error!(TunnelBuildRecordParseError);
derive_nom_parse_error!(TunnelDataParseError);