tlspuffin/tls/
fn_extensions.rs

1#![allow(clippy::ptr_arg)]
2#![allow(dead_code)]
3
4//! Extensions according to IANA:
5//! <https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml>
6//!
7//! In the source code all IDs are available, but implementations are missing.
8
9use puffin::algebra::error::FnError;
10use webpki::DnsNameRef;
11
12use crate::nyi_fn;
13use crate::tls::fn_impl::fn_get_ticket_age_add;
14use crate::tls::fn_utils::fn_get_ticket;
15use crate::tls::key_exchange::deterministic_key_share;
16use crate::tls::rustls::msgs::base::{Payload, PayloadU16, PayloadU24, PayloadU8};
17use crate::tls::rustls::msgs::enums::*;
18use crate::tls::rustls::msgs::handshake::*;
19use crate::tls::rustls::msgs::message::Message;
20use crate::tls::rustls::x509;
21
22pub fn fn_client_extensions_new() -> Result<Vec<ClientExtension>, FnError> {
23    Ok(vec![])
24}
25
26pub fn fn_client_extensions_append(
27    extensions: &Vec<ClientExtension>,
28    extension: &ClientExtension,
29) -> Result<Vec<ClientExtension>, FnError> {
30    let mut new_extensions = extensions.clone();
31    new_extensions.push(extension.clone());
32
33    Ok(new_extensions)
34}
35
36pub fn fn_client_extensions_make(
37    extensions: &Vec<ClientExtension>,
38) -> Result<ClientExtensions, FnError> {
39    Ok(ClientExtensions(extensions.clone()))
40}
41
42pub fn fn_server_extensions_new() -> Result<Vec<ServerExtension>, FnError> {
43    Ok(vec![])
44}
45
46pub fn fn_server_extensions_make(
47    extensions: &Vec<ServerExtension>,
48) -> Result<ServerExtensions, FnError> {
49    Ok(ServerExtensions(extensions.clone()))
50}
51
52pub fn fn_server_extensions_append(
53    extensions: &Vec<ServerExtension>,
54    extension: &ServerExtension,
55) -> Result<Vec<ServerExtension>, FnError> {
56    let mut new_extensions = extensions.clone();
57    new_extensions.push(extension.clone());
58
59    Ok(new_extensions)
60}
61
62pub fn fn_hello_retry_extensions_make(
63    extensions: &Vec<HelloRetryExtension>,
64) -> Result<HelloRetryExtensions, FnError> {
65    Ok(HelloRetryExtensions(extensions.clone()))
66}
67pub fn fn_hello_retry_extensions_new() -> Result<Vec<HelloRetryExtension>, FnError> {
68    Ok(vec![])
69}
70
71pub fn fn_hello_retry_extensions_append(
72    extensions: &Vec<HelloRetryExtension>,
73    extension: &HelloRetryExtension,
74) -> Result<Vec<HelloRetryExtension>, FnError> {
75    let mut new_extensions = extensions.clone();
76    new_extensions.push(extension.clone());
77
78    Ok(new_extensions)
79}
80
81pub fn fn_cert_req_extensions_new() -> Result<Vec<CertReqExtension>, FnError> {
82    Ok(vec![])
83}
84
85pub fn fn_cert_req_extensions_append(
86    extensions: &Vec<CertReqExtension>,
87    extension: &CertReqExtension,
88) -> Result<Vec<CertReqExtension>, FnError> {
89    let mut new_extensions = extensions.clone();
90    new_extensions.push(extension.clone());
91
92    Ok(new_extensions)
93}
94
95pub fn fn_cert_extensions_new() -> Result<Vec<CertificateExtension>, FnError> {
96    Ok(vec![])
97}
98
99pub fn fn_cert_extensions_append(
100    extensions: &Vec<CertificateExtension>,
101    extension: &CertificateExtension,
102) -> Result<Vec<CertificateExtension>, FnError> {
103    let mut new_extensions = extensions.clone();
104    new_extensions.push(extension.clone());
105
106    Ok(new_extensions)
107}
108
109pub fn fn_cert_extensions_make(
110    extensions: &Vec<CertificateExtension>,
111) -> Result<CertificateExtensions, FnError> {
112    Ok(CertificateExtensions(extensions.clone()))
113}
114
115pub fn fn_new_session_ticket_extensions_new() -> Result<Vec<NewSessionTicketExtension>, FnError> {
116    Ok(vec![])
117}
118
119pub fn fn_new_session_ticket_extensions_append(
120    extensions: &Vec<NewSessionTicketExtension>,
121    extension: &NewSessionTicketExtension,
122) -> Result<Vec<NewSessionTicketExtension>, FnError> {
123    let mut new_extensions = extensions.clone();
124    new_extensions.push(extension.clone());
125
126    Ok(new_extensions)
127}
128
129// todo ServerExtensions
130//      https://gitlab.inria.fr/mammann/tlspuffin/-/issues/57
131
132// todo CertReqExtension
133//      https://gitlab.inria.fr/mammann/tlspuffin/-/issues/57
134
135// todo NewSessionTicketExtension
136//      https://gitlab.inria.fr/mammann/tlspuffin/-/issues/57
137
138// todo Unknown Extensions for
139//      ClientExtension, ServerExtension, HelloRetryExtension, NewSessionTicketExtension
140//      https://gitlab.inria.fr/mammann/tlspuffin/-/issues/57
141
142//
143// Actual extensions
144//
145
146/// ServerName => 0x0000,
147pub fn fn_server_name_extension() -> Result<ClientExtension, FnError> {
148    let dns_name = "inria.fr";
149    Ok(ClientExtension::ServerName(ServerNameRequest(vec![
150        // TODO-Mapper: could be extended to change this field
151        ServerName {
152            typ: ServerNameType::HostName,
153            payload: ServerNamePayload::HostName((
154                PayloadU16(dns_name.to_string().into_bytes()),
155                DnsNameRef::try_from_ascii_str(dns_name)
156                    .map_err(|err| FnError::Codec(err.to_string()))?
157                    .to_owned(),
158            )),
159        },
160    ])))
161}
162pub fn fn_server_name_server_extension() -> Result<ServerExtension, FnError> {
163    Ok(ServerExtension::ServerNameAck)
164}
165nyi_fn! {
166    /// MaxFragmentLength => 0x0001,
167}
168nyi_fn! {
169    /// ClientCertificateUrl => 0x0002,
170}
171nyi_fn! {
172    /// TrustedCAKeys => 0x0003,
173}
174nyi_fn! {
175    /// TruncatedHMAC => 0x0004,
176}
177/// StatusRequest => 0x0005,
178pub fn fn_status_request_extension(
179    responder_ids: &VecU16OfPayloadU16,
180    extensions: &PayloadU16,
181) -> Result<ClientExtension, FnError> {
182    // todo unclear where the arguments come from here, needs manual trace implementation
183    //      https://github.com/tlspuffin/tlspuffin/issues/155
184    Ok(ClientExtension::CertificateStatusRequest(
185        CertificateStatusRequest::OCSP(OCSPCertificateStatusRequest {
186            responder_ids: responder_ids.clone(),
187            extensions: extensions.clone(),
188        }),
189    ))
190}
191pub fn fn_status_request_server_extension() -> Result<ServerExtension, FnError> {
192    Ok(ServerExtension::CertificateStatusAck)
193}
194
195pub fn fn_status_request_certificate_extension(
196    ocsp_response: &PayloadU24,
197) -> Result<CertificateExtension, FnError> {
198    // todo unclear where the arguments come from here, needs manual trace implementation
199    //      https://github.com/tlspuffin/tlspuffin/issues/155
200    Ok(CertificateExtension::CertificateStatus(CertificateStatus {
201        ocsp_response: ocsp_response.clone(),
202    }))
203}
204nyi_fn! {
205    /// UserMapping => 0x0006,
206}
207nyi_fn! {
208    /// ClientAuthz => 0x0007,
209}
210nyi_fn! {
211    /// ServerAuthz => 0x0008,
212}
213nyi_fn! {
214    /// CertificateType => 0x0009,
215}
216/// EllipticCurves => 0x000a,
217pub fn fn_support_group_extension_make(
218    groups: &Vec<NamedGroup>,
219) -> Result<ClientExtension, FnError> {
220    Ok(ClientExtension::NamedGroups(NamedGroups(groups.clone())))
221}
222
223pub fn fn_support_group_extension_new() -> Result<Vec<NamedGroup>, FnError> {
224    Ok(vec![])
225}
226
227pub fn fn_support_group_extension_append(
228    groups: &Vec<NamedGroup>,
229    group: &NamedGroup,
230) -> Result<Vec<NamedGroup>, FnError> {
231    let mut new_groups = groups.clone();
232    new_groups.push(*group);
233
234    Ok(new_groups)
235}
236
237// ECPointFormats => 0x000b,
238pub fn fn_ec_point_formats_extension() -> Result<ClientExtension, FnError> {
239    Ok(ClientExtension::ECPointFormats(ECPointFormatList(vec![
240        // TODO-Mapper: could be extended to change this field
241        ECPointFormat::Uncompressed,
242    ])))
243}
244pub fn fn_ec_point_formats_server_extension() -> Result<ServerExtension, FnError> {
245    Ok(ServerExtension::ECPointFormats(ECPointFormatList(vec![
246        // TODO-Mapper: could be extended to change this field
247        ECPointFormat::Uncompressed,
248    ])))
249}
250nyi_fn! {
251    /// SRP => 0x000c,
252}
253/// SignatureAlgorithms => 0x000d,
254pub fn fn_supported_signature_schemes_extension_new() -> Result<Vec<SignatureScheme>, FnError> {
255    Ok(vec![])
256}
257
258pub fn fn_supported_signature_schemes_extension_append(
259    signature_schemes: &Vec<SignatureScheme>,
260    signature_scheme: &SignatureScheme,
261) -> Result<Vec<SignatureScheme>, FnError> {
262    let mut new_signature_algorithms = signature_schemes.clone();
263    new_signature_algorithms.push(signature_scheme.clone());
264
265    Ok(new_signature_algorithms)
266}
267
268pub fn fn_signature_algorithm_extension(
269    supported_signature_schemes: &Vec<SignatureScheme>,
270) -> Result<ClientExtension, FnError> {
271    Ok(ClientExtension::SignatureAlgorithms(
272        SupportedSignatureSchemes(supported_signature_schemes.clone()),
273    ))
274}
275
276pub fn fn_signature_algorithm_cert_req_extension(
277    supported_signature_schemes: &Vec<SignatureScheme>,
278) -> Result<CertReqExtension, FnError> {
279    Ok(CertReqExtension::SignatureAlgorithms(
280        SupportedSignatureSchemes(supported_signature_schemes.clone()),
281    ))
282}
283
284pub fn fn_sig_scheme_rsa_pkcs1_sha256() -> Result<SignatureScheme, FnError> {
285    Ok(SignatureScheme::RSA_PKCS1_SHA256)
286}
287
288pub fn fn_sig_scheme_rsa_pss_sha256() -> Result<SignatureScheme, FnError> {
289    Ok(SignatureScheme::RSA_PSS_SHA256)
290}
291
292nyi_fn! {
293    /// UseSRTP => 0x000e,
294}
295nyi_fn! {
296    /// Heartbeat => 0x000f,
297}
298/// ALProtocolNegotiation => 0x0010,
299pub fn fn_empty_vec_of_vec() -> Result<Vec<Vec<u8>>, FnError> {
300    Ok(vec![])
301}
302pub fn fn_append_vec(vec_of_vec: &Vec<Vec<u8>>, data: &Vec<u8>) -> Result<Vec<Vec<u8>>, FnError> {
303    // todo unclear where the arguments come from here, needs manual trace implementation
304    //      https://github.com/tlspuffin/tlspuffin/issues/155
305    let mut new = vec_of_vec.clone();
306    new.push(data.clone());
307    Ok(new)
308}
309pub fn fn_al_protocol_negotiation(
310    protocol_name_list: &VecU16OfPayloadU8,
311) -> Result<ClientExtension, FnError> {
312    Ok(ClientExtension::Protocols(protocol_name_list.clone()))
313}
314pub fn fn_al_protocol_server_negotiation(
315    protocol_name_list: &VecU16OfPayloadU8,
316) -> Result<ServerExtension, FnError> {
317    Ok(ServerExtension::Protocols(protocol_name_list.clone()))
318}
319nyi_fn! {
320    /// status_request_v2 => 0x0011
321}
322/// SCT => 0x0012,
323pub fn fn_signed_certificate_timestamp_extension() -> Result<ClientExtension, FnError> {
324    Ok(ClientExtension::SignedCertificateTimestampRequest)
325}
326pub fn fn_signed_certificate_timestamp_server_extension() -> Result<ServerExtension, FnError> {
327    // todo unclear where what to put here
328    //      https://github.com/tlspuffin/tlspuffin/issues/155
329    Ok(ServerExtension::SignedCertificateTimestamp(
330        VecU16OfPayloadU16(vec![PayloadU16::new(Vec::from([42u8; 128]))]),
331    ))
332}
333pub fn fn_signed_certificate_timestamp_certificate_extension(
334) -> Result<CertificateExtension, FnError> {
335    // todo unclear where what to put here
336    //      https://github.com/tlspuffin/tlspuffin/issues/155
337    Ok(CertificateExtension::SignedCertificateTimestamp(
338        VecU16OfPayloadU16(vec![PayloadU16::new(Vec::from([42u8; 128]))]),
339    ))
340}
341nyi_fn! {
342    /// client_certificate_type => 0x0013,
343}
344nyi_fn! {
345    /// server_certificate_type => 0x0014,
346}
347nyi_fn! {
348    /// Padding => 0x0015,
349}
350nyi_fn! {
351    /// encrypt_then_mac => 0x0016,
352}
353/// ExtendedMasterSecret => 0x0017,
354pub fn fn_extended_master_secret_extension() -> Result<ClientExtension, FnError> {
355    Ok(ClientExtension::ExtendedMasterSecretRequest)
356}
357pub fn fn_extended_master_secret_server_extension() -> Result<ServerExtension, FnError> {
358    Ok(ServerExtension::ExtendedMasterSecretAck)
359}
360nyi_fn! {
361    /// token_binding => 0x0018,
362}
363nyi_fn! {
364    /// cached_info => 0x0019,
365}
366nyi_fn! {
367    /// tls_lts => 0x001A,
368}
369nyi_fn! {
370    /// compress_certificate => 0x001B,
371}
372nyi_fn! {
373    /// record_size_limit => 0x001C,
374}
375nyi_fn! {
376    /// pwd_protect => 0x001D,
377}
378nyi_fn! {
379    /// pwd_clear => 0x001E,
380}
381nyi_fn! {
382    /// password_salt => 0x001F,
383}
384nyi_fn! {
385    /// ticket_pinning => 0x0020,
386}
387nyi_fn! {
388    /// tls_cert_with_extern_psk => 0x0021,
389}
390nyi_fn! {
391    /// delegated_credentials => 0x0022,
392}
393/// SessionTicket => 0x0023,
394pub fn fn_session_ticket_request_extension() -> Result<ClientExtension, FnError> {
395    Ok(ClientExtension::SessionTicket(ClientSessionTicket::Request))
396}
397pub fn fn_session_ticket_offer_extension(ticket: &Vec<u8>) -> Result<ClientExtension, FnError> {
398    // todo unclear where the arguments come from here, needs manual trace implementation
399    //      https://github.com/tlspuffin/tlspuffin/issues/155
400    Ok(ClientExtension::SessionTicket(ClientSessionTicket::Offer(
401        Payload::new(ticket.clone()),
402    )))
403}
404pub fn fn_session_ticket_server_extension() -> Result<ServerExtension, FnError> {
405    Ok(ServerExtension::ServerNameAck)
406}
407nyi_fn! {
408    /// TLMSP => 0x0024,
409}
410nyi_fn! {
411    /// TLMSP_proxying => 0x0025,
412}
413nyi_fn! {
414    /// TLMSP_delegate => 0x0026,
415}
416nyi_fn! {
417    /// supported_ekt_ciphers => 0x0027,
418}
419/// PreSharedKey => 0x0029,
420pub fn fn_new_preshared_key_identity(
421    identity: &PayloadU16,
422) -> Result<PresharedKeyIdentity, FnError> {
423    // todo unclear where the arguments come from here, needs manual trace implementation
424    //      https://github.com/tlspuffin/tlspuffin/issues/155
425    Ok(PresharedKeyIdentity {
426        identity: identity.clone(),
427        obfuscated_ticket_age: 10,
428    })
429}
430pub fn fn_empty_preshared_keys_identity_vec() -> Result<Vec<PresharedKeyIdentity>, FnError> {
431    Ok(vec![])
432}
433pub fn fn_append_preshared_keys_identity(
434    identities: &Vec<PresharedKeyIdentity>,
435    identify: &PresharedKeyIdentity,
436) -> Result<Vec<PresharedKeyIdentity>, FnError> {
437    let mut new = identities.clone();
438    new.push(identify.clone());
439    Ok(new)
440}
441
442pub fn fn_preshared_keys_extension_empty_binder(
443    new_ticket: &Message,
444) -> Result<ClientExtension, FnError> {
445    let ticket: Vec<u8> = fn_get_ticket(new_ticket)?;
446    let age_add: u64 = fn_get_ticket_age_add(new_ticket)?;
447
448    let ticket_age_millis: u32 = 100; // 100ms since receiving NewSessionTicket
449    let obfuscated_ticket_age = ticket_age_millis.wrapping_add(age_add as u32);
450
451    let resuming_suite = &crate::tls::rustls::tls13::TLS13_AES_128_GCM_SHA256; // todo allow other cipher suites
452    let binder_len = resuming_suite.hash_algorithm().output_len;
453    let binder = vec![0u8; binder_len];
454
455    let psk_identity = PresharedKeyIdentity::new(ticket, obfuscated_ticket_age);
456
457    Ok(ClientExtension::PresharedKey(PresharedKeyOffer::new(
458        psk_identity,
459        binder,
460    )))
461}
462
463pub fn fn_preshared_keys_server_extension(identities: &u16) -> Result<ServerExtension, FnError> {
464    Ok(ServerExtension::PresharedKey(*identities))
465}
466/// EarlyData => 0x002a,
467pub fn fn_early_data_extension() -> Result<ClientExtension, FnError> {
468    Ok(ClientExtension::EarlyData)
469}
470pub fn fn_early_data_new_session_ticket_extension(
471    early_data: &u32,
472) -> Result<NewSessionTicketExtension, FnError> {
473    Ok(NewSessionTicketExtension::EarlyData(*early_data))
474}
475pub fn fn_early_data_server_extension() -> Result<ServerExtension, FnError> {
476    Ok(ServerExtension::EarlyData)
477}
478/// SupportedVersions => 0x002b,
479pub fn fn_supported_versions12_extension() -> Result<ClientExtension, FnError> {
480    Ok(ClientExtension::SupportedVersions(ProtocolVersions(vec![
481        ProtocolVersion::TLSv1_2,
482    ])))
483}
484pub fn fn_supported_versions13_extension() -> Result<ClientExtension, FnError> {
485    Ok(ClientExtension::SupportedVersions(ProtocolVersions(vec![
486        ProtocolVersion::TLSv1_3,
487    ])))
488}
489pub fn fn_supported_versions_both_extension() -> Result<ClientExtension, FnError> {
490    Ok(ClientExtension::SupportedVersions(ProtocolVersions(vec![
491        ProtocolVersion::TLSv1_3,
492        ProtocolVersion::TLSv1_2,
493    ])))
494}
495pub fn fn_supported_versions12_hello_retry_extension() -> Result<HelloRetryExtension, FnError> {
496    Ok(HelloRetryExtension::SupportedVersions(
497        ProtocolVersion::TLSv1_2,
498    ))
499}
500pub fn fn_supported_versions13_hello_retry_extension() -> Result<HelloRetryExtension, FnError> {
501    Ok(HelloRetryExtension::SupportedVersions(
502        ProtocolVersion::TLSv1_3,
503    ))
504}
505
506pub fn fn_supported_versions12_server_extension() -> Result<ServerExtension, FnError> {
507    Ok(ServerExtension::SupportedVersions(ProtocolVersion::TLSv1_2))
508}
509pub fn fn_supported_versions13_server_extension() -> Result<ServerExtension, FnError> {
510    Ok(ServerExtension::SupportedVersions(ProtocolVersion::TLSv1_3))
511}
512/// Cookie => 0x002c,
513pub fn fn_cookie_extension(cookie: &PayloadU16) -> Result<ClientExtension, FnError> {
514    Ok(ClientExtension::Cookie(cookie.clone()))
515}
516
517pub fn fn_cookie_hello_retry_extension(
518    cookie: &PayloadU16,
519) -> Result<HelloRetryExtension, FnError> {
520    Ok(HelloRetryExtension::Cookie(cookie.clone()))
521}
522/// PSKKeyExchangeModes => 0x002d,
523pub fn fn_psk_exchange_mode_dhe_ke_extension() -> Result<ClientExtension, FnError> {
524    Ok(ClientExtension::PresharedKeyModes(PSKKeyExchangeModes(
525        vec![PSKKeyExchangeMode::PSK_DHE_KE],
526    )))
527}
528pub fn fn_psk_exchange_mode_ke_extension() -> Result<ClientExtension, FnError> {
529    Ok(ClientExtension::PresharedKeyModes(PSKKeyExchangeModes(
530        vec![PSKKeyExchangeMode::PSK_KE], // TODO-Mapper: could be extended to change this field
531    )))
532}
533nyi_fn! {
534    /// TicketEarlyDataInfo => 0x002e,
535}
536/// CertificateAuthorities => 0x002f,
537pub fn fn_certificate_authorities_extension() -> Result<CertReqExtension, FnError> {
538    let mut r = VecU16OfPayloadU16(Vec::new());
539
540    let subject = "inria.fr";
541    let mut name = Vec::new();
542    name.extend_from_slice(subject.as_bytes());
543    x509::wrap_in_sequence(&mut name);
544    r.0.push(DistinguishedName::new(name));
545
546    Ok(CertReqExtension::AuthorityNames(r))
547}
548nyi_fn! {
549    /// OIDFilters => 0x0030,
550}
551nyi_fn! {
552    /// PostHandshakeAuth => 0x0031,
553}
554/// SignatureAlgorithmsCert => 0x0032,
555pub fn fn_signature_algorithm_cert_extension() -> Result<ClientExtension, FnError> {
556    Ok(ClientExtension::SignatureAlgorithmsCert(
557        SupportedSignatureSchemes(vec![
558            SignatureScheme::RSA_PKCS1_SHA1,
559            SignatureScheme::ECDSA_SHA1_Legacy,
560            SignatureScheme::ECDSA_NISTP256_SHA256,
561            SignatureScheme::RSA_PKCS1_SHA384,
562            SignatureScheme::ECDSA_NISTP384_SHA384,
563            SignatureScheme::RSA_PKCS1_SHA512,
564            SignatureScheme::ECDSA_NISTP521_SHA512,
565            SignatureScheme::RSA_PSS_SHA384,
566            SignatureScheme::RSA_PSS_SHA512,
567            SignatureScheme::ED25519,
568            SignatureScheme::ED448,
569            SignatureScheme::RSA_PKCS1_SHA256,
570            SignatureScheme::RSA_PSS_SHA256,
571        ]),
572    ))
573}
574/// KeyShare => 0x0033,
575
576pub fn fn_key_share_deterministic(group: &NamedGroup) -> Result<KeyShareEntry, FnError> {
577    Ok(KeyShareEntry {
578        group: *group,
579        payload: PayloadU16::new(deterministic_key_share(group)?),
580    })
581}
582
583pub fn fn_key_share_extension_make(
584    key_shares: &Vec<KeyShareEntry>,
585) -> Result<ClientExtension, FnError> {
586    Ok(ClientExtension::KeyShare(KeyShareEntries(
587        key_shares.clone(),
588    )))
589}
590
591pub fn fn_key_share_extension_new() -> Result<Vec<KeyShareEntry>, FnError> {
592    Ok(vec![])
593}
594
595pub fn fn_key_share_extension_append(
596    key_shares: &Vec<KeyShareEntry>,
597    key_share_entry: &KeyShareEntry,
598) -> Result<Vec<KeyShareEntry>, FnError> {
599    let mut new_key_shares = key_shares.clone();
600    new_key_shares.push(key_share_entry.clone());
601
602    Ok(new_key_shares)
603}
604
605pub fn fn_key_share_extension(
606    group: &NamedGroup,
607    key_share: &PayloadU16,
608) -> Result<KeyShareEntry, FnError> {
609    Ok(KeyShareEntry {
610        group: *group,
611        payload: key_share.clone(),
612    })
613}
614
615pub fn fn_key_share_server_extension(entry: &KeyShareEntry) -> Result<ServerExtension, FnError> {
616    Ok(ServerExtension::KeyShare(entry.clone()))
617}
618
619pub fn fn_key_share_hello_retry_extension(
620    group: &NamedGroup,
621) -> Result<HelloRetryExtension, FnError> {
622    Ok(HelloRetryExtension::KeyShare(*group))
623}
624nyi_fn! {
625    /// transparency_info => 0x0034,
626}
627nyi_fn! {
628    /// connection_id => 0x0035,
629}
630nyi_fn! {
631    /// external_id_hash => 0x0037,
632}
633nyi_fn! {
634    /// external_session_id => 0x0038,
635}
636/// TransportParameters/quic_transport_parameters => 0x0039,
637pub fn fn_transport_parameters_extension(parameters: &Vec<u8>) -> Result<ClientExtension, FnError> {
638    // todo unclear where the arguments come from here, needs manual trace implementation
639    //      https://github.com/tlspuffin/tlspuffin/issues/155
640    Ok(ClientExtension::TransportParameters(parameters.clone()))
641}
642pub fn fn_transport_parameters_server_extension(
643    parameters: &Vec<u8>,
644) -> Result<ServerExtension, FnError> {
645    // todo unclear where the arguments come from here, needs manual trace implementation
646    //      https://github.com/tlspuffin/tlspuffin/issues/155
647    Ok(ServerExtension::TransportParameters(parameters.clone()))
648}
649nyi_fn! {
650    /// NextProtocolNegotiation => 0x3374,
651}
652nyi_fn! {
653    /// ChannelId => 0x754f,
654}
655
656/// RenegotiationInfo => 0xff01,
657pub fn fn_renegotiation_info_extension(data: &PayloadU8) -> Result<ClientExtension, FnError> {
658    Ok(ClientExtension::RenegotiationInfo(data.clone()))
659}
660
661pub fn fn_renegotiation_info_server_extension(
662    data: &PayloadU8,
663) -> Result<ServerExtension, FnError> {
664    Ok(ServerExtension::RenegotiationInfo(data.clone()))
665}
666/// TransportParametersDraft => 0xffa5
667pub fn fn_transport_parameters_draft_extension(
668    parameters: &Vec<u8>,
669) -> Result<ClientExtension, FnError> {
670    // todo unclear where the arguments come from here, needs manual trace implementation
671    //      https://github.com/tlspuffin/tlspuffin/issues/155
672    Ok(ClientExtension::TransportParametersDraft(
673        parameters.clone(),
674    ))
675}
676pub fn fn_transport_parameters_draft_server_extension(
677    parameters: &Vec<u8>,
678) -> Result<ServerExtension, FnError> {
679    // todo unclear where the arguments come from here, needs manual trace implementation
680    //      https://github.com/tlspuffin/tlspuffin/issues/155
681    Ok(ServerExtension::TransportParametersDraft(
682        parameters.clone(),
683    ))
684}
685// Unknown extensions
686
687pub fn fn_unknown_client_extension() -> Result<ClientExtension, FnError> {
688    Ok(ClientExtension::Unknown(UnknownExtension {
689        typ: ExtensionType::Unknown(0xFFFF),
690        payload: Payload::new([42; 10]),
691    }))
692}
693
694pub fn fn_unknown_server_extension() -> Result<ServerExtension, FnError> {
695    Ok(ServerExtension::Unknown(UnknownExtension {
696        typ: ExtensionType::Unknown(0xFFFF),
697        payload: Payload::new([42; 10]),
698    }))
699}
700
701pub fn fn_unknown_hello_retry_extension() -> Result<HelloRetryExtension, FnError> {
702    Ok(HelloRetryExtension::Unknown(UnknownExtension {
703        typ: ExtensionType::Unknown(0xFFFF),
704        payload: Payload::new([42; 10]),
705    }))
706}
707
708pub fn fn_unknown_cert_request_extension() -> Result<CertReqExtension, FnError> {
709    Ok(CertReqExtension::Unknown(UnknownExtension {
710        typ: ExtensionType::Unknown(0xFFFF),
711        payload: Payload::new([42; 10]),
712    }))
713}
714
715pub fn fn_unknown_new_session_ticket_extension() -> Result<NewSessionTicketExtension, FnError> {
716    Ok(NewSessionTicketExtension::Unknown(UnknownExtension {
717        typ: ExtensionType::Unknown(0xFFFF),
718        payload: Payload::new([42; 10]),
719    }))
720}
721
722pub fn fn_unknown_certificate_extension() -> Result<CertificateExtension, FnError> {
723    Ok(CertificateExtension::Unknown(UnknownExtension {
724        typ: ExtensionType::Unknown(0xFFFF),
725        payload: Payload::new([42; 10]),
726    }))
727}