rtc_dtls/extension/
mod.rs1pub mod extension_server_name;
3pub mod extension_supported_elliptic_curves;
5pub mod extension_supported_point_formats;
7pub mod extension_supported_signature_algorithms;
9pub mod extension_use_extended_master_secret;
12pub mod extension_use_srtp;
15pub mod renegotiation_info;
17
18use extension_server_name::*;
19use extension_supported_elliptic_curves::*;
20use extension_supported_point_formats::*;
21use extension_supported_signature_algorithms::*;
22use extension_use_extended_master_secret::*;
23use extension_use_srtp::*;
24
25use shared::error::*;
26
27use crate::extension::renegotiation_info::ExtensionRenegotiationInfo;
28use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
29use std::io::{Read, Write};
30
31#[derive(Clone, Debug, PartialEq, Eq)]
33pub enum ExtensionValue {
35 ServerName = 0,
37 SupportedEllipticCurves = 10,
39 SupportedPointFormats = 11,
41 SupportedSignatureAlgorithms = 13,
43 UseSrtp = 14,
45 UseExtendedMasterSecret = 23,
47 RenegotiationInfo = 65281,
49 Unsupported,
51}
52
53impl From<u16> for ExtensionValue {
54 fn from(val: u16) -> Self {
55 match val {
56 0 => ExtensionValue::ServerName,
57 10 => ExtensionValue::SupportedEllipticCurves,
58 11 => ExtensionValue::SupportedPointFormats,
59 13 => ExtensionValue::SupportedSignatureAlgorithms,
60 14 => ExtensionValue::UseSrtp,
61 23 => ExtensionValue::UseExtendedMasterSecret,
62 65281 => ExtensionValue::RenegotiationInfo,
63 _ => ExtensionValue::Unsupported,
64 }
65 }
66}
67
68#[derive(PartialEq, Eq, Debug, Clone)]
69pub enum Extension {
71 ServerName(ExtensionServerName),
73 SupportedEllipticCurves(ExtensionSupportedEllipticCurves),
75 SupportedPointFormats(ExtensionSupportedPointFormats),
77 SupportedSignatureAlgorithms(ExtensionSupportedSignatureAlgorithms),
79 UseSrtp(ExtensionUseSrtp),
81 UseExtendedMasterSecret(ExtensionUseExtendedMasterSecret),
83 RenegotiationInfo(ExtensionRenegotiationInfo),
85}
86
87impl Extension {
88 pub fn extension_value(&self) -> ExtensionValue {
90 match self {
91 Extension::ServerName(ext) => ext.extension_value(),
92 Extension::SupportedEllipticCurves(ext) => ext.extension_value(),
93 Extension::SupportedPointFormats(ext) => ext.extension_value(),
94 Extension::SupportedSignatureAlgorithms(ext) => ext.extension_value(),
95 Extension::UseSrtp(ext) => ext.extension_value(),
96 Extension::UseExtendedMasterSecret(ext) => ext.extension_value(),
97 Extension::RenegotiationInfo(ext) => ext.extension_value(),
98 }
99 }
100
101 pub fn size(&self) -> usize {
103 let mut len = 2;
104
105 len += match self {
106 Extension::ServerName(ext) => ext.size(),
107 Extension::SupportedEllipticCurves(ext) => ext.size(),
108 Extension::SupportedPointFormats(ext) => ext.size(),
109 Extension::SupportedSignatureAlgorithms(ext) => ext.size(),
110 Extension::UseSrtp(ext) => ext.size(),
111 Extension::UseExtendedMasterSecret(ext) => ext.size(),
112 Extension::RenegotiationInfo(ext) => ext.size(),
113 };
114
115 len
116 }
117
118 pub fn marshal<W: Write>(&self, writer: &mut W) -> Result<()> {
124 writer.write_u16::<BigEndian>(self.extension_value() as u16)?;
125 match self {
126 Extension::ServerName(ext) => ext.marshal(writer),
127 Extension::SupportedEllipticCurves(ext) => ext.marshal(writer),
128 Extension::SupportedPointFormats(ext) => ext.marshal(writer),
129 Extension::SupportedSignatureAlgorithms(ext) => ext.marshal(writer),
130 Extension::UseSrtp(ext) => ext.marshal(writer),
131 Extension::UseExtendedMasterSecret(ext) => ext.marshal(writer),
132 Extension::RenegotiationInfo(ext) => ext.marshal(writer),
133 }
134 }
135
136 pub fn unmarshal<R: Read>(reader: &mut R) -> Result<Self> {
142 let extension_value: ExtensionValue = reader.read_u16::<BigEndian>()?.into();
143 match extension_value {
144 ExtensionValue::ServerName => Ok(Extension::ServerName(
145 ExtensionServerName::unmarshal(reader)?,
146 )),
147 ExtensionValue::SupportedEllipticCurves => Ok(Extension::SupportedEllipticCurves(
148 ExtensionSupportedEllipticCurves::unmarshal(reader)?,
149 )),
150 ExtensionValue::SupportedPointFormats => Ok(Extension::SupportedPointFormats(
151 ExtensionSupportedPointFormats::unmarshal(reader)?,
152 )),
153 ExtensionValue::SupportedSignatureAlgorithms => {
154 Ok(Extension::SupportedSignatureAlgorithms(
155 ExtensionSupportedSignatureAlgorithms::unmarshal(reader)?,
156 ))
157 }
158 ExtensionValue::UseSrtp => Ok(Extension::UseSrtp(ExtensionUseSrtp::unmarshal(reader)?)),
159 ExtensionValue::UseExtendedMasterSecret => Ok(Extension::UseExtendedMasterSecret(
160 ExtensionUseExtendedMasterSecret::unmarshal(reader)?,
161 )),
162 ExtensionValue::RenegotiationInfo => Ok(Extension::RenegotiationInfo(
163 ExtensionRenegotiationInfo::unmarshal(reader)?,
164 )),
165 _ => Err(Error::ErrInvalidExtensionType),
166 }
167 }
168}