embedded_tls/extensions/extension_data/
supported_versions.rs

1use crate::{
2    buffer::CryptoBuffer,
3    parse_buffer::{ParseBuffer, ParseError},
4    TlsError,
5};
6use heapless::Vec;
7
8#[derive(Clone, Copy, PartialEq, Debug)]
9#[cfg_attr(feature = "defmt", derive(defmt::Format))]
10pub struct ProtocolVersion(u16);
11
12impl ProtocolVersion {
13    pub fn encode(&self, buf: &mut CryptoBuffer) -> Result<(), TlsError> {
14        buf.push_u16(self.0).map_err(|_| TlsError::EncodeError)
15    }
16
17    pub fn parse(buf: &mut ParseBuffer) -> Result<Self, ParseError> {
18        buf.read_u16().map(Self)
19    }
20}
21
22pub const TLS13: ProtocolVersion = ProtocolVersion(0x0304);
23
24#[derive(Debug, Clone)]
25#[cfg_attr(feature = "defmt", derive(defmt::Format))]
26pub struct SupportedVersionsClientHello<const N: usize> {
27    pub versions: Vec<ProtocolVersion, N>,
28}
29
30impl<const N: usize> SupportedVersionsClientHello<N> {
31    pub fn parse(buf: &mut ParseBuffer) -> Result<Self, ParseError> {
32        let data_length = buf.read_u8()? as usize;
33
34        Ok(Self {
35            versions: buf.read_list::<_, N>(data_length, ProtocolVersion::parse)?,
36        })
37    }
38
39    pub fn encode(&self, buf: &mut CryptoBuffer) -> Result<(), TlsError> {
40        buf.with_u8_length(|buf| {
41            for v in self.versions.iter() {
42                v.encode(buf)?;
43            }
44            Ok(())
45        })
46    }
47}
48
49#[derive(Debug, Clone, Copy, PartialEq)]
50#[cfg_attr(feature = "defmt", derive(defmt::Format))]
51pub struct SupportedVersionsServerHello {
52    pub selected_version: ProtocolVersion,
53}
54
55impl SupportedVersionsServerHello {
56    pub fn parse(buf: &mut ParseBuffer) -> Result<Self, ParseError> {
57        Ok(Self {
58            selected_version: ProtocolVersion::parse(buf)?,
59        })
60    }
61
62    pub fn encode(&self, buf: &mut CryptoBuffer) -> Result<(), TlsError> {
63        self.selected_version.encode(buf)
64    }
65}