SMTP request parser.
This commit is contained in:
parent
1fe4870438
commit
24e0230bab
6 changed files with 2767 additions and 0 deletions
6
.gitignore
vendored
6
.gitignore
vendored
|
@ -8,3 +8,9 @@ Cargo.lock
|
|||
|
||||
# These are backup files generated by rustfmt
|
||||
**/*.rs.bk
|
||||
|
||||
|
||||
# Added by cargo
|
||||
|
||||
/target
|
||||
/Cargo.lock
|
||||
|
|
8
Cargo.toml
Normal file
8
Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
|||
[package]
|
||||
name = "smtp-proto"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
194
src/lib.rs
Normal file
194
src/lib.rs
Normal file
|
@ -0,0 +1,194 @@
|
|||
pub mod request;
|
||||
pub mod response;
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub enum Request<T> {
|
||||
Ehlo {
|
||||
host: T,
|
||||
},
|
||||
Lhlo {
|
||||
host: T,
|
||||
},
|
||||
Helo {
|
||||
host: T,
|
||||
},
|
||||
Mail {
|
||||
from: T,
|
||||
parameters: Vec<Parameter<T>>,
|
||||
},
|
||||
Rcpt {
|
||||
to: T,
|
||||
parameters: Vec<Parameter<T>>,
|
||||
},
|
||||
Bdat {
|
||||
chunk_size: usize,
|
||||
is_last: bool,
|
||||
},
|
||||
Auth {
|
||||
mechanism: Mechanism,
|
||||
initial_response: T,
|
||||
},
|
||||
Noop {
|
||||
value: T,
|
||||
},
|
||||
Vrfy {
|
||||
value: T,
|
||||
},
|
||||
Expn {
|
||||
value: T,
|
||||
},
|
||||
Help {
|
||||
value: T,
|
||||
},
|
||||
Etrn {
|
||||
name: T,
|
||||
},
|
||||
Atrn {
|
||||
domains: Vec<T>,
|
||||
},
|
||||
Burl {
|
||||
uri: T,
|
||||
is_last: bool,
|
||||
},
|
||||
StartTls,
|
||||
Data,
|
||||
Rset,
|
||||
Quit,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub enum Parameter<T> {
|
||||
Body(Body),
|
||||
Size(usize),
|
||||
TransId(T),
|
||||
By(By),
|
||||
Notify(u8),
|
||||
Orcpt(Orcpt<T>),
|
||||
Ret(Ret),
|
||||
EnvId(T),
|
||||
Solicit(T),
|
||||
Mtrk(Mtrk<T>),
|
||||
Auth(T),
|
||||
HoldFor(u64),
|
||||
HoldUntil(u64),
|
||||
MtPriority(i64),
|
||||
Rrvs(Rrvs),
|
||||
SmtpUtf8,
|
||||
RequireTls,
|
||||
ConPerm,
|
||||
ConNeg,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub enum Body {
|
||||
SevenBit,
|
||||
EightBitMime,
|
||||
BinaryMime,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct Orcpt<T> {
|
||||
pub addr_type: T,
|
||||
pub addr: T,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub enum Ret {
|
||||
Full,
|
||||
Hdrs,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct Mtrk<T> {
|
||||
pub certifier: T,
|
||||
pub timeout: u64,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub enum By {
|
||||
Notify { time: i64, trace: bool },
|
||||
Return { time: i64, trace: bool },
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub enum Rrvs {
|
||||
Reject(i64),
|
||||
Continue(i64),
|
||||
}
|
||||
|
||||
pub const NOTIFY_SUCCESS: u8 = 0x01;
|
||||
pub const NOTIFY_FAILURE: u8 = 0x02;
|
||||
pub const NOTIFY_DELAY: u8 = 0x04;
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub enum Mechanism {
|
||||
_9798MDsaSha1,
|
||||
_9798MEcdsaSha1,
|
||||
_9798MRsaSha1Enc,
|
||||
_9798UDsaSha1,
|
||||
_9798UEcdsaSha1,
|
||||
_9798URsaSha1Enc,
|
||||
Anonymous,
|
||||
CramMd5,
|
||||
DigestMd5,
|
||||
EapAes128,
|
||||
EapAes128Plus,
|
||||
EcdhX25519Challenge,
|
||||
EcdsaNist256pChallenge,
|
||||
External,
|
||||
Gs2Krb5,
|
||||
Gs2Krb5Plus,
|
||||
GssSpnego,
|
||||
Gssapi,
|
||||
KerberosV4,
|
||||
KerberosV5,
|
||||
Login,
|
||||
NmasSambaAuth,
|
||||
NmasAuthen,
|
||||
NmasLogin,
|
||||
Ntlm,
|
||||
Oauth10a,
|
||||
Oauthbearer,
|
||||
Openid20,
|
||||
Otp,
|
||||
Plain,
|
||||
Saml20,
|
||||
ScramSha1,
|
||||
ScramSha1Plus,
|
||||
ScramSha256,
|
||||
ScramSha256Plus,
|
||||
Securid,
|
||||
Skey,
|
||||
Spnego,
|
||||
SpnegoPlus,
|
||||
SxoverPlus,
|
||||
Xoauth,
|
||||
Xoauth2,
|
||||
// Unknown
|
||||
Unknown,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub enum Error {
|
||||
NeedsMoreData,
|
||||
UnknownCommand,
|
||||
InvalidAddress,
|
||||
SyntaxError { syntax: &'static str },
|
||||
InvalidParameter { param: &'static str },
|
||||
UnsupportedParameter { param: String },
|
||||
UnexpectedChar { char: u8 },
|
||||
}
|
||||
|
||||
pub(crate) const LF: u8 = b'\n';
|
||||
pub(crate) const SP: u8 = b' ';
|
||||
|
||||
pub(crate) trait IntoString: Sized {
|
||||
fn into_string(self) -> String;
|
||||
}
|
||||
|
||||
impl IntoString for Vec<u8> {
|
||||
fn into_string(self) -> String {
|
||||
String::from_utf8(self)
|
||||
.unwrap_or_else(|err| String::from_utf8_lossy(err.as_bytes()).into_owned())
|
||||
}
|
||||
}
|
664
src/request/mod.rs
Normal file
664
src/request/mod.rs
Normal file
|
@ -0,0 +1,664 @@
|
|||
pub mod parser;
|
||||
|
||||
// SMTP commands
|
||||
pub(crate) const EHLO: u64 =
|
||||
(b'e' as u64) | (b'h' as u64) << 8 | (b'l' as u64) << 16 | (b'o' as u64) << 24;
|
||||
pub(crate) const HELO: u64 =
|
||||
(b'h' as u64) | (b'e' as u64) << 8 | (b'l' as u64) << 16 | (b'o' as u64) << 24;
|
||||
pub(crate) const LHLO: u64 =
|
||||
(b'l' as u64) | (b'h' as u64) << 8 | (b'l' as u64) << 16 | (b'o' as u64) << 24;
|
||||
pub(crate) const MAIL: u64 =
|
||||
(b'm' as u64) | (b'a' as u64) << 8 | (b'i' as u64) << 16 | (b'l' as u64) << 24;
|
||||
pub(crate) const RCPT: u64 =
|
||||
(b'r' as u64) | (b'c' as u64) << 8 | (b'p' as u64) << 16 | (b't' as u64) << 24;
|
||||
pub(crate) const DATA: u64 =
|
||||
(b'd' as u64) | (b'a' as u64) << 8 | (b't' as u64) << 16 | (b'a' as u64) << 24;
|
||||
pub(crate) const BDAT: u64 =
|
||||
(b'b' as u64) | (b'd' as u64) << 8 | (b'a' as u64) << 16 | (b't' as u64) << 24;
|
||||
pub(crate) const RSET: u64 =
|
||||
(b'r' as u64) | (b's' as u64) << 8 | (b'e' as u64) << 16 | (b't' as u64) << 24;
|
||||
pub(crate) const VRFY: u64 =
|
||||
(b'v' as u64) | (b'r' as u64) << 8 | (b'f' as u64) << 16 | (b'y' as u64) << 24;
|
||||
pub(crate) const EXPN: u64 =
|
||||
(b'e' as u64) | (b'x' as u64) << 8 | (b'p' as u64) << 16 | (b'n' as u64) << 24;
|
||||
pub(crate) const HELP: u64 =
|
||||
(b'h' as u64) | (b'e' as u64) << 8 | (b'l' as u64) << 16 | (b'p' as u64) << 24;
|
||||
pub(crate) const NOOP: u64 =
|
||||
(b'n' as u64) | (b'o' as u64) << 8 | (b'o' as u64) << 16 | (b'p' as u64) << 24;
|
||||
pub(crate) const QUIT: u64 =
|
||||
(b'q' as u64) | (b'u' as u64) << 8 | (b'i' as u64) << 16 | (b't' as u64) << 24;
|
||||
pub(crate) const ETRN: u64 =
|
||||
(b'e' as u64) | (b't' as u64) << 8 | (b'r' as u64) << 16 | (b'n' as u64) << 24;
|
||||
pub(crate) const ATRN: u64 =
|
||||
(b'a' as u64) | (b't' as u64) << 8 | (b'r' as u64) << 16 | (b'n' as u64) << 24;
|
||||
pub(crate) const AUTH: u64 =
|
||||
(b'a' as u64) | (b'u' as u64) << 8 | (b't' as u64) << 16 | (b'h' as u64) << 24;
|
||||
pub(crate) const BURL: u64 =
|
||||
(b'b' as u64) | (b'u' as u64) << 8 | (b'r' as u64) << 16 | (b'l' as u64) << 24;
|
||||
pub(crate) const STARTTLS: u64 = (b's' as u64)
|
||||
| (b't' as u64) << 8
|
||||
| (b'a' as u64) << 16
|
||||
| (b'r' as u64) << 24
|
||||
| (b't' as u64) << 32
|
||||
| (b't' as u64) << 40
|
||||
| (b'l' as u64) << 48
|
||||
| (b's' as u64) << 56;
|
||||
|
||||
// Arguments
|
||||
pub(crate) const FROM: u64 =
|
||||
(b'f' as u64) | (b'r' as u64) << 8 | (b'o' as u64) << 16 | (b'm' as u64) << 24;
|
||||
pub(crate) const TO: u64 = (b't' as u64) | (b'o' as u64) << 8;
|
||||
pub(crate) const LAST: u64 =
|
||||
(b'l' as u64) | (b'a' as u64) << 8 | (b's' as u64) << 16 | (b't' as u64) << 24;
|
||||
|
||||
// Parameters
|
||||
pub(crate) const BODY: u128 =
|
||||
(b'b' as u128) | (b'o' as u128) << 8 | (b'd' as u128) << 16 | (b'y' as u128) << 24;
|
||||
pub(crate) const SEVENBIT: u128 =
|
||||
(b'7' as u128) | (b'b' as u128) << 8 | (b'i' as u128) << 16 | (b't' as u128) << 24;
|
||||
pub(crate) const EIGHBITMIME: u128 = (b'8' as u128)
|
||||
| (b'b' as u128) << 8
|
||||
| (b'i' as u128) << 16
|
||||
| (b't' as u128) << 24
|
||||
| (b'm' as u128) << 32
|
||||
| (b'i' as u128) << 40
|
||||
| (b'm' as u128) << 48
|
||||
| (b'e' as u128) << 56;
|
||||
pub(crate) const BINARYMIME: u128 = (b'b' as u128)
|
||||
| (b'i' as u128) << 8
|
||||
| (b'n' as u128) << 16
|
||||
| (b'a' as u128) << 24
|
||||
| (b'r' as u128) << 32
|
||||
| (b'y' as u128) << 40
|
||||
| (b'm' as u128) << 48
|
||||
| (b'i' as u128) << 56
|
||||
| (b'm' as u128) << 64
|
||||
| (b'e' as u128) << 72;
|
||||
pub(crate) const SIZE: u128 =
|
||||
(b's' as u128) | (b'i' as u128) << 8 | (b'z' as u128) << 16 | (b'e' as u128) << 24;
|
||||
pub(crate) const TRANSID: u128 = (b't' as u128)
|
||||
| (b'r' as u128) << 8
|
||||
| (b'a' as u128) << 16
|
||||
| (b'n' as u128) << 24
|
||||
| (b's' as u128) << 32
|
||||
| (b'i' as u128) << 40
|
||||
| (b'd' as u128) << 48;
|
||||
pub(crate) const BY: u128 = (b'b' as u128) | (b'y' as u128) << 8;
|
||||
|
||||
pub(crate) const N: u64 = b'n' as u64;
|
||||
pub(crate) const NT: u64 = (b'n' as u64) | (b't' as u64) << 8;
|
||||
pub(crate) const C: u64 = b'c' as u64;
|
||||
pub(crate) const R: u64 = b'r' as u64;
|
||||
pub(crate) const RT: u64 = (b'r' as u64) | (b't' as u64) << 8;
|
||||
|
||||
pub(crate) const NOTIFY: u128 = (b'n' as u128)
|
||||
| (b'o' as u128) << 8
|
||||
| (b't' as u128) << 16
|
||||
| (b'i' as u128) << 24
|
||||
| (b'f' as u128) << 32
|
||||
| (b'y' as u128) << 40;
|
||||
pub(crate) const ORCPT: u128 = (b'o' as u128)
|
||||
| (b'r' as u128) << 8
|
||||
| (b'c' as u128) << 16
|
||||
| (b'p' as u128) << 24
|
||||
| (b't' as u128) << 32;
|
||||
pub(crate) const RET: u128 = (b'r' as u128) | (b'e' as u128) << 8 | (b't' as u128) << 16;
|
||||
pub(crate) const ENVID: u128 = (b'e' as u128)
|
||||
| (b'n' as u128) << 8
|
||||
| (b'v' as u128) << 16
|
||||
| (b'i' as u128) << 24
|
||||
| (b'd' as u128) << 32;
|
||||
pub(crate) const NEVER: u128 = (b'n' as u128)
|
||||
| (b'e' as u128) << 8
|
||||
| (b'v' as u128) << 16
|
||||
| (b'e' as u128) << 24
|
||||
| (b'r' as u128) << 32;
|
||||
pub(crate) const SUCCESS: u128 = (b's' as u128)
|
||||
| (b'u' as u128) << 8
|
||||
| (b'c' as u128) << 16
|
||||
| (b'c' as u128) << 24
|
||||
| (b'e' as u128) << 32
|
||||
| (b's' as u128) << 40
|
||||
| (b's' as u128) << 48;
|
||||
pub(crate) const FAILURE: u128 = (b'f' as u128)
|
||||
| (b'a' as u128) << 8
|
||||
| (b'i' as u128) << 16
|
||||
| (b'l' as u128) << 24
|
||||
| (b'u' as u128) << 32
|
||||
| (b'r' as u128) << 40
|
||||
| (b'e' as u128) << 48;
|
||||
pub(crate) const DELAY: u128 = (b'd' as u128)
|
||||
| (b'e' as u128) << 8
|
||||
| (b'l' as u128) << 16
|
||||
| (b'a' as u128) << 24
|
||||
| (b'y' as u128) << 32;
|
||||
pub(crate) const FULL: u64 =
|
||||
(b'f' as u64) | (b'u' as u64) << 8 | (b'l' as u64) << 16 | (b'l' as u64) << 24;
|
||||
pub(crate) const HDRS: u64 =
|
||||
(b'h' as u64) | (b'd' as u64) << 8 | (b'r' as u64) << 16 | (b's' as u64) << 24;
|
||||
pub(crate) const SOLICIT: u128 = (b's' as u128)
|
||||
| (b'o' as u128) << 8
|
||||
| (b'l' as u128) << 16
|
||||
| (b'i' as u128) << 24
|
||||
| (b'c' as u128) << 32
|
||||
| (b'i' as u128) << 40
|
||||
| (b't' as u128) << 48;
|
||||
pub(crate) const MTRK: u128 =
|
||||
(b'm' as u128) | (b't' as u128) << 8 | (b'r' as u128) << 16 | (b'k' as u128) << 24;
|
||||
pub(crate) const AUTH_: u128 =
|
||||
(b'a' as u128) | (b'u' as u128) << 8 | (b't' as u128) << 16 | (b'h' as u128) << 24;
|
||||
pub(crate) const HOLDFOR: u128 = (b'h' as u128)
|
||||
| (b'o' as u128) << 8
|
||||
| (b'l' as u128) << 16
|
||||
| (b'd' as u128) << 24
|
||||
| (b'f' as u128) << 32
|
||||
| (b'o' as u128) << 40
|
||||
| (b'r' as u128) << 48;
|
||||
pub(crate) const HOLDUNTIL: u128 = (b'h' as u128)
|
||||
| (b'o' as u128) << 8
|
||||
| (b'l' as u128) << 16
|
||||
| (b'd' as u128) << 24
|
||||
| (b'u' as u128) << 32
|
||||
| (b'n' as u128) << 40
|
||||
| (b't' as u128) << 48
|
||||
| (b'i' as u128) << 56
|
||||
| (b'l' as u128) << 64;
|
||||
pub(crate) const SMTPUTF8: u128 = (b's' as u128)
|
||||
| (b'm' as u128) << 8
|
||||
| (b't' as u128) << 16
|
||||
| (b'p' as u128) << 24
|
||||
| (b'u' as u128) << 32
|
||||
| (b't' as u128) << 40
|
||||
| (b'f' as u128) << 48
|
||||
| (b'8' as u128) << 56;
|
||||
pub(crate) const CONPERM: u128 = (b'c' as u128)
|
||||
| (b'o' as u128) << 8
|
||||
| (b'n' as u128) << 16
|
||||
| (b'p' as u128) << 24
|
||||
| (b'e' as u128) << 32
|
||||
| (b'r' as u128) << 40
|
||||
| (b'm' as u128) << 48;
|
||||
pub(crate) const CONNEG: u128 = (b'c' as u128)
|
||||
| (b'o' as u128) << 8
|
||||
| (b'n' as u128) << 16
|
||||
| (b'n' as u128) << 24
|
||||
| (b'e' as u128) << 32
|
||||
| (b'g' as u128) << 40;
|
||||
pub(crate) const MT_PRIORITY: u128 = (b'm' as u128)
|
||||
| (b't' as u128) << 8
|
||||
| (b'-' as u128) << 16
|
||||
| (b'p' as u128) << 24
|
||||
| (b'r' as u128) << 32
|
||||
| (b'i' as u128) << 40
|
||||
| (b'o' as u128) << 48
|
||||
| (b'r' as u128) << 56
|
||||
| (b'i' as u128) << 64
|
||||
| (b't' as u128) << 72
|
||||
| (b'y' as u128) << 80;
|
||||
pub(crate) const RRVS: u128 =
|
||||
(b'r' as u128) | (b'r' as u128) << 8 | (b'v' as u128) << 16 | (b's' as u128) << 24;
|
||||
pub(crate) const REQUIRETLS: u128 = (b'r' as u128)
|
||||
| (b'e' as u128) << 8
|
||||
| (b'q' as u128) << 16
|
||||
| (b'u' as u128) << 24
|
||||
| (b'i' as u128) << 32
|
||||
| (b'r' as u128) << 40
|
||||
| (b'e' as u128) << 48
|
||||
| (b't' as u128) << 56
|
||||
| (b'l' as u128) << 64
|
||||
| (b's' as u128) << 72;
|
||||
|
||||
// SASL Mechanisms
|
||||
pub(crate) const _9798_M_DSA_SHA1: u128 = (b'9' as u128)
|
||||
| (b'7' as u128) << 8
|
||||
| (b'9' as u128) << 16
|
||||
| (b'8' as u128) << 24
|
||||
| (b'-' as u128) << 32
|
||||
| (b'm' as u128) << 40
|
||||
| (b'-' as u128) << 48
|
||||
| (b'd' as u128) << 56
|
||||
| (b's' as u128) << 64
|
||||
| (b'a' as u128) << 72
|
||||
| (b'-' as u128) << 80
|
||||
| (b's' as u128) << 88
|
||||
| (b'h' as u128) << 96
|
||||
| (b'a' as u128) << 104
|
||||
| (b'1' as u128) << 112;
|
||||
pub(crate) const _9798_M_ECDSA_SHA: u128 = (b'9' as u128)
|
||||
| (b'7' as u128) << 8
|
||||
| (b'9' as u128) << 16
|
||||
| (b'8' as u128) << 24
|
||||
| (b'-' as u128) << 32
|
||||
| (b'm' as u128) << 40
|
||||
| (b'-' as u128) << 48
|
||||
| (b'e' as u128) << 56
|
||||
| (b'c' as u128) << 64
|
||||
| (b'd' as u128) << 72
|
||||
| (b's' as u128) << 80
|
||||
| (b'a' as u128) << 88
|
||||
| (b'-' as u128) << 96
|
||||
| (b's' as u128) << 104
|
||||
| (b'h' as u128) << 112
|
||||
| (b'a' as u128) << 120;
|
||||
pub(crate) const _9798_M_RSA_SHA1_: u128 = (b'9' as u128)
|
||||
| (b'7' as u128) << 8
|
||||
| (b'9' as u128) << 16
|
||||
| (b'8' as u128) << 24
|
||||
| (b'-' as u128) << 32
|
||||
| (b'm' as u128) << 40
|
||||
| (b'-' as u128) << 48
|
||||
| (b'r' as u128) << 56
|
||||
| (b's' as u128) << 64
|
||||
| (b'a' as u128) << 72
|
||||
| (b'-' as u128) << 80
|
||||
| (b's' as u128) << 88
|
||||
| (b'h' as u128) << 96
|
||||
| (b'a' as u128) << 104
|
||||
| (b'1' as u128) << 112
|
||||
| (b'-' as u128) << 120;
|
||||
pub(crate) const _9798_U_DSA_SHA1: u128 = (b'9' as u128)
|
||||
| (b'7' as u128) << 8
|
||||
| (b'9' as u128) << 16
|
||||
| (b'8' as u128) << 24
|
||||
| (b'-' as u128) << 32
|
||||
| (b'u' as u128) << 40
|
||||
| (b'-' as u128) << 48
|
||||
| (b'd' as u128) << 56
|
||||
| (b's' as u128) << 64
|
||||
| (b'a' as u128) << 72
|
||||
| (b'-' as u128) << 80
|
||||
| (b's' as u128) << 88
|
||||
| (b'h' as u128) << 96
|
||||
| (b'a' as u128) << 104
|
||||
| (b'1' as u128) << 112;
|
||||
pub(crate) const _9798_U_ECDSA_SHA: u128 = (b'9' as u128)
|
||||
| (b'7' as u128) << 8
|
||||
| (b'9' as u128) << 16
|
||||
| (b'8' as u128) << 24
|
||||
| (b'-' as u128) << 32
|
||||
| (b'u' as u128) << 40
|
||||
| (b'-' as u128) << 48
|
||||
| (b'e' as u128) << 56
|
||||
| (b'c' as u128) << 64
|
||||
| (b'd' as u128) << 72
|
||||
| (b's' as u128) << 80
|
||||
| (b'a' as u128) << 88
|
||||
| (b'-' as u128) << 96
|
||||
| (b's' as u128) << 104
|
||||
| (b'h' as u128) << 112
|
||||
| (b'a' as u128) << 120;
|
||||
pub(crate) const _9798_U_RSA_SHA1_: u128 = (b'9' as u128)
|
||||
| (b'7' as u128) << 8
|
||||
| (b'9' as u128) << 16
|
||||
| (b'8' as u128) << 24
|
||||
| (b'-' as u128) << 32
|
||||
| (b'u' as u128) << 40
|
||||
| (b'-' as u128) << 48
|
||||
| (b'r' as u128) << 56
|
||||
| (b's' as u128) << 64
|
||||
| (b'a' as u128) << 72
|
||||
| (b'-' as u128) << 80
|
||||
| (b's' as u128) << 88
|
||||
| (b'h' as u128) << 96
|
||||
| (b'a' as u128) << 104
|
||||
| (b'1' as u128) << 112
|
||||
| (b'-' as u128) << 120;
|
||||
pub(crate) const ANONYMOUS: u128 = (b'a' as u128)
|
||||
| (b'n' as u128) << 8
|
||||
| (b'o' as u128) << 16
|
||||
| (b'n' as u128) << 24
|
||||
| (b'y' as u128) << 32
|
||||
| (b'm' as u128) << 40
|
||||
| (b'o' as u128) << 48
|
||||
| (b'u' as u128) << 56
|
||||
| (b's' as u128) << 64;
|
||||
pub(crate) const CRAM_MD5: u128 = (b'c' as u128)
|
||||
| (b'r' as u128) << 8
|
||||
| (b'a' as u128) << 16
|
||||
| (b'm' as u128) << 24
|
||||
| (b'-' as u128) << 32
|
||||
| (b'm' as u128) << 40
|
||||
| (b'd' as u128) << 48
|
||||
| (b'5' as u128) << 56;
|
||||
pub(crate) const DIGEST_MD5: u128 = (b'd' as u128)
|
||||
| (b'i' as u128) << 8
|
||||
| (b'g' as u128) << 16
|
||||
| (b'e' as u128) << 24
|
||||
| (b's' as u128) << 32
|
||||
| (b't' as u128) << 40
|
||||
| (b'-' as u128) << 48
|
||||
| (b'm' as u128) << 56
|
||||
| (b'd' as u128) << 64
|
||||
| (b'5' as u128) << 72;
|
||||
pub(crate) const EAP_AES128: u128 = (b'e' as u128)
|
||||
| (b'a' as u128) << 8
|
||||
| (b'p' as u128) << 16
|
||||
| (b'-' as u128) << 24
|
||||
| (b'a' as u128) << 32
|
||||
| (b'e' as u128) << 40
|
||||
| (b's' as u128) << 48
|
||||
| (b'1' as u128) << 56
|
||||
| (b'2' as u128) << 64
|
||||
| (b'8' as u128) << 72;
|
||||
pub(crate) const EAP_AES128_PLUS: u128 = (b'e' as u128)
|
||||
| (b'a' as u128) << 8
|
||||
| (b'p' as u128) << 16
|
||||
| (b'-' as u128) << 24
|
||||
| (b'a' as u128) << 32
|
||||
| (b'e' as u128) << 40
|
||||
| (b's' as u128) << 48
|
||||
| (b'1' as u128) << 56
|
||||
| (b'2' as u128) << 64
|
||||
| (b'8' as u128) << 72
|
||||
| (b'-' as u128) << 80
|
||||
| (b'p' as u128) << 88
|
||||
| (b'l' as u128) << 96
|
||||
| (b'u' as u128) << 104
|
||||
| (b's' as u128) << 112;
|
||||
pub(crate) const ECDH_X25519_CHAL: u128 = (b'e' as u128)
|
||||
| (b'c' as u128) << 8
|
||||
| (b'd' as u128) << 16
|
||||
| (b'h' as u128) << 24
|
||||
| (b'-' as u128) << 32
|
||||
| (b'x' as u128) << 40
|
||||
| (b'2' as u128) << 48
|
||||
| (b'5' as u128) << 56
|
||||
| (b'5' as u128) << 64
|
||||
| (b'1' as u128) << 72
|
||||
| (b'9' as u128) << 80
|
||||
| (b'-' as u128) << 88
|
||||
| (b'c' as u128) << 96
|
||||
| (b'h' as u128) << 104
|
||||
| (b'a' as u128) << 112
|
||||
| (b'l' as u128) << 120;
|
||||
pub(crate) const ECDSA_NIST256P_C: u128 = (b'e' as u128)
|
||||
| (b'c' as u128) << 8
|
||||
| (b'd' as u128) << 16
|
||||
| (b's' as u128) << 24
|
||||
| (b'a' as u128) << 32
|
||||
| (b'-' as u128) << 40
|
||||
| (b'n' as u128) << 48
|
||||
| (b'i' as u128) << 56
|
||||
| (b's' as u128) << 64
|
||||
| (b't' as u128) << 72
|
||||
| (b'2' as u128) << 80
|
||||
| (b'5' as u128) << 88
|
||||
| (b'6' as u128) << 96
|
||||
| (b'p' as u128) << 104
|
||||
| (b'-' as u128) << 112
|
||||
| (b'c' as u128) << 120;
|
||||
pub(crate) const EXTERNAL: u128 = (b'e' as u128)
|
||||
| (b'x' as u128) << 8
|
||||
| (b't' as u128) << 16
|
||||
| (b'e' as u128) << 24
|
||||
| (b'r' as u128) << 32
|
||||
| (b'n' as u128) << 40
|
||||
| (b'a' as u128) << 48
|
||||
| (b'l' as u128) << 56;
|
||||
pub(crate) const GS2_KRB5: u128 = (b'g' as u128)
|
||||
| (b's' as u128) << 8
|
||||
| (b'2' as u128) << 16
|
||||
| (b'-' as u128) << 24
|
||||
| (b'k' as u128) << 32
|
||||
| (b'r' as u128) << 40
|
||||
| (b'b' as u128) << 48
|
||||
| (b'5' as u128) << 56;
|
||||
pub(crate) const GS2_KRB5_PLUS: u128 = (b'g' as u128)
|
||||
| (b's' as u128) << 8
|
||||
| (b'2' as u128) << 16
|
||||
| (b'-' as u128) << 24
|
||||
| (b'k' as u128) << 32
|
||||
| (b'r' as u128) << 40
|
||||
| (b'b' as u128) << 48
|
||||
| (b'5' as u128) << 56
|
||||
| (b'-' as u128) << 64
|
||||
| (b'p' as u128) << 72
|
||||
| (b'l' as u128) << 80
|
||||
| (b'u' as u128) << 88
|
||||
| (b's' as u128) << 96;
|
||||
pub(crate) const GSS_SPNEGO: u128 = (b'g' as u128)
|
||||
| (b's' as u128) << 8
|
||||
| (b's' as u128) << 16
|
||||
| (b'-' as u128) << 24
|
||||
| (b's' as u128) << 32
|
||||
| (b'p' as u128) << 40
|
||||
| (b'n' as u128) << 48
|
||||
| (b'e' as u128) << 56
|
||||
| (b'g' as u128) << 64
|
||||
| (b'o' as u128) << 72;
|
||||
pub(crate) const GSSAPI: u128 = (b'g' as u128)
|
||||
| (b's' as u128) << 8
|
||||
| (b's' as u128) << 16
|
||||
| (b'a' as u128) << 24
|
||||
| (b'p' as u128) << 32
|
||||
| (b'i' as u128) << 40;
|
||||
pub(crate) const KERBEROS_V4: u128 = (b'k' as u128)
|
||||
| (b'e' as u128) << 8
|
||||
| (b'r' as u128) << 16
|
||||
| (b'b' as u128) << 24
|
||||
| (b'e' as u128) << 32
|
||||
| (b'r' as u128) << 40
|
||||
| (b'o' as u128) << 48
|
||||
| (b's' as u128) << 56
|
||||
| (b'_' as u128) << 64
|
||||
| (b'v' as u128) << 72
|
||||
| (b'4' as u128) << 80;
|
||||
pub(crate) const KERBEROS_V5: u128 = (b'k' as u128)
|
||||
| (b'e' as u128) << 8
|
||||
| (b'r' as u128) << 16
|
||||
| (b'b' as u128) << 24
|
||||
| (b'e' as u128) << 32
|
||||
| (b'r' as u128) << 40
|
||||
| (b'o' as u128) << 48
|
||||
| (b's' as u128) << 56
|
||||
| (b'_' as u128) << 64
|
||||
| (b'v' as u128) << 72
|
||||
| (b'5' as u128) << 80;
|
||||
pub(crate) const LOGIN: u128 = (b'l' as u128)
|
||||
| (b'o' as u128) << 8
|
||||
| (b'g' as u128) << 16
|
||||
| (b'i' as u128) << 24
|
||||
| (b'n' as u128) << 32;
|
||||
pub(crate) const NMAS_SAMBA_AUTH: u128 = (b'n' as u128)
|
||||
| (b'm' as u128) << 8
|
||||
| (b'a' as u128) << 16
|
||||
| (b's' as u128) << 24
|
||||
| (b'-' as u128) << 32
|
||||
| (b's' as u128) << 40
|
||||
| (b'a' as u128) << 48
|
||||
| (b'm' as u128) << 56
|
||||
| (b'b' as u128) << 64
|
||||
| (b'a' as u128) << 72
|
||||
| (b'-' as u128) << 80
|
||||
| (b'a' as u128) << 88
|
||||
| (b'u' as u128) << 96
|
||||
| (b't' as u128) << 104
|
||||
| (b'h' as u128) << 112;
|
||||
pub(crate) const NMAS_AUTHEN: u128 = (b'n' as u128)
|
||||
| (b'm' as u128) << 8
|
||||
| (b'a' as u128) << 16
|
||||
| (b's' as u128) << 24
|
||||
| (b'_' as u128) << 32
|
||||
| (b'a' as u128) << 40
|
||||
| (b'u' as u128) << 48
|
||||
| (b't' as u128) << 56
|
||||
| (b'h' as u128) << 64
|
||||
| (b'e' as u128) << 72
|
||||
| (b'n' as u128) << 80;
|
||||
pub(crate) const NMAS_LOGIN: u128 = (b'n' as u128)
|
||||
| (b'm' as u128) << 8
|
||||
| (b'a' as u128) << 16
|
||||
| (b's' as u128) << 24
|
||||
| (b'_' as u128) << 32
|
||||
| (b'l' as u128) << 40
|
||||
| (b'o' as u128) << 48
|
||||
| (b'g' as u128) << 56
|
||||
| (b'i' as u128) << 64
|
||||
| (b'n' as u128) << 72;
|
||||
pub(crate) const NTLM: u128 =
|
||||
(b'n' as u128) | (b't' as u128) << 8 | (b'l' as u128) << 16 | (b'm' as u128) << 24;
|
||||
pub(crate) const OAUTH10A: u128 = (b'o' as u128)
|
||||
| (b'a' as u128) << 8
|
||||
| (b'u' as u128) << 16
|
||||
| (b't' as u128) << 24
|
||||
| (b'h' as u128) << 32
|
||||
| (b'1' as u128) << 40
|
||||
| (b'0' as u128) << 48
|
||||
| (b'a' as u128) << 56;
|
||||
pub(crate) const OAUTHBEARER: u128 = (b'o' as u128)
|
||||
| (b'a' as u128) << 8
|
||||
| (b'u' as u128) << 16
|
||||
| (b't' as u128) << 24
|
||||
| (b'h' as u128) << 32
|
||||
| (b'b' as u128) << 40
|
||||
| (b'e' as u128) << 48
|
||||
| (b'a' as u128) << 56
|
||||
| (b'r' as u128) << 64
|
||||
| (b'e' as u128) << 72
|
||||
| (b'r' as u128) << 80;
|
||||
pub(crate) const OPENID20: u128 = (b'o' as u128)
|
||||
| (b'p' as u128) << 8
|
||||
| (b'e' as u128) << 16
|
||||
| (b'n' as u128) << 24
|
||||
| (b'i' as u128) << 32
|
||||
| (b'd' as u128) << 40
|
||||
| (b'2' as u128) << 48
|
||||
| (b'0' as u128) << 56;
|
||||
pub(crate) const OTP: u128 = (b'o' as u128) | (b't' as u128) << 8 | (b'p' as u128) << 16;
|
||||
pub(crate) const PLAIN: u128 = (b'p' as u128)
|
||||
| (b'l' as u128) << 8
|
||||
| (b'a' as u128) << 16
|
||||
| (b'i' as u128) << 24
|
||||
| (b'n' as u128) << 32;
|
||||
pub(crate) const SAML20: u128 = (b's' as u128)
|
||||
| (b'a' as u128) << 8
|
||||
| (b'm' as u128) << 16
|
||||
| (b'l' as u128) << 24
|
||||
| (b'2' as u128) << 32
|
||||
| (b'0' as u128) << 40;
|
||||
pub(crate) const SCRAM_SHA_1: u128 = (b's' as u128)
|
||||
| (b'c' as u128) << 8
|
||||
| (b'r' as u128) << 16
|
||||
| (b'a' as u128) << 24
|
||||
| (b'm' as u128) << 32
|
||||
| (b'-' as u128) << 40
|
||||
| (b's' as u128) << 48
|
||||
| (b'h' as u128) << 56
|
||||
| (b'a' as u128) << 64
|
||||
| (b'-' as u128) << 72
|
||||
| (b'1' as u128) << 80;
|
||||
pub(crate) const SCRAM_SHA_1_PLUS: u128 = (b's' as u128)
|
||||
| (b'c' as u128) << 8
|
||||
| (b'r' as u128) << 16
|
||||
| (b'a' as u128) << 24
|
||||
| (b'm' as u128) << 32
|
||||
| (b'-' as u128) << 40
|
||||
| (b's' as u128) << 48
|
||||
| (b'h' as u128) << 56
|
||||
| (b'a' as u128) << 64
|
||||
| (b'-' as u128) << 72
|
||||
| (b'1' as u128) << 80
|
||||
| (b'-' as u128) << 88
|
||||
| (b'p' as u128) << 96
|
||||
| (b'l' as u128) << 104
|
||||
| (b'u' as u128) << 112
|
||||
| (b's' as u128) << 120;
|
||||
pub(crate) const SCRAM_SHA_256: u128 = (b's' as u128)
|
||||
| (b'c' as u128) << 8
|
||||
| (b'r' as u128) << 16
|
||||
| (b'a' as u128) << 24
|
||||
| (b'm' as u128) << 32
|
||||
| (b'-' as u128) << 40
|
||||
| (b's' as u128) << 48
|
||||
| (b'h' as u128) << 56
|
||||
| (b'a' as u128) << 64
|
||||
| (b'-' as u128) << 72
|
||||
| (b'2' as u128) << 80
|
||||
| (b'5' as u128) << 88
|
||||
| (b'6' as u128) << 96;
|
||||
pub(crate) const SCRAM_SHA_256_PL: u128 = (b's' as u128)
|
||||
| (b'c' as u128) << 8
|
||||
| (b'r' as u128) << 16
|
||||
| (b'a' as u128) << 24
|
||||
| (b'm' as u128) << 32
|
||||
| (b'-' as u128) << 40
|
||||
| (b's' as u128) << 48
|
||||
| (b'h' as u128) << 56
|
||||
| (b'a' as u128) << 64
|
||||
| (b'-' as u128) << 72
|
||||
| (b'2' as u128) << 80
|
||||
| (b'5' as u128) << 88
|
||||
| (b'6' as u128) << 96
|
||||
| (b'-' as u128) << 104
|
||||
| (b'p' as u128) << 112
|
||||
| (b'l' as u128) << 120;
|
||||
pub(crate) const SECURID: u128 = (b's' as u128)
|
||||
| (b'e' as u128) << 8
|
||||
| (b'c' as u128) << 16
|
||||
| (b'u' as u128) << 24
|
||||
| (b'r' as u128) << 32
|
||||
| (b'i' as u128) << 40
|
||||
| (b'd' as u128) << 48;
|
||||
pub(crate) const SKEY: u128 =
|
||||
(b's' as u128) | (b'k' as u128) << 8 | (b'e' as u128) << 16 | (b'y' as u128) << 24;
|
||||
pub(crate) const SPNEGO: u128 = (b's' as u128)
|
||||
| (b'p' as u128) << 8
|
||||
| (b'n' as u128) << 16
|
||||
| (b'e' as u128) << 24
|
||||
| (b'g' as u128) << 32
|
||||
| (b'o' as u128) << 40;
|
||||
pub(crate) const SPNEGO_PLUS: u128 = (b's' as u128)
|
||||
| (b'p' as u128) << 8
|
||||
| (b'n' as u128) << 16
|
||||
| (b'e' as u128) << 24
|
||||
| (b'g' as u128) << 32
|
||||
| (b'o' as u128) << 40
|
||||
| (b'-' as u128) << 48
|
||||
| (b'p' as u128) << 56
|
||||
| (b'l' as u128) << 64
|
||||
| (b'u' as u128) << 72
|
||||
| (b's' as u128) << 80;
|
||||
pub(crate) const SXOVER_PLUS: u128 = (b's' as u128)
|
||||
| (b'x' as u128) << 8
|
||||
| (b'o' as u128) << 16
|
||||
| (b'v' as u128) << 24
|
||||
| (b'e' as u128) << 32
|
||||
| (b'r' as u128) << 40
|
||||
| (b'-' as u128) << 48
|
||||
| (b'p' as u128) << 56
|
||||
| (b'l' as u128) << 64
|
||||
| (b'u' as u128) << 72
|
||||
| (b's' as u128) << 80;
|
||||
pub(crate) const XOAUTH: u128 = (b'x' as u128)
|
||||
| (b'o' as u128) << 8
|
||||
| (b'a' as u128) << 16
|
||||
| (b'u' as u128) << 24
|
||||
| (b't' as u128) << 32
|
||||
| (b'h' as u128) << 40;
|
||||
pub(crate) const XOAUTH2: u128 = (b'x' as u128)
|
||||
| (b'o' as u128) << 8
|
||||
| (b'a' as u128) << 16
|
||||
| (b'u' as u128) << 24
|
||||
| (b't' as u128) << 32
|
||||
| (b'h' as u128) << 40
|
||||
| (b'2' as u128) << 48;
|
||||
|
||||
/*
|
||||
* Adapted from Daniel Lemire's source:
|
||||
* https://github.com/lemire/Code-used-on-Daniel-Lemire-s-blog/blob/master/2019/04/17/hexparse.cpp
|
||||
*
|
||||
*/
|
||||
|
||||
pub(crate) static HEX_MAP: &[i8] = &[
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10,
|
||||
11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
];
|
1895
src/request/parser.rs
Normal file
1895
src/request/parser.rs
Normal file
File diff suppressed because it is too large
Load diff
0
src/response/mod.rs
Normal file
0
src/response/mod.rs
Normal file
Loading…
Reference in a new issue