Coverage Report

Created: 2026-05-16 07:38

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
18.8M
    fn from(ext: TlsExtensionType) -> u16 {
92
18.8M
        ext.0
93
18.8M
    }
<u16 as core::convert::From<tls_parser::tls_extensions::TlsExtensionType>>::from
Line
Count
Source
91
7.35M
    fn from(ext: TlsExtensionType) -> u16 {
92
7.35M
        ext.0
93
7.35M
    }
<u16 as core::convert::From<tls_parser::tls_extensions::TlsExtensionType>>::from
Line
Count
Source
91
11.4M
    fn from(ext: TlsExtensionType) -> u16 {
92
11.4M
        ext.0
93
11.4M
    }
94
}
95
96
/// TLS extensions
97
///
98
#[derive(Clone, PartialEq)]
99
pub enum TlsExtension<'a> {
100
    SNI(Vec<(SNIType, &'a [u8])>),
101
    MaxFragmentLength(u8),
102
    StatusRequest(Option<(CertificateStatusType, &'a [u8])>),
103
    EllipticCurves(Vec<NamedGroup>),
104
    EcPointFormats(&'a [u8]),
105
    SignatureAlgorithms(Vec<u16>),
106
    RecordSizeLimit(u16),
107
    SessionTicket(&'a [u8]),
108
    KeyShareOld(&'a [u8]),
109
    KeyShare(&'a [u8]),
110
    PreSharedKey(&'a [u8]),
111
    EarlyData(Option<u32>),
112
    SupportedVersions(Vec<TlsVersion>),
113
    Cookie(&'a [u8]),
114
    PskExchangeModes(Vec<u8>),
115
    Heartbeat(u8),
116
    ALPN(Vec<&'a [u8]>),
117
118
    SignedCertificateTimestamp(Option<&'a [u8]>),
119
    Padding(&'a [u8]),
120
    EncryptThenMac,
121
    ExtendedMasterSecret,
122
123
    OidFilters(Vec<OidFilter<'a>>),
124
    PostHandshakeAuth,
125
126
    NextProtocolNegotiation,
127
128
    RenegotiationInfo(&'a [u8]),
129
    EncryptedServerName {
130
        ciphersuite: TlsCipherSuiteID,
131
        group: NamedGroup,
132
        key_share: &'a [u8],
133
        record_digest: &'a [u8],
134
        encrypted_sni: &'a [u8],
135
    },
136
137
    Grease(u16, &'a [u8]),
138
139
    Unknown(TlsExtensionType, &'a [u8]),
140
}
141
142
impl<'a> From<&'a TlsExtension<'a>> for TlsExtensionType {
143
    #[rustfmt::skip]
144
4.15M
    fn from(ext: &TlsExtension) -> TlsExtensionType {
145
4.15M
        match *ext {
146
3.02M
            TlsExtension::SNI(_)                        => TlsExtensionType::ServerName,
147
432
            TlsExtension::MaxFragmentLength(_)          => TlsExtensionType::MaxFragmentLength,
148
50.6k
            TlsExtension::StatusRequest(_)              => TlsExtensionType::StatusRequest,
149
4.91k
            TlsExtension::EllipticCurves(_)             => TlsExtensionType::SupportedGroups,
150
5.31k
            TlsExtension::EcPointFormats(_)             => TlsExtensionType::EcPointFormats,
151
2.25k
            TlsExtension::SignatureAlgorithms(_)        => TlsExtensionType::SignatureAlgorithms,
152
1.98k
            TlsExtension::SessionTicket(_)              => TlsExtensionType::SessionTicketTLS,
153
461
            TlsExtension::RecordSizeLimit(_)            => TlsExtensionType::RecordSizeLimit,
154
1.32k
            TlsExtension::KeyShareOld(_)                => TlsExtensionType::KeyShareOld,
155
1.02k
            TlsExtension::KeyShare(_)                   => TlsExtensionType::KeyShare,
156
1.67k
            TlsExtension::PreSharedKey(_)               => TlsExtensionType::PreSharedKey,
157
1.43k
            TlsExtension::EarlyData(_)                  => TlsExtensionType::EarlyData,
158
4.93k
            TlsExtension::SupportedVersions(_)          => TlsExtensionType::SupportedVersions,
159
1.65k
            TlsExtension::Cookie(_)                     => TlsExtensionType::Cookie,
160
1.97k
            TlsExtension::PskExchangeModes(_)           => TlsExtensionType::PskExchangeModes,
161
554
            TlsExtension::Heartbeat(_)                  => TlsExtensionType::Heartbeat,
162
13.3k
            TlsExtension::ALPN(_)                       => TlsExtensionType::ApplicationLayerProtocolNegotiation,
163
5.59k
            TlsExtension::SignedCertificateTimestamp(_) => TlsExtensionType::SignedCertificateTimestamp,
164
816
            TlsExtension::Padding(_)                    => TlsExtensionType::Padding,
165
4.38k
            TlsExtension::EncryptThenMac                => TlsExtensionType::EncryptThenMac,
166
502
            TlsExtension::ExtendedMasterSecret          => TlsExtensionType::ExtendedMasterSecret,
167
3.14k
            TlsExtension::OidFilters(_)                 => TlsExtensionType::OidFilters,
168
1.09k
            TlsExtension::PostHandshakeAuth             => TlsExtensionType::PostHandshakeAuth,
169
132
            TlsExtension::NextProtocolNegotiation       => TlsExtensionType::NextProtocolNegotiation,
170
529
            TlsExtension::RenegotiationInfo(_)          => TlsExtensionType::RenegotiationInfo,
171
361
            TlsExtension::EncryptedServerName{..}       => TlsExtensionType::EncryptedServerName,
172
681
            TlsExtension::Grease(_,_)                   => TlsExtensionType::Grease,
173
1.01M
            TlsExtension::Unknown(x,_)                  => x
174
        }
175
4.15M
    }
<tls_parser::tls_extensions::TlsExtensionType as core::convert::From<&tls_parser::tls_extensions::TlsExtension>>::from
Line
Count
Source
144
1.51M
    fn from(ext: &TlsExtension) -> TlsExtensionType {
145
1.51M
        match *ext {
146
1.06M
            TlsExtension::SNI(_)                        => TlsExtensionType::ServerName,
147
223
            TlsExtension::MaxFragmentLength(_)          => TlsExtensionType::MaxFragmentLength,
148
39.1k
            TlsExtension::StatusRequest(_)              => TlsExtensionType::StatusRequest,
149
2.92k
            TlsExtension::EllipticCurves(_)             => TlsExtensionType::SupportedGroups,
150
2.51k
            TlsExtension::EcPointFormats(_)             => TlsExtensionType::EcPointFormats,
151
1.14k
            TlsExtension::SignatureAlgorithms(_)        => TlsExtensionType::SignatureAlgorithms,
152
669
            TlsExtension::SessionTicket(_)              => TlsExtensionType::SessionTicketTLS,
153
240
            TlsExtension::RecordSizeLimit(_)            => TlsExtensionType::RecordSizeLimit,
154
947
            TlsExtension::KeyShareOld(_)                => TlsExtensionType::KeyShareOld,
155
505
            TlsExtension::KeyShare(_)                   => TlsExtensionType::KeyShare,
156
1.01k
            TlsExtension::PreSharedKey(_)               => TlsExtensionType::PreSharedKey,
157
620
            TlsExtension::EarlyData(_)                  => TlsExtensionType::EarlyData,
158
2.23k
            TlsExtension::SupportedVersions(_)          => TlsExtensionType::SupportedVersions,
159
842
            TlsExtension::Cookie(_)                     => TlsExtensionType::Cookie,
160
955
            TlsExtension::PskExchangeModes(_)           => TlsExtensionType::PskExchangeModes,
161
224
            TlsExtension::Heartbeat(_)                  => TlsExtensionType::Heartbeat,
162
9.06k
            TlsExtension::ALPN(_)                       => TlsExtensionType::ApplicationLayerProtocolNegotiation,
163
2.20k
            TlsExtension::SignedCertificateTimestamp(_) => TlsExtensionType::SignedCertificateTimestamp,
164
246
            TlsExtension::Padding(_)                    => TlsExtensionType::Padding,
165
3.26k
            TlsExtension::EncryptThenMac                => TlsExtensionType::EncryptThenMac,
166
285
            TlsExtension::ExtendedMasterSecret          => TlsExtensionType::ExtendedMasterSecret,
167
1.46k
            TlsExtension::OidFilters(_)                 => TlsExtensionType::OidFilters,
168
478
            TlsExtension::PostHandshakeAuth             => TlsExtensionType::PostHandshakeAuth,
169
66
            TlsExtension::NextProtocolNegotiation       => TlsExtensionType::NextProtocolNegotiation,
170
287
            TlsExtension::RenegotiationInfo(_)          => TlsExtensionType::RenegotiationInfo,
171
126
            TlsExtension::EncryptedServerName{..}       => TlsExtensionType::EncryptedServerName,
172
327
            TlsExtension::Grease(_,_)                   => TlsExtensionType::Grease,
173
375k
            TlsExtension::Unknown(x,_)                  => x
174
        }
175
1.51M
    }
<tls_parser::tls_extensions::TlsExtensionType as core::convert::From<&tls_parser::tls_extensions::TlsExtension>>::from
Line
Count
Source
144
2.63M
    fn from(ext: &TlsExtension) -> TlsExtensionType {
145
2.63M
        match *ext {
146
1.95M
            TlsExtension::SNI(_)                        => TlsExtensionType::ServerName,
147
209
            TlsExtension::MaxFragmentLength(_)          => TlsExtensionType::MaxFragmentLength,
148
11.5k
            TlsExtension::StatusRequest(_)              => TlsExtensionType::StatusRequest,
149
1.99k
            TlsExtension::EllipticCurves(_)             => TlsExtensionType::SupportedGroups,
150
2.79k
            TlsExtension::EcPointFormats(_)             => TlsExtensionType::EcPointFormats,
151
1.10k
            TlsExtension::SignatureAlgorithms(_)        => TlsExtensionType::SignatureAlgorithms,
152
1.31k
            TlsExtension::SessionTicket(_)              => TlsExtensionType::SessionTicketTLS,
153
221
            TlsExtension::RecordSizeLimit(_)            => TlsExtensionType::RecordSizeLimit,
154
373
            TlsExtension::KeyShareOld(_)                => TlsExtensionType::KeyShareOld,
155
519
            TlsExtension::KeyShare(_)                   => TlsExtensionType::KeyShare,
156
655
            TlsExtension::PreSharedKey(_)               => TlsExtensionType::PreSharedKey,
157
810
            TlsExtension::EarlyData(_)                  => TlsExtensionType::EarlyData,
158
2.70k
            TlsExtension::SupportedVersions(_)          => TlsExtensionType::SupportedVersions,
159
811
            TlsExtension::Cookie(_)                     => TlsExtensionType::Cookie,
160
1.02k
            TlsExtension::PskExchangeModes(_)           => TlsExtensionType::PskExchangeModes,
161
330
            TlsExtension::Heartbeat(_)                  => TlsExtensionType::Heartbeat,
162
4.30k
            TlsExtension::ALPN(_)                       => TlsExtensionType::ApplicationLayerProtocolNegotiation,
163
3.39k
            TlsExtension::SignedCertificateTimestamp(_) => TlsExtensionType::SignedCertificateTimestamp,
164
570
            TlsExtension::Padding(_)                    => TlsExtensionType::Padding,
165
1.12k
            TlsExtension::EncryptThenMac                => TlsExtensionType::EncryptThenMac,
166
217
            TlsExtension::ExtendedMasterSecret          => TlsExtensionType::ExtendedMasterSecret,
167
1.67k
            TlsExtension::OidFilters(_)                 => TlsExtensionType::OidFilters,
168
621
            TlsExtension::PostHandshakeAuth             => TlsExtensionType::PostHandshakeAuth,
169
66
            TlsExtension::NextProtocolNegotiation       => TlsExtensionType::NextProtocolNegotiation,
170
242
            TlsExtension::RenegotiationInfo(_)          => TlsExtensionType::RenegotiationInfo,
171
235
            TlsExtension::EncryptedServerName{..}       => TlsExtensionType::EncryptedServerName,
172
354
            TlsExtension::Grease(_,_)                   => TlsExtensionType::Grease,
173
643k
            TlsExtension::Unknown(x,_)                  => x
174
        }
175
2.63M
    }
176
}
177
178
#[derive(Clone, Debug, PartialEq)]
179
pub struct KeyShareEntry<'a> {
180
    pub group: NamedGroup, // NamedGroup
181
    pub kx: &'a [u8],      // Key Exchange Data
182
}
183
184
0
#[derive(Clone, Copy, Debug, PartialEq, Eq, NomBE)]
Unexecuted instantiation: <tls_parser::tls_extensions::PskKeyExchangeMode as nom_derive::traits::Parse<&[u8]>>::parse_be
Unexecuted instantiation: <tls_parser::tls_extensions::PskKeyExchangeMode as nom_derive::traits::Parse<&[u8]>>::parse_le
Unexecuted instantiation: <tls_parser::tls_extensions::PskKeyExchangeMode as nom_derive::traits::Parse<&[u8]>>::parse_be
Unexecuted instantiation: <tls_parser::tls_extensions::PskKeyExchangeMode as nom_derive::traits::Parse<&[u8]>>::parse_le
185
pub struct PskKeyExchangeMode(pub u8);
186
187
newtype_enum! {
188
impl PskKeyExchangeMode {
189
    Psk    = 0,
190
    PskDhe = 1,
191
}
192
}
193
194
8.81k
#[derive(Clone, Copy, Debug, PartialEq, Eq, NomBE)]
<tls_parser::tls_extensions::SNIType as nom_derive::traits::Parse<&[u8]>>::parse_be
Line
Count
Source
194
3.92k
#[derive(Clone, Copy, Debug, PartialEq, Eq, NomBE)]
Unexecuted instantiation: <tls_parser::tls_extensions::SNIType as nom_derive::traits::Parse<&[u8]>>::parse_le
<tls_parser::tls_extensions::SNIType as nom_derive::traits::Parse<&[u8]>>::parse_be
Line
Count
Source
194
4.89k
#[derive(Clone, Copy, Debug, PartialEq, Eq, NomBE)]
Unexecuted instantiation: <tls_parser::tls_extensions::SNIType as nom_derive::traits::Parse<&[u8]>>::parse_le
195
pub struct SNIType(pub u8);
196
197
newtype_enum! {
198
impl display SNIType {
199
    HostName = 0,
200
}
201
}
202
203
0
#[derive(Clone, Copy, PartialEq, Eq, NomBE)]
Unexecuted instantiation: <tls_parser::tls_extensions::CertificateStatusType as nom_derive::traits::Parse<&[u8]>>::parse_be
Unexecuted instantiation: <tls_parser::tls_extensions::CertificateStatusType as nom_derive::traits::Parse<&[u8]>>::parse_le
Unexecuted instantiation: <tls_parser::tls_extensions::CertificateStatusType as nom_derive::traits::Parse<&[u8]>>::parse_be
Unexecuted instantiation: <tls_parser::tls_extensions::CertificateStatusType as nom_derive::traits::Parse<&[u8]>>::parse_le
204
pub struct CertificateStatusType(pub u8);
205
206
newtype_enum! {
207
impl debug CertificateStatusType {
208
    OCSP = 1,
209
}
210
}
211
212
#[derive(Clone, Debug, PartialEq)]
213
pub struct OidFilter<'a> {
214
    pub cert_ext_oid: &'a [u8],
215
    pub cert_ext_val: &'a [u8],
216
}
217
218
// struct {
219
//     NameType name_type;
220
//     select (name_type) {
221
//         case host_name: HostName;
222
//     } name;
223
// } ServerName;
224
//
225
// enum {
226
//     host_name(0), (255)
227
// } NameType;
228
//
229
// opaque HostName<1..2^16-1>;
230
393k
pub fn parse_tls_extension_sni_hostname(i: &[u8]) -> IResult<&[u8], (SNIType, &[u8])> {
231
393k
    let (i, t) = SNIType::parse(i)?;
232
384k
    let (i, v) = length_data(be_u16)(i)?;
233
382k
    Ok((i, (t, v)))
234
393k
}
tls_parser::tls_extensions::parse_tls_extension_sni_hostname
Line
Count
Source
230
168k
pub fn parse_tls_extension_sni_hostname(i: &[u8]) -> IResult<&[u8], (SNIType, &[u8])> {
231
168k
    let (i, t) = SNIType::parse(i)?;
232
164k
    let (i, v) = length_data(be_u16)(i)?;
233
163k
    Ok((i, (t, v)))
234
168k
}
tls_parser::tls_extensions::parse_tls_extension_sni_hostname
Line
Count
Source
230
224k
pub fn parse_tls_extension_sni_hostname(i: &[u8]) -> IResult<&[u8], (SNIType, &[u8])> {
231
224k
    let (i, t) = SNIType::parse(i)?;
232
219k
    let (i, v) = length_data(be_u16)(i)?;
233
218k
    Ok((i, (t, v)))
234
224k
}
235
236
// struct {
237
//     ServerName server_name_list<1..2^16-1>
238
// } ServerNameList;
239
3.02M
pub fn parse_tls_extension_sni_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
240
3.02M
    if i.is_empty() {
241
        // special case: SNI extension in server can be empty
242
3.01M
        return Ok((i, TlsExtension::SNI(Vec::new())));
243
12.2k
    }
244
12.2k
    let (i, list_len) = be_u16(i)?;
245
11.5k
    let (i, v) = map_parser(
246
11.5k
        take(list_len),
247
11.5k
        many0(complete(parse_tls_extension_sni_hostname)),
248
11.5k
    )(i)?;
249
10.5k
    Ok((i, TlsExtension::SNI(v)))
250
3.02M
}
tls_parser::tls_extensions::parse_tls_extension_sni_content
Line
Count
Source
239
1.06M
pub fn parse_tls_extension_sni_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
240
1.06M
    if i.is_empty() {
241
        // special case: SNI extension in server can be empty
242
1.06M
        return Ok((i, TlsExtension::SNI(Vec::new())));
243
5.42k
    }
244
5.42k
    let (i, list_len) = be_u16(i)?;
245
5.20k
    let (i, v) = map_parser(
246
5.20k
        take(list_len),
247
5.20k
        many0(complete(parse_tls_extension_sni_hostname)),
248
5.20k
    )(i)?;
249
4.91k
    Ok((i, TlsExtension::SNI(v)))
250
1.06M
}
tls_parser::tls_extensions::parse_tls_extension_sni_content
Line
Count
Source
239
1.95M
pub fn parse_tls_extension_sni_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
240
1.95M
    if i.is_empty() {
241
        // special case: SNI extension in server can be empty
242
1.94M
        return Ok((i, TlsExtension::SNI(Vec::new())));
243
6.78k
    }
244
6.78k
    let (i, list_len) = be_u16(i)?;
245
6.32k
    let (i, v) = map_parser(
246
6.32k
        take(list_len),
247
6.32k
        many0(complete(parse_tls_extension_sni_hostname)),
248
6.32k
    )(i)?;
249
5.67k
    Ok((i, TlsExtension::SNI(v)))
250
1.95M
}
251
252
0
pub fn parse_tls_extension_sni(i: &[u8]) -> IResult<&[u8], TlsExtension> {
253
0
    let (i, _) = tag([0x00, 0x00])(i)?;
254
0
    map_parser(length_data(be_u16), parse_tls_extension_sni_content)(i)
255
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_sni
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_sni
256
257
/// Max fragment length [RFC6066]
258
1.04k
pub fn parse_tls_extension_max_fragment_length_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
259
1.04k
    map(be_u8, TlsExtension::MaxFragmentLength)(i)
260
1.04k
}
tls_parser::tls_extensions::parse_tls_extension_max_fragment_length_content
Line
Count
Source
258
456
pub fn parse_tls_extension_max_fragment_length_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
259
456
    map(be_u8, TlsExtension::MaxFragmentLength)(i)
260
456
}
tls_parser::tls_extensions::parse_tls_extension_max_fragment_length_content
Line
Count
Source
258
589
pub fn parse_tls_extension_max_fragment_length_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
259
589
    map(be_u8, TlsExtension::MaxFragmentLength)(i)
260
589
}
261
262
/// Max fragment length [RFC6066]
263
0
pub fn parse_tls_extension_max_fragment_length(i: &[u8]) -> IResult<&[u8], TlsExtension> {
264
0
    let (i, _) = tag([0x00, 0x01])(i)?;
265
0
    map_parser(
266
0
        length_data(be_u16),
267
0
        parse_tls_extension_max_fragment_length_content,
268
0
    )(i)
269
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_max_fragment_length
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_max_fragment_length
270
271
/// Status Request [RFC6066]
272
50.6k
fn parse_tls_extension_status_request_content(
273
50.6k
    i: &[u8],
274
50.6k
    ext_len: u16,
275
50.6k
) -> IResult<&[u8], TlsExtension> {
276
50.6k
    match ext_len {
277
45.2k
        0 => Ok((i, TlsExtension::StatusRequest(None))),
278
        _ => {
279
5.32k
            let (i, status_type) = be_u8(i)?;
280
5.32k
            let (i, request) = take(ext_len - 1)(i)?;
281
5.32k
            Ok((
282
5.32k
                i,
283
5.32k
                TlsExtension::StatusRequest(Some((CertificateStatusType(status_type), request))),
284
5.32k
            ))
285
        }
286
    }
287
50.6k
}
tls_parser::tls_extensions::parse_tls_extension_status_request_content
Line
Count
Source
272
39.1k
fn parse_tls_extension_status_request_content(
273
39.1k
    i: &[u8],
274
39.1k
    ext_len: u16,
275
39.1k
) -> IResult<&[u8], TlsExtension> {
276
39.1k
    match ext_len {
277
35.7k
        0 => Ok((i, TlsExtension::StatusRequest(None))),
278
        _ => {
279
3.32k
            let (i, status_type) = be_u8(i)?;
280
3.32k
            let (i, request) = take(ext_len - 1)(i)?;
281
3.32k
            Ok((
282
3.32k
                i,
283
3.32k
                TlsExtension::StatusRequest(Some((CertificateStatusType(status_type), request))),
284
3.32k
            ))
285
        }
286
    }
287
39.1k
}
tls_parser::tls_extensions::parse_tls_extension_status_request_content
Line
Count
Source
272
11.5k
fn parse_tls_extension_status_request_content(
273
11.5k
    i: &[u8],
274
11.5k
    ext_len: u16,
275
11.5k
) -> IResult<&[u8], TlsExtension> {
276
11.5k
    match ext_len {
277
9.50k
        0 => Ok((i, TlsExtension::StatusRequest(None))),
278
        _ => {
279
1.99k
            let (i, status_type) = be_u8(i)?;
280
1.99k
            let (i, request) = take(ext_len - 1)(i)?;
281
1.99k
            Ok((
282
1.99k
                i,
283
1.99k
                TlsExtension::StatusRequest(Some((CertificateStatusType(status_type), request))),
284
1.99k
            ))
285
        }
286
    }
287
11.5k
}
288
289
0
pub fn parse_tls_extension_status_request(i: &[u8]) -> IResult<&[u8], TlsExtension> {
290
0
    let (i, _) = tag([0x00, 0x05])(i)?;
291
0
    let (i, ext_len) = be_u16(i)?;
292
0
    map_parser(take(ext_len), move |d| {
293
0
        parse_tls_extension_status_request_content(d, ext_len)
294
0
    })(i)
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_status_request::{closure#0}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_status_request::{closure#0}
295
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_status_request
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_status_request
296
297
// defined in rfc8422
298
6.39k
pub fn parse_tls_extension_elliptic_curves_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
299
6.39k
    map_parser(
300
6.39k
        length_data(be_u16),
301
6.39k
        map(parse_named_groups, TlsExtension::EllipticCurves),
302
6.39k
    )(i)
303
6.39k
}
tls_parser::tls_extensions::parse_tls_extension_elliptic_curves_content
Line
Count
Source
298
3.58k
pub fn parse_tls_extension_elliptic_curves_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
299
3.58k
    map_parser(
300
3.58k
        length_data(be_u16),
301
3.58k
        map(parse_named_groups, TlsExtension::EllipticCurves),
302
3.58k
    )(i)
303
3.58k
}
tls_parser::tls_extensions::parse_tls_extension_elliptic_curves_content
Line
Count
Source
298
2.81k
pub fn parse_tls_extension_elliptic_curves_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
299
2.81k
    map_parser(
300
2.81k
        length_data(be_u16),
301
2.81k
        map(parse_named_groups, TlsExtension::EllipticCurves),
302
2.81k
    )(i)
303
2.81k
}
304
305
0
pub fn parse_tls_extension_elliptic_curves(i: &[u8]) -> IResult<&[u8], TlsExtension> {
306
0
    let (i, _) = tag([0x00, 0x0a])(i)?;
307
0
    map_parser(
308
0
        length_data(be_u16),
309
0
        parse_tls_extension_elliptic_curves_content,
310
0
    )(i)
311
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_elliptic_curves
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_elliptic_curves
312
313
6.13k
pub fn parse_tls_extension_ec_point_formats_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
314
6.13k
    map(length_data(be_u8), TlsExtension::EcPointFormats)(i)
315
6.13k
}
tls_parser::tls_extensions::parse_tls_extension_ec_point_formats_content
Line
Count
Source
313
2.92k
pub fn parse_tls_extension_ec_point_formats_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
314
2.92k
    map(length_data(be_u8), TlsExtension::EcPointFormats)(i)
315
2.92k
}
tls_parser::tls_extensions::parse_tls_extension_ec_point_formats_content
Line
Count
Source
313
3.21k
pub fn parse_tls_extension_ec_point_formats_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
314
3.21k
    map(length_data(be_u8), TlsExtension::EcPointFormats)(i)
315
3.21k
}
316
317
0
pub fn parse_tls_extension_ec_point_formats(i: &[u8]) -> IResult<&[u8], TlsExtension> {
318
0
    let (i, _) = tag([0x00, 0x0a])(i)?;
319
0
    map_parser(
320
0
        length_data(be_u16),
321
0
        parse_tls_extension_ec_point_formats_content,
322
0
    )(i)
323
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_ec_point_formats
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_ec_point_formats
324
325
/// Parse 'Signature Algorithms' extension (rfc8446, TLS 1.3 only)
326
3.46k
pub fn parse_tls_extension_signature_algorithms_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
327
3.46k
    let (i, l) = map_parser(length_data(be_u16), many0(complete(be_u16)))(i)?;
328
2.25k
    Ok((i, TlsExtension::SignatureAlgorithms(l))) // XXX SignatureAlgorithms or SignatureScheme
329
3.46k
}
tls_parser::tls_extensions::parse_tls_extension_signature_algorithms_content
Line
Count
Source
326
1.75k
pub fn parse_tls_extension_signature_algorithms_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
327
1.75k
    let (i, l) = map_parser(length_data(be_u16), many0(complete(be_u16)))(i)?;
328
1.14k
    Ok((i, TlsExtension::SignatureAlgorithms(l))) // XXX SignatureAlgorithms or SignatureScheme
329
1.75k
}
tls_parser::tls_extensions::parse_tls_extension_signature_algorithms_content
Line
Count
Source
326
1.70k
pub fn parse_tls_extension_signature_algorithms_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
327
1.70k
    let (i, l) = map_parser(length_data(be_u16), many0(complete(be_u16)))(i)?;
328
1.10k
    Ok((i, TlsExtension::SignatureAlgorithms(l))) // XXX SignatureAlgorithms or SignatureScheme
329
1.70k
}
330
331
0
pub fn parse_tls_extension_signature_algorithms(i: &[u8]) -> IResult<&[u8], TlsExtension> {
332
0
    let (i, _) = tag([0x00, 13])(i)?;
333
0
    map_parser(
334
0
        length_data(be_u16),
335
0
        parse_tls_extension_signature_algorithms_content,
336
0
    )(i)
337
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_signature_algorithms
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_signature_algorithms
338
339
// rfc6520
340
951
pub fn parse_tls_extension_heartbeat_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
341
951
    map(be_u8, TlsExtension::Heartbeat)(i)
342
951
}
tls_parser::tls_extensions::parse_tls_extension_heartbeat_content
Line
Count
Source
340
421
pub fn parse_tls_extension_heartbeat_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
341
421
    map(be_u8, TlsExtension::Heartbeat)(i)
342
421
}
tls_parser::tls_extensions::parse_tls_extension_heartbeat_content
Line
Count
Source
340
530
pub fn parse_tls_extension_heartbeat_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
341
530
    map(be_u8, TlsExtension::Heartbeat)(i)
342
530
}
343
344
0
pub fn parse_tls_extension_heartbeat(i: &[u8]) -> IResult<&[u8], TlsExtension> {
345
0
    let (i, _) = tag([0x00, 0x0d])(i)?;
346
0
    let (i, ext_len) = verify(be_u16, |&n| n == 1)(i)?;
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_heartbeat::{closure#0}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_heartbeat::{closure#0}
347
0
    map_parser(take(ext_len), parse_tls_extension_heartbeat_content)(i)
348
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_heartbeat
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_heartbeat
349
350
668k
fn parse_protocol_name(i: &[u8]) -> IResult<&[u8], &[u8]> {
351
668k
    length_data(be_u8)(i)
352
668k
}
tls_parser::tls_extensions::parse_protocol_name
Line
Count
Source
350
341k
fn parse_protocol_name(i: &[u8]) -> IResult<&[u8], &[u8]> {
351
341k
    length_data(be_u8)(i)
352
341k
}
tls_parser::tls_extensions::parse_protocol_name
Line
Count
Source
350
326k
fn parse_protocol_name(i: &[u8]) -> IResult<&[u8], &[u8]> {
351
326k
    length_data(be_u8)(i)
352
326k
}
353
354
/// Defined in [RFC7301]
355
14.5k
pub fn parse_tls_extension_alpn_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
356
14.5k
    let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_protocol_name)))(i)?;
357
13.3k
    Ok((i, TlsExtension::ALPN(v)))
358
14.5k
}
tls_parser::tls_extensions::parse_tls_extension_alpn_content
Line
Count
Source
355
9.64k
pub fn parse_tls_extension_alpn_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
356
9.64k
    let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_protocol_name)))(i)?;
