embedded_tls/extensions/extension_data/
signature_algorithms.rs1use crate::{
2 TlsError,
3 buffer::CryptoBuffer,
4 parse_buffer::{ParseBuffer, ParseError},
5};
6
7use heapless::Vec;
8
9#[derive(Debug, Clone, Copy, PartialEq)]
10#[cfg_attr(feature = "defmt", derive(defmt::Format))]
11pub enum SignatureScheme {
12 RsaPkcs1Sha256,
14 RsaPkcs1Sha384,
15 RsaPkcs1Sha512,
16
17 EcdsaSecp256r1Sha256,
19 EcdsaSecp384r1Sha384,
20 EcdsaSecp521r1Sha512,
21
22 RsaPssRsaeSha256,
24 RsaPssRsaeSha384,
25 RsaPssRsaeSha512,
26
27 Ed25519,
29 Ed448,
30
31 RsaPssPssSha256,
33 RsaPssPssSha384,
34 RsaPssPssSha512,
35
36 Sha224Ecdsa,
37 Sha224Rsa,
38 Sha224Dsa,
39
40 RsaPkcs1Sha1,
42 EcdsaSha1,
43
44 Sha256BrainpoolP256r1,
46 Sha384BrainpoolP384r1,
47 Sha512BrainpoolP512r1,
48
49 MlDsa44,
51 MlDsa65,
52 MlDsa87,
53 }
57
58impl SignatureScheme {
59 pub fn parse(buf: &mut ParseBuffer) -> Result<Self, ParseError> {
60 match buf.read_u16()? {
61 0x0401 => Ok(Self::RsaPkcs1Sha256),
62 0x0501 => Ok(Self::RsaPkcs1Sha384),
63 0x0601 => Ok(Self::RsaPkcs1Sha512),
64
65 0x0403 => Ok(Self::EcdsaSecp256r1Sha256),
66 0x0503 => Ok(Self::EcdsaSecp384r1Sha384),
67 0x0603 => Ok(Self::EcdsaSecp521r1Sha512),
68
69 0x0804 => Ok(Self::RsaPssRsaeSha256),
70 0x0805 => Ok(Self::RsaPssRsaeSha384),
71 0x0806 => Ok(Self::RsaPssRsaeSha512),
72
73 0x0807 => Ok(Self::Ed25519),
74 0x0808 => Ok(Self::Ed448),
75
76 0x0809 => Ok(Self::RsaPssPssSha256),
77 0x080a => Ok(Self::RsaPssPssSha384),
78 0x080b => Ok(Self::RsaPssPssSha512),
79
80 0x0303 => Ok(Self::Sha224Ecdsa),
81 0x0301 => Ok(Self::Sha224Rsa),
82 0x0302 => Ok(Self::Sha224Dsa),
83
84 0x0201 => Ok(Self::RsaPkcs1Sha1),
85 0x0203 => Ok(Self::EcdsaSha1),
86
87 0x081A => Ok(Self::Sha256BrainpoolP256r1),
88 0x081B => Ok(Self::Sha384BrainpoolP384r1),
89 0x081C => Ok(Self::Sha512BrainpoolP512r1),
90
91 0x0904 => Ok(Self::MlDsa44),
92 0x0905 => Ok(Self::MlDsa65),
93 0x0906 => Ok(Self::MlDsa87),
94
95 _ => Err(ParseError::InvalidData),
96 }
97 }
98
99 #[must_use]
100 pub fn as_u16(self) -> u16 {
101 match self {
102 Self::RsaPkcs1Sha256 => 0x0401,
103 Self::RsaPkcs1Sha384 => 0x0501,
104 Self::RsaPkcs1Sha512 => 0x0601,
105
106 Self::EcdsaSecp256r1Sha256 => 0x0403,
107 Self::EcdsaSecp384r1Sha384 => 0x0503,
108 Self::EcdsaSecp521r1Sha512 => 0x0603,
109
110 Self::RsaPssRsaeSha256 => 0x0804,
111 Self::RsaPssRsaeSha384 => 0x0805,
112 Self::RsaPssRsaeSha512 => 0x0806,
113
114 Self::Ed25519 => 0x0807,
115 Self::Ed448 => 0x0808,
116
117 Self::RsaPssPssSha256 => 0x0809,
118 Self::RsaPssPssSha384 => 0x080a,
119 Self::RsaPssPssSha512 => 0x080b,
120
121 Self::Sha224Ecdsa => 0x0303,
122 Self::Sha224Rsa => 0x0301,
123 Self::Sha224Dsa => 0x0302,
124
125 Self::RsaPkcs1Sha1 => 0x0201,
126 Self::EcdsaSha1 => 0x0203,
127
128 Self::Sha256BrainpoolP256r1 => 0x081A,
129 Self::Sha384BrainpoolP384r1 => 0x081B,
130 Self::Sha512BrainpoolP512r1 => 0x081C,
131
132 Self::MlDsa44 => 0x0904,
133 Self::MlDsa65 => 0x0905,
134 Self::MlDsa87 => 0x0906,
135 }
136 }
137}
138
139#[derive(Debug, Clone, PartialEq)]
140#[cfg_attr(feature = "defmt", derive(defmt::Format))]
141pub struct SignatureAlgorithms<const N: usize> {
142 pub supported_signature_algorithms: Vec<SignatureScheme, N>,
143}
144
145impl<const N: usize> SignatureAlgorithms<N> {
146 pub fn parse(buf: &mut ParseBuffer) -> Result<Self, ParseError> {
147 let data_length = buf.read_u16()? as usize;
148
149 Ok(Self {
150 supported_signature_algorithms: buf
151 .read_list::<_, N>(data_length, SignatureScheme::parse)?,
152 })
153 }
154
155 pub fn encode(&self, buf: &mut CryptoBuffer) -> Result<(), TlsError> {
156 buf.with_u16_length(|buf| {
157 for &a in &self.supported_signature_algorithms {
158 buf.push_u16(a.as_u16())
159 .map_err(|_| TlsError::EncodeError)?;
160 }
161 Ok(())
162 })
163 }
164}