diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 17:39:49 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 17:39:49 +0000 |
commit | a0aa2307322cd47bbf416810ac0292925e03be87 (patch) | |
tree | 37076262a026c4b48c8a0e84f44ff9187556ca35 /rust/vendor/tls-parser/src/tls_ec.rs | |
parent | Initial commit. (diff) | |
download | suricata-a0aa2307322cd47bbf416810ac0292925e03be87.tar.xz suricata-a0aa2307322cd47bbf416810ac0292925e03be87.zip |
Adding upstream version 1:7.0.3.upstream/1%7.0.3
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'rust/vendor/tls-parser/src/tls_ec.rs')
-rw-r--r-- | rust/vendor/tls-parser/src/tls_ec.rs | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/rust/vendor/tls-parser/src/tls_ec.rs b/rust/vendor/tls-parser/src/tls_ec.rs new file mode 100644 index 0000000..2130f86 --- /dev/null +++ b/rust/vendor/tls-parser/src/tls_ec.rs @@ -0,0 +1,200 @@ +use alloc::vec::Vec; +use nom::error::{make_error, ErrorKind}; +use nom::multi::length_data; +use nom::number::streaming::be_u8; +use nom::{Err, IResult}; +use nom_derive::*; +use rusticata_macros::newtype_enum; + +/// Named curves, as defined in [RFC4492](https://tools.ietf.org/html/rfc4492), [RFC7027](https://tools.ietf.org/html/rfc7027), [RFC7919](https://tools.ietf.org/html/rfc7919) and +/// [IANA Supported Groups +/// Registry](https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-8) +#[derive(Clone, Copy, PartialEq, Eq, NomBE)] +pub struct NamedGroup(pub u16); + +newtype_enum! { +impl debug NamedGroup { + Sect163k1 = 1, + Sect163r1 = 2, + Sect163r2 = 3, + Sect193r1 = 4, + Sect193r2 = 5, + Sect233k1 = 6, + Sect233r1 = 7, + Sect239k1 = 8, + Sect283k1 = 9, + Sect283r1 = 10, + Sect409k1 = 11, + Sect409r1 = 12, + Sect571k1 = 13, + Sect571r1 = 14, + Secp160k1 = 15, + Secp160r1 = 16, + Secp160r2 = 17, + Secp192k1 = 18, + Secp192r1 = 19, + Secp224k1 = 20, + Secp224r1 = 21, + Secp256k1 = 22, + Secp256r1 = 23, + Secp384r1 = 24, + Secp521r1 = 25, + BrainpoolP256r1 = 26, + BrainpoolP384r1 = 27, + BrainpoolP512r1 = 28, + EcdhX25519 = 29, + EcdhX448 = 30, + BrainpoolP256r1tls13 = 31, + BrainpoolP384r1tls13 = 32, + BrainpoolP512r1tls13 = 33, + Sm2 = 41, + Ffdhe2048 = 0x100, + Ffdhe3072 = 0x101, + Ffdhe4096 = 0x102, + Ffdhe6144 = 0x103, + Ffdhe8192 = 0x104, + ArbitraryExplicitPrimeCurves = 0xFF01, + ArbitraryExplicitChar2Curves = 0xFF02, +} +} + +impl NamedGroup { + /// Return key size of curve in bits, or None if unknown + pub fn key_bits(self: NamedGroup) -> Option<u16> { + match self { + NamedGroup::Sect163k1 => Some(163), + NamedGroup::Sect163r1 => Some(163), + NamedGroup::Sect163r2 => Some(163), + NamedGroup::Sect193r1 => Some(193), + NamedGroup::Sect193r2 => Some(193), + NamedGroup::Sect233k1 => Some(233), + NamedGroup::Sect233r1 => Some(233), + NamedGroup::Sect239k1 => Some(239), + NamedGroup::Sect283k1 => Some(283), + NamedGroup::Sect283r1 => Some(283), + NamedGroup::Sect409k1 => Some(409), + NamedGroup::Sect409r1 => Some(409), + NamedGroup::Sect571k1 => Some(571), + NamedGroup::Sect571r1 => Some(571), + NamedGroup::Secp160k1 => Some(160), + NamedGroup::Secp160r1 => Some(160), + NamedGroup::Secp160r2 => Some(160), + NamedGroup::Secp192k1 => Some(192), + NamedGroup::Secp192r1 => Some(192), + NamedGroup::Secp224k1 => Some(224), + NamedGroup::Secp224r1 => Some(224), + NamedGroup::Secp256k1 => Some(256), + NamedGroup::Secp256r1 => Some(256), + NamedGroup::Secp384r1 => Some(384), + NamedGroup::Secp521r1 => Some(521), + NamedGroup::BrainpoolP256r1 => Some(256), + NamedGroup::BrainpoolP384r1 => Some(384), + NamedGroup::BrainpoolP512r1 => Some(521), + NamedGroup::EcdhX25519 => Some(253), + _ => None, + } + } +} + +/// Elliptic curve +/// +/// a and b specify the coefficients of the curve +#[derive(Debug, PartialEq, NomBE)] +pub struct ECCurve<'a> { + #[nom(Parse = "length_data(be_u8)")] + pub a: &'a [u8], + #[nom(Parse = "length_data(be_u8)")] + pub b: &'a [u8], +} + +/// Elliptic curve types, as defined in the +/// [IANA EC Curve Type Registry +/// Registry](https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-10) +#[derive(Clone, Copy, PartialEq, Eq, NomBE)] +pub struct ECCurveType(pub u8); + +newtype_enum! { +impl display ECCurveType { + ExplicitPrime = 1, + ExplicitChar2 = 2, + NamedGroup = 3, +} +} + +/// EC Point +#[derive(Clone, Debug, PartialEq, NomBE)] +pub struct ECPoint<'a> { + #[nom(Parse = "length_data(be_u8)")] + pub point: &'a [u8], +} + +/// Elliptic curve parameters, conveyed verbosely as a prime field, as +/// defined in [RFC4492](https://tools.ietf.org/html/rfc4492) section 5.4 +#[derive(Debug, PartialEq, NomBE)] +pub struct ExplicitPrimeContent<'a> { + #[nom(Parse = "length_data(be_u8)")] + pub prime_p: &'a [u8], + pub curve: ECCurve<'a>, + pub base: ECPoint<'a>, + #[nom(Parse = "length_data(be_u8)")] + pub order: &'a [u8], + #[nom(Parse = "length_data(be_u8)")] + pub cofactor: &'a [u8], +} + +/// Elliptic curve parameters content (depending on EC type) +#[derive(PartialEq, Nom)] +#[nom(Selector = "ECCurveType")] +pub enum ECParametersContent<'a> { + #[nom(Selector = "ECCurveType::ExplicitPrime")] + ExplicitPrime(ExplicitPrimeContent<'a>), + // TODO ExplicitChar2 is defined in [RFC4492] section 5.4 + // #[nom(Selector="ECCurveType::ExplicitChar2")] + // ExplicitChar2(&'a [u8]), + #[nom(Selector = "ECCurveType::NamedGroup")] + NamedGroup(NamedGroup), +} + +/// Elliptic curve parameters, +/// defined in [RFC4492](https://tools.ietf.org/html/rfc4492) section 5.4 +#[derive(PartialEq, NomBE)] +pub struct ECParameters<'a> { + /// Should match a [ECCurveType](enum.ECCurveType.html) value + pub curve_type: ECCurveType, + #[nom(Parse = "{|i| ECParametersContent::parse(i, curve_type)}")] + pub params_content: ECParametersContent<'a>, +} + +/// ECDH parameters +/// defined in [RFC4492](https://tools.ietf.org/html/rfc4492) section 5.4 +#[derive(Debug, PartialEq, NomBE)] +pub struct ServerECDHParams<'a> { + pub curve_params: ECParameters<'a>, + pub public: ECPoint<'a>, +} + +/// Parse the entire input as a list of named groups (curves) +pub fn parse_named_groups(i: &[u8]) -> IResult<&[u8], Vec<NamedGroup>> { + let len = i.len(); + if len == 0 { + return Ok((i, Vec::new())); + } + if len % 2 == 1 || len > i.len() { + return Err(Err::Error(make_error(i, ErrorKind::LengthValue))); + } + let v = (&i[..len]) + .chunks(2) + .map(|chunk| NamedGroup((chunk[0] as u16) << 8 | chunk[1] as u16)) + .collect(); + Ok((&i[len..], v)) +} + +#[inline] +pub fn parse_ec_parameters(i: &[u8]) -> IResult<&[u8], ECParameters> { + ECParameters::parse(i) +} + +#[inline] +pub fn parse_ecdh_params(i: &[u8]) -> IResult<&[u8], ServerECDHParams> { + ServerECDHParams::parse(i) +} |