357
9.06k
    Ok((i, TlsExtension::ALPN(v)))
358
9.64k
}
tls_parser::tls_extensions::parse_tls_extension_alpn_content
Line
Count
Source
355
4.92k
pub fn parse_tls_extension_alpn_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
356
4.92k
    let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_protocol_name)))(i)?;
357
4.30k
    Ok((i, TlsExtension::ALPN(v)))
358
4.92k
}
359
360
/// Defined in [RFC7685]
361
816
fn parse_tls_extension_padding_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
362
816
    map(take(ext_len), TlsExtension::Padding)(i)
363
816
}
tls_parser::tls_extensions::parse_tls_extension_padding_content
Line
Count
Source
361
246
fn parse_tls_extension_padding_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
362
246
    map(take(ext_len), TlsExtension::Padding)(i)
363
246
}
tls_parser::tls_extensions::parse_tls_extension_padding_content
Line
Count
Source
361
570
fn parse_tls_extension_padding_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
362
570
    map(take(ext_len), TlsExtension::Padding)(i)
363
570
}
364
365
/// Defined in [RFC6962]
366
5.59k
pub fn parse_tls_extension_signed_certificate_timestamp_content(
367
5.59k
    i: &[u8],
368
5.59k
) -> IResult<&[u8], TlsExtension> {
369
5.59k
    map(
370
5.59k
        opt(complete(length_data(be_u16))),
371
5.59k
        TlsExtension::SignedCertificateTimestamp,
372
5.59k
    )(i)
373
5.59k
}
tls_parser::tls_extensions::parse_tls_extension_signed_certificate_timestamp_content
Line
Count
Source
366
2.20k
pub fn parse_tls_extension_signed_certificate_timestamp_content(
367
2.20k
    i: &[u8],
368
2.20k
) -> IResult<&[u8], TlsExtension> {
369
2.20k
    map(
370
2.20k
        opt(complete(length_data(be_u16))),
371
2.20k
        TlsExtension::SignedCertificateTimestamp,
372
2.20k
    )(i)
373
2.20k
}
tls_parser::tls_extensions::parse_tls_extension_signed_certificate_timestamp_content
Line
Count
Source
366
3.39k
pub fn parse_tls_extension_signed_certificate_timestamp_content(
367
3.39k
    i: &[u8],
368
3.39k
) -> IResult<&[u8], TlsExtension> {
369
3.39k
    map(
370
3.39k
        opt(complete(length_data(be_u16))),
371
3.39k
        TlsExtension::SignedCertificateTimestamp,
372
3.39k
    )(i)
373
3.39k
}
374
375
/// Encrypt-then-MAC is defined in [RFC7366]
376
4.79k
fn parse_tls_extension_encrypt_then_mac_content(
377
4.79k
    i: &[u8],
378
4.79k
    ext_len: u16,
379
4.79k
) -> IResult<&[u8], TlsExtension> {
380
4.79k
    if ext_len != 0 {
381
409
        return Err(Err::Error(make_error(i, ErrorKind::Verify)));
382
4.38k
    }
383
4.38k
    Ok((i, TlsExtension::EncryptThenMac))
384
4.79k
}
tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac_content
Line
Count
Source
376
3.46k
fn parse_tls_extension_encrypt_then_mac_content(
377
3.46k
    i: &[u8],
378
3.46k
    ext_len: u16,
379
3.46k
) -> IResult<&[u8], TlsExtension> {
380
3.46k
    if ext_len != 0 {
381
197
        return Err(Err::Error(make_error(i, ErrorKind::Verify)));
382
3.26k
    }
383
3.26k
    Ok((i, TlsExtension::EncryptThenMac))
384
3.46k
}
tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac_content
Line
Count
Source
376
1.33k
fn parse_tls_extension_encrypt_then_mac_content(
377
1.33k
    i: &[u8],
378
1.33k
    ext_len: u16,
379
1.33k
) -> IResult<&[u8], TlsExtension> {
380
1.33k
    if ext_len != 0 {
381
212
        return Err(Err::Error(make_error(i, ErrorKind::Verify)));
382
1.12k
    }
383
1.12k
    Ok((i, TlsExtension::EncryptThenMac))
384
1.33k
}
385
386
/// Encrypt-then-MAC is defined in [RFC7366]
387
0
pub fn parse_tls_extension_encrypt_then_mac(i: &[u8]) -> IResult<&[u8], TlsExtension> {
388
0
    let (i, _) = tag([0x00, 0x16])(i)?;
389
0
    let (i, ext_len) = be_u16(i)?;
390
0
    map_parser(take(ext_len), move |d| {
391
0
        parse_tls_extension_encrypt_then_mac_content(d, ext_len)
392
0
    })(i)
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac::{closure#0}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac::{closure#0}
393
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_encrypt_then_mac
394
395
/// Extended Master Secret is defined in [RFC7627]
396
913
fn parse_tls_extension_extended_master_secret_content(
397
913
    i: &[u8],
398
913
    ext_len: u16,
399
913
) -> IResult<&[u8], TlsExtension> {
400
913
    if ext_len != 0 {
401
411
        return Err(Err::Error(make_error(i, ErrorKind::Verify)));
402
502
    }
403
502
    Ok((i, TlsExtension::ExtendedMasterSecret))
404
913
}
tls_parser::tls_extensions::parse_tls_extension_extended_master_secret_content
Line
Count
Source
396
483
fn parse_tls_extension_extended_master_secret_content(
397
483
    i: &[u8],
398
483
    ext_len: u16,
399
483
) -> IResult<&[u8], TlsExtension> {
400
483
    if ext_len != 0 {
401
198
        return Err(Err::Error(make_error(i, ErrorKind::Verify)));
402
285
    }
403
285
    Ok((i, TlsExtension::ExtendedMasterSecret))
404
483
}
tls_parser::tls_extensions::parse_tls_extension_extended_master_secret_content
Line
Count
Source
396
430
fn parse_tls_extension_extended_master_secret_content(
397
430
    i: &[u8],
398
430
    ext_len: u16,
399
430
) -> IResult<&[u8], TlsExtension> {
400
430
    if ext_len != 0 {
401
213
        return Err(Err::Error(make_error(i, ErrorKind::Verify)));
402
217
    }
403
217
    Ok((i, TlsExtension::ExtendedMasterSecret))
404
430
}
405
406
/// Extended Master Secret is defined in [RFC7627]
407
0
pub fn parse_tls_extension_extended_master_secret(i: &[u8]) -> IResult<&[u8], TlsExtension> {
408
0
    let (i, _) = tag([0x00, 0x17])(i)?;
409
0
    let (i, ext_len) = be_u16(i)?;
410
0
    map_parser(take(ext_len), move |d| {
411
0
        parse_tls_extension_extended_master_secret_content(d, ext_len)
412
0
    })(i)
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_extended_master_secret::{closure#0}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_extended_master_secret::{closure#0}
413
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_extended_master_secret
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_extended_master_secret
414
415
/// Extended Record Size Limit is defined in [RFC7627]
416
879
fn parse_tls_extension_record_size_limit(i: &[u8]) -> IResult<&[u8], TlsExtension> {
417
879
    map(be_u16, TlsExtension::RecordSizeLimit)(i)
418
879
}
tls_parser::tls_extensions::parse_tls_extension_record_size_limit
Line
Count
Source
416
458
fn parse_tls_extension_record_size_limit(i: &[u8]) -> IResult<&[u8], TlsExtension> {
417
458
    map(be_u16, TlsExtension::RecordSizeLimit)(i)
418
458
}
tls_parser::tls_extensions::parse_tls_extension_record_size_limit
Line
Count
Source
416
421
fn parse_tls_extension_record_size_limit(i: &[u8]) -> IResult<&[u8], TlsExtension> {
417
421
    map(be_u16, TlsExtension::RecordSizeLimit)(i)
418
421
}
419
420
1.98k
fn parse_tls_extension_session_ticket_content(
421
1.98k
    i: &[u8],
422
1.98k
    ext_len: u16,
423
1.98k
) -> IResult<&[u8], TlsExtension> {
424
1.98k
    map(take(ext_len), TlsExtension::SessionTicket)(i)
425
1.98k
}
tls_parser::tls_extensions::parse_tls_extension_session_ticket_content
Line
Count
Source
420
669
fn parse_tls_extension_session_ticket_content(
421
669
    i: &[u8],
422
669
    ext_len: u16,
423
669
) -> IResult<&[u8], TlsExtension> {
424
669
    map(take(ext_len), TlsExtension::SessionTicket)(i)
425
669
}
tls_parser::tls_extensions::parse_tls_extension_session_ticket_content
Line
Count
Source
420
1.31k
fn parse_tls_extension_session_ticket_content(
421
1.31k
    i: &[u8],
422
1.31k
    ext_len: u16,
423
1.31k
) -> IResult<&[u8], TlsExtension> {
424
1.31k
    map(take(ext_len), TlsExtension::SessionTicket)(i)
425
1.31k
}
426
427
0
pub fn parse_tls_extension_session_ticket(i: &[u8]) -> IResult<&[u8], TlsExtension> {
428
0
    let (i, _) = tag([0x00, 0x23])(i)?;
429
0
    let (i, ext_len) = be_u16(i)?;
430
0
    map_parser(take(ext_len), move |d| {
431
0
        parse_tls_extension_session_ticket_content(d, ext_len)
432
0
    })(i)
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_session_ticket::{closure#0}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_session_ticket::{closure#0}
433
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_session_ticket
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_session_ticket
434
435
1.32k
fn parse_tls_extension_key_share_old_content(
436
1.32k
    i: &[u8],
437
1.32k
    ext_len: u16,
438
1.32k
) -> IResult<&[u8], TlsExtension> {
439
1.32k
    map(take(ext_len), TlsExtension::KeyShareOld)(i)
440
1.32k
}
tls_parser::tls_extensions::parse_tls_extension_key_share_old_content
Line
Count
Source
435
947
fn parse_tls_extension_key_share_old_content(
436
947
    i: &[u8],
437
947
    ext_len: u16,
438
947
) -> IResult<&[u8], TlsExtension> {
439
947
    map(take(ext_len), TlsExtension::KeyShareOld)(i)
440
947
}
tls_parser::tls_extensions::parse_tls_extension_key_share_old_content
Line
Count
Source
435
373
fn parse_tls_extension_key_share_old_content(
436
373
    i: &[u8],
437
373
    ext_len: u16,
438
373
) -> IResult<&[u8], TlsExtension> {
439
373
    map(take(ext_len), TlsExtension::KeyShareOld)(i)
440
373
}
441
442
1.02k
fn parse_tls_extension_key_share_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
443
1.02k
    map(take(ext_len), TlsExtension::KeyShare)(i)
444
1.02k
}
tls_parser::tls_extensions::parse_tls_extension_key_share_content
Line
Count
Source
442
505
fn parse_tls_extension_key_share_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
443
505
    map(take(ext_len), TlsExtension::KeyShare)(i)
444
505
}
tls_parser::tls_extensions::parse_tls_extension_key_share_content
Line
Count
Source
442
519
fn parse_tls_extension_key_share_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
443
519
    map(take(ext_len), TlsExtension::KeyShare)(i)
444
519
}
445
446
0
pub fn parse_tls_extension_key_share(i: &[u8]) -> IResult<&[u8], TlsExtension> {
447
0
    let (i, _) = tag([0x00, 0x33])(i)?;
448
0
    let (i, ext_len) = be_u16(i)?;
449
0
    map_parser(take(ext_len), move |d| {
450
0
        parse_tls_extension_key_share_content(d, ext_len)
451
0
    })(i)
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_key_share::{closure#0}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_key_share::{closure#0}
452
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_key_share
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_key_share
453
454
1.67k
fn parse_tls_extension_pre_shared_key_content(
455
1.67k
    i: &[u8],
456
1.67k
    ext_len: u16,
457
1.67k
) -> IResult<&[u8], TlsExtension> {
458
1.67k
    map(take(ext_len), TlsExtension::PreSharedKey)(i)
459
1.67k
}
tls_parser::tls_extensions::parse_tls_extension_pre_shared_key_content
Line
Count
Source
454
1.01k
fn parse_tls_extension_pre_shared_key_content(
455
1.01k
    i: &[u8],
456
1.01k
    ext_len: u16,
457
1.01k
) -> IResult<&[u8], TlsExtension> {
458
1.01k
    map(take(ext_len), TlsExtension::PreSharedKey)(i)
459
1.01k
}
tls_parser::tls_extensions::parse_tls_extension_pre_shared_key_content
Line
Count
Source
454
655
fn parse_tls_extension_pre_shared_key_content(
455
655
    i: &[u8],
456
655
    ext_len: u16,
457
655
) -> IResult<&[u8], TlsExtension> {
458
655
    map(take(ext_len), TlsExtension::PreSharedKey)(i)
459
655
}
460
461
0
pub fn parse_tls_extension_pre_shared_key(i: &[u8]) -> IResult<&[u8], TlsExtension> {
462
0
    let (i, _) = tag([0x00, 0x28])(i)?;
463
0
    let (i, ext_len) = be_u16(i)?;
464
0
    map_parser(take(ext_len), move |d| {
465
0
        parse_tls_extension_pre_shared_key_content(d, ext_len)
466
0
    })(i)
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_pre_shared_key::{closure#0}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_pre_shared_key::{closure#0}
467
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_pre_shared_key
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_pre_shared_key
468
469
1.82k
fn parse_tls_extension_early_data_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
470
1.82k
    map(cond(ext_len > 0, be_u32), TlsExtension::EarlyData)(i)
471
1.82k
}
tls_parser::tls_extensions::parse_tls_extension_early_data_content
Line
Count
Source
469
814
fn parse_tls_extension_early_data_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
470
814
    map(cond(ext_len > 0, be_u32), TlsExtension::EarlyData)(i)
471
814
}
tls_parser::tls_extensions::parse_tls_extension_early_data_content
Line
Count
Source
469
1.01k
fn parse_tls_extension_early_data_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
470
1.01k
    map(cond(ext_len > 0, be_u32), TlsExtension::EarlyData)(i)
471
1.01k
}
472
473
0
pub fn parse_tls_extension_early_data(i: &[u8]) -> IResult<&[u8], TlsExtension> {
474
0
    let (i, _) = tag([0x00, 0x2a])(i)?;
475
0
    let (i, ext_len) = be_u16(i)?;
476
0
    map_parser(take(ext_len), move |d| {
477
0
        parse_tls_extension_early_data_content(d, ext_len)
478
0
    })(i)
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_early_data::{closure#0}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_early_data::{closure#0}
479
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_early_data
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_early_data
480
481
// TLS 1.3 draft 23
482
//       struct {
483
//           select (Handshake.msg_type) {
484
//               case client_hello:
485
//                    ProtocolVersion versions<2..254>;
486
//
487
//               case server_hello: /* and HelloRetryRequest */
488
//                    ProtocolVersion selected_version;
489
//           };
490
//       } SupportedVersions;
491
// XXX the content depends on the current message type
492
// XXX first case has length 1 + 2*n, while the second case has length 2
493
5.91k
fn parse_tls_extension_supported_versions_content(
494
5.91k
    i: &[u8],
495
5.91k
    ext_len: u16,
496
5.91k
) -> IResult<&[u8], TlsExtension> {
497
5.91k
    if ext_len == 2 {
498
1.44k
        map(be_u16, |x| {
499
1.44k
            TlsExtension::SupportedVersions(vec![TlsVersion(x)])
500
1.44k
        })(i)
tls_parser::tls_extensions::parse_tls_extension_supported_versions_content::{closure#0}
Line
Count
Source
498
420
        map(be_u16, |x| {
499
420
            TlsExtension::SupportedVersions(vec![TlsVersion(x)])
500
420
        })(i)
tls_parser::tls_extensions::parse_tls_extension_supported_versions_content::{closure#0}
Line
Count
Source
498
1.02k
        map(be_u16, |x| {
499
1.02k
            TlsExtension::SupportedVersions(vec![TlsVersion(x)])
500
1.02k
        })(i)
501
    } else {
502
4.47k
        let (i, _) = be_u8(i)?;
503
4.01k
        if ext_len == 0 {
504
0
            return Err(Err::Error(make_error(i, ErrorKind::Verify)));
505
4.01k
        }
506
4.01k
        let (i, l) = map_parser(take(ext_len - 1), parse_tls_versions)(i)?;
507
3.49k
        Ok((i, TlsExtension::SupportedVersions(l)))
508
    }
509
5.91k
}
tls_parser::tls_extensions::parse_tls_extension_supported_versions_content
Line
Count
Source
493
2.64k
fn parse_tls_extension_supported_versions_content(
494
2.64k
    i: &[u8],
495
2.64k
    ext_len: u16,
496
2.64k
) -> IResult<&[u8], TlsExtension> {
497
2.64k
    if ext_len == 2 {
498
420
        map(be_u16, |x| {
499
            TlsExtension::SupportedVersions(vec![TlsVersion(x)])
500
420
        })(i)
501
    } else {
502
2.22k
        let (i, _) = be_u8(i)?;
503
2.00k
        if ext_len == 0 {
504
0
            return Err(Err::Error(make_error(i, ErrorKind::Verify)));
505
2.00k
        }
506
2.00k
        let (i, l) = map_parser(take(ext_len - 1), parse_tls_versions)(i)?;
507
1.81k
        Ok((i, TlsExtension::SupportedVersions(l)))
508
    }
509
2.64k
}
tls_parser::tls_extensions::parse_tls_extension_supported_versions_content
Line
Count
Source
493
3.27k
fn parse_tls_extension_supported_versions_content(
494
3.27k
    i: &[u8],
495
3.27k
    ext_len: u16,
496
3.27k
) -> IResult<&[u8], TlsExtension> {
497
3.27k
    if ext_len == 2 {
498
1.02k
        map(be_u16, |x| {
499
            TlsExtension::SupportedVersions(vec![TlsVersion(x)])
500
1.02k
        })(i)
501
    } else {
502
2.25k
        let (i, _) = be_u8(i)?;
503
2.00k
        if ext_len == 0 {
504
0
            return Err(Err::Error(make_error(i, ErrorKind::Verify)));
505
2.00k
        }
506
2.00k
        let (i, l) = map_parser(take(ext_len - 1), parse_tls_versions)(i)?;
507
1.68k
        Ok((i, TlsExtension::SupportedVersions(l)))
508
    }
509
3.27k
}
510
511
0
pub fn parse_tls_extension_supported_versions(i: &[u8]) -> IResult<&[u8], TlsExtension> {
512
0
    let (i, _) = tag([0x00, 0x2b])(i)?;
513
0
    let (i, ext_len) = be_u16(i)?;
514
0
    map_parser(take(ext_len), move |d| {
515
0
        parse_tls_extension_supported_versions_content(d, ext_len)
516
0
    })(i)
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_supported_versions::{closure#0}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_supported_versions::{closure#0}
517
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_supported_versions
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_supported_versions
518
519
1.65k
fn parse_tls_extension_cookie_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
520
1.65k
    map(take(ext_len), TlsExtension::Cookie)(i)
521
1.65k
}
tls_parser::tls_extensions::parse_tls_extension_cookie_content
Line
Count
Source
519
842
fn parse_tls_extension_cookie_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
520
842
    map(take(ext_len), TlsExtension::Cookie)(i)
521
842
}
tls_parser::tls_extensions::parse_tls_extension_cookie_content
Line
Count
Source
519
811
fn parse_tls_extension_cookie_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
520
811
    map(take(ext_len), TlsExtension::Cookie)(i)
521
811
}
522
523
0
pub fn parse_tls_extension_cookie(i: &[u8]) -> IResult<&[u8], TlsExtension> {
524
0
    let (i, _) = tag([0x00, 0x2c])(i)?;
525
0
    let (i, ext_len) = be_u16(i)?;
526
0
    map_parser(take(ext_len), move |d| {
527
0
        parse_tls_extension_cookie_content(d, ext_len)
528
0
    })(i)
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_cookie::{closure#0}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_cookie::{closure#0}
529
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_cookie
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_cookie
530
531
2.99k
pub fn parse_tls_extension_psk_key_exchange_modes_content(
532
2.99k
    i: &[u8],
533
2.99k
) -> IResult<&[u8], TlsExtension> {
534
2.99k
    let (i, v) = length_data(be_u8)(i)?;
535
1.97k
    Ok((i, TlsExtension::PskExchangeModes(v.to_vec())))
536
2.99k
}
tls_parser::tls_extensions::parse_tls_extension_psk_key_exchange_modes_content
Line
Count
Source
531
1.38k
pub fn parse_tls_extension_psk_key_exchange_modes_content(
532
1.38k
    i: &[u8],
533
1.38k
) -> IResult<&[u8], TlsExtension> {
534
1.38k
    let (i, v) = length_data(be_u8)(i)?;
535
955
    Ok((i, TlsExtension::PskExchangeModes(v.to_vec())))
536
1.38k
}
tls_parser::tls_extensions::parse_tls_extension_psk_key_exchange_modes_content
Line
Count
Source
531
1.60k
pub fn parse_tls_extension_psk_key_exchange_modes_content(
532
1.60k
    i: &[u8],
533
1.60k
) -> IResult<&[u8], TlsExtension> {
534
1.60k
    let (i, v) = length_data(be_u8)(i)?;
535
1.02k
    Ok((i, TlsExtension::PskExchangeModes(v.to_vec())))
536
1.60k
}
537
538
0
pub fn parse_tls_extension_psk_key_exchange_modes(i: &[u8]) -> IResult<&[u8], TlsExtension> {
539
0
    let (i, _) = tag([0x00, 0x2d])(i)?;
540
0
    let (i, ext_len) = be_u16(i)?;
541
0
    map_parser(
542
0
        take(ext_len),
543
0
        parse_tls_extension_psk_key_exchange_modes_content,
544
0
    )(i)
545
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_psk_key_exchange_modes
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_psk_key_exchange_modes
546
547
/// Defined in RFC-draft-agl-tls-nextprotoneg-03. Deprecated in favour of ALPN.
548
392
fn parse_tls_extension_npn_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
549
392
    if ext_len != 0 {
550
260
        return Err(Err::Error(make_error(i, ErrorKind::Verify)));
551
132
    }
552
132
    Ok((i, TlsExtension::NextProtocolNegotiation))
553
392
}
tls_parser::tls_extensions::parse_tls_extension_npn_content
Line
Count
Source
548
132
fn parse_tls_extension_npn_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
549
132
    if ext_len != 0 {
550
66
        return Err(Err::Error(make_error(i, ErrorKind::Verify)));
551
66
    }
552
66
    Ok((i, TlsExtension::NextProtocolNegotiation))
553
132
}
tls_parser::tls_extensions::parse_tls_extension_npn_content
Line
Count
Source
548
260
fn parse_tls_extension_npn_content(i: &[u8], ext_len: u16) -> IResult<&[u8], TlsExtension> {
549
260
    if ext_len != 0 {
550
194
        return Err(Err::Error(make_error(i, ErrorKind::Verify)));
551
66
    }
552
66
    Ok((i, TlsExtension::NextProtocolNegotiation))
553
260
}
554
555
/// Renegotiation Info, defined in [RFC5746]
556
1.56k
pub fn parse_tls_extension_renegotiation_info_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
557
1.56k
    map(length_data(be_u8), TlsExtension::RenegotiationInfo)(i)
558
1.56k
}
tls_parser::tls_extensions::parse_tls_extension_renegotiation_info_content
Line
Count
Source
556
868
pub fn parse_tls_extension_renegotiation_info_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
557
868
    map(length_data(be_u8), TlsExtension::RenegotiationInfo)(i)
558
868
}
tls_parser::tls_extensions::parse_tls_extension_renegotiation_info_content
Line
Count
Source
556
694
pub fn parse_tls_extension_renegotiation_info_content(i: &[u8]) -> IResult<&[u8], TlsExtension> {
557
694
    map(length_data(be_u8), TlsExtension::RenegotiationInfo)(i)
558
694
}
559
560
/// Encrypted Server Name, defined in [draft-ietf-tls-esni]
561
5.03k
pub fn parse_tls_extension_encrypted_server_name(i: &[u8]) -> IResult<&[u8], TlsExtension> {
562
5.03k
    let (i, ciphersuite) = map(be_u16, TlsCipherSuiteID)(i)?;
563
4.22k
    let (i, group) = NamedGroup::parse(i)?;
564
3.62k
    let (i, key_share) = length_data(be_u16)(i)?;
565
2.73k
    let (i, record_digest) = length_data(be_u16)(i)?;
566
1.66k
    let (i, encrypted_sni) = length_data(be_u16)(i)?;
567
361
    let esn = TlsExtension::EncryptedServerName {
568
361
        ciphersuite,
569
361
        group,
570
361
        key_share,
571
361
        record_digest,
572
361
        encrypted_sni,
573
361
    };
574
361
    Ok((i, esn))
575
5.03k
}
tls_parser::tls_extensions::parse_tls_extension_encrypted_server_name
Line
Count
Source
561
2.28k
pub fn parse_tls_extension_encrypted_server_name(i: &[u8]) -> IResult<&[u8], TlsExtension> {
562
2.28k
    let (i, ciphersuite) = map(be_u16, TlsCipherSuiteID)(i)?;
563
1.97k
    let (i, group) = NamedGroup::parse(i)?;
564
1.70k
    let (i, key_share) = length_data(be_u16)(i)?;
565
1.24k
    let (i, record_digest) = length_data(be_u16)(i)?;
566
831
    let (i, encrypted_sni) = length_data(be_u16)(i)?;
567
126
    let esn = TlsExtension::EncryptedServerName {
568
126
        ciphersuite,
569
126
        group,
570
126
        key_share,
571
126
        record_digest,
572
126
        encrypted_sni,
573
126
    };
574
126
    Ok((i, esn))
575
2.28k
}
tls_parser::tls_extensions::parse_tls_extension_encrypted_server_name
Line
Count
Source
561
2.74k
pub fn parse_tls_extension_encrypted_server_name(i: &[u8]) -> IResult<&[u8], TlsExtension> {
562
2.74k
    let (i, ciphersuite) = map(be_u16, TlsCipherSuiteID)(i)?;
563
2.24k
    let (i, group) = NamedGroup::parse(i)?;
564
1.92k
    let (i, key_share) = length_data(be_u16)(i)?;
565
1.49k
    let (i, record_digest) = length_data(be_u16)(i)?;
566
830
    let (i, encrypted_sni) = length_data(be_u16)(i)?;
567
235
    let esn = TlsExtension::EncryptedServerName {
568
235
        ciphersuite,
569
235
        group,
570
235
        key_share,
571
235
        record_digest,
572
235
        encrypted_sni,
573
235
    };
574
235
    Ok((i, esn))
575
2.74k
}
576
577
140k
fn parse_tls_oid_filter(i: &[u8]) -> IResult<&[u8], OidFilter> {
578
140k
    let (i, cert_ext_oid) = length_data(be_u8)(i)?;
579
138k
    let (i, cert_ext_val) = length_data(be_u16)(i)?;
580
137k
    let filter = OidFilter {
581
137k
        cert_ext_oid,
582
137k
        cert_ext_val,
583
137k
    };
584
137k
    Ok((i, filter))
585
140k
}
tls_parser::tls_extensions::parse_tls_oid_filter
Line
Count
Source
577
78.1k
fn parse_tls_oid_filter(i: &[u8]) -> IResult<&[u8], OidFilter> {
578
78.1k
    let (i, cert_ext_oid) = length_data(be_u8)(i)?;
579
77.3k
    let (i, cert_ext_val) = length_data(be_u16)(i)?;
580
76.7k
    let filter = OidFilter {
581
76.7k
        cert_ext_oid,
582
76.7k
        cert_ext_val,
583
76.7k
    };
584
76.7k
    Ok((i, filter))
585
78.1k
}
tls_parser::tls_extensions::parse_tls_oid_filter
Line
Count
Source
577
62.2k
fn parse_tls_oid_filter(i: &[u8]) -> IResult<&[u8], OidFilter> {
578
62.2k
    let (i, cert_ext_oid) = length_data(be_u8)(i)?;
579
61.2k
    let (i, cert_ext_val) = length_data(be_u16)(i)?;
580
60.5k
    let filter = OidFilter {
581
60.5k
        cert_ext_oid,
582
60.5k
        cert_ext_val,
583
60.5k
    };
584
60.5k
    Ok((i, filter))
585
62.2k
}
586
587
/// Defined in TLS 1.3 draft 19
588
4.39k
fn parse_tls_extension_oid_filters(i: &[u8]) -> IResult<&[u8], TlsExtension> {
589
4.39k
    let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_tls_oid_filter)))(i)?;
590
3.14k
    Ok((i, TlsExtension::OidFilters(v)))
591
4.39k
}
tls_parser::tls_extensions::parse_tls_extension_oid_filters
Line
Count
Source
588
2.11k
fn parse_tls_extension_oid_filters(i: &[u8]) -> IResult<&[u8], TlsExtension> {
589
2.11k
    let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_tls_oid_filter)))(i)?;
590
1.46k
    Ok((i, TlsExtension::OidFilters(v)))
591
2.11k
}
tls_parser::tls_extensions::parse_tls_extension_oid_filters
Line
Count
Source
588
2.27k
fn parse_tls_extension_oid_filters(i: &[u8]) -> IResult<&[u8], TlsExtension> {
589
2.27k
    let (i, v) = map_parser(length_data(be_u16), many0(complete(parse_tls_oid_filter)))(i)?;
590
1.67k
    Ok((i, TlsExtension::OidFilters(v)))
591
2.27k
}
592
593
/// Defined in TLS 1.3 draft 20
594
1.54k
fn parse_tls_extension_post_handshake_auth_content(
595
1.54k
    i: &[u8],
596
1.54k
    ext_len: u16,
597
1.54k
) -> IResult<&[u8], TlsExtension> {
598
1.54k
    if ext_len != 0 {
599
444
        return Err(Err::Error(make_error(i, ErrorKind::Verify)));
600
1.09k
    }
601
1.09k
    Ok((i, TlsExtension::PostHandshakeAuth))
602
1.54k
}
tls_parser::tls_extensions::parse_tls_extension_post_handshake_auth_content
Line
Count
Source
594
686
fn parse_tls_extension_post_handshake_auth_content(
595
686
    i: &[u8],
596
686
    ext_len: u16,
597
686
) -> IResult<&[u8], TlsExtension> {
598
686
    if ext_len != 0 {
599
208
        return Err(Err::Error(make_error(i, ErrorKind::Verify)));
600
478
    }
601
478
    Ok((i, TlsExtension::PostHandshakeAuth))
602
686
}
tls_parser::tls_extensions::parse_tls_extension_post_handshake_auth_content
Line
Count
Source
594
857
fn parse_tls_extension_post_handshake_auth_content(
595
857
    i: &[u8],
596
857
    ext_len: u16,
597
857
) -> IResult<&[u8], TlsExtension> {
598
857
    if ext_len != 0 {
599
236
        return Err(Err::Error(make_error(i, ErrorKind::Verify)));
600
621
    }
601
621
    Ok((i, TlsExtension::PostHandshakeAuth))
602
857
}
603
604
0
pub fn parse_tls_extension_unknown(i: &[u8]) -> IResult<&[u8], TlsExtension> {
605
0
    let (i, ext_type) = be_u16(i)?;
606
0
    let (i, ext_data) = length_data(be_u16)(i)?;
607
0
    Ok((
608
0
        i,
609
0
        TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data),
610
0
    ))
