embedded_tls/extensions/extension_data/
supported_versions.rs1use 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}