/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 | 18.8M | fn from(ext: TlsExtensionType) -> u16 { |
92 | 18.8M | ext.0 |
93 | 18.8M | } <u16 as core::convert::From<tls_parser::tls_extensions::TlsExtensionType>>::from Line | Count | Source | 91 | 7.35M | fn from(ext: TlsExtensionType) -> u16 { | 92 | 7.35M | ext.0 | 93 | 7.35M | } |
<u16 as core::convert::From<tls_parser::tls_extensions::TlsExtensionType>>::from Line | Count | Source | 91 | 11.4M | fn from(ext: TlsExtensionType) -> u16 { | 92 | 11.4M | ext.0 | 93 | 11.4M | } |
|
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 | 4.15M | fn from(ext: &TlsExtension) -> TlsExtensionType { |
145 | 4.15M | match *ext { |
146 | 3.02M | TlsExtension::SNI(_) => TlsExtensionType::ServerName, |
147 | 432 | TlsExtension::MaxFragmentLength(_) => TlsExtensionType::MaxFragmentLength, |
148 | 50.6k | TlsExtension::StatusRequest(_) => TlsExtensionType::StatusRequest, |
149 | 4.91k | TlsExtension::EllipticCurves(_) => TlsExtensionType::SupportedGroups, |
150 | 5.31k | TlsExtension::EcPointFormats(_) => TlsExtensionType::EcPointFormats, |
151 | 2.25k | TlsExtension::SignatureAlgorithms(_) => TlsExtensionType::SignatureAlgorithms, |
152 | 1.98k | TlsExtension::SessionTicket(_) => TlsExtensionType::SessionTicketTLS, |
153 | 461 | TlsExtension::RecordSizeLimit(_) => TlsExtensionType::RecordSizeLimit, |
154 | 1.32k | TlsExtension::KeyShareOld(_) => TlsExtensionType::KeyShareOld, |
155 | 1.02k | TlsExtension::KeyShare(_) => TlsExtensionType::KeyShare, |
156 | 1.67k | TlsExtension::PreSharedKey(_) => TlsExtensionType::PreSharedKey, |
157 | 1.43k | TlsExtension::EarlyData(_) => TlsExtensionType::EarlyData, |
158 | 4.93k | TlsExtension::SupportedVersions(_) => TlsExtensionType::SupportedVersions, |
159 | 1.65k | TlsExtension::Cookie(_) => TlsExtensionType::Cookie, |
160 | 1.97k | TlsExtension::PskExchangeModes(_) => TlsExtensionType::PskExchangeModes, |
161 | 554 | TlsExtension::Heartbeat(_) => TlsExtensionType::Heartbeat, |
162 | 13.3k | TlsExtension::ALPN(_) => TlsExtensionType::ApplicationLayerProtocolNegotiation, |
163 | 5.59k | TlsExtension::SignedCertificateTimestamp(_) => TlsExtensionType::SignedCertificateTimestamp, |
164 | 816 | TlsExtension::Padding(_) => TlsExtensionType::Padding, |
165 | 4.38k | TlsExtension::EncryptThenMac => TlsExtensionType::EncryptThenMac, |
166 | 502 | TlsExtension::ExtendedMasterSecret => TlsExtensionType::ExtendedMasterSecret, |
167 | 3.14k | TlsExtension::OidFilters(_) => TlsExtensionType::OidFilters, |
168 | 1.09k | TlsExtension::PostHandshakeAuth => TlsExtensionType::PostHandshakeAuth, |
169 | 132 | TlsExtension::NextProtocolNegotiation => TlsExtensionType::NextProtocolNegotiation, |
170 | 529 | TlsExtension::RenegotiationInfo(_) => TlsExtensionType::RenegotiationInfo, |
171 | 361 | TlsExtension::EncryptedServerName{..} => TlsExtensionType::EncryptedServerName, |
172 | 681 | TlsExtension::Grease(_,_) => TlsExtensionType::Grease, |
173 | 1.01M | TlsExtension::Unknown(x,_) => x |
174 | | } |
175 | 4.15M | } <tls_parser::tls_extensions::TlsExtensionType as core::convert::From<&tls_parser::tls_extensions::TlsExtension>>::from Line | Count | Source | 144 | 1.51M | fn from(ext: &TlsExtension) -> TlsExtensionType { | 145 | 1.51M | match *ext { | 146 | 1.06M | TlsExtension::SNI(_) => TlsExtensionType::ServerName, | 147 | 223 | TlsExtension::MaxFragmentLength(_) => TlsExtensionType::MaxFragmentLength, | 148 | 39.1k | TlsExtension::StatusRequest(_) => TlsExtensionType::StatusRequest, | 149 | 2.92k | TlsExtension::EllipticCurves(_) => TlsExtensionType::SupportedGroups, | 150 | 2.51k | TlsExtension::EcPointFormats(_) => TlsExtensionType::EcPointFormats, | 151 | 1.14k | TlsExtension::SignatureAlgorithms(_) => TlsExtensionType::SignatureAlgorithms, | 152 | 669 | TlsExtension::SessionTicket(_) => TlsExtensionType::SessionTicketTLS, | 153 | 240 | TlsExtension::RecordSizeLimit(_) => TlsExtensionType::RecordSizeLimit, | 154 | 947 | TlsExtension::KeyShareOld(_) => TlsExtensionType::KeyShareOld, | 155 | 505 | TlsExtension::KeyShare(_) => TlsExtensionType::KeyShare, | 156 | 1.01k | TlsExtension::PreSharedKey(_) => TlsExtensionType::PreSharedKey, | 157 | 620 | TlsExtension::EarlyData(_) => TlsExtensionType::EarlyData, | 158 | 2.23k | TlsExtension::SupportedVersions(_) => TlsExtensionType::SupportedVersions, | 159 | 842 | TlsExtension::Cookie(_) => TlsExtensionType::Cookie, | 160 | 955 | TlsExtension::PskExchangeModes(_) => TlsExtensionType::PskExchangeModes, | 161 | 224 | TlsExtension::Heartbeat(_) => TlsExtensionType::Heartbeat, | 162 | 9.06k | TlsExtension::ALPN(_) => TlsExtensionType::ApplicationLayerProtocolNegotiation, | 163 | 2.20k | TlsExtension::SignedCertificateTimestamp(_) => TlsExtensionType::SignedCertificateTimestamp, | 164 | 246 | TlsExtension::Padding(_) => TlsExtensionType::Padding, | 165 | 3.26k | TlsExtension::EncryptThenMac => TlsExtensionType::EncryptThenMac, | 166 | 285 | TlsExtension::ExtendedMasterSecret => TlsExtensionType::ExtendedMasterSecret, | 167 | 1.46k | TlsExtension::OidFilters(_) => TlsExtensionType::OidFilters, | 168 | 478 | TlsExtension::PostHandshakeAuth => TlsExtensionType::PostHandshakeAuth, | 169 | 66 | TlsExtension::NextProtocolNegotiation => TlsExtensionType::NextProtocolNegotiation, | 170 | 287 | TlsExtension::RenegotiationInfo(_) => TlsExtensionType::RenegotiationInfo, | 171 | 126 | TlsExtension::EncryptedServerName{..} => TlsExtensionType::EncryptedServerName, | 172 | 327 | TlsExtension::Grease(_,_) => TlsExtensionType::Grease, | 173 | 375k | TlsExtension::Unknown(x,_) => x | 174 | | } | 175 | 1.51M | } |
<tls_parser::tls_extensions::TlsExtensionType as core::convert::From<&tls_parser::tls_extensions::TlsExtension>>::from Line | Count | Source | 144 | 2.63M | fn from(ext: &TlsExtension) -> TlsExtensionType { | 145 | 2.63M | match *ext { | 146 | 1.95M | TlsExtension::SNI(_) => TlsExtensionType::ServerName, | 147 | 209 | TlsExtension::MaxFragmentLength(_) => TlsExtensionType::MaxFragmentLength, | 148 | 11.5k | TlsExtension::StatusRequest(_) => TlsExtensionType::StatusRequest, | 149 | 1.99k | TlsExtension::EllipticCurves(_) => TlsExtensionType::SupportedGroups, | 150 | 2.79k | TlsExtension::EcPointFormats(_) => TlsExtensionType::EcPointFormats, | 151 | 1.10k | TlsExtension::SignatureAlgorithms(_) => TlsExtensionType::SignatureAlgorithms, | 152 | 1.31k | TlsExtension::SessionTicket(_) => TlsExtensionType::SessionTicketTLS, | 153 | 221 | TlsExtension::RecordSizeLimit(_) => TlsExtensionType::RecordSizeLimit, | 154 | 373 | TlsExtension::KeyShareOld(_) => TlsExtensionType::KeyShareOld, | 155 | 519 | TlsExtension::KeyShare(_) => TlsExtensionType::KeyShare, | 156 | 655 | TlsExtension::PreSharedKey(_) => TlsExtensionType::PreSharedKey, | 157 | 810 | TlsExtension::EarlyData(_) => TlsExtensionType::EarlyData, | 158 | 2.70k | TlsExtension::SupportedVersions(_) => TlsExtensionType::SupportedVersions, | 159 | 811 | TlsExtension::Cookie(_) => TlsExtensionType::Cookie, | 160 | 1.02k | TlsExtension::PskExchangeModes(_) => TlsExtensionType::PskExchangeModes, | 161 | 330 | TlsExtension::Heartbeat(_) => TlsExtensionType::Heartbeat, | 162 | 4.30k | TlsExtension::ALPN(_) => TlsExtensionType::ApplicationLayerProtocolNegotiation, | 163 | 3.39k | TlsExtension::SignedCertificateTimestamp(_) => TlsExtensionType::SignedCertificateTimestamp, | 164 | 570 | TlsExtension::Padding(_) => TlsExtensionType::Padding, | 165 | 1.12k | TlsExtension::EncryptThenMac => TlsExtensionType::EncryptThenMac, | 166 | 217 | TlsExtension::ExtendedMasterSecret => TlsExtensionType::ExtendedMasterSecret, | 167 | 1.67k | TlsExtension::OidFilters(_) => TlsExtensionType::OidFilters, | 168 | 621 | TlsExtension::PostHandshakeAuth => TlsExtensionType::PostHandshakeAuth, | 169 | 66 | TlsExtension::NextProtocolNegotiation => TlsExtensionType::NextProtocolNegotiation, | 170 | 242 | TlsExtension::RenegotiationInfo(_) => TlsExtensionType::RenegotiationInfo, | 171 | 235 | TlsExtension::EncryptedServerName{..} => TlsExtensionType::EncryptedServerName, | 172 | 354 | TlsExtension::Grease(_,_) => TlsExtensionType::Grease, | 173 | 643k | TlsExtension::Unknown(x,_) => x | 174 | | } | 175 | 2.63M | } |
|
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 | 8.81k | #[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 | 4.89k | #[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 | 393k | pub fn parse_tls_extension_sni_hostname(i: &[u8]) -> IResult<&[u8], (SNIType, &[u8])> { |
231 | 393k | let (i, t) = SNIType::parse(i)?; |
232 | 384k | let (i, v) = length_data(be_u16)(i)?; |
233 | 382k | Ok((i, (t, v))) |
234 | 393k | } tls_parser::tls_extensions::parse_tls_extension_sni_hostname Line | Count | Source | 230 | 168k | pub fn parse_tls_extension_sni_hostname(i: &[u8]) -> IResult<&[u8], (SNIType, &[u8])> { | 231 | 168k | let (i, t) = SNIType::parse(i)?; | 232 | 164k | let (i, v) = length_data(be_u16)(i)?; | 233 | 163k | Ok((i, (t, v))) | 234 | 168k | } |
tls_parser::tls_extensions::parse_tls_extension_sni_hostname Line | Count | Source | 230 | 224k | pub fn parse_tls_extension_sni_hostname(i: &[u8]) -> IResult<&[u8], (SNIType, &[u8])> { | 231 | 224k | let (i, t) = SNIType::parse(i)?; | 232 | 219k | let (i, v) = length_data(be_u16)(i)?; | 233 | 218k | Ok((i, (t, v))) | 234 | 224k | } |
|
235 | | |
236 | | // struct { |
237 | | // ServerName server_name_list<1..2^16-1> |
238 | | // } ServerNameList; |
239 | 3.02M | pub fn parse_tls_extension_sni_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
240 | 3.02M | if i.is_empty() { |
241 | | // special case: SNI extension in server can be empty |
242 | 3.01M | return Ok((i, TlsExtension::SNI(Vec::new()))); |
243 | 12.2k | } |
244 | 12.2k | let (i, list_len) = be_u16(i)?; |
245 | 11.5k | let (i, v) = map_parser( |
246 | 11.5k | take(list_len), |
247 | 11.5k | many0(complete(parse_tls_extension_sni_hostname)), |
248 | 11.5k | )(i)?; |
249 | 10.5k | Ok((i, TlsExtension::SNI(v))) |
250 | 3.02M | } tls_parser::tls_extensions::parse_tls_extension_sni_content Line | Count | Source | 239 | 1.06M | pub fn parse_tls_extension_sni_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 240 | 1.06M | if i.is_empty() { | 241 | | // special case: SNI extension in server can be empty | 242 | 1.06M | return Ok((i, TlsExtension::SNI(Vec::new()))); | 243 | 5.42k | } | 244 | 5.42k | let (i, list_len) = be_u16(i)?; | 245 | 5.20k | let (i, v) = map_parser( | 246 | 5.20k | take(list_len), | 247 | 5.20k | many0(complete(parse_tls_extension_sni_hostname)), | 248 | 5.20k | )(i)?; | 249 | 4.91k | Ok((i, TlsExtension::SNI(v))) | 250 | 1.06M | } |
tls_parser::tls_extensions::parse_tls_extension_sni_content Line | Count | Source | 239 | 1.95M | pub fn parse_tls_extension_sni_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 240 | 1.95M | if i.is_empty() { | 241 | | // special case: SNI extension in server can be empty | 242 | 1.94M | return Ok((i, TlsExtension::SNI(Vec::new()))); | 243 | 6.78k | } | 244 | 6.78k | let (i, list_len) = be_u16(i)?; | 245 | 6.32k | let (i, v) = map_parser( | 246 | 6.32k | take(list_len), | 247 | 6.32k | many0(complete(parse_tls_extension_sni_hostname)), | 248 | 6.32k | )(i)?; | 249 | 5.67k | Ok((i, TlsExtension::SNI(v))) | 250 | 1.95M | } |
|
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 | 456 | pub fn parse_tls_extension_max_fragment_length_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 259 | 456 | map(be_u8, TlsExtension::MaxFragmentLength)(i) | 260 | 456 | } |
tls_parser::tls_extensions::parse_tls_extension_max_fragment_length_content Line | Count | Source | 258 | 589 | pub fn parse_tls_extension_max_fragment_length_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 259 | 589 | map(be_u8, TlsExtension::MaxFragmentLength)(i) | 260 | 589 | } |
|
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 | 50.6k | fn parse_tls_extension_status_request_content( |
273 | 50.6k | i: &[u8], |
274 | 50.6k | ext_len: u16, |
275 | 50.6k | ) -> IResult<&[u8], TlsExtension> { |
276 | 50.6k | match ext_len { |
277 | 45.2k | 0 => Ok((i, TlsExtension::StatusRequest(None))), |
278 | | _ => { |
279 | 5.32k | let (i, status_type) = be_u8(i)?; |
280 | 5.32k | let (i, request) = take(ext_len - 1)(i)?; |
281 | 5.32k | Ok(( |
282 | 5.32k | i, |
283 | 5.32k | TlsExtension::StatusRequest(Some((CertificateStatusType(status_type), request))), |
284 | 5.32k | )) |
285 | | } |
286 | | } |
287 | 50.6k | } tls_parser::tls_extensions::parse_tls_extension_status_request_content Line | Count | Source | 272 | 39.1k | fn parse_tls_extension_status_request_content( | 273 | 39.1k | i: &[u8], | 274 | 39.1k | ext_len: u16, | 275 | 39.1k | ) -> IResult<&[u8], TlsExtension> { | 276 | 39.1k | match ext_len { | 277 | 35.7k | 0 => Ok((i, TlsExtension::StatusRequest(None))), | 278 | | _ => { | 279 | 3.32k | let (i, status_type) = be_u8(i)?; | 280 | 3.32k | let (i, request) = take(ext_len - 1)(i)?; | 281 | 3.32k | Ok(( | 282 | 3.32k | i, | 283 | 3.32k | TlsExtension::StatusRequest(Some((CertificateStatusType(status_type), request))), | 284 | 3.32k | )) | 285 | | } | 286 | | } | 287 | 39.1k | } |
tls_parser::tls_extensions::parse_tls_extension_status_request_content Line | Count | Source | 272 | 11.5k | fn parse_tls_extension_status_request_content( | 273 | 11.5k | i: &[u8], | 274 | 11.5k | ext_len: u16, | 275 | 11.5k | ) -> IResult<&[u8], TlsExtension> { | 276 | 11.5k | match ext_len { | 277 | 9.50k | 0 => Ok((i, TlsExtension::StatusRequest(None))), | 278 | | _ => { | 279 | 1.99k | let (i, status_type) = be_u8(i)?; | 280 | 1.99k | let (i, request) = take(ext_len - 1)(i)?; | 281 | 1.99k | Ok(( | 282 | 1.99k | i, | 283 | 1.99k | TlsExtension::StatusRequest(Some((CertificateStatusType(status_type), request))), | 284 | 1.99k | )) | 285 | | } | 286 | | } | 287 | 11.5k | } |
|
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 | 6.39k | pub fn parse_tls_extension_elliptic_curves_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
299 | 6.39k | map_parser( |
300 | 6.39k | length_data(be_u16), |
301 | 6.39k | map(parse_named_groups, TlsExtension::EllipticCurves), |
302 | 6.39k | )(i) |
303 | 6.39k | } tls_parser::tls_extensions::parse_tls_extension_elliptic_curves_content Line | Count | Source | 298 | 3.58k | pub fn parse_tls_extension_elliptic_curves_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 299 | 3.58k | map_parser( | 300 | 3.58k | length_data(be_u16), | 301 | 3.58k | map(parse_named_groups, TlsExtension::EllipticCurves), | 302 | 3.58k | )(i) | 303 | 3.58k | } |
tls_parser::tls_extensions::parse_tls_extension_elliptic_curves_content Line | Count | Source | 298 | 2.81k | pub fn parse_tls_extension_elliptic_curves_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 299 | 2.81k | map_parser( | 300 | 2.81k | length_data(be_u16), | 301 | 2.81k | map(parse_named_groups, TlsExtension::EllipticCurves), | 302 | 2.81k | )(i) | 303 | 2.81k | } |
|
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 | 6.13k | pub fn parse_tls_extension_ec_point_formats_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
314 | 6.13k | map(length_data(be_u8), TlsExtension::EcPointFormats)(i) |
315 | 6.13k | } tls_parser::tls_extensions::parse_tls_extension_ec_point_formats_content Line | Count | Source | 313 | 2.92k | pub fn parse_tls_extension_ec_point_formats_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 314 | 2.92k | map(length_data(be_u8), TlsExtension::EcPointFormats)(i) | 315 | 2.92k | } |
tls_parser::tls_extensions::parse_tls_extension_ec_point_formats_content Line | Count | Source | 313 | 3.21k | pub fn parse_tls_extension_ec_point_formats_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 314 | 3.21k | map(length_data(be_u8), TlsExtension::EcPointFormats)(i) | 315 | 3.21k | } |
|
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.46k | pub fn parse_tls_extension_signature_algorithms_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
327 | 3.46k | let (i, l) = map_parser(length_data(be_u16), many0(complete(be_u16)))(i)?; |
328 | 2.25k | Ok((i, TlsExtension::SignatureAlgorithms(l))) // XXX SignatureAlgorithms or SignatureScheme |
329 | 3.46k | } tls_parser::tls_extensions::parse_tls_extension_signature_algorithms_content Line | Count | Source | 326 | 1.75k | pub fn parse_tls_extension_signature_algorithms_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 327 | 1.75k | let (i, l) = map_parser(length_data(be_u16), many0(complete(be_u16)))(i)?; | 328 | 1.14k | Ok((i, TlsExtension::SignatureAlgorithms(l))) // XXX SignatureAlgorithms or SignatureScheme | 329 | 1.75k | } |
tls_parser::tls_extensions::parse_tls_extension_signature_algorithms_content Line | Count | Source | 326 | 1.70k | pub fn parse_tls_extension_signature_algorithms_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 327 | 1.70k | 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.70k | } |
|
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 | 951 | pub fn parse_tls_extension_heartbeat_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
341 | 951 | map(be_u8, TlsExtension::Heartbeat)(i) |
342 | 951 | } tls_parser::tls_extensions::parse_tls_extension_heartbeat_content Line | Count | Source | 340 | 421 | pub fn parse_tls_extension_heartbeat_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 341 | 421 | map(be_u8, TlsExtension::Heartbeat)(i) | 342 | 421 | } |
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 | 668k | fn parse_protocol_name(i: &[u8]) -> IResult<&[u8], &[u8]> { |
351 | 668k | length_data(be_u8)(i) |
352 | 668k | } tls_parser::tls_extensions::parse_protocol_name Line | Count | Source | 350 | 341k | fn parse_protocol_name(i: &[u8]) -> IResult<&[u8], &[u8]> { | 351 | 341k | length_data(be_u8)(i) | 352 | 341k | } |
tls_parser::tls_extensions::parse_protocol_name Line | Count | Source | 350 | 326k | fn parse_protocol_name(i: &[u8]) -> IResult<&[u8], &[u8]> { | 351 | 326k | length_data(be_u8)(i) | 352 | 326k | } |
|
353 | | |
354 | | /// Defined in [RFC7301] |
355 | 14.5k | pub fn parse_tls_extension_alpn_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
356 | 14.5k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_protocol_name)))(i)?; |
357 | 13.3k | Ok((i, TlsExtension::ALPN(v))) |
358 | 14.5k | } tls_parser::tls_extensions::parse_tls_extension_alpn_content Line | Count | Source | 355 | 9.64k | pub fn parse_tls_extension_alpn_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 356 | 9.64k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_protocol_name)))(i)?; | 357 | 9.06k | Ok((i, TlsExtension::ALPN(v))) | 358 | 9.64k | } |
tls_parser::tls_extensions::parse_tls_extension_alpn_content Line | Count | Source | 355 | 4.92k | pub fn parse_tls_extension_alpn_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 356 | 4.92k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_protocol_name)))(i)?; | 357 | 4.30k | Ok((i, TlsExtension::ALPN(v))) | 358 | 4.92k | } |
|
359 | | |
360 | | /// Defined in [RFC7685] |
361 | 816 | fn parse_tls_extension_padding_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { |
362 | 816 | map(take(ext_len), TlsExtension::Padding)(i) |
363 | 816 | } tls_parser::tls_extensions::parse_tls_extension_padding_content Line | Count | Source | 361 | 246 | fn parse_tls_extension_padding_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 362 | 246 | map(take(ext_len), TlsExtension::Padding)(i) | 363 | 246 | } |
tls_parser::tls_extensions::parse_tls_extension_padding_content Line | Count | Source | 361 | 570 | fn parse_tls_extension_padding_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 362 | 570 | map(take(ext_len), TlsExtension::Padding)(i) | 363 | 570 | } |
|
364 | | |
365 | | /// Defined in [RFC6962] |
366 | 5.59k | pub fn parse_tls_extension_signed_certificate_timestamp_content( |
367 | 5.59k | i: &[u8], |
368 | 5.59k | ) -> IResult<&[u8], TlsExtension> { |
369 | 5.59k | map( |
370 | 5.59k | opt(complete(length_data(be_u16))), |
371 | 5.59k | TlsExtension::SignedCertificateTimestamp, |
372 | 5.59k | )(i) |
373 | 5.59k | } tls_parser::tls_extensions::parse_tls_extension_signed_certificate_timestamp_content Line | Count | Source | 366 | 2.20k | pub fn parse_tls_extension_signed_certificate_timestamp_content( | 367 | 2.20k | i: &[u8], | 368 | 2.20k | ) -> IResult<&[u8], TlsExtension> { | 369 | 2.20k | map( | 370 | 2.20k | opt(complete(length_data(be_u16))), | 371 | 2.20k | TlsExtension::SignedCertificateTimestamp, | 372 | 2.20k | )(i) | 373 | 2.20k | } |
tls_parser::tls_extensions::parse_tls_extension_signed_certificate_timestamp_content Line | Count | Source | 366 | 3.39k | pub fn parse_tls_extension_signed_certificate_timestamp_content( | 367 | 3.39k | i: &[u8], | 368 | 3.39k | ) -> IResult<&[u8], TlsExtension> { | 369 | 3.39k | map( | 370 | 3.39k | opt(complete(length_data(be_u16))), | 371 | 3.39k | TlsExtension::SignedCertificateTimestamp, | 372 | 3.39k | )(i) | 373 | 3.39k | } |
|
374 | | |
375 | | /// Encrypt-then-MAC is defined in [RFC7366] |
376 | 4.79k | fn parse_tls_extension_encrypt_then_mac_content( |
377 | 4.79k | i: &[u8], |
378 | 4.79k | ext_len: u16, |
379 | 4.79k | ) -> IResult<&[u8], TlsExtension> { |
380 | 4.79k | if ext_len != 0 { |
381 | 409 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
382 | 4.38k | } |
383 | 4.38k | Ok((i, TlsExtension::EncryptThenMac)) |
384 | 4.79k | } tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac_content Line | Count | Source | 376 | 3.46k | fn parse_tls_extension_encrypt_then_mac_content( | 377 | 3.46k | i: &[u8], | 378 | 3.46k | ext_len: u16, | 379 | 3.46k | ) -> IResult<&[u8], TlsExtension> { | 380 | 3.46k | if ext_len != 0 { | 381 | 197 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 382 | 3.26k | } | 383 | 3.26k | Ok((i, TlsExtension::EncryptThenMac)) | 384 | 3.46k | } |
tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac_content Line | Count | Source | 376 | 1.33k | fn parse_tls_extension_encrypt_then_mac_content( | 377 | 1.33k | i: &[u8], | 378 | 1.33k | ext_len: u16, | 379 | 1.33k | ) -> IResult<&[u8], TlsExtension> { | 380 | 1.33k | if ext_len != 0 { | 381 | 212 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 382 | 1.12k | } | 383 | 1.12k | Ok((i, TlsExtension::EncryptThenMac)) | 384 | 1.33k | } |
|
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 | 913 | fn parse_tls_extension_extended_master_secret_content( |
397 | 913 | i: &[u8], |
398 | 913 | ext_len: u16, |
399 | 913 | ) -> IResult<&[u8], TlsExtension> { |
400 | 913 | if ext_len != 0 { |
401 | 411 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
402 | 502 | } |
403 | 502 | Ok((i, TlsExtension::ExtendedMasterSecret)) |
404 | 913 | } tls_parser::tls_extensions::parse_tls_extension_extended_master_secret_content Line | Count | Source | 396 | 483 | fn parse_tls_extension_extended_master_secret_content( | 397 | 483 | i: &[u8], | 398 | 483 | ext_len: u16, | 399 | 483 | ) -> IResult<&[u8], TlsExtension> { | 400 | 483 | if ext_len != 0 { | 401 | 198 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 402 | 285 | } | 403 | 285 | Ok((i, TlsExtension::ExtendedMasterSecret)) | 404 | 483 | } |
tls_parser::tls_extensions::parse_tls_extension_extended_master_secret_content Line | Count | Source | 396 | 430 | fn parse_tls_extension_extended_master_secret_content( | 397 | 430 | i: &[u8], | 398 | 430 | ext_len: u16, | 399 | 430 | ) -> IResult<&[u8], TlsExtension> { | 400 | 430 | if ext_len != 0 { | 401 | 213 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 402 | 217 | } | 403 | 217 | Ok((i, TlsExtension::ExtendedMasterSecret)) | 404 | 430 | } |
|
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 | 879 | fn parse_tls_extension_record_size_limit(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
417 | 879 | map(be_u16, TlsExtension::RecordSizeLimit)(i) |
418 | 879 | } tls_parser::tls_extensions::parse_tls_extension_record_size_limit Line | Count | Source | 416 | 458 | fn parse_tls_extension_record_size_limit(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 417 | 458 | map(be_u16, TlsExtension::RecordSizeLimit)(i) | 418 | 458 | } |
tls_parser::tls_extensions::parse_tls_extension_record_size_limit Line | Count | Source | 416 | 421 | fn parse_tls_extension_record_size_limit(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 417 | 421 | map(be_u16, TlsExtension::RecordSizeLimit)(i) | 418 | 421 | } |
|
419 | | |
420 | 1.98k | fn parse_tls_extension_session_ticket_content( |
421 | 1.98k | i: &[u8], |
422 | 1.98k | ext_len: u16, |
423 | 1.98k | ) -> IResult<&[u8], TlsExtension> { |
424 | 1.98k | map(take(ext_len), TlsExtension::SessionTicket)(i) |
425 | 1.98k | } tls_parser::tls_extensions::parse_tls_extension_session_ticket_content Line | Count | Source | 420 | 669 | fn parse_tls_extension_session_ticket_content( | 421 | 669 | i: &[u8], | 422 | 669 | ext_len: u16, | 423 | 669 | ) -> IResult<&[u8], TlsExtension> { | 424 | 669 | map(take(ext_len), TlsExtension::SessionTicket)(i) | 425 | 669 | } |
tls_parser::tls_extensions::parse_tls_extension_session_ticket_content Line | Count | Source | 420 | 1.31k | fn parse_tls_extension_session_ticket_content( | 421 | 1.31k | i: &[u8], | 422 | 1.31k | ext_len: u16, | 423 | 1.31k | ) -> IResult<&[u8], TlsExtension> { | 424 | 1.31k | map(take(ext_len), TlsExtension::SessionTicket)(i) | 425 | 1.31k | } |
|
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 | 1.32k | fn parse_tls_extension_key_share_old_content( |
436 | 1.32k | i: &[u8], |
437 | 1.32k | ext_len: u16, |
438 | 1.32k | ) -> IResult<&[u8], TlsExtension> { |
439 | 1.32k | map(take(ext_len), TlsExtension::KeyShareOld)(i) |
440 | 1.32k | } tls_parser::tls_extensions::parse_tls_extension_key_share_old_content Line | Count | Source | 435 | 947 | fn parse_tls_extension_key_share_old_content( | 436 | 947 | i: &[u8], | 437 | 947 | ext_len: u16, | 438 | 947 | ) -> IResult<&[u8], TlsExtension> { | 439 | 947 | map(take(ext_len), TlsExtension::KeyShareOld)(i) | 440 | 947 | } |
tls_parser::tls_extensions::parse_tls_extension_key_share_old_content Line | Count | Source | 435 | 373 | fn parse_tls_extension_key_share_old_content( | 436 | 373 | i: &[u8], | 437 | 373 | ext_len: u16, | 438 | 373 | ) -> IResult<&[u8], TlsExtension> { | 439 | 373 | map(take(ext_len), TlsExtension::KeyShareOld)(i) | 440 | 373 | } |
|
441 | | |
442 | 1.02k | fn parse_tls_extension_key_share_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { |
443 | 1.02k | map(take(ext_len), TlsExtension::KeyShare)(i) |
444 | 1.02k | } tls_parser::tls_extensions::parse_tls_extension_key_share_content Line | Count | Source | 442 | 505 | fn parse_tls_extension_key_share_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 443 | 505 | map(take(ext_len), TlsExtension::KeyShare)(i) | 444 | 505 | } |
tls_parser::tls_extensions::parse_tls_extension_key_share_content Line | Count | Source | 442 | 519 | fn parse_tls_extension_key_share_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 443 | 519 | map(take(ext_len), TlsExtension::KeyShare)(i) | 444 | 519 | } |
|
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.67k | fn parse_tls_extension_pre_shared_key_content( |
455 | 1.67k | i: &[u8], |
456 | 1.67k | ext_len: u16, |
457 | 1.67k | ) -> IResult<&[u8], TlsExtension> { |
458 | 1.67k | map(take(ext_len), TlsExtension::PreSharedKey)(i) |
459 | 1.67k | } tls_parser::tls_extensions::parse_tls_extension_pre_shared_key_content Line | Count | Source | 454 | 1.01k | fn parse_tls_extension_pre_shared_key_content( | 455 | 1.01k | i: &[u8], | 456 | 1.01k | ext_len: u16, | 457 | 1.01k | ) -> IResult<&[u8], TlsExtension> { | 458 | 1.01k | map(take(ext_len), TlsExtension::PreSharedKey)(i) | 459 | 1.01k | } |
tls_parser::tls_extensions::parse_tls_extension_pre_shared_key_content Line | Count | Source | 454 | 655 | fn parse_tls_extension_pre_shared_key_content( | 455 | 655 | i: &[u8], | 456 | 655 | ext_len: u16, | 457 | 655 | ) -> IResult<&[u8], TlsExtension> { | 458 | 655 | map(take(ext_len), TlsExtension::PreSharedKey)(i) | 459 | 655 | } |
|
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.82k | fn parse_tls_extension_early_data_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { |
470 | 1.82k | map(cond(ext_len > 0, be_u32), TlsExtension::EarlyData)(i) |
471 | 1.82k | } tls_parser::tls_extensions::parse_tls_extension_early_data_content Line | Count | Source | 469 | 814 | fn parse_tls_extension_early_data_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 470 | 814 | map(cond(ext_len > 0, be_u32), TlsExtension::EarlyData)(i) | 471 | 814 | } |
tls_parser::tls_extensions::parse_tls_extension_early_data_content Line | Count | Source | 469 | 1.01k | fn parse_tls_extension_early_data_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 470 | 1.01k | map(cond(ext_len > 0, be_u32), TlsExtension::EarlyData)(i) | 471 | 1.01k | } |
|
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 | 5.91k | fn parse_tls_extension_supported_versions_content( |
494 | 5.91k | i: &[u8], |
495 | 5.91k | ext_len: u16, |
496 | 5.91k | ) -> IResult<&[u8], TlsExtension> { |
497 | 5.91k | if ext_len == 2 { |
498 | 1.44k | map(be_u16, |x| { |
499 | 1.44k | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) |
500 | 1.44k | })(i) tls_parser::tls_extensions::parse_tls_extension_supported_versions_content::{closure#0}Line | Count | Source | 498 | 420 | map(be_u16, |x| { | 499 | 420 | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) | 500 | 420 | })(i) |
tls_parser::tls_extensions::parse_tls_extension_supported_versions_content::{closure#0}Line | Count | Source | 498 | 1.02k | map(be_u16, |x| { | 499 | 1.02k | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) | 500 | 1.02k | })(i) |
|
501 | | } else { |
502 | 4.47k | let (i, _) = be_u8(i)?; |
503 | 4.01k | if ext_len == 0 { |
504 | 0 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
505 | 4.01k | } |
506 | 4.01k | let (i, l) = map_parser(take(ext_len - 1), parse_tls_versions)(i)?; |
507 | 3.49k | Ok((i, TlsExtension::SupportedVersions(l))) |
508 | | } |
509 | 5.91k | } tls_parser::tls_extensions::parse_tls_extension_supported_versions_content Line | Count | Source | 493 | 2.64k | fn parse_tls_extension_supported_versions_content( | 494 | 2.64k | i: &[u8], | 495 | 2.64k | ext_len: u16, | 496 | 2.64k | ) -> IResult<&[u8], TlsExtension> { | 497 | 2.64k | if ext_len == 2 { | 498 | 420 | map(be_u16, |x| { | 499 | | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) | 500 | 420 | })(i) | 501 | | } else { | 502 | 2.22k | let (i, _) = be_u8(i)?; | 503 | 2.00k | if ext_len == 0 { | 504 | 0 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 505 | 2.00k | } | 506 | 2.00k | let (i, l) = map_parser(take(ext_len - 1), parse_tls_versions)(i)?; | 507 | 1.81k | Ok((i, TlsExtension::SupportedVersions(l))) | 508 | | } | 509 | 2.64k | } |
tls_parser::tls_extensions::parse_tls_extension_supported_versions_content Line | Count | Source | 493 | 3.27k | fn parse_tls_extension_supported_versions_content( | 494 | 3.27k | i: &[u8], | 495 | 3.27k | ext_len: u16, | 496 | 3.27k | ) -> IResult<&[u8], TlsExtension> { | 497 | 3.27k | if ext_len == 2 { | 498 | 1.02k | map(be_u16, |x| { | 499 | | TlsExtension::SupportedVersions(vec![TlsVersion(x)]) | 500 | 1.02k | })(i) | 501 | | } else { | 502 | 2.25k | let (i, _) = be_u8(i)?; | 503 | 2.00k | if ext_len == 0 { | 504 | 0 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 505 | 2.00k | } | 506 | 2.00k | let (i, l) = map_parser(take(ext_len - 1), parse_tls_versions)(i)?; | 507 | 1.68k | Ok((i, TlsExtension::SupportedVersions(l))) | 508 | | } | 509 | 3.27k | } |
|
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.65k | fn parse_tls_extension_cookie_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { |
520 | 1.65k | map(take(ext_len), TlsExtension::Cookie)(i) |
521 | 1.65k | } tls_parser::tls_extensions::parse_tls_extension_cookie_content Line | Count | Source | 519 | 842 | fn parse_tls_extension_cookie_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 520 | 842 | map(take(ext_len), TlsExtension::Cookie)(i) | 521 | 842 | } |
tls_parser::tls_extensions::parse_tls_extension_cookie_content Line | Count | Source | 519 | 811 | fn parse_tls_extension_cookie_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 520 | 811 | map(take(ext_len), TlsExtension::Cookie)(i) | 521 | 811 | } |
|
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.99k | pub fn parse_tls_extension_psk_key_exchange_modes_content( |
532 | 2.99k | i: &[u8], |
533 | 2.99k | ) -> IResult<&[u8], TlsExtension> { |
534 | 2.99k | let (i, v) = length_data(be_u8)(i)?; |
535 | 1.97k | Ok((i, TlsExtension::PskExchangeModes(v.to_vec()))) |
536 | 2.99k | } tls_parser::tls_extensions::parse_tls_extension_psk_key_exchange_modes_content Line | Count | Source | 531 | 1.38k | pub fn parse_tls_extension_psk_key_exchange_modes_content( | 532 | 1.38k | i: &[u8], | 533 | 1.38k | ) -> IResult<&[u8], TlsExtension> { | 534 | 1.38k | let (i, v) = length_data(be_u8)(i)?; | 535 | 955 | Ok((i, TlsExtension::PskExchangeModes(v.to_vec()))) | 536 | 1.38k | } |
tls_parser::tls_extensions::parse_tls_extension_psk_key_exchange_modes_content Line | Count | Source | 531 | 1.60k | pub fn parse_tls_extension_psk_key_exchange_modes_content( | 532 | 1.60k | i: &[u8], | 533 | 1.60k | ) -> IResult<&[u8], TlsExtension> { | 534 | 1.60k | let (i, v) = length_data(be_u8)(i)?; | 535 | 1.02k | Ok((i, TlsExtension::PskExchangeModes(v.to_vec()))) | 536 | 1.60k | } |
|
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 | 392 | fn parse_tls_extension_npn_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { |
549 | 392 | if ext_len != 0 { |
550 | 260 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
551 | 132 | } |
552 | 132 | Ok((i, TlsExtension::NextProtocolNegotiation)) |
553 | 392 | } 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 | 260 | fn parse_tls_extension_npn_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> { | 549 | 260 | if ext_len != 0 { | 550 | 194 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 551 | 66 | } | 552 | 66 | Ok((i, TlsExtension::NextProtocolNegotiation)) | 553 | 260 | } |
|
554 | | |
555 | | /// Renegotiation Info, defined in [RFC5746] |
556 | 1.56k | pub fn parse_tls_extension_renegotiation_info_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
557 | 1.56k | map(length_data(be_u8), TlsExtension::RenegotiationInfo)(i) |
558 | 1.56k | } tls_parser::tls_extensions::parse_tls_extension_renegotiation_info_content Line | Count | Source | 556 | 868 | pub fn parse_tls_extension_renegotiation_info_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 557 | 868 | map(length_data(be_u8), TlsExtension::RenegotiationInfo)(i) | 558 | 868 | } |
tls_parser::tls_extensions::parse_tls_extension_renegotiation_info_content Line | Count | Source | 556 | 694 | pub fn parse_tls_extension_renegotiation_info_content(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 557 | 694 | map(length_data(be_u8), TlsExtension::RenegotiationInfo)(i) | 558 | 694 | } |
|
559 | | |
560 | | /// Encrypted Server Name, defined in [draft-ietf-tls-esni] |
561 | 5.03k | pub fn parse_tls_extension_encrypted_server_name(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
562 | 5.03k | let (i, ciphersuite) = map(be_u16, TlsCipherSuiteID)(i)?; |
563 | 4.22k | let (i, group) = NamedGroup::parse(i)?; |
564 | 3.62k | let (i, key_share) = length_data(be_u16)(i)?; |
565 | 2.73k | let (i, record_digest) = length_data(be_u16)(i)?; |
566 | 1.66k | let (i, encrypted_sni) = length_data(be_u16)(i)?; |
567 | 361 | let esn = TlsExtension::EncryptedServerName { |
568 | 361 | ciphersuite, |
569 | 361 | group, |
570 | 361 | key_share, |
571 | 361 | record_digest, |
572 | 361 | encrypted_sni, |
573 | 361 | }; |
574 | 361 | Ok((i, esn)) |
575 | 5.03k | } tls_parser::tls_extensions::parse_tls_extension_encrypted_server_name Line | Count | Source | 561 | 2.28k | pub fn parse_tls_extension_encrypted_server_name(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 562 | 2.28k | let (i, ciphersuite) = map(be_u16, TlsCipherSuiteID)(i)?; | 563 | 1.97k | let (i, group) = NamedGroup::parse(i)?; | 564 | 1.70k | let (i, key_share) = length_data(be_u16)(i)?; | 565 | 1.24k | let (i, record_digest) = length_data(be_u16)(i)?; | 566 | 831 | let (i, encrypted_sni) = length_data(be_u16)(i)?; | 567 | 126 | let esn = TlsExtension::EncryptedServerName { | 568 | 126 | ciphersuite, | 569 | 126 | group, | 570 | 126 | key_share, | 571 | 126 | record_digest, | 572 | 126 | encrypted_sni, | 573 | 126 | }; | 574 | 126 | Ok((i, esn)) | 575 | 2.28k | } |
tls_parser::tls_extensions::parse_tls_extension_encrypted_server_name Line | Count | Source | 561 | 2.74k | pub fn parse_tls_extension_encrypted_server_name(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 562 | 2.74k | let (i, ciphersuite) = map(be_u16, TlsCipherSuiteID)(i)?; | 563 | 2.24k | let (i, group) = NamedGroup::parse(i)?; | 564 | 1.92k | let (i, key_share) = length_data(be_u16)(i)?; | 565 | 1.49k | let (i, record_digest) = length_data(be_u16)(i)?; | 566 | 830 | let (i, encrypted_sni) = length_data(be_u16)(i)?; | 567 | 235 | let esn = TlsExtension::EncryptedServerName { | 568 | 235 | ciphersuite, | 569 | 235 | group, | 570 | 235 | key_share, | 571 | 235 | record_digest, | 572 | 235 | encrypted_sni, | 573 | 235 | }; | 574 | 235 | Ok((i, esn)) | 575 | 2.74k | } |
|
576 | | |
577 | 140k | fn parse_tls_oid_filter(i: &[u8]) -> IResult<&[u8], OidFilter> { |
578 | 140k | let (i, cert_ext_oid) = length_data(be_u8)(i)?; |
579 | 138k | let (i, cert_ext_val) = length_data(be_u16)(i)?; |
580 | 137k | let filter = OidFilter { |
581 | 137k | cert_ext_oid, |
582 | 137k | cert_ext_val, |
583 | 137k | }; |
584 | 137k | Ok((i, filter)) |
585 | 140k | } tls_parser::tls_extensions::parse_tls_oid_filter Line | Count | Source | 577 | 78.1k | fn parse_tls_oid_filter(i: &[u8]) -> IResult<&[u8], OidFilter> { | 578 | 78.1k | let (i, cert_ext_oid) = length_data(be_u8)(i)?; | 579 | 77.3k | let (i, cert_ext_val) = length_data(be_u16)(i)?; | 580 | 76.7k | let filter = OidFilter { | 581 | 76.7k | cert_ext_oid, | 582 | 76.7k | cert_ext_val, | 583 | 76.7k | }; | 584 | 76.7k | Ok((i, filter)) | 585 | 78.1k | } |
tls_parser::tls_extensions::parse_tls_oid_filter Line | Count | Source | 577 | 62.2k | fn parse_tls_oid_filter(i: &[u8]) -> IResult<&[u8], OidFilter> { | 578 | 62.2k | let (i, cert_ext_oid) = length_data(be_u8)(i)?; | 579 | 61.2k | let (i, cert_ext_val) = length_data(be_u16)(i)?; | 580 | 60.5k | let filter = OidFilter { | 581 | 60.5k | cert_ext_oid, | 582 | 60.5k | cert_ext_val, | 583 | 60.5k | }; | 584 | 60.5k | Ok((i, filter)) | 585 | 62.2k | } |
|
586 | | |
587 | | /// Defined in TLS 1.3 draft 19 |
588 | 4.39k | fn parse_tls_extension_oid_filters(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
589 | 4.39k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_tls_oid_filter)))(i)?; |
590 | 3.14k | Ok((i, TlsExtension::OidFilters(v))) |
591 | 4.39k | } tls_parser::tls_extensions::parse_tls_extension_oid_filters Line | Count | Source | 588 | 2.11k | fn parse_tls_extension_oid_filters(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 589 | 2.11k | let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_tls_oid_filter)))(i)?; | 590 | 1.46k | Ok((i, TlsExtension::OidFilters(v))) | 591 | 2.11k | } |
tls_parser::tls_extensions::parse_tls_extension_oid_filters Line | Count | Source | 588 | 2.27k | fn parse_tls_extension_oid_filters(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 589 | 2.27k | 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.27k | } |
|
592 | | |
593 | | /// Defined in TLS 1.3 draft 20 |
594 | 1.54k | fn parse_tls_extension_post_handshake_auth_content( |
595 | 1.54k | i: &[u8], |
596 | 1.54k | ext_len: u16, |
597 | 1.54k | ) -> IResult<&[u8], TlsExtension> { |
598 | 1.54k | if ext_len != 0 { |
599 | 444 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); |
600 | 1.09k | } |
601 | 1.09k | Ok((i, TlsExtension::PostHandshakeAuth)) |
602 | 1.54k | } tls_parser::tls_extensions::parse_tls_extension_post_handshake_auth_content Line | Count | Source | 594 | 686 | fn parse_tls_extension_post_handshake_auth_content( | 595 | 686 | i: &[u8], | 596 | 686 | ext_len: u16, | 597 | 686 | ) -> IResult<&[u8], TlsExtension> { | 598 | 686 | if ext_len != 0 { | 599 | 208 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 600 | 478 | } | 601 | 478 | Ok((i, TlsExtension::PostHandshakeAuth)) | 602 | 686 | } |
tls_parser::tls_extensions::parse_tls_extension_post_handshake_auth_content Line | Count | Source | 594 | 857 | fn parse_tls_extension_post_handshake_auth_content( | 595 | 857 | i: &[u8], | 596 | 857 | ext_len: u16, | 597 | 857 | ) -> IResult<&[u8], TlsExtension> { | 598 | 857 | if ext_len != 0 { | 599 | 236 | return Err(Err::Error(make_error(i, ErrorKind::Verify))); | 600 | 621 | } | 601 | 621 | Ok((i, TlsExtension::PostHandshakeAuth)) | 602 | 857 | } |
|
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 | 4.23M | pub fn parse_tls_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> { |
693 | 4.23M | let (i, ext_type) = be_u16(i)?; |
694 | 4.19M | let (i, ext_data) = length_data(be_u16)(i)?; |
695 | 4.17M | if ext_type & 0x0f0f == 0x0a0a { |
696 | 681 | return Ok((i, TlsExtension::Grease(ext_type, ext_data))); |
697 | 4.16M | } |
698 | 4.16M | let ext_len = ext_data.len() as u16; |
699 | 4.16M | let (_, ext) = match ext_type { |
700 | 3.02M | 0 => parse_tls_extension_sni_content(ext_data), |
701 | 1.04k | 1 => parse_tls_extension_max_fragment_length_content(ext_data), |
702 | 50.6k | 5 => parse_tls_extension_status_request_content(ext_data, ext_len), |
703 | 6.39k | 10 => parse_tls_extension_elliptic_curves_content(ext_data), |
704 | 6.13k | 11 => parse_tls_extension_ec_point_formats_content(ext_data), |
705 | 3.46k | 13 => parse_tls_extension_signature_algorithms_content(ext_data), |
706 | 951 | 15 => parse_tls_extension_heartbeat_content(ext_data), |
707 | 14.5k | 16 => parse_tls_extension_alpn_content(ext_data), |
708 | 5.59k | 18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data), |
709 | 816 | 21 => parse_tls_extension_padding_content(ext_data, ext_len), |
710 | 4.79k | 22 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len), |
711 | 913 | 23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len), |
712 | 879 | 28 => parse_tls_extension_record_size_limit(ext_data), |
713 | 1.98k | 35 => parse_tls_extension_session_ticket_content(ext_data, ext_len), |
714 | 1.32k | 40 => parse_tls_extension_key_share_old_content(ext_data, ext_len), |
715 | 1.67k | 41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len), |
716 | 1.82k | 42 => parse_tls_extension_early_data_content(ext_data, ext_len), |
717 | 5.91k | 43 => parse_tls_extension_supported_versions_content(ext_data, ext_len), |
718 | 1.65k | 44 => parse_tls_extension_cookie_content(ext_data, ext_len), |
719 | 2.99k | 45 => parse_tls_extension_psk_key_exchange_modes_content(ext_data), |
720 | 4.39k | 48 => parse_tls_extension_oid_filters(ext_data), |
721 | 1.54k | 49 => parse_tls_extension_post_handshake_auth_content(ext_data, ext_len), |
722 | 1.02k | 51 => parse_tls_extension_key_share_content(ext_data, ext_len), |
723 | 392 | 13172 => parse_tls_extension_npn_content(ext_data, ext_len), |
724 | 1.56k | 0xff01 => parse_tls_extension_renegotiation_info_content(ext_data), |
725 | 5.03k | 0xffce => parse_tls_extension_encrypted_server_name(ext_data), |
726 | 1.01M | _ => Ok(( |
727 | 1.01M | i, |
728 | 1.01M | TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data), |
729 | 1.01M | )), |
730 | 18.6k | }?; |
731 | 4.15M | Ok((i, ext)) |
732 | 4.23M | } tls_parser::tls_extensions::parse_tls_extension Line | Count | Source | 692 | 1.55M | pub fn parse_tls_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 693 | 1.55M | let (i, ext_type) = be_u16(i)?; | 694 | 1.53M | let (i, ext_data) = length_data(be_u16)(i)?; | 695 | 1.52M | if ext_type & 0x0f0f == 0x0a0a { | 696 | 327 | return Ok((i, TlsExtension::Grease(ext_type, ext_data))); | 697 | 1.52M | } | 698 | 1.52M | let ext_len = ext_data.len() as u16; | 699 | 1.52M | let (_, ext) = match ext_type { | 700 | 1.06M | 0 => parse_tls_extension_sni_content(ext_data), | 701 | 456 | 1 => parse_tls_extension_max_fragment_length_content(ext_data), | 702 | 39.1k | 5 => parse_tls_extension_status_request_content(ext_data, ext_len), | 703 | 3.58k | 10 => parse_tls_extension_elliptic_curves_content(ext_data), | 704 | 2.92k | 11 => parse_tls_extension_ec_point_formats_content(ext_data), | 705 | 1.75k | 13 => parse_tls_extension_signature_algorithms_content(ext_data), | 706 | 421 | 15 => parse_tls_extension_heartbeat_content(ext_data), | 707 | 9.64k | 16 => parse_tls_extension_alpn_content(ext_data), | 708 | 2.20k | 18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data), | 709 | 246 | 21 => parse_tls_extension_padding_content(ext_data, ext_len), | 710 | 3.46k | 22 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len), | 711 | 483 | 23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len), | 712 | 458 | 28 => parse_tls_extension_record_size_limit(ext_data), | 713 | 669 | 35 => parse_tls_extension_session_ticket_content(ext_data, ext_len), | 714 | 947 | 40 => parse_tls_extension_key_share_old_content(ext_data, ext_len), | 715 | 1.01k | 41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len), | 716 | 814 | 42 => parse_tls_extension_early_data_content(ext_data, ext_len), | 717 | 2.64k | 43 => parse_tls_extension_supported_versions_content(ext_data, ext_len), | 718 | 842 | 44 => parse_tls_extension_cookie_content(ext_data, ext_len), | 719 | 1.38k | 45 => parse_tls_extension_psk_key_exchange_modes_content(ext_data), | 720 | 2.11k | 48 => parse_tls_extension_oid_filters(ext_data), | 721 | 686 | 49 => parse_tls_extension_post_handshake_auth_content(ext_data, ext_len), | 722 | 505 | 51 => parse_tls_extension_key_share_content(ext_data, ext_len), | 723 | 132 | 13172 => parse_tls_extension_npn_content(ext_data, ext_len), | 724 | 868 | 0xff01 => parse_tls_extension_renegotiation_info_content(ext_data), | 725 | 2.28k | 0xffce => parse_tls_extension_encrypted_server_name(ext_data), | 726 | 375k | _ => Ok(( | 727 | 375k | i, | 728 | 375k | TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data), | 729 | 375k | )), | 730 | 8.51k | }?; | 731 | 1.51M | Ok((i, ext)) | 732 | 1.55M | } |
tls_parser::tls_extensions::parse_tls_extension Line | Count | Source | 692 | 2.67M | pub fn parse_tls_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> { | 693 | 2.67M | let (i, ext_type) = be_u16(i)?; | 694 | 2.65M | let (i, ext_data) = length_data(be_u16)(i)?; | 695 | 2.64M | if ext_type & 0x0f0f == 0x0a0a { | 696 | 354 | return Ok((i, TlsExtension::Grease(ext_type, ext_data))); | 697 | 2.64M | } | 698 | 2.64M | let ext_len = ext_data.len() as u16; | 699 | 2.64M | let (_, ext) = match ext_type { | 700 | 1.95M | 0 => parse_tls_extension_sni_content(ext_data), | 701 | 589 | 1 => parse_tls_extension_max_fragment_length_content(ext_data), | 702 | 11.5k | 5 => parse_tls_extension_status_request_content(ext_data, ext_len), | 703 | 2.81k | 10 => parse_tls_extension_elliptic_curves_content(ext_data), | 704 | 3.21k | 11 => parse_tls_extension_ec_point_formats_content(ext_data), | 705 | 1.70k | 13 => parse_tls_extension_signature_algorithms_content(ext_data), | 706 | 530 | 15 => parse_tls_extension_heartbeat_content(ext_data), | 707 | 4.92k | 16 => parse_tls_extension_alpn_content(ext_data), | 708 | 3.39k | 18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data), | 709 | 570 | 21 => parse_tls_extension_padding_content(ext_data, ext_len), | 710 | 1.33k | 22 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len), | 711 | 430 | 23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len), | 712 | 421 | 28 => parse_tls_extension_record_size_limit(ext_data), | 713 | 1.31k | 35 => parse_tls_extension_session_ticket_content(ext_data, ext_len), | 714 | 373 | 40 => parse_tls_extension_key_share_old_content(ext_data, ext_len), | 715 | 655 | 41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len), | 716 | 1.01k | 42 => parse_tls_extension_early_data_content(ext_data, ext_len), | 717 | 3.27k | 43 => parse_tls_extension_supported_versions_content(ext_data, ext_len), | 718 | 811 | 44 => parse_tls_extension_cookie_content(ext_data, ext_len), | 719 | 1.60k | 45 => parse_tls_extension_psk_key_exchange_modes_content(ext_data), | 720 | 2.27k | 48 => parse_tls_extension_oid_filters(ext_data), | 721 | 857 | 49 => parse_tls_extension_post_handshake_auth_content(ext_data, ext_len), | 722 | 519 | 51 => parse_tls_extension_key_share_content(ext_data, ext_len), | 723 | 260 | 13172 => parse_tls_extension_npn_content(ext_data, ext_len), | 724 | 694 | 0xff01 => parse_tls_extension_renegotiation_info_content(ext_data), | 725 | 2.74k | 0xffce => parse_tls_extension_encrypted_server_name(ext_data), | 726 | 643k | _ => Ok(( | 727 | 643k | i, | 728 | 643k | TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data), | 729 | 643k | )), | 730 | 10.1k | }?; | 731 | 2.63M | Ok((i, ext)) | 732 | 2.67M | } |
|
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 | 79.5k | pub fn parse_tls_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> { |
746 | 79.5k | many0(complete(parse_tls_extension))(i) |
747 | 79.5k | } tls_parser::tls_extensions::parse_tls_extensions Line | Count | Source | 745 | 37.2k | pub fn parse_tls_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> { | 746 | 37.2k | many0(complete(parse_tls_extension))(i) | 747 | 37.2k | } |
tls_parser::tls_extensions::parse_tls_extensions Line | Count | Source | 745 | 42.3k | pub fn parse_tls_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> { | 746 | 42.3k | many0(complete(parse_tls_extension))(i) | 747 | 42.3k | } |
|