611
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_unknown
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_extension_unknown
612
613
/// Parse a single TLS Client Hello extension
614
0
pub fn parse_tls_client_hello_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> {
615
0
    let (i, ext_type) = be_u16(i)?;
616
0
    let (i, ext_data) = length_data(be_u16)(i)?;
617
0
    if ext_type & 0x0f0f == 0x0a0a {
618
0
        return Ok((i, TlsExtension::Grease(ext_type, ext_data)));
619
0
    }
620
0
    let ext_len = ext_data.len() as u16;
621
0
    let (_, ext) = match ext_type {
622
0
        0 => parse_tls_extension_sni_content(ext_data),
623
0
        1 => parse_tls_extension_max_fragment_length_content(ext_data),
624
0
        5 => parse_tls_extension_status_request_content(ext_data, ext_len),
625
0
        10 => parse_tls_extension_elliptic_curves_content(ext_data),
626
0
        11 => parse_tls_extension_ec_point_formats_content(ext_data),
627
0
        13 => parse_tls_extension_signature_algorithms_content(ext_data),
628
0
        15 => parse_tls_extension_heartbeat_content(ext_data),
629
0
        16 => parse_tls_extension_alpn_content(ext_data),
630
0
        18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data), // ok XXX should be empty
631
0
        21 => parse_tls_extension_padding_content(ext_data, ext_len),
632
0
        22 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len),
