Coverage Report

Created: 2025-07-23 07:29

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