/rust/registry/src/index.crates.io-6f17d22bba15001f/tls-parser-0.11.0/src/tls_extensions.rs
Line | Count | Source (jump to first uncovered line) |
1 | | //! |
2 | | //! TLS extensions are defined in: |
3 | | //! |
4 | | //! - [RFC4492](https://tools.ietf.org/html/rfc4492) |
5 | | //! - [RFC6066](https://tools.ietf.org/html/rfc6066) |
6 | | //! - [RFC7366](https://tools.ietf.org/html/rfc7366) |
7 | | //! - [RFC7627](https://tools.ietf.org/html/rfc7627) |
8 | | |
9 | | use crate::tls::{parse_tls_versions, TlsCipherSuiteID, TlsVersion}; |
10 | | use crate::tls_ec::{parse_named_groups, NamedGroup}; |
11 | | use alloc::{vec, vec::Vec}; |
12 | | use core::convert::From; |
13 | | use nom::bytes::streaming::{tag, take}; |
14 | | use nom::combinator::{complete, cond, map, map_parser, opt, verify}; |
15 | | use nom::error::{make_error, ErrorKind}; |
16 | | use nom::multi::{length_data, many0}; |
17 | | use nom::number::streaming::{be_u16, be_u32, be_u8}; |
18 | | use nom::{Err, IResult}; |
19 | | use nom_derive::{NomBE, Parse}; |
20 | | use rusticata_macros::newtype_enum; |
21 | | |
22 | | /// TLS extension types, |
23 | | /// defined in the [IANA Transport Layer Security (TLS) |
24 | | /// Extensions](http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml) |
25 | | /// registry |
26 | 0 | #[derive(Clone, Copy, Debug, PartialEq, Eq, NomBE)] Unexecuted instantiation: <tls_parser::tls_extensions::TlsExtensionType as nom_derive::traits::Parse<&[u8]>>::parse_be Unexecuted instantiation: <tls_parser::tls_extensions::TlsExtensionType as nom_derive::traits::Parse<&[u8]>>::parse_le Unexecuted instantiation: <tls_parser::tls_extensions::TlsExtensionType as nom_derive::traits::Parse<&[u8]>>::parse Unexecuted instantiation: <tls_parser::tls_extensions::TlsExtensionType as nom_derive::traits::Parse<&[u8]>>::parse_be Unexecuted instantiation: <tls_parser::tls_extensions::TlsExtensionType as nom_derive::traits::Parse<&[u8]>>::parse_le Unexecuted instantiation: <tls_parser::tls_extensions::TlsExtensionType as nom_derive::traits::Parse<&[u8]>>::parse |
27 | | pub struct TlsExtensionType(pub u16); |
28 | | |
29 | | newtype_enum! { |
30 | | impl display TlsExtensionType { |
31 | | ServerName = 0, // [RFC6066] |
32 | | MaxFragmentLength = 1, |
33 | | ClientCertificate = 2, |
34 | | TrustedCaKeys = 3, |
35 | | TruncatedHMac = 4, |
36 | | StatusRequest = 5, // [RFC6066] |
37 | | UserMapping = 6, |
38 | | ClientAuthz = 7, |
39 | | ServerAuthz = 8, |
40 | | CertType = 9, |
41 | | SupportedGroups = 10, // [RFC4492][RFC7919] |
42 | | EcPointFormats = 11, // [RFC4492] |
43 | | Srp = 12, // [RFC5054] |
44 | | SignatureAlgorithms = 13, // [RFC8446] |
45 | | UseSrtp = 14, |
46 | | Heartbeat = 15, // [RFC6520] |
47 | | ApplicationLayerProtocolNegotiation = 16, // [RFC7301] |
48 | | StatusRequestv2 = 17, |
49 | | SignedCertificateTimestamp = 18, |
50 | | ClientCertificateType = 19, |
51 | | ServerCertificateType = 20, |
52 | | Padding = 21, // [RFC7685] |
53 | | EncryptThenMac = 22, // [RFC7366] |
54 | | ExtendedMasterSecret = 23, // [RFC7627] |
55 | | TokenBinding = 24, |
56 | | CachedInfo = 25, |
57 | | |
58 | | RecordSizeLimit = 28, // [RFC8449] |
59 | | |
60 | | SessionTicketTLS = 35, |
61 | | |
62 | | KeyShareOld = 40, // moved to 51 in TLS 1.3 draft 23 |
63 | | PreSharedKey = 41, // [RFC8446] |
64 | | EarlyData = 42, // [RFC8446] |
65 | | SupportedVersions = 43, // [RFC8446] |
66 | | Cookie = 44, // [RFC8446] |
67 | | PskExchangeModes = 45, // [RFC8446] |
68 | | TicketEarlyDataInfo = 46, // TLS 1.3 draft 18, removed in draft 19 |
69 | | CertificateAuthorities = 47, |
70 | | OidFilters = 48, // [RFC8446] |
71 | | PostHandshakeAuth = 49, // TLS 1.3 draft 20 |
72 | | SigAlgorithmsCert = 50, // TLS 1.3 draft 23 |
73 | | KeyShare = 51, // TLS 1.3 draft 23 |
74 | | |
75 | | NextProtocolNegotiation = 13172, |
76 | | |
77 | | Grease = 0xfafa, |
78 | | |
79 | | RenegotiationInfo = 0xff01, // [RFC5746] |
80 | | EncryptedServerName = 0xffce, // draft-ietf-tls-esni |
81 | | } |
82 | | } |
83 | | |
84 | | impl TlsExtensionType { |
85 | 0 | pub fn from_u16(t: u16) -> TlsExtensionType { |
86 | 0 | TlsExtensionType(t) |
87 | 0 | } Unexecuted instantiation: <tls_parser::tls_extensions::TlsExtensionType>::from_u16 Unexecuted instantiation: <tls_parser::tls_extensions::TlsExtensionType>::from_u16 |
88 | | } |
89 | | |
90 | | impl From<TlsExtensionType> for u16 { |
91 | 10.6M | fn from(ext: TlsExtensionType) -> u16 { |
92 | 10.6M | ext.0 |
93 | 10.6M | } <u16 as core::convert::From<tls_parser::tls_extensions::TlsExtensionType>>::from Line | Count | Source | 91 | 5.31M | fn from(ext: TlsExtensionType) -> u16 { | 92 | 5.31M | ext.0 | 93 | 5.31M | } |
<u16 as core::convert::From<tls_parser::tls_extensions::TlsExtensionType>>::from Line | Count | Source | 91 | 5.35M | fn from(ext: TlsExtensionType) -> u16 { | 92 | 5.35M | ext.0 | 93 | 5.35M | } |
|
94 | | } |
95 | | |
96 | | /// TLS extensions |
97 | | /// |
98 | | #[derive(Clone, PartialEq)] |
99 | | pub enum TlsExtension<'a> { |
100 | | SNI(Vec<(SNIType, &'a [u8])>), |
101 | | MaxFragmentLength(u8), |
102 | | StatusRequest(Option<(CertificateStatusType, &'a [u8])>), |
103 | | EllipticCurves(Vec<NamedGroup>), |
104 | | EcPointFormats(&'a [u8]), |
105 | | SignatureAlgorithms(Vec<u16>), |
106 | | RecordSizeLimit(u16), |
107 | | SessionTicket(&'a [u8]), |
108 | | KeyShareOld(&'a [u8]), |
109 | | KeyShare(&'a [u8]), |
110 | | PreSharedKey(&'a [u8]), |
111 | | EarlyData(Option<u32>), |
112 | | SupportedVersions(Vec<TlsVersion>), |
113 | | Cookie(&'a [u8]), |
114 | | PskExchangeModes(Vec<u8>), |
115 | | Heartbeat(u8), |
116 | | ALPN(Vec<&'a [u8]>), |
117 | | |
118 | | SignedCertificateTimestamp(Option<&'a [u8]>), |
119 | | Padding(&'a [u8]), |
120 | | EncryptThenMac, |
121 | | ExtendedMasterSecret, |
122 | | |
123 | | OidFilters(Vec<OidFilter<'a>>), |
124 | | PostHandshakeAuth, |
125 | | |
126 | | NextProtocolNegotiation, |
127 | | |
128 | | RenegotiationInfo(&'a [u8]), |
129 | | EncryptedServerName { |
130 | | ciphersuite: TlsCipherSuiteID, |
131 | | group: NamedGroup, |
132 | | key_share: &'a [u8], |
133 | | record_digest: &'a [u8], |
134 | | encrypted_sni: &'a [u8], |
135 | | }, |
136 | | |
137 | | Grease(u16, &'a [u8]), |
138 | | |
139 | | Unknown(TlsExtensionType, &'a [u8]), |
140 | | } |
141 | | |
142 | | impl<'a> From<&'a TlsExtension<'a>> for TlsExtensionType { |
143 | | #[rustfmt::skip] |
144 | 3.07M | fn from(ext: &TlsExtension) -> TlsExtensionType { |
145 | 3.07M | match *ext { |
146 | 2.51M | TlsExtension::SNI(_) => TlsExtensionType::ServerName, |
147 | 405 | TlsExtension::MaxFragmentLength(_) => TlsExtensionType::MaxFragmentLength, |
148 | 45.0k | TlsExtension::StatusRequest(_) => TlsExtensionType::StatusRequest, |
149 | 2.22k | TlsExtension::EllipticCurves(_) => TlsExtensionType::SupportedGroups, |
150 | 2.11k | TlsExtension::EcPointFormats(_) => TlsExtensionType::EcPointFormats, |
151 | 2.21k | TlsExtension::SignatureAlgorithms(_) => TlsExtensionType::SignatureAlgorithms, |
152 | 2.06k | TlsExtension::SessionTicket(_) => TlsExtensionType::SessionTicketTLS, |
153 | 458 | TlsExtension::RecordSizeLimit(_) => TlsExtensionType::RecordSizeLimit, |
154 | 891 | TlsExtension::KeyShareOld(_) => TlsExtensionType::KeyShareOld, |
155 | 888 | TlsExtension::KeyShare(_) => TlsExtensionType::KeyShare, |
156 | 1.89k | TlsExtension::PreSharedKey(_) => TlsExtensionType::PreSharedKey, |
157 | 1.45k | TlsExtension::EarlyData(_) => TlsExtensionType::EarlyData, |
158 | 5.26k | TlsExtension::SupportedVersions(_) => TlsExtensionType::SupportedVersions, |
159 | 1.28k | TlsExtension::Cookie(_) => TlsExtensionType::Cookie, |
160 | 1.92k | TlsExtension::PskExchangeModes(_) => TlsExtensionType::PskExchangeModes, |
161 | 405 | TlsExtension::Heartbeat(_) => TlsExtensionType::Heartbeat, |
162 | 6.87k | TlsExtension::ALPN(_) => TlsExtensionType::ApplicationLayerProtocolNegotiation, |
163 | 3.32k | TlsExtension::SignedCertificateTimestamp(_) => TlsExtensionType::SignedCertificateTimestamp, |
164 | 1.60k | TlsExtension::Padding(_) => TlsExtensionType::Padding, |
165 | 1.20k | TlsExtension::EncryptThenMac => TlsExtensionType::EncryptThenMac, |
166 | 415 | TlsExtension::ExtendedMasterSecret => TlsExtensionType::ExtendedMasterSecret, |
167 | 2.90k | TlsExtension::OidFilters(_) => TlsExtensionType::OidFilters, |
168 | 1.19k | TlsExtension::PostHandshakeAuth => TlsExtensionType::PostHandshakeAuth, |
169 | 135 | TlsExtension::NextProtocolNegotiation => TlsExtensionType::NextProtocolNegotiation, |
170 | 539 | TlsExtension::RenegotiationInfo(_) => TlsExtensionType::RenegotiationInfo, |
171 | 206 | TlsExtension::EncryptedServerName{..} => TlsExtensionType::EncryptedServerName, |
172 | 1.00k | TlsExtension::Grease(_,_) => TlsExtensionType::Grease, |
173 | 477k | TlsExtension::Unknown(x,_) => x |
174 | | } |
175 | 3.07M | } <tls_parser::tls_extensions::TlsExtensionType as core::convert::From<&tls_parser::tls_extensions::TlsExtension>>::from Line | Count | Source | 144 | 1.35M | fn from(ext: &TlsExtension) -> TlsExtensionType { | 145 | 1.35M | match *ext { | 146 | 1.05M | TlsExtension::SNI(_) => TlsExtensionType::ServerName, | 147 | 330 | TlsExtension::MaxFragmentLength(_) => TlsExtensionType::MaxFragmentLength, | 148 | 44.1k | TlsExtension::StatusRequest(_) => TlsExtensionType::StatusRequest, | 149 | 1.50k | TlsExtension::EllipticCurves(_) => TlsExtensionType::SupportedGroups, | 150 | 963 | TlsExtension::EcPointFormats(_) => TlsExtensionType::EcPointFormats, | 151 | 1.32k | TlsExtension::SignatureAlgorithms(_) => TlsExtensionType::SignatureAlgorithms, | 152 | 962 | TlsExtension::SessionTicket(_) => TlsExtensionType::SessionTicketTLS, | 153 | 245 | TlsExtension::RecordSizeLimit(_) => TlsExtensionType::RecordSizeLimit, | 154 | 357 | TlsExtension::KeyShareOld(_) => TlsExtensionType::KeyShareOld, | 155 | 510 | TlsExtension::KeyShare(_) => TlsExtensionType::KeyShare, | 156 | 728 | TlsExtension::PreSharedKey(_) => TlsExtensionType::PreSharedKey, | 157 | 621 | TlsExtension::EarlyData(_) => TlsExtensionType::EarlyData, | 158 | 2.37k | TlsExtension::SupportedVersions(_) => TlsExtensionType::SupportedVersions, | 159 | 528 | TlsExtension::Cookie(_) => TlsExtensionType::Cookie, | 160 | 813 | TlsExtension::PskExchangeModes(_) => TlsExtensionType::PskExchangeModes, | 161 | 207 | TlsExtension::Heartbeat(_) => TlsExtensionType::Heartbeat, | 162 | 3.08k | TlsExtension::ALPN(_) => TlsExtensionType::ApplicationLayerProtocolNegotiation, | 163 | 2.21k | TlsExtension::SignedCertificateTimestamp(_) => TlsExtensionType::SignedCertificateTimestamp, | 164 | 1.40k | TlsExtension::Padding(_) => TlsExtensionType::Padding, | 165 | 998 | TlsExtension::EncryptThenMac => TlsExtensionType::EncryptThenMac, | 166 | 316 | TlsExtension::ExtendedMasterSecret => TlsExtensionType::ExtendedMasterSecret, | 167 | 1.23k | TlsExtension::OidFilters(_) => TlsExtensionType::OidFilters, | 168 | 724 | TlsExtension::PostHandshakeAuth => TlsExtensionType::PostHandshakeAuth, | 169 | 66 | TlsExtension::NextProtocolNegotiation => TlsExtensionType::NextProtocolNegotiation, | 170 | 295 | TlsExtension::RenegotiationInfo(_) => TlsExtensionType::RenegotiationInfo, | 171 | 86 | TlsExtension::EncryptedServerName{..} => TlsExtensionType::EncryptedServerName, | 172 | 380 | TlsExtension::Grease(_,_) => TlsExtensionType::Grease, | 173 | 229k | TlsExtension::Unknown(x,_) => x | 174 | | } | 175 | 1.35M | } |
<tls_parser::tls_extensions::TlsExtensionType as core::convert::From<&tls_parser::tls_extensions::TlsExtension>>::from Line | Count | Source | 144 | 1.72M | fn from(ext: &TlsExtension) -> TlsExtensionType { | 145 | 1.72M | match *ext { | 146 | 1.45M | TlsExtension::SNI(_) => TlsExtensionType::ServerName, | 147 | 75 | TlsExtension::MaxFragmentLength(_) => TlsExtensionType::MaxFragmentLength, | 148 | 866 | TlsExtension::StatusRequest(_) => TlsExtensionType::StatusRequest, | 149 | 716 | TlsExtension::EllipticCurves(_) => TlsExtensionType::SupportedGroups, | 150 | 1.15k | TlsExtension::EcPointFormats(_) => TlsExtensionType::EcPointFormats, | 151 | 894 | TlsExtension::SignatureAlgorithms(_) => TlsExtensionType::SignatureAlgorithms, | 152 | 1.10k | TlsExtension::SessionTicket(_) => TlsExtensionType::SessionTicketTLS, | 153 | 213 | TlsExtension::RecordSizeLimit(_) => TlsExtensionType::RecordSizeLimit, | 154 | 534 | TlsExtension::KeyShareOld(_) => TlsExtensionType::KeyShareOld, | 155 | 378 | TlsExtension::KeyShare(_) => TlsExtensionType::KeyShare, | 156 | 1.16k | TlsExtension::PreSharedKey(_) => TlsExtensionType::PreSharedKey, | 157 | 833 | TlsExtension::EarlyData(_) => TlsExtensionType::EarlyData, | 158 | 2.88k | TlsExtension::SupportedVersions(_) => TlsExtensionType::SupportedVersions, | 159 | 759 | TlsExtension::Cookie(_) => TlsExtensionType::Cookie, | 160 | 1.10k | TlsExtension::PskExchangeModes(_) => TlsExtensionType::PskExchangeModes, | 161 | 198 | TlsExtension::Heartbeat(_) => TlsExtensionType::Heartbeat, | 162 | 3.78k | TlsExtension::ALPN(_) => TlsExtensionType::ApplicationLayerProtocolNegotiation, | 163 | 1.11k | TlsExtension::SignedCertificateTimestamp(_) => TlsExtensionType::SignedCertificateTimestamp, | 164 | 198 | TlsExtension::Padding(_) => TlsExtensionType::Padding, | 165 | 209 | TlsExtension::EncryptThenMac => TlsExtensionType::EncryptThenMac, | 166 | 99 | TlsExtension::ExtendedMasterSecret => TlsExtensionType::ExtendedMasterSecret, | 167 | 1.67k | TlsExtension::OidFilters(_) => TlsExtensionType::OidFilters, | 168 | 467 | TlsExtension::PostHandshakeAuth => TlsExtensionType::PostHandshakeAuth, | 169 | 69 | TlsExtension::NextProtocolNegotiation => TlsExtensionType::NextProtocolNegotiation, | 170 | 244 | TlsExtension::RenegotiationInfo(_) => TlsExtensionType::RenegotiationInfo, | 171 | 120 | TlsExtension::EncryptedServerName{..} => TlsExtensionType::EncryptedServerName, | 172 | 620 | TlsExtension::Grease(_,_) => TlsExtensionType::Grease, | 173 | 247k | TlsExtension::Unknown(x,_) => x | 174 | | } | 175 | 1.72M | } |
|
176 | | } |
177 | | |
178 | | #[derive(Clone, Debug, PartialEq)] |
179 | | pub struct KeyShareEntry<'a> { |
180 | | pub group: NamedGroup, // NamedGroup |
181 | | pub kx: &'a [u8], // Key Exchange Data |
182 | | } |
183 | | |
184 | 0 | #[derive(Clone, Copy, Debug, PartialEq, Eq, NomBE)] Unexecuted instantiation: <tls_parser::tls_extensions::PskKeyExchangeMode as nom_derive::traits::Parse<&[u8]>>::parse_be Unexecuted instantiation: <tls_parser::tls_extensions::PskKeyExchangeMode as nom_derive::traits::Parse<&[u8]>>::parse_le Unexecuted instantiation: <tls_parser::tls_extensions::PskKeyExchangeMode as nom_derive::traits::Parse<&[u8]>>::parse Unexecuted instantiation: <tls_parser::tls_extensions::PskKeyExchangeMode as nom_derive::traits::Parse<&[u8]>>::parse_be Unexecuted instantiation: <tls_parser::tls_extensions::PskKeyExchangeMode as nom_derive::traits::Parse<&[u8]>>::parse_le Unexecuted instantiation: <tls_parser::tls_extensions::PskKeyExchangeMode as nom_derive::traits::Parse<&[u8]>>::parse |
185 | | pub struct PskKeyExchangeMode(pub u8); |
186 | | |
187 | | newtype_enum! { |
188 | | impl PskKeyExchangeMode { |
189 | | Psk = 0, |
190 | | PskDhe = 1, |
191 | | } |
192 | | } |
193 | | |
194 | 335k | #[derive(Clone, Copy, Debug, PartialEq, Eq, NomBE)] <tls_parser::tls_extensions::SNIType as nom_derive::traits::Parse<&[u8]>>::parse_be Line | Count | Source | 194 | 171k | #[derive(Clone, Copy, Debug, PartialEq, Eq, NomBE)] |
Unexecuted instantiation: <tls_parser::tls_extensions::SNIType as nom_derive::traits::Parse<&[u8]>>::parse_le <tls_parser::tls_extensions::SNIType as nom_derive::traits::Parse<&[u8]>>::parse Line | Count | Source | 194 | 167k | #[derive(Clone, Copy, Debug, PartialEq, Eq, NomBE)] |
<tls_parser::tls_extensions::SNIType as nom_derive::traits::Parse<&[u8]>>::parse_be Line | Count | Source | 194 | 163k | #[derive(Clone, Copy, Debug, PartialEq, Eq, NomBE)] |
Unexecuted instantiation: <tls_parser::tls_extensions::SNIType as nom_derive::traits::Parse<&[u8]>>::parse_le <tls_parser::tls_extensions::SNIType as nom_derive::traits::Parse<&[u8]>>::parse Line | Count | Source | 194 | 160k | #[derive(Clone, Copy, Debug, PartialEq, Eq, NomBE)] |
|
195 | | pub struct SNIType(pub u8); |
196 | | |
197 | | newtype_enum! { |
198 | | impl display SNIType { |
199 | | HostName = 0, |
200 | | } |
201 | | } |
202 | | |
203 | 0 | #[derive(Clone, Copy, PartialEq, Eq, NomBE)] Unexecuted instantiation: <tls_parser::tls_extensions::CertificateStatusType as nom_derive::traits::Parse<&[u8]>>::parse_be Unexecuted instantiation: <tls_parser::tls_extensions::CertificateStatusType as nom_derive::traits::Parse<&[u8]>>::parse_le Unexecuted instantiation: <tls_parser::tls_extensions::CertificateStatusType as nom_derive::traits::Parse<&[u8]>>::parse Unexecuted instantiation: <tls_parser::tls_extensions::CertificateStatusType as nom_derive::traits::Parse<&[u8]>>::parse_be Unexecuted instantiation: <tls_parser::tls_extensions::CertificateStatusType as nom_derive::traits::Parse<&[u8]>>::parse_le Unexecuted instantiation: <tls_parser::tls_extensions::CertificateStatusType as nom_derive::traits::Parse<&[u8]>>::parse |
204 | | pub struct CertificateStatusType(pub u8); |
205 | | |
206 | | newtype_enum! { |
207 | | impl debug CertificateStatusType { |
208 | | OCSP = 1, |
209 | | } |
210 | | } |
211 | | |
212 | | #[derive(Clone, Debug, PartialEq)] |
213 | | pub struct OidFilter<'a> { |
214 | | pub cert_ext_oid: &'a [u8], |
215 | | pub cert_ext_val: &'a [u8], |
216 | | } |
217 | | |
218 | | // struct { |
219 | | // NameType name_type; |
220 | | // select (name_type) { |
221 | | // case host_name: HostName; |
222 | | // } name; |
223 | | // } ServerName; |
224 | | // |
225 | | // enum { |
226 | | // host_name(0), (255) |
227 | | // } NameType; |
228 | | // |
229 | | // opaque HostName<1..2^16-1>; |
230 | 328k | pub fn parse_tls_extension_sni_hostname(i: &[u8]) -> IResult<&[u8], (SNIType, &[u8])> { |
231 | 328k | let (i, t) = SNIType::parse(i)?; |
232 | 320k | let (i, v) = length_data(be_u16)(i)?; |
233 | 318k | Ok((i, (t, v))) |
234 | 328k | } tls_parser::tls_extensions::parse_tls_extension_sni_hostname Line | Count | Source | 230 | 167k | pub fn parse_tls_extension_sni_hostname(i: &[u8]) -> IResult<&[u8], (SNIType, &[u8])> { | 231 | 167k | let (i, t) = SNIType::parse(i)?; | 232 | 163k | let (i, v) = length_data(be_u16)(i)?; | 233 | 162k | Ok((i, (t, v))) | 234 | 167k | } |
tls_parser::tls_extensions::parse_tls_extension_sni_hostname Line | Count | Source | 230 | 160k | pub fn parse_tls_extension_sni_hostname(i: &[u8]) -> IResult<&[u8], (SNIType, &[u8])> { | 231 | 160k | let (i, t) = SNIType::parse(i)?; | 232 | 157k | let (i, v) = length_data(be_u16)(i)?; | 233 | 156k | Ok((i, (t, v))) | 234 | 160k | } |
|
235 | | |
236 | | // struct { |
237 | | // ServerName server_name_list<1..2^16-1> |
238 | | // } ServerNameList; |
239 | 2.51M | pub fn parse_tls_extension_sni_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
240 | 2.51M | if i.is_empty() { |
241 | | // special case: SNI extension in server can be empty |
242 | 2.50M | return Ok((i, TlsExtension::SNI(Vec::new()))); |
243 | 10.8k | } |
244 | 10.8k | let (i, list_len) = be_u16(i)?; |
245 | 10.1k | let (i, v) = map_parser( |
246 | 10.1k | take(list_len), |
247 | 10.1k | many0(complete(parse_tls_extension_sni_hostname)), |
248 | 10.1k | )(i)?; |
249 | 9.41k | Ok((i, TlsExtension::SNI(v))) |
250 | 2.51M | } tls_parser::tls_extensions::parse_tls_extension_sni_content Line | Count | Source | 239 | 1.05M | pub fn parse_tls_extension_sni_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 240 | 1.05M | if i.is_empty() { | 241 | | // special case: SNI extension in server can be empty | 242 | 1.05M | return Ok((i, TlsExtension::SNI(Vec::new()))); | 243 | 5.57k | } | 244 | 5.57k | let (i, list_len) = be_u16(i)?; | 245 | 5.36k | let (i, v) = map_parser( | 246 | 5.36k | take(list_len), | 247 | 5.36k | many0(complete(parse_tls_extension_sni_hostname)), | 248 | 5.36k | )(i)?; | 249 | 5.02k | Ok((i, TlsExtension::SNI(v))) | 250 | 1.05M | } |
tls_parser::tls_extensions::parse_tls_extension_sni_content Line | Count | Source | 239 | 1.45M | pub fn parse_tls_extension_sni_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 240 | 1.45M | if i.is_empty() { | 241 | | // special case: SNI extension in server can be empty | 242 | 1.45M | return Ok((i, TlsExtension::SNI(Vec::new()))); | 243 | 5.25k | } | 244 | 5.25k | let (i, list_len) = be_u16(i)?; | 245 | 4.74k | let (i, v) = map_parser( | 246 | 4.74k | take(list_len), | 247 | 4.74k | many0(complete(parse_tls_extension_sni_hostname)), | 248 | 4.74k | )(i)?; | 249 | 4.39k | Ok((i, TlsExtension::SNI(v))) | 250 | 1.45M | } |
|
251 | | |
252 | 0 | pub fn parse_tls_extension_sni(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
253 | 0 | let (i, _) = tag([0x00, 0x00])(i)?; |
254 | 0 | map_parser(length_data(be_u16), parse_tls_extension_sni_content)(i) |
255 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_sni Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_sni |
256 | | |
257 | | /// Max fragment length [RFC6066] |
258 | 1.08k | pub fn parse_tls_extension_max_fragment_length_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
259 | 1.08k | map(be_u8, TlsExtension::MaxFragmentLength)(i) |
260 | 1.08k | } tls_parser::tls_extensions::parse_tls_extension_max_fragment_length_content Line | Count | Source | 258 | 574 | pub fn parse_tls_extension_max_fragment_length_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 259 | 574 | map(be_u8, TlsExtension::MaxFragmentLength)(i) | 260 | 574 | } |
tls_parser::tls_extensions::parse_tls_extension_max_fragment_length_content Line | Count | Source | 258 | 508 | pub fn parse_tls_extension_max_fragment_length_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 259 | 508 | map(be_u8, TlsExtension::MaxFragmentLength)(i) | 260 | 508 | } |
|
261 | | |
262 | | /// Max fragment length [RFC6066] |
263 | 0 | pub fn parse_tls_extension_max_fragment_length(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
264 | 0 | let (i, _) = tag([0x00, 0x01])(i)?; |
265 | 0 | map_parser( |
266 | 0 | length_data(be_u16), |
267 | 0 | parse_tls_extension_max_fragment_length_content, |
268 | 0 | )(i) |
269 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_max_fragment_length Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_max_fragment_length |
270 | | |
271 | | /// Status Request [RFC6066] |
272 | 45.0k | fn parse_tls_extension_status_request_content( |
273 | 45.0k | i: &[u8], |
274 | 45.0k | ext_len: u16, |
275 | 45.0k | ) -> IResult<&[u8], TlsExtension> { |
276 | 45.0k | match ext_len { |
277 | 40.6k | 0 => Ok((i, TlsExtension::StatusRequest(None))), |
278 | | _ => { |
279 | 4.38k | let (i, status_type) = be_u8(i)?; |
280 | 4.38k | let (i, request) = take(ext_len - 1)(i)?; |
281 | 4.38k | Ok(( |
282 | 4.38k | i, |
283 | 4.38k | TlsExtension::StatusRequest(Some((CertificateStatusType(status_type), request))), |
284 | 4.38k | )) |
285 | | } |
286 | | } |
287 | 45.0k | } tls_parser::tls_extensions::parse_tls_extension_status_request_content Line | Count | Source | 272 | 44.1k | fn parse_tls_extension_status_request_content( | 273 | 44.1k | i: &[u8], | 274 | 44.1k | ext_len: u16, | 275 | 44.1k | ) -> IResult<&[u8], TlsExtension> { | 276 | 44.1k | match ext_len { | 277 | 40.1k | 0 => Ok((i, TlsExtension::StatusRequest(None))), | 278 | | _ => { | 279 | 3.97k | let (i, status_type) = be_u8(i)?; | 280 | 3.97k | let (i, request) = take(ext_len - 1)(i)?; | 281 | 3.97k | Ok(( | 282 | 3.97k | i, | 283 | 3.97k | TlsExtension::StatusRequest(Some((CertificateStatusType(status_type), request))), | 284 | 3.97k | )) | 285 | | } | 286 | | } | 287 | 44.1k | } |
tls_parser::tls_extensions::parse_tls_extension_status_request_content Line | Count | Source | 272 | 866 | fn parse_tls_extension_status_request_content( | 273 | 866 | i: &[u8], | 274 | 866 | ext_len: u16, | 275 | 866 | ) -> IResult<&[u8], TlsExtension> { | 276 | 866 | match ext_len { | 277 | 447 | 0 => Ok((i, TlsExtension::StatusRequest(None))), | 278 | | _ => { | 279 | 419 | let (i, status_type) = be_u8(i)?; | 280 | 419 | let (i, request) = take(ext_len - 1)(i)?; | 281 | 419 | Ok(( | 282 | 419 | i, | 283 | 419 | TlsExtension::StatusRequest(Some((CertificateStatusType(status_type), request))), | 284 | 419 | )) | 285 | | } | 286 | | } | 287 | 866 | } |
|
288 | | |
289 | 0 | pub fn parse_tls_extension_status_request(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
290 | 0 | let (i, _) = tag([0x00, 0x05])(i)?; |
291 | 0 | let (i, ext_len) = be_u16(i)?; |
292 | 0 | map_parser(take(ext_len), move |d| { |
293 | 0 | parse_tls_extension_status_request_content(d, ext_len) |
294 | 0 | })(i) Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_status_request::{closure#0} Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_status_request::{closure#0} |
295 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_status_request Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_status_request |
296 | | |
297 | | // defined in rfc8422 |
298 | 3.61k | pub fn parse_tls_extension_elliptic_curves_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
299 | 3.61k | map_parser( |
300 | 3.61k | length_data(be_u16), |
301 | 3.61k | map(parse_named_groups, TlsExtension::EllipticCurves), |
302 | 3.61k | )(i) |
303 | 3.61k | } tls_parser::tls_extensions::parse_tls_extension_elliptic_curves_content Line | Count | Source | 298 | 2.20k | pub fn parse_tls_extension_elliptic_curves_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 299 | 2.20k | map_parser( | 300 | 2.20k | length_data(be_u16), | 301 | 2.20k | map(parse_named_groups, TlsExtension::EllipticCurves), | 302 | 2.20k | )(i) | 303 | 2.20k | } |
tls_parser::tls_extensions::parse_tls_extension_elliptic_curves_content Line | Count | Source | 298 | 1.40k | pub fn parse_tls_extension_elliptic_curves_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 299 | 1.40k | map_parser( | 300 | 1.40k | length_data(be_u16), | 301 | 1.40k | map(parse_named_groups, TlsExtension::EllipticCurves), | 302 | 1.40k | )(i) | 303 | 1.40k | } |
|
304 | | |
305 | 0 | pub fn parse_tls_extension_elliptic_curves(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
306 | 0 | let (i, _) = tag([0x00, 0x0a])(i)?; |
307 | 0 | map_parser( |
308 | 0 | length_data(be_u16), |
309 | 0 | parse_tls_extension_elliptic_curves_content, |
310 | 0 | )(i) |
311 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_elliptic_curves Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_elliptic_curves |
312 | | |
313 | 2.90k | pub fn parse_tls_extension_ec_point_formats_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
314 | 2.90k | map(length_data(be_u8), TlsExtension::EcPointFormats)(i) |
315 | 2.90k | } tls_parser::tls_extensions::parse_tls_extension_ec_point_formats_content Line | Count | Source | 313 | 1.51k | pub fn parse_tls_extension_ec_point_formats_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 314 | 1.51k | map(length_data(be_u8), TlsExtension::EcPointFormats)(i) | 315 | 1.51k | } |
tls_parser::tls_extensions::parse_tls_extension_ec_point_formats_content Line | Count | Source | 313 | 1.39k | pub fn parse_tls_extension_ec_point_formats_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 314 | 1.39k | map(length_data(be_u8), TlsExtension::EcPointFormats)(i) | 315 | 1.39k | } |
|
316 | | |
317 | 0 | pub fn parse_tls_extension_ec_point_formats(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
318 | 0 | let (i, _) = tag([0x00, 0x0a])(i)?; |
319 | 0 | map_parser( |
320 | 0 | length_data(be_u16), |
321 | 0 | parse_tls_extension_ec_point_formats_content, |
322 | 0 | )(i) |
323 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_ec_point_formats Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_ec_point_formats |
324 | | |
325 | | /// Parse 'Signature Algorithms' extension (rfc8446, TLS 1.3 only) |
326 | 3.34k | pub fn parse_tls_extension_signature_algorithms_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
327 | 3.34k | let (i, l) = map_parser(length_data(be_u16), many0(complete(be_u16)))(i)?; |
328 | 2.21k | Ok((i, TlsExtension::SignatureAlgorithms(l))) // XXX SignatureAlgorithms or SignatureScheme |
329 | 3.34k | } tls_parser::tls_extensions::parse_tls_extension_signature_algorithms_content Line | Count | Source | 326 | 1.86k | pub fn parse_tls_extension_signature_algorithms_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 327 | 1.86k | let (i, l) = map_parser(length_data(be_u16), many0(complete(be_u16)))(i)?; | 328 | 1.32k | Ok((i, TlsExtension::SignatureAlgorithms(l))) // XXX SignatureAlgorithms or SignatureScheme | 329 | 1.86k | } |
tls_parser::tls_extensions::parse_tls_extension_signature_algorithms_content Line | Count | Source | 326 | 1.47k | pub fn parse_tls_extension_signature_algorithms_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 327 | 1.47k | let (i, l) = map_parser(length_data(be_u16), many0(complete(be_u16)))(i)?; | 328 | 894 | Ok((i, TlsExtension::SignatureAlgorithms(l))) // XXX SignatureAlgorithms or SignatureScheme | 329 | 1.47k | } |
|
330 | | |
331 | 0 | pub fn parse_tls_extension_signature_algorithms(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
332 | 0 | let (i, _) = tag([0x00, 13])(i)?; |
333 | 0 | map_parser( |
334 | 0 | length_data(be_u16), |
335 | 0 | parse_tls_extension_signature_algorithms_content, |
336 | 0 | )(i) |
337 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_signature_algorithms Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_signature_algorithms |
338 | | |
339 | | // rfc6520 |
340 | 669 | pub fn parse_tls_extension_heartbeat_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
341 | 669 | map(be_u8, TlsExtension::Heartbeat)(i) |
342 | 669 | } tls_parser::tls_extensions::parse_tls_extension_heartbeat_content Line | Count | Source | 340 | 401 | pub fn parse_tls_extension_heartbeat_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 341 | 401 | map(be_u8, TlsExtension::Heartbeat)(i) | 342 | 401 | } |
tls_parser::tls_extensions::parse_tls_extension_heartbeat_content Line | Count | Source | 340 | 268 | pub fn parse_tls_extension_heartbeat_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 341 | 268 | map(be_u8, TlsExtension::Heartbeat)(i) | 342 | 268 | } |
|
343 | | |
344 | 0 | pub fn parse_tls_extension_heartbeat(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
345 | 0 | let (i, _) = tag([0x00, 0x0d])(i)?; |
346 | 0 | let (i, ext_len) = verify(be_u16, |&n| n == 1)(i)?; Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_heartbeat::{closure#0} Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_heartbeat::{closure#0} |
347 | 0 | map_parser(take(ext_len), parse_tls_extension_heartbeat_content)(i) |
348 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_heartbeat Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_heartbeat |
349 | | |
350 | 793k | fn parse_protocol_name(i: &[u8]) -> IResult<&[u8], &[u8]> { |
351 | 793k | length_data(be_u8)(i) |
352 | 793k | } tls_parser::tls_extensions::parse_protocol_name Line | Count | Source | 350 | 361k | fn parse_protocol_name(i: &[u8]) -> IResult<&[u8], &[u8]> { | 351 | 361k | length_data(be_u8)(i) | 352 | 361k | } |
tls_parser::tls_extensions::parse_protocol_name Line | Count | Source | 350 | 431k | fn parse_protocol_name(i: &[u8]) -> IResult<&[u8], &[u8]> { | 351 | 431k | length_data(be_u8)(i) | 352 | 431k | } |
|
353 | | |
354 | | /// Defined in [RFC7301] |
355 | 7.91k | pub fn parse_tls_extension_alpn_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
356 | 7.91k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_protocol_name)))(i)?; |
357 | 6.87k | Ok((i, TlsExtension::ALPN(v))) |
358 | 7.91k | } tls_parser::tls_extensions::parse_tls_extension_alpn_content Line | Count | Source | 355 | 3.62k | pub fn parse_tls_extension_alpn_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 356 | 3.62k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_protocol_name)))(i)?; | 357 | 3.08k | Ok((i, TlsExtension::ALPN(v))) | 358 | 3.62k | } |
tls_parser::tls_extensions::parse_tls_extension_alpn_content Line | Count | Source | 355 | 4.29k | pub fn parse_tls_extension_alpn_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 356 | 4.29k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_protocol_name)))(i)?; | 357 | 3.78k | Ok((i, TlsExtension::ALPN(v))) | 358 | 4.29k | } |
|
359 | | |
360 | | /// Defined in [RFC7685] |
361 | 1.60k | fn parse_tls_extension_padding_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { |
362 | 1.60k | map(take(ext_len), TlsExtension::Padding)(i) |
363 | 1.60k | } tls_parser::tls_extensions::parse_tls_extension_padding_content Line | Count | Source | 361 | 1.40k | fn parse_tls_extension_padding_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 362 | 1.40k | map(take(ext_len), TlsExtension::Padding)(i) | 363 | 1.40k | } |
tls_parser::tls_extensions::parse_tls_extension_padding_content Line | Count | Source | 361 | 198 | fn parse_tls_extension_padding_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 362 | 198 | map(take(ext_len), TlsExtension::Padding)(i) | 363 | 198 | } |
|
364 | | |
365 | | /// Defined in [RFC6962] |
366 | 3.32k | pub fn parse_tls_extension_signed_certificate_timestamp_content( |
367 | 3.32k | i: &[u8], |
368 | 3.32k | ) -> IResult<&[u8], TlsExtension> { |
369 | 3.32k | map( |
370 | 3.32k | opt(complete(length_data(be_u16))), |
371 | 3.32k | TlsExtension::SignedCertificateTimestamp, |
372 | 3.32k | )(i) |
373 | 3.32k | } tls_parser::tls_extensions::parse_tls_extension_signed_certificate_timestamp_content Line | Count | Source | 366 | 2.21k | pub fn parse_tls_extension_signed_certificate_timestamp_content( | 367 | 2.21k | i: &[u8], | 368 | 2.21k | ) -> IResult<&[u8], TlsExtension> { | 369 | 2.21k | map( | 370 | 2.21k | opt(complete(length_data(be_u16))), | 371 | 2.21k | TlsExtension::SignedCertificateTimestamp, | 372 | 2.21k | )(i) | 373 | 2.21k | } |
tls_parser::tls_extensions::parse_tls_extension_signed_certificate_timestamp_content Line | Count | Source | 366 | 1.11k | pub fn parse_tls_extension_signed_certificate_timestamp_content( | 367 | 1.11k | i: &[u8], | 368 | 1.11k | ) -> IResult<&[u8], TlsExtension> { | 369 | 1.11k | map( | 370 | 1.11k | opt(complete(length_data(be_u16))), | 371 | 1.11k | TlsExtension::SignedCertificateTimestamp, | 372 | 1.11k | )(i) | 373 | 1.11k | } |
|
374 | | |
375 | | /// Encrypt-then-MAC is defined in [RFC7366] |
376 | 1.46k | fn parse_tls_extension_encrypt_then_mac_content( |
377 | 1.46k | i: &[u8], |
378 | 1.46k | ext_len: u16, |
379 | 1.46k | ) -> IResult<&[u8], TlsExtension> { |
380 | 1.46k | if ext_len != 0 { |
381 | 262 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
382 | 1.20k | } |
383 | 1.20k | Ok((i, TlsExtension::EncryptThenMac)) |
384 | 1.46k | } tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac_content Line | Count | Source | 376 | 1.19k | fn parse_tls_extension_encrypt_then_mac_content( | 377 | 1.19k | i: &[u8], | 378 | 1.19k | ext_len: u16, | 379 | 1.19k | ) -> IResult<&[u8], TlsExtension> { | 380 | 1.19k | if ext_len != 0 { | 381 | 195 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 382 | 998 | } | 383 | 998 | Ok((i, TlsExtension::EncryptThenMac)) | 384 | 1.19k | } |
tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac_content Line | Count | Source | 376 | 276 | fn parse_tls_extension_encrypt_then_mac_content( | 377 | 276 | i: &[u8], | 378 | 276 | ext_len: u16, | 379 | 276 | ) -> IResult<&[u8], TlsExtension> { | 380 | 276 | if ext_len != 0 { | 381 | 67 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 382 | 209 | } | 383 | 209 | Ok((i, TlsExtension::EncryptThenMac)) | 384 | 276 | } |
|
385 | | |
386 | | /// Encrypt-then-MAC is defined in [RFC7366] |
387 | 0 | pub fn parse_tls_extension_encrypt_then_mac(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
388 | 0 | let (i, _) = tag([0x00, 0x16])(i)?; |
389 | 0 | let (i, ext_len) = be_u16(i)?; |
390 | 0 | map_parser(take(ext_len), move |d| { |
391 | 0 | parse_tls_extension_encrypt_then_mac_content(d, ext_len) |
392 | 0 | })(i) Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac::{closure#0} Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac::{closure#0} |
393 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac |
394 | | |
395 | | /// Extended Master Secret is defined in [RFC7627] |
396 | 816 | fn parse_tls_extension_extended_master_secret_content( |
397 | 816 | i: &[u8], |
398 | 816 | ext_len: u16, |
399 | 816 | ) -> IResult<&[u8], TlsExtension> { |
400 | 816 | if ext_len != 0 { |
401 | 401 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
402 | 415 | } |
403 | 415 | Ok((i, TlsExtension::ExtendedMasterSecret)) |
404 | 816 | } tls_parser::tls_extensions::parse_tls_extension_extended_master_secret_content Line | Count | Source | 396 | 511 | fn parse_tls_extension_extended_master_secret_content( | 397 | 511 | i: &[u8], | 398 | 511 | ext_len: u16, | 399 | 511 | ) -> IResult<&[u8], TlsExtension> { | 400 | 511 | if ext_len != 0 { | 401 | 195 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 402 | 316 | } | 403 | 316 | Ok((i, TlsExtension::ExtendedMasterSecret)) | 404 | 511 | } |
tls_parser::tls_extensions::parse_tls_extension_extended_master_secret_content Line | Count | Source | 396 | 305 | fn parse_tls_extension_extended_master_secret_content( | 397 | 305 | i: &[u8], | 398 | 305 | ext_len: u16, | 399 | 305 | ) -> IResult<&[u8], TlsExtension> { | 400 | 305 | if ext_len != 0 { | 401 | 206 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 402 | 99 | } | 403 | 99 | Ok((i, TlsExtension::ExtendedMasterSecret)) | 404 | 305 | } |
|
405 | | |
406 | | /// Extended Master Secret is defined in [RFC7627] |
407 | 0 | pub fn parse_tls_extension_extended_master_secret(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
408 | 0 | let (i, _) = tag([0x00, 0x17])(i)?; |
409 | 0 | let (i, ext_len) = be_u16(i)?; |
410 | 0 | map_parser(take(ext_len), move |d| { |
411 | 0 | parse_tls_extension_extended_master_secret_content(d, ext_len) |
412 | 0 | })(i) Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_extended_master_secret::{closure#0} Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_extended_master_secret::{closure#0} |
413 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_extended_master_secret Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_extended_master_secret |
414 | | |
415 | | /// Extended Record Size Limit is defined in [RFC7627] |
416 | 790 | fn parse_tls_extension_record_size_limit(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
417 | 790 | map(be_u16, TlsExtension::RecordSizeLimit)(i) |
418 | 790 | } tls_parser::tls_extensions::parse_tls_extension_record_size_limit Line | Count | Source | 416 | 508 | fn parse_tls_extension_record_size_limit(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 417 | 508 | map(be_u16, TlsExtension::RecordSizeLimit)(i) | 418 | 508 | } |
tls_parser::tls_extensions::parse_tls_extension_record_size_limit Line | Count | Source | 416 | 282 | fn parse_tls_extension_record_size_limit(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 417 | 282 | map(be_u16, TlsExtension::RecordSizeLimit)(i) | 418 | 282 | } |
|
419 | | |
420 | 2.06k | fn parse_tls_extension_session_ticket_content( |
421 | 2.06k | i: &[u8], |
422 | 2.06k | ext_len: u16, |
423 | 2.06k | ) -> IResult<&[u8], TlsExtension> { |
424 | 2.06k | map(take(ext_len), TlsExtension::SessionTicket)(i) |
425 | 2.06k | } tls_parser::tls_extensions::parse_tls_extension_session_ticket_content Line | Count | Source | 420 | 962 | fn parse_tls_extension_session_ticket_content( | 421 | 962 | i: &[u8], | 422 | 962 | ext_len: u16, | 423 | 962 | ) -> IResult<&[u8], TlsExtension> { | 424 | 962 | map(take(ext_len), TlsExtension::SessionTicket)(i) | 425 | 962 | } |
tls_parser::tls_extensions::parse_tls_extension_session_ticket_content Line | Count | Source | 420 | 1.10k | fn parse_tls_extension_session_ticket_content( | 421 | 1.10k | i: &[u8], | 422 | 1.10k | ext_len: u16, | 423 | 1.10k | ) -> IResult<&[u8], TlsExtension> { | 424 | 1.10k | map(take(ext_len), TlsExtension::SessionTicket)(i) | 425 | 1.10k | } |
|
426 | | |
427 | 0 | pub fn parse_tls_extension_session_ticket(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
428 | 0 | let (i, _) = tag([0x00, 0x23])(i)?; |
429 | 0 | let (i, ext_len) = be_u16(i)?; |
430 | 0 | map_parser(take(ext_len), move |d| { |
431 | 0 | parse_tls_extension_session_ticket_content(d, ext_len) |
432 | 0 | })(i) Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_session_ticket::{closure#0} Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_session_ticket::{closure#0} |
433 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_session_ticket Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_session_ticket |
434 | | |
435 | 891 | fn parse_tls_extension_key_share_old_content( |
436 | 891 | i: &[u8], |
437 | 891 | ext_len: u16, |
438 | 891 | ) -> IResult<&[u8], TlsExtension> { |
439 | 891 | map(take(ext_len), TlsExtension::KeyShareOld)(i) |
440 | 891 | } tls_parser::tls_extensions::parse_tls_extension_key_share_old_content Line | Count | Source | 435 | 357 | fn parse_tls_extension_key_share_old_content( | 436 | 357 | i: &[u8], | 437 | 357 | ext_len: u16, | 438 | 357 | ) -> IResult<&[u8], TlsExtension> { | 439 | 357 | map(take(ext_len), TlsExtension::KeyShareOld)(i) | 440 | 357 | } |
tls_parser::tls_extensions::parse_tls_extension_key_share_old_content Line | Count | Source | 435 | 534 | fn parse_tls_extension_key_share_old_content( | 436 | 534 | i: &[u8], | 437 | 534 | ext_len: u16, | 438 | 534 | ) -> IResult<&[u8], TlsExtension> { | 439 | 534 | map(take(ext_len), TlsExtension::KeyShareOld)(i) | 440 | 534 | } |
|
441 | | |
442 | 888 | fn parse_tls_extension_key_share_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { |
443 | 888 | map(take(ext_len), TlsExtension::KeyShare)(i) |
444 | 888 | } tls_parser::tls_extensions::parse_tls_extension_key_share_content Line | Count | Source | 442 | 510 | fn parse_tls_extension_key_share_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 443 | 510 | map(take(ext_len), TlsExtension::KeyShare)(i) | 444 | 510 | } |
tls_parser::tls_extensions::parse_tls_extension_key_share_content Line | Count | Source | 442 | 378 | fn parse_tls_extension_key_share_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 443 | 378 | map(take(ext_len), TlsExtension::KeyShare)(i) | 444 | 378 | } |
|
445 | | |
446 | 0 | pub fn parse_tls_extension_key_share(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
447 | 0 | let (i, _) = tag([0x00, 0x33])(i)?; |
448 | 0 | let (i, ext_len) = be_u16(i)?; |
449 | 0 | map_parser(take(ext_len), move |d| { |
450 | 0 | parse_tls_extension_key_share_content(d, ext_len) |
451 | 0 | })(i) Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_key_share::{closure#0} Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_key_share::{closure#0} |
452 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_key_share Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_key_share |
453 | | |
454 | 1.89k | fn parse_tls_extension_pre_shared_key_content( |
455 | 1.89k | i: &[u8], |
456 | 1.89k | ext_len: u16, |
457 | 1.89k | ) -> IResult<&[u8], TlsExtension> { |
458 | 1.89k | map(take(ext_len), TlsExtension::PreSharedKey)(i) |
459 | 1.89k | } tls_parser::tls_extensions::parse_tls_extension_pre_shared_key_content Line | Count | Source | 454 | 728 | fn parse_tls_extension_pre_shared_key_content( | 455 | 728 | i: &[u8], | 456 | 728 | ext_len: u16, | 457 | 728 | ) -> IResult<&[u8], TlsExtension> { | 458 | 728 | map(take(ext_len), TlsExtension::PreSharedKey)(i) | 459 | 728 | } |
tls_parser::tls_extensions::parse_tls_extension_pre_shared_key_content Line | Count | Source | 454 | 1.16k | fn parse_tls_extension_pre_shared_key_content( | 455 | 1.16k | i: &[u8], | 456 | 1.16k | ext_len: u16, | 457 | 1.16k | ) -> IResult<&[u8], TlsExtension> { | 458 | 1.16k | map(take(ext_len), TlsExtension::PreSharedKey)(i) | 459 | 1.16k | } |
|
460 | | |
461 | 0 | pub fn parse_tls_extension_pre_shared_key(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
462 | 0 | let (i, _) = tag([0x00, 0x28])(i)?; |
463 | 0 | let (i, ext_len) = be_u16(i)?; |
464 | 0 | map_parser(take(ext_len), move |d| { |
465 | 0 | parse_tls_extension_pre_shared_key_content(d, ext_len) |
466 | 0 | })(i) Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_pre_shared_key::{closure#0} Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_pre_shared_key::{closure#0} |
467 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_pre_shared_key Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_pre_shared_key |
468 | | |
469 | 1.84k | fn parse_tls_extension_early_data_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { |
470 | 1.84k | map(cond(ext_len > 0, be_u32), TlsExtension::EarlyData)(i) |
471 | 1.84k | } tls_parser::tls_extensions::parse_tls_extension_early_data_content Line | Count | Source | 469 | 815 | fn parse_tls_extension_early_data_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 470 | 815 | map(cond(ext_len > 0, be_u32), TlsExtension::EarlyData)(i) | 471 | 815 | } |
tls_parser::tls_extensions::parse_tls_extension_early_data_content Line | Count | Source | 469 | 1.02k | fn parse_tls_extension_early_data_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 470 | 1.02k | map(cond(ext_len > 0, be_u32), TlsExtension::EarlyData)(i) | 471 | 1.02k | } |
|
472 | | |
473 | 0 | pub fn parse_tls_extension_early_data(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
474 | 0 | let (i, _) = tag([0x00, 0x2a])(i)?; |
475 | 0 | let (i, ext_len) = be_u16(i)?; |
476 | 0 | map_parser(take(ext_len), move |d| { |
477 | 0 | parse_tls_extension_early_data_content(d, ext_len) |
478 | 0 | })(i) Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_early_data::{closure#0} Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_early_data::{closure#0} |
479 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_early_data Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_early_data |
480 | | |
481 | | // TLS 1.3 draft 23 |
482 | | // struct { |
483 | | // select (Handshake.msg_type) { |
484 | | // case client_hello: |
485 | | // ProtocolVersion versions<2..254>; |
486 | | // |
487 | | // case server_hello: /* and HelloRetryRequest */ |
488 | | // ProtocolVersion selected_version; |
489 | | // }; |
490 | | // } SupportedVersions; |
491 | | // XXX the content depends on the current message type |
492 | | // XXX first case has length 1 + 2*n, while the second case has length 2 |
493 | 6.00k | fn parse_tls_extension_supported_versions_content( |
494 | 6.00k | i: &[u8], |
495 | 6.00k | ext_len: u16, |
496 | 6.00k | ) -> IResult<&[u8], TlsExtension> { |
497 | 6.00k | if ext_len == 2 { |
498 | 1.43k | map(be_u16, |x| { |
499 | 1.43k | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) |
500 | 1.43k | })(i) tls_parser::tls_extensions::parse_tls_extension_supported_versions_content::{closure#0} Line | Count | Source | 498 | 507 | map(be_u16, |x| { | 499 | 507 | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) | 500 | 507 | })(i) |
tls_parser::tls_extensions::parse_tls_extension_supported_versions_content::{closure#0} Line | Count | Source | 498 | 931 | map(be_u16, |x| { | 499 | 931 | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) | 500 | 931 | })(i) |
|
501 | | } else { |
502 | 4.56k | let (i, _) = be_u8(i)?; |
503 | 4.12k | if ext_len == 0 { |
504 | 0 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
505 | 4.12k | } |
506 | 4.12k | let (i, l) = map_parser(take(ext_len - 1), parse_tls_versions)(i)?; |
507 | 3.82k | Ok((i, TlsExtension::SupportedVersions(l))) |
508 | | } |
509 | 6.00k | } tls_parser::tls_extensions::parse_tls_extension_supported_versions_content Line | Count | Source | 493 | 2.78k | fn parse_tls_extension_supported_versions_content( | 494 | 2.78k | i: &[u8], | 495 | 2.78k | ext_len: u16, | 496 | 2.78k | ) -> IResult<&[u8], TlsExtension> { | 497 | 2.78k | if ext_len == 2 { | 498 | 507 | map(be_u16, |x| { | 499 | | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) | 500 | 507 | })(i) | 501 | | } else { | 502 | 2.27k | let (i, _) = be_u8(i)?; | 503 | 2.06k | if ext_len == 0 { | 504 | 0 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 505 | 2.06k | } | 506 | 2.06k | let (i, l) = map_parser(take(ext_len - 1), parse_tls_versions)(i)?; | 507 | 1.86k | Ok((i, TlsExtension::SupportedVersions(l))) | 508 | | } | 509 | 2.78k | } |
tls_parser::tls_extensions::parse_tls_extension_supported_versions_content Line | Count | Source | 493 | 3.22k | fn parse_tls_extension_supported_versions_content( | 494 | 3.22k | i: &[u8], | 495 | 3.22k | ext_len: u16, | 496 | 3.22k | ) -> IResult<&[u8], TlsExtension> { | 497 | 3.22k | if ext_len == 2 { | 498 | 931 | map(be_u16, |x| { | 499 | | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) | 500 | 931 | })(i) | 501 | | } else { | 502 | 2.29k | let (i, _) = be_u8(i)?; | 503 | 2.05k | if ext_len == 0 { | 504 | 0 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 505 | 2.05k | } | 506 | 2.05k | let (i, l) = map_parser(take(ext_len - 1), parse_tls_versions)(i)?; | 507 | 1.95k | Ok((i, TlsExtension::SupportedVersions(l))) | 508 | | } | 509 | 3.22k | } |
|
510 | | |
511 | 0 | pub fn parse_tls_extension_supported_versions(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
512 | 0 | let (i, _) = tag([0x00, 0x2b])(i)?; |
513 | 0 | let (i, ext_len) = be_u16(i)?; |
514 | 0 | map_parser(take(ext_len), move |d| { |
515 | 0 | parse_tls_extension_supported_versions_content(d, ext_len) |
516 | 0 | })(i) Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_supported_versions::{closure#0} Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_supported_versions::{closure#0} |
517 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_supported_versions Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_supported_versions |
518 | | |
519 | 1.28k | fn parse_tls_extension_cookie_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { |
520 | 1.28k | map(take(ext_len), TlsExtension::Cookie)(i) |
521 | 1.28k | } tls_parser::tls_extensions::parse_tls_extension_cookie_content Line | Count | Source | 519 | 528 | fn parse_tls_extension_cookie_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 520 | 528 | map(take(ext_len), TlsExtension::Cookie)(i) | 521 | 528 | } |
tls_parser::tls_extensions::parse_tls_extension_cookie_content Line | Count | Source | 519 | 759 | fn parse_tls_extension_cookie_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 520 | 759 | map(take(ext_len), TlsExtension::Cookie)(i) | 521 | 759 | } |
|
522 | | |
523 | 0 | pub fn parse_tls_extension_cookie(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
524 | 0 | let (i, _) = tag([0x00, 0x2c])(i)?; |
525 | 0 | let (i, ext_len) = be_u16(i)?; |
526 | 0 | map_parser(take(ext_len), move |d| { |
527 | 0 | parse_tls_extension_cookie_content(d, ext_len) |
528 | 0 | })(i) Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_cookie::{closure#0} Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_cookie::{closure#0} |
529 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_cookie Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_cookie |
530 | | |
531 | 2.60k | pub fn parse_tls_extension_psk_key_exchange_modes_content( |
532 | 2.60k | i: &[u8], |
533 | 2.60k | ) -> IResult<&[u8], TlsExtension> { |
534 | 2.60k | let (i, v) = length_data(be_u8)(i)?; |
535 | 1.92k | Ok((i, TlsExtension::PskExchangeModes(v.to_vec()))) |
536 | 2.60k | } tls_parser::tls_extensions::parse_tls_extension_psk_key_exchange_modes_content Line | Count | Source | 531 | 1.20k | pub fn parse_tls_extension_psk_key_exchange_modes_content( | 532 | 1.20k | i: &[u8], | 533 | 1.20k | ) -> IResult<&[u8], TlsExtension> { | 534 | 1.20k | let (i, v) = length_data(be_u8)(i)?; | 535 | 813 | Ok((i, TlsExtension::PskExchangeModes(v.to_vec()))) | 536 | 1.20k | } |
tls_parser::tls_extensions::parse_tls_extension_psk_key_exchange_modes_content Line | Count | Source | 531 | 1.39k | pub fn parse_tls_extension_psk_key_exchange_modes_content( | 532 | 1.39k | i: &[u8], | 533 | 1.39k | ) -> IResult<&[u8], TlsExtension> { | 534 | 1.39k | let (i, v) = length_data(be_u8)(i)?; | 535 | 1.10k | Ok((i, TlsExtension::PskExchangeModes(v.to_vec()))) | 536 | 1.39k | } |
|
537 | | |
538 | 0 | pub fn parse_tls_extension_psk_key_exchange_modes(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
539 | 0 | let (i, _) = tag([0x00, 0x2d])(i)?; |
540 | 0 | let (i, ext_len) = be_u16(i)?; |
541 | 0 | map_parser( |
542 | 0 | take(ext_len), |
543 | 0 | parse_tls_extension_psk_key_exchange_modes_content, |
544 | 0 | )(i) |
545 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_psk_key_exchange_modes Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_psk_key_exchange_modes |
546 | | |
547 | | /// Defined in RFC-draft-agl-tls-nextprotoneg-03. Deprecated in favour of ALPN. |
548 | 267 | fn parse_tls_extension_npn_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { |
549 | 267 | if ext_len != 0 { |
550 | 132 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
551 | 135 | } |
552 | 135 | Ok((i, TlsExtension::NextProtocolNegotiation)) |
553 | 267 | } tls_parser::tls_extensions::parse_tls_extension_npn_content Line | Count | Source | 548 | 132 | fn parse_tls_extension_npn_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 549 | 132 | if ext_len != 0 { | 550 | 66 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 551 | 66 | } | 552 | 66 | Ok((i, TlsExtension::NextProtocolNegotiation)) | 553 | 132 | } |
tls_parser::tls_extensions::parse_tls_extension_npn_content Line | Count | Source | 548 | 135 | fn parse_tls_extension_npn_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 549 | 135 | if ext_len != 0 { | 550 | 66 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 551 | 69 | } | 552 | 69 | Ok((i, TlsExtension::NextProtocolNegotiation)) | 553 | 135 | } |
|
554 | | |
555 | | /// Renegotiation Info, defined in [RFC5746] |
556 | 1.65k | pub fn parse_tls_extension_renegotiation_info_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
557 | 1.65k | map(length_data(be_u8), TlsExtension::RenegotiationInfo)(i) |
558 | 1.65k | } tls_parser::tls_extensions::parse_tls_extension_renegotiation_info_content Line | Count | Source | 556 | 852 | pub fn parse_tls_extension_renegotiation_info_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 557 | 852 | map(length_data(be_u8), TlsExtension::RenegotiationInfo)(i) | 558 | 852 | } |
tls_parser::tls_extensions::parse_tls_extension_renegotiation_info_content Line | Count | Source | 556 | 804 | pub fn parse_tls_extension_renegotiation_info_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 557 | 804 | map(length_data(be_u8), TlsExtension::RenegotiationInfo)(i) | 558 | 804 | } |
|
559 | | |
560 | | /// Encrypted Server Name, defined in [draft-ietf-tls-esni] |
561 | 4.61k | pub fn parse_tls_extension_encrypted_server_name(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
562 | 4.61k | let (i, ciphersuite) = map(be_u16, TlsCipherSuiteID)(i)?; |
563 | 3.76k | let (i, group) = NamedGroup::parse(i)?; |
564 | 3.17k | let (i, key_share) = length_data(be_u16)(i)?; |
565 | 2.37k | let (i, record_digest) = length_data(be_u16)(i)?; |
566 | 1.29k | let (i, encrypted_sni) = length_data(be_u16)(i)?; |
567 | 206 | let esn = TlsExtension::EncryptedServerName { |
568 | 206 | ciphersuite, |
569 | 206 | group, |
570 | 206 | key_share, |
571 | 206 | record_digest, |
572 | 206 | encrypted_sni, |
573 | 206 | }; |
574 | 206 | Ok((i, esn)) |
575 | 4.61k | } tls_parser::tls_extensions::parse_tls_extension_encrypted_server_name Line | Count | Source | 561 | 2.24k | pub fn parse_tls_extension_encrypted_server_name(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 562 | 2.24k | let (i, ciphersuite) = map(be_u16, TlsCipherSuiteID)(i)?; | 563 | 1.90k | let (i, group) = NamedGroup::parse(i)?; | 564 | 1.63k | let (i, key_share) = length_data(be_u16)(i)?; | 565 | 1.01k | let (i, record_digest) = length_data(be_u16)(i)?; | 566 | 552 | let (i, encrypted_sni) = length_data(be_u16)(i)?; | 567 | 86 | let esn = TlsExtension::EncryptedServerName { | 568 | 86 | ciphersuite, | 569 | 86 | group, | 570 | 86 | key_share, | 571 | 86 | record_digest, | 572 | 86 | encrypted_sni, | 573 | 86 | }; | 574 | 86 | Ok((i, esn)) | 575 | 2.24k | } |
tls_parser::tls_extensions::parse_tls_extension_encrypted_server_name Line | Count | Source | 561 | 2.37k | pub fn parse_tls_extension_encrypted_server_name(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 562 | 2.37k | let (i, ciphersuite) = map(be_u16, TlsCipherSuiteID)(i)?; | 563 | 1.86k | let (i, group) = NamedGroup::parse(i)?; | 564 | 1.54k | let (i, key_share) = length_data(be_u16)(i)?; | 565 | 1.36k | let (i, record_digest) = length_data(be_u16)(i)?; | 566 | 745 | let (i, encrypted_sni) = length_data(be_u16)(i)?; | 567 | 120 | let esn = TlsExtension::EncryptedServerName { | 568 | 120 | ciphersuite, | 569 | 120 | group, | 570 | 120 | key_share, | 571 | 120 | record_digest, | 572 | 120 | encrypted_sni, | 573 | 120 | }; | 574 | 120 | Ok((i, esn)) | 575 | 2.37k | } |
|
576 | | |
577 | 170k | fn parse_tls_oid_filter(i: &[u8]) -> IResult<&[u8], OidFilter> { |
578 | 170k | let (i, cert_ext_oid) = length_data(be_u8)(i)?; |
579 | 168k | let (i, cert_ext_val) = length_data(be_u16)(i)?; |
580 | 167k | let filter = OidFilter { |
581 | 167k | cert_ext_oid, |
582 | 167k | cert_ext_val, |
583 | 167k | }; |
584 | 167k | Ok((i, filter)) |
585 | 170k | } tls_parser::tls_extensions::parse_tls_oid_filter Line | Count | Source | 577 | 112k | fn parse_tls_oid_filter(i: &[u8]) -> IResult<&[u8], OidFilter> { | 578 | 112k | let (i, cert_ext_oid) = length_data(be_u8)(i)?; | 579 | 112k | let (i, cert_ext_val) = length_data(be_u16)(i)?; | 580 | 111k | let filter = OidFilter { | 581 | 111k | cert_ext_oid, | 582 | 111k | cert_ext_val, | 583 | 111k | }; | 584 | 111k | Ok((i, filter)) | 585 | 112k | } |
tls_parser::tls_extensions::parse_tls_oid_filter Line | Count | Source | 577 | 57.6k | fn parse_tls_oid_filter(i: &[u8]) -> IResult<&[u8], OidFilter> { | 578 | 57.6k | let (i, cert_ext_oid) = length_data(be_u8)(i)?; | 579 | 56.7k | let (i, cert_ext_val) = length_data(be_u16)(i)?; | 580 | 56.0k | let filter = OidFilter { | 581 | 56.0k | cert_ext_oid, | 582 | 56.0k | cert_ext_val, | 583 | 56.0k | }; | 584 | 56.0k | Ok((i, filter)) | 585 | 57.6k | } |
|
586 | | |
587 | | /// Defined in TLS 1.3 draft 19 |
588 | 4.50k | fn parse_tls_extension_oid_filters(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
589 | 4.50k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_tls_oid_filter)))(i)?; |
590 | 2.90k | Ok((i, TlsExtension::OidFilters(v))) |
591 | 4.50k | } tls_parser::tls_extensions::parse_tls_extension_oid_filters Line | Count | Source | 588 | 1.63k | fn parse_tls_extension_oid_filters(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 589 | 1.63k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_tls_oid_filter)))(i)?; | 590 | 1.23k | Ok((i, TlsExtension::OidFilters(v))) | 591 | 1.63k | } |
tls_parser::tls_extensions::parse_tls_extension_oid_filters Line | Count | Source | 588 | 2.87k | fn parse_tls_extension_oid_filters(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 589 | 2.87k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_tls_oid_filter)))(i)?; | 590 | 1.67k | Ok((i, TlsExtension::OidFilters(v))) | 591 | 2.87k | } |
|
592 | | |
593 | | /// Defined in TLS 1.3 draft 20 |
594 | 1.70k | fn parse_tls_extension_post_handshake_auth_content( |
595 | 1.70k | i: &[u8], |
596 | 1.70k | ext_len: u16, |
597 | 1.70k | ) -> IResult<&[u8], TlsExtension> { |
598 | 1.70k | if ext_len != 0 { |
599 | 509 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
600 | 1.19k | } |
601 | 1.19k | Ok((i, TlsExtension::PostHandshakeAuth)) |
602 | 1.70k | } tls_parser::tls_extensions::parse_tls_extension_post_handshake_auth_content Line | Count | Source | 594 | 923 | fn parse_tls_extension_post_handshake_auth_content( | 595 | 923 | i: &[u8], | 596 | 923 | ext_len: u16, | 597 | 923 | ) -> IResult<&[u8], TlsExtension> { | 598 | 923 | if ext_len != 0 { | 599 | 199 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 600 | 724 | } | 601 | 724 | Ok((i, TlsExtension::PostHandshakeAuth)) | 602 | 923 | } |
tls_parser::tls_extensions::parse_tls_extension_post_handshake_auth_content Line | Count | Source | 594 | 777 | fn parse_tls_extension_post_handshake_auth_content( | 595 | 777 | i: &[u8], | 596 | 777 | ext_len: u16, | 597 | 777 | ) -> IResult<&[u8], TlsExtension> { | 598 | 777 | if ext_len != 0 { | 599 | 310 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 600 | 467 | } | 601 | 467 | Ok((i, TlsExtension::PostHandshakeAuth)) | 602 | 777 | } |
|
603 | | |
604 | 0 | pub fn parse_tls_extension_unknown(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
605 | 0 | let (i, ext_type) = be_u16(i)?; |
606 | 0 | let (i, ext_data) = length_data(be_u16)(i)?; |
607 | 0 | Ok(( |
608 | 0 | i, |
609 | 0 | TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data), |
610 | 0 | )) |
611 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_unknown Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_unknown |
612 | | |
613 | | /// Parse a single TLS Client Hello extension |
614 | 0 | pub fn parse_tls_client_hello_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
615 | 0 | let (i, ext_type) = be_u16(i)?; |
616 | 0 | let (i, ext_data) = length_data(be_u16)(i)?; |
617 | 0 | if ext_type & 0x0f0f == 0x0a0a { |
618 | 0 | return Ok((i, TlsExtension::Grease(ext_type, ext_data))); |
619 | 0 | } |
620 | 0 | let ext_len = ext_data.len() as u16; |
621 | 0 | let (_, ext) = match ext_type { |
622 | 0 | 0 => parse_tls_extension_sni_content(ext_data), |
623 | 0 | 1 => parse_tls_extension_max_fragment_length_content(ext_data), |
624 | 0 | 5 => parse_tls_extension_status_request_content(ext_data, ext_len), |
625 | 0 | 10 => parse_tls_extension_elliptic_curves_content(ext_data), |
626 | 0 | 11 => parse_tls_extension_ec_point_formats_content(ext_data), |
627 | 0 | 13 => parse_tls_extension_signature_algorithms_content(ext_data), |
628 | 0 | 15 => parse_tls_extension_heartbeat_content(ext_data), |
629 | 0 | 16 => parse_tls_extension_alpn_content(ext_data), |
630 | 0 | 18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data), // ok XXX should be empty |
631 | 0 | 21 => parse_tls_extension_padding_content(ext_data, ext_len), |
632 | 0 | 22 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len), |
633 | 0 | 23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len), |
634 | 0 | 28 => parse_tls_extension_record_size_limit(ext_data), |
635 | 0 | 35 => parse_tls_extension_session_ticket_content(ext_data, ext_len), |
636 | 0 | 41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len), |
637 | 0 | 42 => parse_tls_extension_early_data_content(ext_data, ext_len), |
638 | 0 | 43 => parse_tls_extension_supported_versions_content(ext_data, ext_len), |
639 | 0 | 44 => parse_tls_extension_cookie_content(ext_data, ext_len), |
640 | 0 | 45 => parse_tls_extension_psk_key_exchange_modes_content(ext_data), |
641 | 0 | 48 => parse_tls_extension_oid_filters(ext_data), |
642 | 0 | 49 => parse_tls_extension_post_handshake_auth_content(ext_data, ext_len), |
643 | 0 | 51 => parse_tls_extension_key_share_content(ext_data, ext_len), // XXX request |
644 | 0 | 13172 => parse_tls_extension_npn_content(ext_data, ext_len), // XXX must be empty |
645 | 0 | 0xff01 => parse_tls_extension_renegotiation_info_content(ext_data), |
646 | 0 | 0xffce => parse_tls_extension_encrypted_server_name(ext_data), |
647 | 0 | _ => Ok(( |
648 | 0 | i, |
649 | 0 | TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data), |
650 | 0 | )), |
651 | 0 | }?; |
652 | 0 | Ok((i, ext)) |
653 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_client_hello_extension Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_client_hello_extension |
654 | | |
655 | | /// Parse a single TLS Server Hello extension |
656 | 0 | pub fn parse_tls_server_hello_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
657 | 0 | let (i, ext_type) = be_u16(i)?; |
658 | 0 | let (i, ext_data) = length_data(be_u16)(i)?; |
659 | 0 | if ext_type & 0x0f0f == 0x0a0a { |
660 | 0 | return Ok((i, TlsExtension::Grease(ext_type, ext_data))); |
661 | 0 | } |
662 | 0 | let ext_len = ext_data.len() as u16; |
663 | 0 | let (_, ext) = match ext_type { |
664 | 0 | 0 => parse_tls_extension_sni_content(ext_data), // XXX SHALL be empty (RFC6066 section 3) |
665 | 0 | 1 => parse_tls_extension_max_fragment_length_content(ext_data), |
666 | 0 | 5 => parse_tls_extension_status_request_content(ext_data, ext_len), // SHALL be empty |
667 | 0 | 11 => parse_tls_extension_ec_point_formats_content(ext_data), // ok XXX only one |
668 | 0 | 13 => parse_tls_extension_signature_algorithms_content(ext_data), // XXX allowed? |
669 | 0 | 15 => parse_tls_extension_heartbeat_content(ext_data), |
670 | 0 | 16 => parse_tls_extension_alpn_content(ext_data), // ok XXX MUST contain one protocol name |
671 | 0 | 18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data), |
672 | 0 | 21 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len), |
673 | 0 | 23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len), |
674 | 0 | 28 => parse_tls_extension_record_size_limit(ext_data), |
675 | 0 | 35 => parse_tls_extension_session_ticket_content(ext_data, ext_len), |
676 | 0 | 41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len), |
677 | 0 | 42 => parse_tls_extension_early_data_content(ext_data, ext_len), |
678 | 0 | 43 => parse_tls_extension_supported_versions_content(ext_data, ext_len), // ok XXX only one |
679 | 0 | 44 => parse_tls_extension_cookie_content(ext_data, ext_len), |
680 | 0 | 51 => parse_tls_extension_key_share_content(ext_data, ext_len), // XXX selected entry |
681 | 0 | 13172 => parse_tls_extension_npn_content(ext_data, ext_len), |
682 | 0 | 0xff01 => parse_tls_extension_renegotiation_info_content(ext_data), |
683 | 0 | _ => Ok(( |
684 | 0 | i, |
685 | 0 | TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data), |
686 | 0 | )), |
687 | 0 | }?; |
688 | 0 | Ok((i, ext)) |
689 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_server_hello_extension Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_server_hello_extension |
690 | | |
691 | | /// Parse a single TLS extension (of any type) |
692 | 3.14M | pub fn parse_tls_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
693 | 3.14M | let (i, ext_type) = be_u16(i)?; |
694 | 3.11M | let (i, ext_data) = length_data(be_u16)(i)?; |
695 | 3.09M | if ext_type & 0x0f0f == 0x0a0a { |
696 | 1.00k | return Ok((i, TlsExtension::Grease(ext_type, ext_data))); |
697 | 3.09M | } |
698 | 3.09M | let ext_len = ext_data.len() as u16; |
699 | 3.09M | let (_, ext) = match ext_type { |
700 | 2.51M | 0 => parse_tls_extension_sni_content(ext_data), |
701 | 1.08k | 1 => parse_tls_extension_max_fragment_length_content(ext_data), |
702 | 45.0k | 5 => parse_tls_extension_status_request_content(ext_data, ext_len), |
703 | 3.61k | 10 => parse_tls_extension_elliptic_curves_content(ext_data), |
704 | 2.90k | 11 => parse_tls_extension_ec_point_formats_content(ext_data), |
705 | 3.34k | 13 => parse_tls_extension_signature_algorithms_content(ext_data), |
706 | 669 | 15 => parse_tls_extension_heartbeat_content(ext_data), |
707 | 7.91k | 16 => parse_tls_extension_alpn_content(ext_data), |
708 | 3.32k | 18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data), |
709 | 1.60k | 21 => parse_tls_extension_padding_content(ext_data, ext_len), |
710 | 1.46k | 22 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len), |
711 | 816 | 23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len), |
712 | 790 | 28 => parse_tls_extension_record_size_limit(ext_data), |
713 | 2.06k | 35 => parse_tls_extension_session_ticket_content(ext_data, ext_len), |
714 | 891 | 40 => parse_tls_extension_key_share_old_content(ext_data, ext_len), |
715 | 1.89k | 41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len), |
716 | 1.84k | 42 => parse_tls_extension_early_data_content(ext_data, ext_len), |
717 | 6.00k | 43 => parse_tls_extension_supported_versions_content(ext_data, ext_len), |
718 | 1.28k | 44 => parse_tls_extension_cookie_content(ext_data, ext_len), |
719 | 2.60k | 45 => parse_tls_extension_psk_key_exchange_modes_content(ext_data), |
720 | 4.50k | 48 => parse_tls_extension_oid_filters(ext_data), |
721 | 1.70k | 49 => parse_tls_extension_post_handshake_auth_content(ext_data, ext_len), |
722 | 888 | 51 => parse_tls_extension_key_share_content(ext_data, ext_len), |
723 | 267 | 13172 => parse_tls_extension_npn_content(ext_data, ext_len), |
724 | 1.65k | 0xff01 => parse_tls_extension_renegotiation_info_content(ext_data), |
725 | 4.61k | 0xffce => parse_tls_extension_encrypted_server_name(ext_data), |
726 | 477k | _ => Ok(( |
727 | 477k | i, |
728 | 477k | TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data), |
729 | 477k | )), |
730 | 17.2k | }?; |
731 | 3.07M | Ok((i, ext)) |
732 | 3.14M | } tls_parser::tls_extensions::parse_tls_extension Line | Count | Source | 692 | 1.38M | pub fn parse_tls_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 693 | 1.38M | let (i, ext_type) = be_u16(i)?; | 694 | 1.37M | let (i, ext_data) = length_data(be_u16)(i)?; | 695 | 1.36M | if ext_type & 0x0f0f == 0x0a0a { | 696 | 380 | return Ok((i, TlsExtension::Grease(ext_type, ext_data))); | 697 | 1.36M | } | 698 | 1.36M | let ext_len = ext_data.len() as u16; | 699 | 1.36M | let (_, ext) = match ext_type { | 700 | 1.05M | 0 => parse_tls_extension_sni_content(ext_data), | 701 | 574 | 1 => parse_tls_extension_max_fragment_length_content(ext_data), | 702 | 44.1k | 5 => parse_tls_extension_status_request_content(ext_data, ext_len), | 703 | 2.20k | 10 => parse_tls_extension_elliptic_curves_content(ext_data), | 704 | 1.51k | 11 => parse_tls_extension_ec_point_formats_content(ext_data), | 705 | 1.86k | 13 => parse_tls_extension_signature_algorithms_content(ext_data), | 706 | 401 | 15 => parse_tls_extension_heartbeat_content(ext_data), | 707 | 3.62k | 16 => parse_tls_extension_alpn_content(ext_data), | 708 | 2.21k | 18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data), | 709 | 1.40k | 21 => parse_tls_extension_padding_content(ext_data, ext_len), | 710 | 1.19k | 22 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len), | 711 | 511 | 23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len), | 712 | 508 | 28 => parse_tls_extension_record_size_limit(ext_data), | 713 | 962 | 35 => parse_tls_extension_session_ticket_content(ext_data, ext_len), | 714 | 357 | 40 => parse_tls_extension_key_share_old_content(ext_data, ext_len), | 715 | 728 | 41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len), | 716 | 815 | 42 => parse_tls_extension_early_data_content(ext_data, ext_len), | 717 | 2.78k | 43 => parse_tls_extension_supported_versions_content(ext_data, ext_len), | 718 | 528 | 44 => parse_tls_extension_cookie_content(ext_data, ext_len), | 719 | 1.20k | 45 => parse_tls_extension_psk_key_exchange_modes_content(ext_data), | 720 | 1.63k | 48 => parse_tls_extension_oid_filters(ext_data), | 721 | 923 | 49 => parse_tls_extension_post_handshake_auth_content(ext_data, ext_len), | 722 | 510 | 51 => parse_tls_extension_key_share_content(ext_data, ext_len), | 723 | 132 | 13172 => parse_tls_extension_npn_content(ext_data, ext_len), | 724 | 852 | 0xff01 => parse_tls_extension_renegotiation_info_content(ext_data), | 725 | 2.24k | 0xffce => parse_tls_extension_encrypted_server_name(ext_data), | 726 | 229k | _ => Ok(( | 727 | 229k | i, | 728 | 229k | TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data), | 729 | 229k | )), | 730 | 8.35k | }?; | 731 | 1.35M | Ok((i, ext)) | 732 | 1.38M | } |
tls_parser::tls_extensions::parse_tls_extension Line | Count | Source | 692 | 1.76M | pub fn parse_tls_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 693 | 1.76M | let (i, ext_type) = be_u16(i)?; | 694 | 1.74M | let (i, ext_data) = length_data(be_u16)(i)?; | 695 | 1.73M | if ext_type & 0x0f0f == 0x0a0a { | 696 | 620 | return Ok((i, TlsExtension::Grease(ext_type, ext_data))); | 697 | 1.73M | } | 698 | 1.73M | let ext_len = ext_data.len() as u16; | 699 | 1.73M | let (_, ext) = match ext_type { | 700 | 1.45M | 0 => parse_tls_extension_sni_content(ext_data), | 701 | 508 | 1 => parse_tls_extension_max_fragment_length_content(ext_data), | 702 | 866 | 5 => parse_tls_extension_status_request_content(ext_data, ext_len), | 703 | 1.40k | 10 => parse_tls_extension_elliptic_curves_content(ext_data), | 704 | 1.39k | 11 => parse_tls_extension_ec_point_formats_content(ext_data), | 705 | 1.47k | 13 => parse_tls_extension_signature_algorithms_content(ext_data), | 706 | 268 | 15 => parse_tls_extension_heartbeat_content(ext_data), | 707 | 4.29k | 16 => parse_tls_extension_alpn_content(ext_data), | 708 | 1.11k | 18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data), | 709 | 198 | 21 => parse_tls_extension_padding_content(ext_data, ext_len), | 710 | 276 | 22 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len), | 711 | 305 | 23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len), | 712 | 282 | 28 => parse_tls_extension_record_size_limit(ext_data), | 713 | 1.10k | 35 => parse_tls_extension_session_ticket_content(ext_data, ext_len), | 714 | 534 | 40 => parse_tls_extension_key_share_old_content(ext_data, ext_len), | 715 | 1.16k | 41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len), | 716 | 1.02k | 42 => parse_tls_extension_early_data_content(ext_data, ext_len), | 717 | 3.22k | 43 => parse_tls_extension_supported_versions_content(ext_data, ext_len), | 718 | 759 | 44 => parse_tls_extension_cookie_content(ext_data, ext_len), | 719 | 1.39k | 45 => parse_tls_extension_psk_key_exchange_modes_content(ext_data), | 720 | 2.87k | 48 => parse_tls_extension_oid_filters(ext_data), | 721 | 777 | 49 => parse_tls_extension_post_handshake_auth_content(ext_data, ext_len), | 722 | 378 | 51 => parse_tls_extension_key_share_content(ext_data, ext_len), | 723 | 135 | 13172 => parse_tls_extension_npn_content(ext_data, ext_len), | 724 | 804 | 0xff01 => parse_tls_extension_renegotiation_info_content(ext_data), | 725 | 2.37k | 0xffce => parse_tls_extension_encrypted_server_name(ext_data), | 726 | 247k | _ => Ok(( | 727 | 247k | i, | 728 | 247k | TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data), | 729 | 247k | )), | 730 | 8.92k | }?; | 731 | 1.72M | Ok((i, ext)) | 732 | 1.76M | } |
|
733 | | |
734 | | /// Parse zero or more TLS Client Hello extensions |
735 | 0 | pub fn parse_tls_client_hello_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> { |
736 | 0 | many0(complete(parse_tls_client_hello_extension))(i) |
737 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_client_hello_extensions Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_client_hello_extensions |
738 | | |
739 | | /// Parse zero or more TLS Server Hello extensions |
740 | 0 | pub fn parse_tls_server_hello_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> { |
741 | 0 | many0(complete(parse_tls_server_hello_extension))(i) |
742 | 0 | } Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_server_hello_extensions Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_server_hello_extensions |
743 | | |
744 | | /// Parse zero or more TLS extensions (of any type) |
745 | 67.7k | pub fn parse_tls_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> { |
746 | 67.7k | many0(complete(parse_tls_extension))(i) |
747 | 67.7k | } tls_parser::tls_extensions::parse_tls_extensions Line | Count | Source | 745 | 30.4k | pub fn parse_tls_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> { | 746 | 30.4k | many0(complete(parse_tls_extension))(i) | 747 | 30.4k | } |
tls_parser::tls_extensions::parse_tls_extensions Line | Count | Source | 745 | 37.3k | pub fn parse_tls_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> { | 746 | 37.3k | many0(complete(parse_tls_extension))(i) | 747 | 37.3k | } |
|