633
0
        23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len),
634
0
        28 => parse_tls_extension_record_size_limit(ext_data),
635
0
        35 => parse_tls_extension_session_ticket_content(ext_data, ext_len),
636
0
        41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len),
637
0
        42 => parse_tls_extension_early_data_content(ext_data, ext_len),
638
0
        43 => parse_tls_extension_supported_versions_content(ext_data, ext_len),
639
0
        44 => parse_tls_extension_cookie_content(ext_data, ext_len),
640
0
        45 => parse_tls_extension_psk_key_exchange_modes_content(ext_data),
641
0
        48 => parse_tls_extension_oid_filters(ext_data),
642
0
        49 => parse_tls_extension_post_handshake_auth_content(ext_data, ext_len),
643
0
        51 => parse_tls_extension_key_share_content(ext_data, ext_len), // XXX request
644
0
        13172 => parse_tls_extension_npn_content(ext_data, ext_len),    // XXX must be empty
645
0
        0xff01 => parse_tls_extension_renegotiation_info_content(ext_data),
646
0
        0xffce => parse_tls_extension_encrypted_server_name(ext_data),
647
0
        _ => Ok((
648
0
            i,
649
0
            TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data),
650
0
        )),
651
0
    }?;
652
0
    Ok((i, ext))
653
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_client_hello_extension
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_client_hello_extension
654
655
/// Parse a single TLS Server Hello extension
656
0
pub fn parse_tls_server_hello_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> {
657
0
    let (i, ext_type) = be_u16(i)?;
658
0
    let (i, ext_data) = length_data(be_u16)(i)?;
659
0
    if ext_type & 0x0f0f == 0x0a0a {
660
0
        return Ok((i, TlsExtension::Grease(ext_type, ext_data)));
661
0
    }
662
0
    let ext_len = ext_data.len() as u16;
663
0
    let (_, ext) = match ext_type {
664
0
        0 => parse_tls_extension_sni_content(ext_data), // XXX SHALL be empty (RFC6066 section 3)
665
0
        1 => parse_tls_extension_max_fragment_length_content(ext_data),
666
0
        5 => parse_tls_extension_status_request_content(ext_data, ext_len), // SHALL be empty
667
0
        11 => parse_tls_extension_ec_point_formats_content(ext_data),       // ok XXX only one
668
0
        13 => parse_tls_extension_signature_algorithms_content(ext_data),   // XXX allowed?
669
0
        15 => parse_tls_extension_heartbeat_content(ext_data),
670
0
        16 => parse_tls_extension_alpn_content(ext_data), // ok XXX MUST contain one protocol name
671
0
        18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data),
672
0
        21 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len),
