/rust/registry/src/index.crates.io-1949cf8c6b5b557f/tls-parser-0.11.0/src/tls_extensions.rs
Line | Count | Source |
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_be Unexecuted instantiation: <tls_parser::tls_extensions::TlsExtensionType as nom_derive::traits::Parse<&[u8]>>::parse_le |
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 | 16.6M | fn from(ext: TlsExtensionType) -> u16 { |
92 | 16.6M | ext.0 |
93 | 16.6M | } <u16 as core::convert::From<tls_parser::tls_extensions::TlsExtensionType>>::from Line | Count | Source | 91 | 6.35M | fn from(ext: TlsExtensionType) -> u16 { | 92 | 6.35M | ext.0 | 93 | 6.35M | } |
<u16 as core::convert::From<tls_parser::tls_extensions::TlsExtensionType>>::from Line | Count | Source | 91 | 10.2M | fn from(ext: TlsExtensionType) -> u16 { | 92 | 10.2M | ext.0 | 93 | 10.2M | } |
|
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.64M | fn from(ext: &TlsExtension) -> TlsExtensionType { |
145 | 3.64M | match *ext { |
146 | 2.60M | TlsExtension::SNI(_) => TlsExtensionType::ServerName, |
147 | 419 | TlsExtension::MaxFragmentLength(_) => TlsExtensionType::MaxFragmentLength, |
148 | 55.9k | TlsExtension::StatusRequest(_) => TlsExtensionType::StatusRequest, |
149 | 3.62k | TlsExtension::EllipticCurves(_) => TlsExtensionType::SupportedGroups, |
150 | 3.66k | TlsExtension::EcPointFormats(_) => TlsExtensionType::EcPointFormats, |
151 | 2.07k | TlsExtension::SignatureAlgorithms(_) => TlsExtensionType::SignatureAlgorithms, |
152 | 2.19k | TlsExtension::SessionTicket(_) => TlsExtensionType::SessionTicketTLS, |
153 | 465 | TlsExtension::RecordSizeLimit(_) => TlsExtensionType::RecordSizeLimit, |
154 | 735 | TlsExtension::KeyShareOld(_) => TlsExtensionType::KeyShareOld, |
155 | 1.26k | TlsExtension::KeyShare(_) => TlsExtensionType::KeyShare, |
156 | 1.64k | TlsExtension::PreSharedKey(_) => TlsExtensionType::PreSharedKey, |
157 | 1.45k | TlsExtension::EarlyData(_) => TlsExtensionType::EarlyData, |
158 | 5.13k | TlsExtension::SupportedVersions(_) => TlsExtensionType::SupportedVersions, |
159 | 1.11k | TlsExtension::Cookie(_) => TlsExtensionType::Cookie, |
160 | 1.53k | TlsExtension::PskExchangeModes(_) => TlsExtensionType::PskExchangeModes, |
161 | 532 | TlsExtension::Heartbeat(_) => TlsExtensionType::Heartbeat, |
162 | 8.95k | TlsExtension::ALPN(_) => TlsExtensionType::ApplicationLayerProtocolNegotiation, |
163 | 5.97k | TlsExtension::SignedCertificateTimestamp(_) => TlsExtensionType::SignedCertificateTimestamp, |
164 | 912 | TlsExtension::Padding(_) => TlsExtensionType::Padding, |
165 | 2.55k | TlsExtension::EncryptThenMac => TlsExtensionType::EncryptThenMac, |
166 | 532 | TlsExtension::ExtendedMasterSecret => TlsExtensionType::ExtendedMasterSecret, |
167 | 3.40k | TlsExtension::OidFilters(_) => TlsExtensionType::OidFilters, |
168 | 1.15k | TlsExtension::PostHandshakeAuth => TlsExtensionType::PostHandshakeAuth, |
169 | 140 | TlsExtension::NextProtocolNegotiation => TlsExtensionType::NextProtocolNegotiation, |
170 | 557 | TlsExtension::RenegotiationInfo(_) => TlsExtensionType::RenegotiationInfo, |
171 | 227 | TlsExtension::EncryptedServerName{..} => TlsExtensionType::EncryptedServerName, |
172 | 759 | TlsExtension::Grease(_,_) => TlsExtensionType::Grease, |
173 | 928k | TlsExtension::Unknown(x,_) => x |
174 | | } |
175 | 3.64M | } <tls_parser::tls_extensions::TlsExtensionType as core::convert::From<&tls_parser::tls_extensions::TlsExtension>>::from Line | Count | Source | 144 | 1.15M | fn from(ext: &TlsExtension) -> TlsExtensionType { | 145 | 1.15M | match *ext { | 146 | 749k | TlsExtension::SNI(_) => TlsExtensionType::ServerName, | 147 | 218 | TlsExtension::MaxFragmentLength(_) => TlsExtensionType::MaxFragmentLength, | 148 | 42.7k | TlsExtension::StatusRequest(_) => TlsExtensionType::StatusRequest, | 149 | 2.34k | TlsExtension::EllipticCurves(_) => TlsExtensionType::SupportedGroups, | 150 | 1.33k | TlsExtension::EcPointFormats(_) => TlsExtensionType::EcPointFormats, | 151 | 1.10k | TlsExtension::SignatureAlgorithms(_) => TlsExtensionType::SignatureAlgorithms, | 152 | 712 | TlsExtension::SessionTicket(_) => TlsExtensionType::SessionTicketTLS, | 153 | 239 | TlsExtension::RecordSizeLimit(_) => TlsExtensionType::RecordSizeLimit, | 154 | 358 | TlsExtension::KeyShareOld(_) => TlsExtensionType::KeyShareOld, | 155 | 511 | TlsExtension::KeyShare(_) => TlsExtensionType::KeyShare, | 156 | 1.03k | TlsExtension::PreSharedKey(_) => TlsExtensionType::PreSharedKey, | 157 | 604 | TlsExtension::EarlyData(_) => TlsExtensionType::EarlyData, | 158 | 1.99k | TlsExtension::SupportedVersions(_) => TlsExtensionType::SupportedVersions, | 159 | 450 | TlsExtension::Cookie(_) => TlsExtensionType::Cookie, | 160 | 819 | TlsExtension::PskExchangeModes(_) => TlsExtensionType::PskExchangeModes, | 161 | 205 | TlsExtension::Heartbeat(_) => TlsExtensionType::Heartbeat, | 162 | 5.35k | TlsExtension::ALPN(_) => TlsExtensionType::ApplicationLayerProtocolNegotiation, | 163 | 2.07k | TlsExtension::SignedCertificateTimestamp(_) => TlsExtensionType::SignedCertificateTimestamp, | 164 | 298 | TlsExtension::Padding(_) => TlsExtensionType::Padding, | 165 | 2.31k | TlsExtension::EncryptThenMac => TlsExtensionType::EncryptThenMac, | 166 | 305 | TlsExtension::ExtendedMasterSecret => TlsExtensionType::ExtendedMasterSecret, | 167 | 1.60k | TlsExtension::OidFilters(_) => TlsExtensionType::OidFilters, | 168 | 442 | TlsExtension::PostHandshakeAuth => TlsExtensionType::PostHandshakeAuth, | 169 | 73 | TlsExtension::NextProtocolNegotiation => TlsExtensionType::NextProtocolNegotiation, | 170 | 281 | TlsExtension::RenegotiationInfo(_) => TlsExtensionType::RenegotiationInfo, | 171 | 111 | TlsExtension::EncryptedServerName{..} => TlsExtensionType::EncryptedServerName, | 172 | 322 | TlsExtension::Grease(_,_) => TlsExtensionType::Grease, | 173 | 333k | TlsExtension::Unknown(x,_) => x | 174 | | } | 175 | 1.15M | } |
<tls_parser::tls_extensions::TlsExtensionType as core::convert::From<&tls_parser::tls_extensions::TlsExtension>>::from Line | Count | Source | 144 | 2.49M | fn from(ext: &TlsExtension) -> TlsExtensionType { | 145 | 2.49M | match *ext { | 146 | 1.85M | TlsExtension::SNI(_) => TlsExtensionType::ServerName, | 147 | 201 | TlsExtension::MaxFragmentLength(_) => TlsExtensionType::MaxFragmentLength, | 148 | 13.1k | TlsExtension::StatusRequest(_) => TlsExtensionType::StatusRequest, | 149 | 1.27k | TlsExtension::EllipticCurves(_) => TlsExtensionType::SupportedGroups, | 150 | 2.32k | TlsExtension::EcPointFormats(_) => TlsExtensionType::EcPointFormats, | 151 | 969 | TlsExtension::SignatureAlgorithms(_) => TlsExtensionType::SignatureAlgorithms, | 152 | 1.48k | TlsExtension::SessionTicket(_) => TlsExtensionType::SessionTicketTLS, | 153 | 226 | TlsExtension::RecordSizeLimit(_) => TlsExtensionType::RecordSizeLimit, | 154 | 377 | TlsExtension::KeyShareOld(_) => TlsExtensionType::KeyShareOld, | 155 | 758 | TlsExtension::KeyShare(_) => TlsExtensionType::KeyShare, | 156 | 609 | TlsExtension::PreSharedKey(_) => TlsExtensionType::PreSharedKey, | 157 | 848 | TlsExtension::EarlyData(_) => TlsExtensionType::EarlyData, | 158 | 3.14k | TlsExtension::SupportedVersions(_) => TlsExtensionType::SupportedVersions, | 159 | 661 | TlsExtension::Cookie(_) => TlsExtensionType::Cookie, | 160 | 719 | TlsExtension::PskExchangeModes(_) => TlsExtensionType::PskExchangeModes, | 161 | 327 | TlsExtension::Heartbeat(_) => TlsExtensionType::Heartbeat, | 162 | 3.59k | TlsExtension::ALPN(_) => TlsExtensionType::ApplicationLayerProtocolNegotiation, | 163 | 3.90k | TlsExtension::SignedCertificateTimestamp(_) => TlsExtensionType::SignedCertificateTimestamp, | 164 | 614 | TlsExtension::Padding(_) => TlsExtensionType::Padding, | 165 | 243 | TlsExtension::EncryptThenMac => TlsExtensionType::EncryptThenMac, | 166 | 227 | TlsExtension::ExtendedMasterSecret => TlsExtensionType::ExtendedMasterSecret, | 167 | 1.80k | TlsExtension::OidFilters(_) => TlsExtensionType::OidFilters, | 168 | 716 | TlsExtension::PostHandshakeAuth => TlsExtensionType::PostHandshakeAuth, | 169 | 67 | TlsExtension::NextProtocolNegotiation => TlsExtensionType::NextProtocolNegotiation, | 170 | 276 | TlsExtension::RenegotiationInfo(_) => TlsExtensionType::RenegotiationInfo, | 171 | 116 | TlsExtension::EncryptedServerName{..} => TlsExtensionType::EncryptedServerName, | 172 | 437 | TlsExtension::Grease(_,_) => TlsExtensionType::Grease, | 173 | 595k | TlsExtension::Unknown(x,_) => x | 174 | | } | 175 | 2.49M | } |
|
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_be Unexecuted instantiation: <tls_parser::tls_extensions::PskKeyExchangeMode as nom_derive::traits::Parse<&[u8]>>::parse_le |
185 | | pub struct PskKeyExchangeMode(pub u8); |
186 | | |
187 | | newtype_enum! { |
188 | | impl PskKeyExchangeMode { |
189 | | Psk = 0, |
190 | | PskDhe = 1, |
191 | | } |
192 | | } |
193 | | |
194 | 9.45k | #[derive(Clone, Copy, Debug, PartialEq, Eq, NomBE)] <tls_parser::tls_extensions::SNIType as nom_derive::traits::Parse<&[u8]>>::parse_be Line | Count | Source | 194 | 3.92k | #[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_be Line | Count | Source | 194 | 5.53k | #[derive(Clone, Copy, Debug, PartialEq, Eq, NomBE)] |
Unexecuted instantiation: <tls_parser::tls_extensions::SNIType as nom_derive::traits::Parse<&[u8]>>::parse_le |
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_be Unexecuted instantiation: <tls_parser::tls_extensions::CertificateStatusType as nom_derive::traits::Parse<&[u8]>>::parse_le |
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 | 285k | pub fn parse_tls_extension_sni_hostname(i: &[u8]) -> IResult<&[u8], (SNIType, &[u8])> { |
231 | 285k | let (i, t) = SNIType::parse(i)?; |
232 | 276k | let (i, v) = length_data(be_u16)(i)?; |
233 | 274k | Ok((i, (t, v))) |
234 | 285k | } tls_parser::tls_extensions::parse_tls_extension_sni_hostname Line | Count | Source | 230 | 111k | pub fn parse_tls_extension_sni_hostname(i: &[u8]) -> IResult<&[u8], (SNIType, &[u8])> { | 231 | 111k | let (i, t) = SNIType::parse(i)?; | 232 | 107k | let (i, v) = length_data(be_u16)(i)?; | 233 | 106k | Ok((i, (t, v))) | 234 | 111k | } |
tls_parser::tls_extensions::parse_tls_extension_sni_hostname Line | Count | Source | 230 | 174k | pub fn parse_tls_extension_sni_hostname(i: &[u8]) -> IResult<&[u8], (SNIType, &[u8])> { | 231 | 174k | let (i, t) = SNIType::parse(i)?; | 232 | 168k | let (i, v) = length_data(be_u16)(i)?; | 233 | 167k | Ok((i, (t, v))) | 234 | 174k | } |
|
235 | | |
236 | | // struct { |
237 | | // ServerName server_name_list<1..2^16-1> |
238 | | // } ServerNameList; |
239 | 2.61M | pub fn parse_tls_extension_sni_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
240 | 2.61M | if i.is_empty() { |
241 | | // special case: SNI extension in server can be empty |
242 | 2.59M | return Ok((i, TlsExtension::SNI(Vec::new()))); |
243 | 12.5k | } |
244 | 12.5k | let (i, list_len) = be_u16(i)?; |
245 | 11.8k | let (i, v) = map_parser( |
246 | 11.8k | take(list_len), |
247 | 11.8k | many0(complete(parse_tls_extension_sni_hostname)), |
248 | 11.8k | )(i)?; |
249 | 11.1k | Ok((i, TlsExtension::SNI(v))) |
250 | 2.61M | } tls_parser::tls_extensions::parse_tls_extension_sni_content Line | Count | Source | 239 | 750k | pub fn parse_tls_extension_sni_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 240 | 750k | if i.is_empty() { | 241 | | // special case: SNI extension in server can be empty | 242 | 745k | return Ok((i, TlsExtension::SNI(Vec::new()))); | 243 | 5.39k | } | 244 | 5.39k | let (i, list_len) = be_u16(i)?; | 245 | 5.17k | let (i, v) = map_parser( | 246 | 5.17k | take(list_len), | 247 | 5.17k | many0(complete(parse_tls_extension_sni_hostname)), | 248 | 5.17k | )(i)?; | 249 | 4.86k | Ok((i, TlsExtension::SNI(v))) | 250 | 750k | } |
tls_parser::tls_extensions::parse_tls_extension_sni_content Line | Count | Source | 239 | 1.86M | pub fn parse_tls_extension_sni_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 240 | 1.86M | if i.is_empty() { | 241 | | // special case: SNI extension in server can be empty | 242 | 1.85M | return Ok((i, TlsExtension::SNI(Vec::new()))); | 243 | 7.13k | } | 244 | 7.13k | let (i, list_len) = be_u16(i)?; | 245 | 6.66k | let (i, v) = map_parser( | 246 | 6.66k | take(list_len), | 247 | 6.66k | many0(complete(parse_tls_extension_sni_hostname)), | 248 | 6.66k | )(i)?; | 249 | 6.29k | Ok((i, TlsExtension::SNI(v))) | 250 | 1.86M | } |
|
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.04k | pub fn parse_tls_extension_max_fragment_length_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
259 | 1.04k | map(be_u8, TlsExtension::MaxFragmentLength)(i) |
260 | 1.04k | } tls_parser::tls_extensions::parse_tls_extension_max_fragment_length_content Line | Count | Source | 258 | 448 | pub fn parse_tls_extension_max_fragment_length_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 259 | 448 | map(be_u8, TlsExtension::MaxFragmentLength)(i) | 260 | 448 | } |
tls_parser::tls_extensions::parse_tls_extension_max_fragment_length_content Line | Count | Source | 258 | 595 | pub fn parse_tls_extension_max_fragment_length_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 259 | 595 | map(be_u8, TlsExtension::MaxFragmentLength)(i) | 260 | 595 | } |
|
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 | 55.9k | fn parse_tls_extension_status_request_content( |
273 | 55.9k | i: &[u8], |
274 | 55.9k | ext_len: u16, |
275 | 55.9k | ) -> IResult<&[u8], TlsExtension> { |
276 | 55.9k | match ext_len { |
277 | 49.3k | 0 => Ok((i, TlsExtension::StatusRequest(None))), |
278 | | _ => { |
279 | 6.57k | let (i, status_type) = be_u8(i)?; |
280 | 6.57k | let (i, request) = take(ext_len - 1)(i)?; |
281 | 6.57k | Ok(( |
282 | 6.57k | i, |
283 | 6.57k | TlsExtension::StatusRequest(Some((CertificateStatusType(status_type), request))), |
284 | 6.57k | )) |
285 | | } |
286 | | } |
287 | 55.9k | } tls_parser::tls_extensions::parse_tls_extension_status_request_content Line | Count | Source | 272 | 42.7k | fn parse_tls_extension_status_request_content( | 273 | 42.7k | i: &[u8], | 274 | 42.7k | ext_len: u16, | 275 | 42.7k | ) -> IResult<&[u8], TlsExtension> { | 276 | 42.7k | match ext_len { | 277 | 39.3k | 0 => Ok((i, TlsExtension::StatusRequest(None))), | 278 | | _ => { | 279 | 3.43k | let (i, status_type) = be_u8(i)?; | 280 | 3.43k | let (i, request) = take(ext_len - 1)(i)?; | 281 | 3.43k | Ok(( | 282 | 3.43k | i, | 283 | 3.43k | TlsExtension::StatusRequest(Some((CertificateStatusType(status_type), request))), | 284 | 3.43k | )) | 285 | | } | 286 | | } | 287 | 42.7k | } |
tls_parser::tls_extensions::parse_tls_extension_status_request_content Line | Count | Source | 272 | 13.1k | fn parse_tls_extension_status_request_content( | 273 | 13.1k | i: &[u8], | 274 | 13.1k | ext_len: u16, | 275 | 13.1k | ) -> IResult<&[u8], TlsExtension> { | 276 | 13.1k | match ext_len { | 277 | 10.0k | 0 => Ok((i, TlsExtension::StatusRequest(None))), | 278 | | _ => { | 279 | 3.13k | let (i, status_type) = be_u8(i)?; | 280 | 3.13k | let (i, request) = take(ext_len - 1)(i)?; | 281 | 3.13k | Ok(( | 282 | 3.13k | i, | 283 | 3.13k | TlsExtension::StatusRequest(Some((CertificateStatusType(status_type), request))), | 284 | 3.13k | )) | 285 | | } | 286 | | } | 287 | 13.1k | } |
|
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 | 4.93k | pub fn parse_tls_extension_elliptic_curves_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
299 | 4.93k | map_parser( |
300 | 4.93k | length_data(be_u16), |
301 | 4.93k | map(parse_named_groups, TlsExtension::EllipticCurves), |
302 | 4.93k | )(i) |
303 | 4.93k | } tls_parser::tls_extensions::parse_tls_extension_elliptic_curves_content Line | Count | Source | 298 | 2.99k | pub fn parse_tls_extension_elliptic_curves_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 299 | 2.99k | map_parser( | 300 | 2.99k | length_data(be_u16), | 301 | 2.99k | map(parse_named_groups, TlsExtension::EllipticCurves), | 302 | 2.99k | )(i) | 303 | 2.99k | } |
tls_parser::tls_extensions::parse_tls_extension_elliptic_curves_content Line | Count | Source | 298 | 1.94k | pub fn parse_tls_extension_elliptic_curves_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 299 | 1.94k | map_parser( | 300 | 1.94k | length_data(be_u16), | 301 | 1.94k | map(parse_named_groups, TlsExtension::EllipticCurves), | 302 | 1.94k | )(i) | 303 | 1.94k | } |
|
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 | 4.49k | pub fn parse_tls_extension_ec_point_formats_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
314 | 4.49k | map(length_data(be_u8), TlsExtension::EcPointFormats)(i) |
315 | 4.49k | } tls_parser::tls_extensions::parse_tls_extension_ec_point_formats_content Line | Count | Source | 313 | 1.73k | pub fn parse_tls_extension_ec_point_formats_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 314 | 1.73k | map(length_data(be_u8), TlsExtension::EcPointFormats)(i) | 315 | 1.73k | } |
tls_parser::tls_extensions::parse_tls_extension_ec_point_formats_content Line | Count | Source | 313 | 2.75k | pub fn parse_tls_extension_ec_point_formats_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 314 | 2.75k | map(length_data(be_u8), TlsExtension::EcPointFormats)(i) | 315 | 2.75k | } |
|
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.30k | pub fn parse_tls_extension_signature_algorithms_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
327 | 3.30k | let (i, l) = map_parser(length_data(be_u16), many0(complete(be_u16)))(i)?; |
328 | 2.07k | Ok((i, TlsExtension::SignatureAlgorithms(l))) // XXX SignatureAlgorithms or SignatureScheme |
329 | 3.30k | } tls_parser::tls_extensions::parse_tls_extension_signature_algorithms_content Line | Count | Source | 326 | 1.69k | pub fn parse_tls_extension_signature_algorithms_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 327 | 1.69k | let (i, l) = map_parser(length_data(be_u16), many0(complete(be_u16)))(i)?; | 328 | 1.10k | Ok((i, TlsExtension::SignatureAlgorithms(l))) // XXX SignatureAlgorithms or SignatureScheme | 329 | 1.69k | } |
tls_parser::tls_extensions::parse_tls_extension_signature_algorithms_content Line | Count | Source | 326 | 1.60k | pub fn parse_tls_extension_signature_algorithms_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 327 | 1.60k | let (i, l) = map_parser(length_data(be_u16), many0(complete(be_u16)))(i)?; | 328 | 969 | Ok((i, TlsExtension::SignatureAlgorithms(l))) // XXX SignatureAlgorithms or SignatureScheme | 329 | 1.60k | } |
|
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 | 931 | pub fn parse_tls_extension_heartbeat_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
341 | 931 | map(be_u8, TlsExtension::Heartbeat)(i) |
342 | 931 | } 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 | 530 | pub fn parse_tls_extension_heartbeat_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 341 | 530 | map(be_u8, TlsExtension::Heartbeat)(i) | 342 | 530 | } |
|
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 | 726k | fn parse_protocol_name(i: &[u8]) -> IResult<&[u8], &[u8]> { |
351 | 726k | length_data(be_u8)(i) |
352 | 726k | } tls_parser::tls_extensions::parse_protocol_name Line | Count | Source | 350 | 402k | fn parse_protocol_name(i: &[u8]) -> IResult<&[u8], &[u8]> { | 351 | 402k | length_data(be_u8)(i) | 352 | 402k | } |
tls_parser::tls_extensions::parse_protocol_name Line | Count | Source | 350 | 324k | fn parse_protocol_name(i: &[u8]) -> IResult<&[u8], &[u8]> { | 351 | 324k | length_data(be_u8)(i) | 352 | 324k | } |
|
353 | | |
354 | | /// Defined in [RFC7301] |
355 | 10.0k | pub fn parse_tls_extension_alpn_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
356 | 10.0k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_protocol_name)))(i)?; |
357 | 8.95k | Ok((i, TlsExtension::ALPN(v))) |
358 | 10.0k | } tls_parser::tls_extensions::parse_tls_extension_alpn_content Line | Count | Source | 355 | 5.92k | pub fn parse_tls_extension_alpn_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 356 | 5.92k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_protocol_name)))(i)?; | 357 | 5.35k | Ok((i, TlsExtension::ALPN(v))) | 358 | 5.92k | } |
tls_parser::tls_extensions::parse_tls_extension_alpn_content Line | Count | Source | 355 | 4.15k | pub fn parse_tls_extension_alpn_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 356 | 4.15k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_protocol_name)))(i)?; | 357 | 3.59k | Ok((i, TlsExtension::ALPN(v))) | 358 | 4.15k | } |
|
359 | | |
360 | | /// Defined in [RFC7685] |
361 | 912 | fn parse_tls_extension_padding_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { |
362 | 912 | map(take(ext_len), TlsExtension::Padding)(i) |
363 | 912 | } tls_parser::tls_extensions::parse_tls_extension_padding_content Line | Count | Source | 361 | 298 | fn parse_tls_extension_padding_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 362 | 298 | map(take(ext_len), TlsExtension::Padding)(i) | 363 | 298 | } |
tls_parser::tls_extensions::parse_tls_extension_padding_content Line | Count | Source | 361 | 614 | fn parse_tls_extension_padding_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 362 | 614 | map(take(ext_len), TlsExtension::Padding)(i) | 363 | 614 | } |
|
364 | | |
365 | | /// Defined in [RFC6962] |
366 | 5.97k | pub fn parse_tls_extension_signed_certificate_timestamp_content( |
367 | 5.97k | i: &[u8], |
368 | 5.97k | ) -> IResult<&[u8], TlsExtension> { |
369 | 5.97k | map( |
370 | 5.97k | opt(complete(length_data(be_u16))), |
371 | 5.97k | TlsExtension::SignedCertificateTimestamp, |
372 | 5.97k | )(i) |
373 | 5.97k | } tls_parser::tls_extensions::parse_tls_extension_signed_certificate_timestamp_content Line | Count | Source | 366 | 2.07k | pub fn parse_tls_extension_signed_certificate_timestamp_content( | 367 | 2.07k | i: &[u8], | 368 | 2.07k | ) -> IResult<&[u8], TlsExtension> { | 369 | 2.07k | map( | 370 | 2.07k | opt(complete(length_data(be_u16))), | 371 | 2.07k | TlsExtension::SignedCertificateTimestamp, | 372 | 2.07k | )(i) | 373 | 2.07k | } |
tls_parser::tls_extensions::parse_tls_extension_signed_certificate_timestamp_content Line | Count | Source | 366 | 3.90k | pub fn parse_tls_extension_signed_certificate_timestamp_content( | 367 | 3.90k | i: &[u8], | 368 | 3.90k | ) -> IResult<&[u8], TlsExtension> { | 369 | 3.90k | map( | 370 | 3.90k | opt(complete(length_data(be_u16))), | 371 | 3.90k | TlsExtension::SignedCertificateTimestamp, | 372 | 3.90k | )(i) | 373 | 3.90k | } |
|
374 | | |
375 | | /// Encrypt-then-MAC is defined in [RFC7366] |
376 | 2.96k | fn parse_tls_extension_encrypt_then_mac_content( |
377 | 2.96k | i: &[u8], |
378 | 2.96k | ext_len: u16, |
379 | 2.96k | ) -> IResult<&[u8], TlsExtension> { |
380 | 2.96k | if ext_len != 0 { |
381 | 406 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
382 | 2.55k | } |
383 | 2.55k | Ok((i, TlsExtension::EncryptThenMac)) |
384 | 2.96k | } tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac_content Line | Count | Source | 376 | 2.51k | fn parse_tls_extension_encrypt_then_mac_content( | 377 | 2.51k | i: &[u8], | 378 | 2.51k | ext_len: u16, | 379 | 2.51k | ) -> IResult<&[u8], TlsExtension> { | 380 | 2.51k | if ext_len != 0 { | 381 | 198 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 382 | 2.31k | } | 383 | 2.31k | Ok((i, TlsExtension::EncryptThenMac)) | 384 | 2.51k | } |
tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac_content Line | Count | Source | 376 | 451 | fn parse_tls_extension_encrypt_then_mac_content( | 377 | 451 | i: &[u8], | 378 | 451 | ext_len: u16, | 379 | 451 | ) -> IResult<&[u8], TlsExtension> { | 380 | 451 | if ext_len != 0 { | 381 | 208 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 382 | 243 | } | 383 | 243 | Ok((i, TlsExtension::EncryptThenMac)) | 384 | 451 | } |
|
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 | 938 | fn parse_tls_extension_extended_master_secret_content( |
397 | 938 | i: &[u8], |
398 | 938 | ext_len: u16, |
399 | 938 | ) -> IResult<&[u8], TlsExtension> { |
400 | 938 | if ext_len != 0 { |
401 | 406 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
402 | 532 | } |
403 | 532 | Ok((i, TlsExtension::ExtendedMasterSecret)) |
404 | 938 | } tls_parser::tls_extensions::parse_tls_extension_extended_master_secret_content Line | Count | Source | 396 | 505 | fn parse_tls_extension_extended_master_secret_content( | 397 | 505 | i: &[u8], | 398 | 505 | ext_len: u16, | 399 | 505 | ) -> IResult<&[u8], TlsExtension> { | 400 | 505 | if ext_len != 0 { | 401 | 200 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 402 | 305 | } | 403 | 305 | Ok((i, TlsExtension::ExtendedMasterSecret)) | 404 | 505 | } |
tls_parser::tls_extensions::parse_tls_extension_extended_master_secret_content Line | Count | Source | 396 | 433 | fn parse_tls_extension_extended_master_secret_content( | 397 | 433 | i: &[u8], | 398 | 433 | ext_len: u16, | 399 | 433 | ) -> IResult<&[u8], TlsExtension> { | 400 | 433 | if ext_len != 0 { | 401 | 206 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 402 | 227 | } | 403 | 227 | Ok((i, TlsExtension::ExtendedMasterSecret)) | 404 | 433 | } |
|
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 | 876 | fn parse_tls_extension_record_size_limit(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
417 | 876 | map(be_u16, TlsExtension::RecordSizeLimit)(i) |
418 | 876 | } tls_parser::tls_extensions::parse_tls_extension_record_size_limit Line | Count | Source | 416 | 453 | fn parse_tls_extension_record_size_limit(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 417 | 453 | map(be_u16, TlsExtension::RecordSizeLimit)(i) | 418 | 453 | } |
tls_parser::tls_extensions::parse_tls_extension_record_size_limit Line | Count | Source | 416 | 423 | fn parse_tls_extension_record_size_limit(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 417 | 423 | map(be_u16, TlsExtension::RecordSizeLimit)(i) | 418 | 423 | } |
|
419 | | |
420 | 2.19k | fn parse_tls_extension_session_ticket_content( |
421 | 2.19k | i: &[u8], |
422 | 2.19k | ext_len: u16, |
423 | 2.19k | ) -> IResult<&[u8], TlsExtension> { |
424 | 2.19k | map(take(ext_len), TlsExtension::SessionTicket)(i) |
425 | 2.19k | } tls_parser::tls_extensions::parse_tls_extension_session_ticket_content Line | Count | Source | 420 | 712 | fn parse_tls_extension_session_ticket_content( | 421 | 712 | i: &[u8], | 422 | 712 | ext_len: u16, | 423 | 712 | ) -> IResult<&[u8], TlsExtension> { | 424 | 712 | map(take(ext_len), TlsExtension::SessionTicket)(i) | 425 | 712 | } |
tls_parser::tls_extensions::parse_tls_extension_session_ticket_content Line | Count | Source | 420 | 1.48k | fn parse_tls_extension_session_ticket_content( | 421 | 1.48k | i: &[u8], | 422 | 1.48k | ext_len: u16, | 423 | 1.48k | ) -> IResult<&[u8], TlsExtension> { | 424 | 1.48k | map(take(ext_len), TlsExtension::SessionTicket)(i) | 425 | 1.48k | } |
|
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 | 735 | fn parse_tls_extension_key_share_old_content( |
436 | 735 | i: &[u8], |
437 | 735 | ext_len: u16, |
438 | 735 | ) -> IResult<&[u8], TlsExtension> { |
439 | 735 | map(take(ext_len), TlsExtension::KeyShareOld)(i) |
440 | 735 | } tls_parser::tls_extensions::parse_tls_extension_key_share_old_content Line | Count | Source | 435 | 358 | fn parse_tls_extension_key_share_old_content( | 436 | 358 | i: &[u8], | 437 | 358 | ext_len: u16, | 438 | 358 | ) -> IResult<&[u8], TlsExtension> { | 439 | 358 | map(take(ext_len), TlsExtension::KeyShareOld)(i) | 440 | 358 | } |
tls_parser::tls_extensions::parse_tls_extension_key_share_old_content Line | Count | Source | 435 | 377 | fn parse_tls_extension_key_share_old_content( | 436 | 377 | i: &[u8], | 437 | 377 | ext_len: u16, | 438 | 377 | ) -> IResult<&[u8], TlsExtension> { | 439 | 377 | map(take(ext_len), TlsExtension::KeyShareOld)(i) | 440 | 377 | } |
|
441 | | |
442 | 1.26k | fn parse_tls_extension_key_share_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { |
443 | 1.26k | map(take(ext_len), TlsExtension::KeyShare)(i) |
444 | 1.26k | } tls_parser::tls_extensions::parse_tls_extension_key_share_content Line | Count | Source | 442 | 511 | fn parse_tls_extension_key_share_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 443 | 511 | map(take(ext_len), TlsExtension::KeyShare)(i) | 444 | 511 | } |
tls_parser::tls_extensions::parse_tls_extension_key_share_content Line | Count | Source | 442 | 758 | fn parse_tls_extension_key_share_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 443 | 758 | map(take(ext_len), TlsExtension::KeyShare)(i) | 444 | 758 | } |
|
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.64k | fn parse_tls_extension_pre_shared_key_content( |
455 | 1.64k | i: &[u8], |
456 | 1.64k | ext_len: u16, |
457 | 1.64k | ) -> IResult<&[u8], TlsExtension> { |
458 | 1.64k | map(take(ext_len), TlsExtension::PreSharedKey)(i) |
459 | 1.64k | } tls_parser::tls_extensions::parse_tls_extension_pre_shared_key_content Line | Count | Source | 454 | 1.03k | fn parse_tls_extension_pre_shared_key_content( | 455 | 1.03k | i: &[u8], | 456 | 1.03k | ext_len: u16, | 457 | 1.03k | ) -> IResult<&[u8], TlsExtension> { | 458 | 1.03k | map(take(ext_len), TlsExtension::PreSharedKey)(i) | 459 | 1.03k | } |
tls_parser::tls_extensions::parse_tls_extension_pre_shared_key_content Line | Count | Source | 454 | 609 | fn parse_tls_extension_pre_shared_key_content( | 455 | 609 | i: &[u8], | 456 | 609 | ext_len: u16, | 457 | 609 | ) -> IResult<&[u8], TlsExtension> { | 458 | 609 | map(take(ext_len), TlsExtension::PreSharedKey)(i) | 459 | 609 | } |
|
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 | 799 | fn parse_tls_extension_early_data_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 470 | 799 | map(cond(ext_len > 0, be_u32), TlsExtension::EarlyData)(i) | 471 | 799 | } |
tls_parser::tls_extensions::parse_tls_extension_early_data_content Line | Count | Source | 469 | 1.04k | fn parse_tls_extension_early_data_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 470 | 1.04k | map(cond(ext_len > 0, be_u32), TlsExtension::EarlyData)(i) | 471 | 1.04k | } |
|
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.03k | fn parse_tls_extension_supported_versions_content( |
494 | 6.03k | i: &[u8], |
495 | 6.03k | ext_len: u16, |
496 | 6.03k | ) -> IResult<&[u8], TlsExtension> { |
497 | 6.03k | if ext_len == 2 { |
498 | 1.89k | map(be_u16, |x| { |
499 | 1.89k | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) |
500 | 1.89k | })(i) tls_parser::tls_extensions::parse_tls_extension_supported_versions_content::{closure#0}Line | Count | Source | 498 | 412 | map(be_u16, |x| { | 499 | 412 | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) | 500 | 412 | })(i) |
tls_parser::tls_extensions::parse_tls_extension_supported_versions_content::{closure#0}Line | Count | Source | 498 | 1.48k | map(be_u16, |x| { | 499 | 1.48k | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) | 500 | 1.48k | })(i) |
|
501 | | } else { |
502 | 4.13k | let (i, _) = be_u8(i)?; |
503 | 3.68k | if ext_len == 0 { |
504 | 0 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
505 | 3.68k | } |
506 | 3.68k | let (i, l) = map_parser(take(ext_len - 1), parse_tls_versions)(i)?; |
507 | 3.23k | Ok((i, TlsExtension::SupportedVersions(l))) |
508 | | } |
509 | 6.03k | } tls_parser::tls_extensions::parse_tls_extension_supported_versions_content Line | Count | Source | 493 | 2.40k | fn parse_tls_extension_supported_versions_content( | 494 | 2.40k | i: &[u8], | 495 | 2.40k | ext_len: u16, | 496 | 2.40k | ) -> IResult<&[u8], TlsExtension> { | 497 | 2.40k | if ext_len == 2 { | 498 | 412 | map(be_u16, |x| { | 499 | | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) | 500 | 412 | })(i) | 501 | | } else { | 502 | 1.99k | let (i, _) = be_u8(i)?; | 503 | 1.77k | if ext_len == 0 { | 504 | 0 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 505 | 1.77k | } | 506 | 1.77k | let (i, l) = map_parser(take(ext_len - 1), parse_tls_versions)(i)?; | 507 | 1.58k | Ok((i, TlsExtension::SupportedVersions(l))) | 508 | | } | 509 | 2.40k | } |
tls_parser::tls_extensions::parse_tls_extension_supported_versions_content Line | Count | Source | 493 | 3.62k | fn parse_tls_extension_supported_versions_content( | 494 | 3.62k | i: &[u8], | 495 | 3.62k | ext_len: u16, | 496 | 3.62k | ) -> IResult<&[u8], TlsExtension> { | 497 | 3.62k | if ext_len == 2 { | 498 | 1.48k | map(be_u16, |x| { | 499 | | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) | 500 | 1.48k | })(i) | 501 | | } else { | 502 | 2.13k | let (i, _) = be_u8(i)?; | 503 | 1.90k | if ext_len == 0 { | 504 | 0 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 505 | 1.90k | } | 506 | 1.90k | let (i, l) = map_parser(take(ext_len - 1), parse_tls_versions)(i)?; | 507 | 1.65k | Ok((i, TlsExtension::SupportedVersions(l))) | 508 | | } | 509 | 3.62k | } |
|
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.11k | fn parse_tls_extension_cookie_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { |
520 | 1.11k | map(take(ext_len), TlsExtension::Cookie)(i) |
521 | 1.11k | } tls_parser::tls_extensions::parse_tls_extension_cookie_content Line | Count | Source | 519 | 450 | fn parse_tls_extension_cookie_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 520 | 450 | map(take(ext_len), TlsExtension::Cookie)(i) | 521 | 450 | } |
tls_parser::tls_extensions::parse_tls_extension_cookie_content Line | Count | Source | 519 | 661 | fn parse_tls_extension_cookie_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 520 | 661 | map(take(ext_len), TlsExtension::Cookie)(i) | 521 | 661 | } |
|
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.78k | pub fn parse_tls_extension_psk_key_exchange_modes_content( |
532 | 2.78k | i: &[u8], |
533 | 2.78k | ) -> IResult<&[u8], TlsExtension> { |
534 | 2.78k | let (i, v) = length_data(be_u8)(i)?; |
535 | 1.53k | Ok((i, TlsExtension::PskExchangeModes(v.to_vec()))) |
536 | 2.78k | } tls_parser::tls_extensions::parse_tls_extension_psk_key_exchange_modes_content Line | Count | Source | 531 | 1.24k | pub fn parse_tls_extension_psk_key_exchange_modes_content( | 532 | 1.24k | i: &[u8], | 533 | 1.24k | ) -> IResult<&[u8], TlsExtension> { | 534 | 1.24k | let (i, v) = length_data(be_u8)(i)?; | 535 | 819 | Ok((i, TlsExtension::PskExchangeModes(v.to_vec()))) | 536 | 1.24k | } |
tls_parser::tls_extensions::parse_tls_extension_psk_key_exchange_modes_content Line | Count | Source | 531 | 1.53k | pub fn parse_tls_extension_psk_key_exchange_modes_content( | 532 | 1.53k | i: &[u8], | 533 | 1.53k | ) -> IResult<&[u8], TlsExtension> { | 534 | 1.53k | let (i, v) = length_data(be_u8)(i)?; | 535 | 719 | Ok((i, TlsExtension::PskExchangeModes(v.to_vec()))) | 536 | 1.53k | } |
|
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 | 272 | fn parse_tls_extension_npn_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { |
549 | 272 | if ext_len != 0 { |
550 | 132 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
551 | 140 | } |
552 | 140 | Ok((i, TlsExtension::NextProtocolNegotiation)) |
553 | 272 | } tls_parser::tls_extensions::parse_tls_extension_npn_content Line | Count | Source | 548 | 139 | fn parse_tls_extension_npn_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 549 | 139 | if ext_len != 0 { | 550 | 66 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 551 | 73 | } | 552 | 73 | Ok((i, TlsExtension::NextProtocolNegotiation)) | 553 | 139 | } |
tls_parser::tls_extensions::parse_tls_extension_npn_content Line | Count | Source | 548 | 133 | fn parse_tls_extension_npn_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 549 | 133 | if ext_len != 0 { | 550 | 66 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 551 | 67 | } | 552 | 67 | Ok((i, TlsExtension::NextProtocolNegotiation)) | 553 | 133 | } |
|
554 | | |
555 | | /// Renegotiation Info, defined in [RFC5746] |
556 | 1.57k | pub fn parse_tls_extension_renegotiation_info_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
557 | 1.57k | map(length_data(be_u8), TlsExtension::RenegotiationInfo)(i) |
558 | 1.57k | } tls_parser::tls_extensions::parse_tls_extension_renegotiation_info_content Line | Count | Source | 556 | 839 | pub fn parse_tls_extension_renegotiation_info_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 557 | 839 | map(length_data(be_u8), TlsExtension::RenegotiationInfo)(i) | 558 | 839 | } |
tls_parser::tls_extensions::parse_tls_extension_renegotiation_info_content Line | Count | Source | 556 | 731 | pub fn parse_tls_extension_renegotiation_info_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 557 | 731 | map(length_data(be_u8), TlsExtension::RenegotiationInfo)(i) | 558 | 731 | } |
|
559 | | |
560 | | /// Encrypted Server Name, defined in [draft-ietf-tls-esni] |
561 | 4.88k | pub fn parse_tls_extension_encrypted_server_name(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
562 | 4.88k | let (i, ciphersuite) = map(be_u16, TlsCipherSuiteID)(i)?; |
563 | 4.03k | let (i, group) = NamedGroup::parse(i)?; |
564 | 3.40k | let (i, key_share) = length_data(be_u16)(i)?; |
565 | 2.42k | let (i, record_digest) = length_data(be_u16)(i)?; |
566 | 1.41k | let (i, encrypted_sni) = length_data(be_u16)(i)?; |
567 | 227 | let esn = TlsExtension::EncryptedServerName { |
568 | 227 | ciphersuite, |
569 | 227 | group, |
570 | 227 | key_share, |
571 | 227 | record_digest, |
572 | 227 | encrypted_sni, |
573 | 227 | }; |
574 | 227 | Ok((i, esn)) |
575 | 4.88k | } tls_parser::tls_extensions::parse_tls_extension_encrypted_server_name Line | Count | Source | 561 | 2.27k | pub fn parse_tls_extension_encrypted_server_name(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 562 | 2.27k | let (i, ciphersuite) = map(be_u16, TlsCipherSuiteID)(i)?; | 563 | 1.92k | let (i, group) = NamedGroup::parse(i)?; | 564 | 1.61k | let (i, key_share) = length_data(be_u16)(i)?; | 565 | 1.06k | let (i, record_digest) = length_data(be_u16)(i)?; | 566 | 653 | let (i, encrypted_sni) = length_data(be_u16)(i)?; | 567 | 111 | let esn = TlsExtension::EncryptedServerName { | 568 | 111 | ciphersuite, | 569 | 111 | group, | 570 | 111 | key_share, | 571 | 111 | record_digest, | 572 | 111 | encrypted_sni, | 573 | 111 | }; | 574 | 111 | Ok((i, esn)) | 575 | 2.27k | } |
tls_parser::tls_extensions::parse_tls_extension_encrypted_server_name Line | Count | Source | 561 | 2.61k | pub fn parse_tls_extension_encrypted_server_name(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 562 | 2.61k | let (i, ciphersuite) = map(be_u16, TlsCipherSuiteID)(i)?; | 563 | 2.11k | let (i, group) = NamedGroup::parse(i)?; | 564 | 1.78k | let (i, key_share) = length_data(be_u16)(i)?; | 565 | 1.36k | let (i, record_digest) = length_data(be_u16)(i)?; | 566 | 759 | let (i, encrypted_sni) = length_data(be_u16)(i)?; | 567 | 116 | let esn = TlsExtension::EncryptedServerName { | 568 | 116 | ciphersuite, | 569 | 116 | group, | 570 | 116 | key_share, | 571 | 116 | record_digest, | 572 | 116 | encrypted_sni, | 573 | 116 | }; | 574 | 116 | Ok((i, esn)) | 575 | 2.61k | } |
|
576 | | |
577 | 109k | fn parse_tls_oid_filter(i: &[u8]) -> IResult<&[u8], OidFilter> { |
578 | 109k | let (i, cert_ext_oid) = length_data(be_u8)(i)?; |
579 | 107k | let (i, cert_ext_val) = length_data(be_u16)(i)?; |
580 | 106k | let filter = OidFilter { |
581 | 106k | cert_ext_oid, |
582 | 106k | cert_ext_val, |
583 | 106k | }; |
584 | 106k | Ok((i, filter)) |
585 | 109k | } tls_parser::tls_extensions::parse_tls_oid_filter Line | Count | Source | 577 | 54.3k | fn parse_tls_oid_filter(i: &[u8]) -> IResult<&[u8], OidFilter> { | 578 | 54.3k | let (i, cert_ext_oid) = length_data(be_u8)(i)?; | 579 | 53.4k | let (i, cert_ext_val) = length_data(be_u16)(i)?; | 580 | 52.7k | let filter = OidFilter { | 581 | 52.7k | cert_ext_oid, | 582 | 52.7k | cert_ext_val, | 583 | 52.7k | }; | 584 | 52.7k | Ok((i, filter)) | 585 | 54.3k | } |
tls_parser::tls_extensions::parse_tls_oid_filter Line | Count | Source | 577 | 55.0k | fn parse_tls_oid_filter(i: &[u8]) -> IResult<&[u8], OidFilter> { | 578 | 55.0k | let (i, cert_ext_oid) = length_data(be_u8)(i)?; | 579 | 53.9k | let (i, cert_ext_val) = length_data(be_u16)(i)?; | 580 | 53.2k | let filter = OidFilter { | 581 | 53.2k | cert_ext_oid, | 582 | 53.2k | cert_ext_val, | 583 | 53.2k | }; | 584 | 53.2k | Ok((i, filter)) | 585 | 55.0k | } |
|
586 | | |
587 | | /// Defined in TLS 1.3 draft 19 |
588 | 4.66k | fn parse_tls_extension_oid_filters(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
589 | 4.66k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_tls_oid_filter)))(i)?; |
590 | 3.40k | Ok((i, TlsExtension::OidFilters(v))) |
591 | 4.66k | } tls_parser::tls_extensions::parse_tls_extension_oid_filters Line | Count | Source | 588 | 2.14k | fn parse_tls_extension_oid_filters(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 589 | 2.14k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_tls_oid_filter)))(i)?; | 590 | 1.60k | Ok((i, TlsExtension::OidFilters(v))) | 591 | 2.14k | } |
tls_parser::tls_extensions::parse_tls_extension_oid_filters Line | Count | Source | 588 | 2.52k | fn parse_tls_extension_oid_filters(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 589 | 2.52k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_tls_oid_filter)))(i)?; | 590 | 1.80k | Ok((i, TlsExtension::OidFilters(v))) | 591 | 2.52k | } |
|
592 | | |
593 | | /// Defined in TLS 1.3 draft 20 |
594 | 1.59k | fn parse_tls_extension_post_handshake_auth_content( |
595 | 1.59k | i: &[u8], |
596 | 1.59k | ext_len: u16, |
597 | 1.59k | ) -> IResult<&[u8], TlsExtension> { |
598 | 1.59k | if ext_len != 0 { |
599 | 439 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
600 | 1.15k | } |
601 | 1.15k | Ok((i, TlsExtension::PostHandshakeAuth)) |
602 | 1.59k | } tls_parser::tls_extensions::parse_tls_extension_post_handshake_auth_content Line | Count | Source | 594 | 643 | fn parse_tls_extension_post_handshake_auth_content( | 595 | 643 | i: &[u8], | 596 | 643 | ext_len: u16, | 597 | 643 | ) -> IResult<&[u8], TlsExtension> { | 598 | 643 | if ext_len != 0 { | 599 | 201 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 600 | 442 | } | 601 | 442 | Ok((i, TlsExtension::PostHandshakeAuth)) | 602 | 643 | } |
tls_parser::tls_extensions::parse_tls_extension_post_handshake_auth_content Line | Count | Source | 594 | 954 | fn parse_tls_extension_post_handshake_auth_content( | 595 | 954 | i: &[u8], | 596 | 954 | ext_len: u16, | 597 | 954 | ) -> IResult<&[u8], TlsExtension> { | 598 | 954 | if ext_len != 0 { | 599 | 238 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 600 | 716 | } | 601 | 716 | Ok((i, TlsExtension::PostHandshakeAuth)) | 602 | 954 | } |
|
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.72M | pub fn parse_tls_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
693 | 3.72M | let (i, ext_type) = be_u16(i)?; |
694 | 3.68M | let (i, ext_data) = length_data(be_u16)(i)?; |
695 | 3.66M | if ext_type & 0x0f0f == 0x0a0a { |
696 | 759 | return Ok((i, TlsExtension::Grease(ext_type, ext_data))); |
697 | 3.66M | } |
698 | 3.66M | let ext_len = ext_data.len() as u16; |
699 | 3.66M | let (_, ext) = match ext_type { |
700 | 2.61M | 0 => parse_tls_extension_sni_content(ext_data), |
701 | 1.04k | 1 => parse_tls_extension_max_fragment_length_content(ext_data), |
702 | 55.9k | 5 => parse_tls_extension_status_request_content(ext_data, ext_len), |
703 | 4.93k | 10 => parse_tls_extension_elliptic_curves_content(ext_data), |
704 | 4.49k | 11 => parse_tls_extension_ec_point_formats_content(ext_data), |
705 | 3.30k | 13 => parse_tls_extension_signature_algorithms_content(ext_data), |
706 | 931 | 15 => parse_tls_extension_heartbeat_content(ext_data), |
707 | 10.0k | 16 => parse_tls_extension_alpn_content(ext_data), |
708 | 5.97k | 18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data), |
709 | 912 | 21 => parse_tls_extension_padding_content(ext_data, ext_len), |
710 | 2.96k | 22 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len), |
711 | 938 | 23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len), |
712 | 876 | 28 => parse_tls_extension_record_size_limit(ext_data), |
713 | 2.19k | 35 => parse_tls_extension_session_ticket_content(ext_data, ext_len), |
714 | 735 | 40 => parse_tls_extension_key_share_old_content(ext_data, ext_len), |
715 | 1.64k | 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.03k | 43 => parse_tls_extension_supported_versions_content(ext_data, ext_len), |
718 | 1.11k | 44 => parse_tls_extension_cookie_content(ext_data, ext_len), |
719 | 2.78k | 45 => parse_tls_extension_psk_key_exchange_modes_content(ext_data), |
720 | 4.66k | 48 => parse_tls_extension_oid_filters(ext_data), |
721 | 1.59k | 49 => parse_tls_extension_post_handshake_auth_content(ext_data, ext_len), |
722 | 1.26k | 51 => parse_tls_extension_key_share_content(ext_data, ext_len), |
723 | 272 | 13172 => parse_tls_extension_npn_content(ext_data, ext_len), |
724 | 1.57k | 0xff01 => parse_tls_extension_renegotiation_info_content(ext_data), |
725 | 4.88k | 0xffce => parse_tls_extension_encrypted_server_name(ext_data), |
726 | 928k | _ => Ok(( |
727 | 928k | i, |
728 | 928k | TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data), |
729 | 928k | )), |
730 | 18.1k | }?; |
731 | 3.64M | Ok((i, ext)) |
732 | 3.72M | } tls_parser::tls_extensions::parse_tls_extension Line | Count | Source | 692 | 1.18M | pub fn parse_tls_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 693 | 1.18M | let (i, ext_type) = be_u16(i)?; | 694 | 1.16M | let (i, ext_data) = length_data(be_u16)(i)?; | 695 | 1.15M | if ext_type & 0x0f0f == 0x0a0a { | 696 | 322 | return Ok((i, TlsExtension::Grease(ext_type, ext_data))); | 697 | 1.15M | } | 698 | 1.15M | let ext_len = ext_data.len() as u16; | 699 | 1.15M | let (_, ext) = match ext_type { | 700 | 750k | 0 => parse_tls_extension_sni_content(ext_data), | 701 | 448 | 1 => parse_tls_extension_max_fragment_length_content(ext_data), | 702 | 42.7k | 5 => parse_tls_extension_status_request_content(ext_data, ext_len), | 703 | 2.99k | 10 => parse_tls_extension_elliptic_curves_content(ext_data), | 704 | 1.73k | 11 => parse_tls_extension_ec_point_formats_content(ext_data), | 705 | 1.69k | 13 => parse_tls_extension_signature_algorithms_content(ext_data), | 706 | 401 | 15 => parse_tls_extension_heartbeat_content(ext_data), | 707 | 5.92k | 16 => parse_tls_extension_alpn_content(ext_data), | 708 | 2.07k | 18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data), | 709 | 298 | 21 => parse_tls_extension_padding_content(ext_data, ext_len), | 710 | 2.51k | 22 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len), | 711 | 505 | 23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len), | 712 | 453 | 28 => parse_tls_extension_record_size_limit(ext_data), | 713 | 712 | 35 => parse_tls_extension_session_ticket_content(ext_data, ext_len), | 714 | 358 | 40 => parse_tls_extension_key_share_old_content(ext_data, ext_len), | 715 | 1.03k | 41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len), | 716 | 799 | 42 => parse_tls_extension_early_data_content(ext_data, ext_len), | 717 | 2.40k | 43 => parse_tls_extension_supported_versions_content(ext_data, ext_len), | 718 | 450 | 44 => parse_tls_extension_cookie_content(ext_data, ext_len), | 719 | 1.24k | 45 => parse_tls_extension_psk_key_exchange_modes_content(ext_data), | 720 | 2.14k | 48 => parse_tls_extension_oid_filters(ext_data), | 721 | 643 | 49 => parse_tls_extension_post_handshake_auth_content(ext_data, ext_len), | 722 | 511 | 51 => parse_tls_extension_key_share_content(ext_data, ext_len), | 723 | 139 | 13172 => parse_tls_extension_npn_content(ext_data, ext_len), | 724 | 839 | 0xff01 => parse_tls_extension_renegotiation_info_content(ext_data), | 725 | 2.27k | 0xffce => parse_tls_extension_encrypted_server_name(ext_data), | 726 | 333k | _ => Ok(( | 727 | 333k | i, | 728 | 333k | TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data), | 729 | 333k | )), | 730 | 8.32k | }?; | 731 | 1.15M | Ok((i, ext)) | 732 | 1.18M | } |
tls_parser::tls_extensions::parse_tls_extension Line | Count | Source | 692 | 2.53M | pub fn parse_tls_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 693 | 2.53M | let (i, ext_type) = be_u16(i)?; | 694 | 2.51M | let (i, ext_data) = length_data(be_u16)(i)?; | 695 | 2.50M | if ext_type & 0x0f0f == 0x0a0a { | 696 | 437 | return Ok((i, TlsExtension::Grease(ext_type, ext_data))); | 697 | 2.50M | } | 698 | 2.50M | let ext_len = ext_data.len() as u16; | 699 | 2.50M | let (_, ext) = match ext_type { | 700 | 1.86M | 0 => parse_tls_extension_sni_content(ext_data), | 701 | 595 | 1 => parse_tls_extension_max_fragment_length_content(ext_data), | 702 | 13.1k | 5 => parse_tls_extension_status_request_content(ext_data, ext_len), | 703 | 1.94k | 10 => parse_tls_extension_elliptic_curves_content(ext_data), | 704 | 2.75k | 11 => parse_tls_extension_ec_point_formats_content(ext_data), | 705 | 1.60k | 13 => parse_tls_extension_signature_algorithms_content(ext_data), | 706 | 530 | 15 => parse_tls_extension_heartbeat_content(ext_data), | 707 | 4.15k | 16 => parse_tls_extension_alpn_content(ext_data), | 708 | 3.90k | 18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data), | 709 | 614 | 21 => parse_tls_extension_padding_content(ext_data, ext_len), | 710 | 451 | 22 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len), | 711 | 433 | 23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len), | 712 | 423 | 28 => parse_tls_extension_record_size_limit(ext_data), | 713 | 1.48k | 35 => parse_tls_extension_session_ticket_content(ext_data, ext_len), | 714 | 377 | 40 => parse_tls_extension_key_share_old_content(ext_data, ext_len), | 715 | 609 | 41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len), | 716 | 1.04k | 42 => parse_tls_extension_early_data_content(ext_data, ext_len), | 717 | 3.62k | 43 => parse_tls_extension_supported_versions_content(ext_data, ext_len), | 718 | 661 | 44 => parse_tls_extension_cookie_content(ext_data, ext_len), | 719 | 1.53k | 45 => parse_tls_extension_psk_key_exchange_modes_content(ext_data), | 720 | 2.52k | 48 => parse_tls_extension_oid_filters(ext_data), | 721 | 954 | 49 => parse_tls_extension_post_handshake_auth_content(ext_data, ext_len), | 722 | 758 | 51 => parse_tls_extension_key_share_content(ext_data, ext_len), | 723 | 133 | 13172 => parse_tls_extension_npn_content(ext_data, ext_len), | 724 | 731 | 0xff01 => parse_tls_extension_renegotiation_info_content(ext_data), | 725 | 2.61k | 0xffce => parse_tls_extension_encrypted_server_name(ext_data), | 726 | 595k | _ => Ok(( | 727 | 595k | i, | 728 | 595k | TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data), | 729 | 595k | )), | 730 | 9.82k | }?; | 731 | 2.49M | Ok((i, ext)) | 732 | 2.53M | } |
|
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 | 76.9k | pub fn parse_tls_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> { |
746 | 76.9k | many0(complete(parse_tls_extension))(i) |
747 | 76.9k | } tls_parser::tls_extensions::parse_tls_extensions Line | Count | Source | 745 | 34.5k | pub fn parse_tls_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> { | 746 | 34.5k | many0(complete(parse_tls_extension))(i) | 747 | 34.5k | } |
tls_parser::tls_extensions::parse_tls_extensions Line | Count | Source | 745 | 42.4k | pub fn parse_tls_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> { | 746 | 42.4k | many0(complete(parse_tls_extension))(i) | 747 | 42.4k | } |
|