| use std::fmt; |
| |
| use crate::enums::ProtocolVersion; |
| |
| /// A TLS protocol version supported by rustls. |
| /// |
| /// All possible instances of this class are provided by the library in |
| /// the [`ALL_VERSIONS`] array, as well as individually as [`TLS12`] |
| /// and [`TLS13`]. |
| #[derive(Eq, PartialEq)] |
| pub struct SupportedProtocolVersion { |
| /// The TLS enumeration naming this version. |
| pub version: ProtocolVersion, |
| is_private: (), |
| } |
| |
| impl fmt::Debug for SupportedProtocolVersion { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| self.version.fmt(f) |
| } |
| } |
| |
| /// TLS1.2 |
| #[cfg(feature = "tls12")] |
| pub static TLS12: SupportedProtocolVersion = SupportedProtocolVersion { |
| version: ProtocolVersion::TLSv1_2, |
| is_private: (), |
| }; |
| |
| /// TLS1.3 |
| pub static TLS13: SupportedProtocolVersion = SupportedProtocolVersion { |
| version: ProtocolVersion::TLSv1_3, |
| is_private: (), |
| }; |
| |
| /// A list of all the protocol versions supported by rustls. |
| pub static ALL_VERSIONS: &[&SupportedProtocolVersion] = &[ |
| &TLS13, |
| #[cfg(feature = "tls12")] |
| &TLS12, |
| ]; |
| |
| /// The version configuration that an application should use by default. |
| /// |
| /// This will be [`ALL_VERSIONS`] for now, but gives space in the future |
| /// to remove a version from here and require users to opt-in to older |
| /// versions. |
| pub static DEFAULT_VERSIONS: &[&SupportedProtocolVersion] = ALL_VERSIONS; |
| |
| #[derive(Clone)] |
| pub(crate) struct EnabledVersions { |
| #[cfg(feature = "tls12")] |
| tls12: Option<&'static SupportedProtocolVersion>, |
| tls13: Option<&'static SupportedProtocolVersion>, |
| } |
| |
| impl fmt::Debug for EnabledVersions { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| let mut list = &mut f.debug_list(); |
| #[cfg(feature = "tls12")] |
| if let Some(v) = self.tls12 { |
| list = list.entry(v); |
| } |
| if let Some(v) = self.tls13 { |
| list = list.entry(v); |
| } |
| list.finish() |
| } |
| } |
| |
| impl EnabledVersions { |
| pub(crate) fn new(versions: &[&'static SupportedProtocolVersion]) -> Self { |
| let mut ev = Self { |
| #[cfg(feature = "tls12")] |
| tls12: None, |
| tls13: None, |
| }; |
| |
| for v in versions { |
| match v.version { |
| #[cfg(feature = "tls12")] |
| ProtocolVersion::TLSv1_2 => ev.tls12 = Some(v), |
| ProtocolVersion::TLSv1_3 => ev.tls13 = Some(v), |
| _ => {} |
| } |
| } |
| |
| ev |
| } |
| |
| pub(crate) fn contains(&self, version: ProtocolVersion) -> bool { |
| match version { |
| #[cfg(feature = "tls12")] |
| ProtocolVersion::TLSv1_2 => self.tls12.is_some(), |
| ProtocolVersion::TLSv1_3 => self.tls13.is_some(), |
| _ => false, |
| } |
| } |
| } |