673
0
        23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len),
674
0
        28 => parse_tls_extension_record_size_limit(ext_data),
675
0
        35 => parse_tls_extension_session_ticket_content(ext_data, ext_len),
676
0
        41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len),
677
0
        42 => parse_tls_extension_early_data_content(ext_data, ext_len),
678
0
        43 => parse_tls_extension_supported_versions_content(ext_data, ext_len), // ok XXX only one
679
0
        44 => parse_tls_extension_cookie_content(ext_data, ext_len),
680
0
        51 => parse_tls_extension_key_share_content(ext_data, ext_len), // XXX selected entry
681
0
        13172 => parse_tls_extension_npn_content(ext_data, ext_len),
682
0
        0xff01 => parse_tls_extension_renegotiation_info_content(ext_data),
683
0
        _ => Ok((
684
0
            i,
685
0
            TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data),
686
0
        )),
687
0
    }?;
688
0
    Ok((i, ext))
689
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_server_hello_extension
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_server_hello_extension
690
691
/// Parse a single TLS extension (of any type)
692
4.23M
pub fn parse_tls_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> {
693
4.23M
    let (i, ext_type) = be_u16(i)?;
694
4.19M
    let (i, ext_data) = length_data(be_u16)(i)?;
695
4.17M
    if ext_type & 0x0f0f == 0x0a0a {
696
681
        return Ok((i, TlsExtension::Grease(ext_type, ext_data)));
697
4.16M
    }
698
4.16M
    let ext_len = ext_data.len() as u16;
699
4.16M
    let (_, ext) = match ext_type {
700
3.02M
        0 => parse_tls_extension_sni_content(ext_data),
701
1.04k
        1 => parse_tls_extension_max_fragment_length_content(ext_data),
702
50.6k
        5 => parse_tls_extension_status_request_content(ext_data, ext_len),
703
6.39k
        10 => parse_tls_extension_elliptic_curves_content(ext_data),
704
6.13k
        11 => parse_tls_extension_ec_point_formats_content(ext_data),
705
3.46k
        13 => parse_tls_extension_signature_algorithms_content(ext_data),
706
951
        15 => parse_tls_extension_heartbeat_content(ext_data),
707
14.5k
        16 => parse_tls_extension_alpn_content(ext_data),
708
5.59k
        18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data),
709
816
        21 => parse_tls_extension_padding_content(ext_data, ext_len),
710
4.79k
        22 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len),
