Coverage Report

Created: 2026-02-14 06:42

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}