#[cfg(test)] mod extension_supported_elliptic_curves_test; use super::*; use crate::curve::named_curve::*; const EXTENSION_SUPPORTED_GROUPS_HEADER_SIZE: usize = 6; /// ## Specifications /// /// * [RFC 8422 §5.1.1] /// /// [RFC 8422 §5.1.1]: https://tools.ietf.org/html/rfc8422#section-5.1.1 #[derive(Clone, Debug, PartialEq, Eq)] pub struct ExtensionSupportedEllipticCurves { pub elliptic_curves: Vec, } impl ExtensionSupportedEllipticCurves { pub fn extension_value(&self) -> ExtensionValue { ExtensionValue::SupportedEllipticCurves } pub fn size(&self) -> usize { 2 + 2 + self.elliptic_curves.len() * 2 } pub fn marshal(&self, writer: &mut W) -> Result<()> { writer.write_u16::(2 + 2 * self.elliptic_curves.len() as u16)?; writer.write_u16::(2 * self.elliptic_curves.len() as u16)?; for v in &self.elliptic_curves { writer.write_u16::(*v as u16)?; } Ok(writer.flush()?) } pub fn unmarshal(reader: &mut R) -> Result { let _ = reader.read_u16::()?; let group_count = reader.read_u16::()? as usize / 2; let mut elliptic_curves = vec![]; for _ in 0..group_count { let elliptic_curve = reader.read_u16::()?.into(); elliptic_curves.push(elliptic_curve); } Ok(ExtensionSupportedEllipticCurves { elliptic_curves }) } }