711
913
        23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len),
712
879
        28 => parse_tls_extension_record_size_limit(ext_data),
713
1.98k
        35 => parse_tls_extension_session_ticket_content(ext_data, ext_len),
714
1.32k
        40 => parse_tls_extension_key_share_old_content(ext_data, ext_len),
715
1.67k
        41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len),
716
1.82k
        42 => parse_tls_extension_early_data_content(ext_data, ext_len),
717
5.91k
        43 => parse_tls_extension_supported_versions_content(ext_data, ext_len),
718
1.65k
        44 => parse_tls_extension_cookie_content(ext_data, ext_len),
719
2.99k
        45 => parse_tls_extension_psk_key_exchange_modes_content(ext_data),
720
4.39k
        48 => parse_tls_extension_oid_filters(ext_data),
721
1.54k
        49 => parse_tls_extension_post_handshake_auth_content(ext_data, ext_len),
722
1.02k
        51 => parse_tls_extension_key_share_content(ext_data, ext_len),
723
392
        13172 => parse_tls_extension_npn_content(ext_data, ext_len),
724
1.56k
        0xff01 => parse_tls_extension_renegotiation_info_content(ext_data),
725
5.03k
        0xffce => parse_tls_extension_encrypted_server_name(ext_data),
726
1.01M
        _ => Ok((
727
1.01M
            i,
728
1.01M
            TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data),
729
1.01M
        )),
730
18.6k
    }?;
731
4.15M
    Ok((i, ext))
732
4.23M
}
tls_parser::tls_extensions::parse_tls_extension
Line
Count
Source
692
1.55M
pub fn parse_tls_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> {
693
1.55M
    let (i, ext_type) = be_u16(i)?;
694
1.53M
    let (i, ext_data) = length_data(be_u16)(i)?;
695
1.52M
    if ext_type & 0x0f0f == 0x0a0a {
696
327
        return Ok((i, TlsExtension::Grease(ext_type, ext_data)));
697
1.52M
    }
698
1.52M
    let ext_len = ext_data.len() as u16;
699
1.52M
    let (_, ext) = match ext_type {
700
1.06M
        0 => parse_tls_extension_sni_content(ext_data),
701
456
        1 => parse_tls_extension_max_fragment_length_content(ext_data),
702
39.1k
        5 => parse_tls_extension_status_request_content(ext_data, ext_len),
703
3.58k
        10 => parse_tls_extension_elliptic_curves_content(ext_data),
704
2.92k
        11 => parse_tls_extension_ec_point_formats_content(ext_data),
705
1.75k
        13 => parse_tls_extension_signature_algorithms_content(ext_data),
706
421
        15 => parse_tls_extension_heartbeat_content(ext_data),
707
9.64k
        16 => parse_tls_extension_alpn_content(ext_data),
708
2.20k
        18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data),
709
246
        21 => parse_tls_extension_padding_content(ext_data, ext_len),
710
3.46k
        22 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len),
711
483
        23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len),
712
458
        28 => parse_tls_extension_record_size_limit(ext_data),
713
669
        35 => parse_tls_extension_session_ticket_content(ext_data, ext_len),
714
947
        40 => parse_tls_extension_key_share_old_content(ext_data, ext_len),
715
1.01k
        41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len),
716
814
        42 => parse_tls_extension_early_data_content(ext_data, ext_len),
717
2.64k
        43 => parse_tls_extension_supported_versions_content(ext_data, ext_len),
718
842
        44 => parse_tls_extension_cookie_content(ext_data, ext_len),
719
1.38k
        45 => parse_tls_extension_psk_key_exchange_modes_content(ext_data),
720
2.11k
        48 => parse_tls_extension_oid_filters(ext_data),
721
686
        49 => parse_tls_extension_post_handshake_auth_content(ext_data, ext_len),
722
505
        51 => parse_tls_extension_key_share_content(ext_data, ext_len),
723
132
        13172 => parse_tls_extension_npn_content(ext_data, ext_len),
724
868
        0xff01 => parse_tls_extension_renegotiation_info_content(ext_data),
725
2.28k
        0xffce => parse_tls_extension_encrypted_server_name(ext_data),
726
375k
        _ => Ok((
727
375k
            i,
728
375k
            TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data),
729
375k
        )),
730
8.51k
    }?;
731
1.51M
    Ok((i, ext))
732
1.55M
}
tls_parser::tls_extensions::parse_tls_extension
Line
Count
Source
692
2.67M
pub fn parse_tls_extension(i: &[u8]) -> IResult<&[u8], TlsExtension> {
693
2.67M
    let (i, ext_type) = be_u16(i)?;
694
2.65M
    let (i, ext_data) = length_data(be_u16)(i)?;
695
2.64M
    if ext_type & 0x0f0f == 0x0a0a {
696
354
        return Ok((i, TlsExtension::Grease(ext_type, ext_data)));
697
2.64M
    }
698
2.64M
    let ext_len = ext_data.len() as u16;
699
2.64M
    let (_, ext) = match ext_type {
700
1.95M
        0 => parse_tls_extension_sni_content(ext_data),
701
589
        1 => parse_tls_extension_max_fragment_length_content(ext_data),
702
11.5k
        5 => parse_tls_extension_status_request_content(ext_data, ext_len),
703
2.81k
        10 => parse_tls_extension_elliptic_curves_content(ext_data),
704
3.21k
        11 => parse_tls_extension_ec_point_formats_content(ext_data),
705
1.70k
        13 => parse_tls_extension_signature_algorithms_content(ext_data),
706
530
        15 => parse_tls_extension_heartbeat_content(ext_data),
707
4.92k
        16 => parse_tls_extension_alpn_content(ext_data),
708
3.39k
        18 => parse_tls_extension_signed_certificate_timestamp_content(ext_data),
709
570
        21 => parse_tls_extension_padding_content(ext_data, ext_len),
710
1.33k
        22 => parse_tls_extension_encrypt_then_mac_content(ext_data, ext_len),
711
430
        23 => parse_tls_extension_extended_master_secret_content(ext_data, ext_len),
712
421
        28 => parse_tls_extension_record_size_limit(ext_data),
713
1.31k
        35 => parse_tls_extension_session_ticket_content(ext_data, ext_len),
714
373
        40 => parse_tls_extension_key_share_old_content(ext_data, ext_len),
715
655
        41 => parse_tls_extension_pre_shared_key_content(ext_data, ext_len),
716
1.01k
        42 => parse_tls_extension_early_data_content(ext_data, ext_len),
717
3.27k
        43 => parse_tls_extension_supported_versions_content(ext_data, ext_len),
718
811
        44 => parse_tls_extension_cookie_content(ext_data, ext_len),
719
1.60k
        45 => parse_tls_extension_psk_key_exchange_modes_content(ext_data),
720
2.27k
        48 => parse_tls_extension_oid_filters(ext_data),
721
857
        49 => parse_tls_extension_post_handshake_auth_content(ext_data, ext_len),
722
519
        51 => parse_tls_extension_key_share_content(ext_data, ext_len),
723
260
        13172 => parse_tls_extension_npn_content(ext_data, ext_len),
724
694
        0xff01 => parse_tls_extension_renegotiation_info_content(ext_data),
725
2.74k
        0xffce => parse_tls_extension_encrypted_server_name(ext_data),
726
643k
        _ => Ok((
727
643k
            i,
728
643k
            TlsExtension::Unknown(TlsExtensionType(ext_type), ext_data),
729
643k
        )),
730
10.1k
    }?;
731
2.63M
    Ok((i, ext))
732
2.67M
}
733
734
/// Parse zero or more TLS Client Hello extensions
735
0
pub fn parse_tls_client_hello_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> {
736
0
    many0(complete(parse_tls_client_hello_extension))(i)
737
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_client_hello_extensions
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_client_hello_extensions
738
739
/// Parse zero or more TLS Server Hello extensions
740
0
pub fn parse_tls_server_hello_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> {
741
0
    many0(complete(parse_tls_server_hello_extension))(i)
742
0
}
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_server_hello_extensions
Unexecuted instantiation: tls_parser::tls_extensions::parse_tls_server_hello_extensions
743
744
/// Parse zero or more TLS extensions (of any type)
745
79.5k
pub fn parse_tls_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> {
746
79.5k
    many0(complete(parse_tls_extension))(i)
747
79.5k
}
tls_parser::tls_extensions::parse_tls_extensions
Line
Count
Source
745
37.2k
pub fn parse_tls_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> {
746
37.2k
    many0(complete(parse_tls_extension))(i)
747
37.2k
}
tls_parser::tls_extensions::parse_tls_extensions
Line
Count
Source
745
42.3k
pub fn parse_tls_extensions(i: &[u8]) -> IResult<&[u8], Vec<TlsExtension>> {
746
42.3k
    many0(complete(parse_tls_extension))(i)
747
42.3k
}