1#![allow(clippy::ptr_arg)]
2#![allow(dead_code)]
3
4use 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
129pub fn fn_server_name_extension() -> Result<ClientExtension, FnError> {
148 let dns_name = "inria.fr";
149 Ok(ClientExtension::ServerName(ServerNameRequest(vec![
150 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 }
168nyi_fn! {
169 }
171nyi_fn! {
172 }
174nyi_fn! {
175 }
177pub fn fn_status_request_extension(
179 responder_ids: &VecU16OfPayloadU16,
180 extensions: &PayloadU16,
181) -> Result<ClientExtension, FnError> {
182 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 Ok(CertificateExtension::CertificateStatus(CertificateStatus {
201 ocsp_response: ocsp_response.clone(),
202 }))
203}
204nyi_fn! {
205 }
207nyi_fn! {
208 }
210nyi_fn! {
211 }
213nyi_fn! {
214 }
216pub 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
237pub fn fn_ec_point_formats_extension() -> Result<ClientExtension, FnError> {
239 Ok(ClientExtension::ECPointFormats(ECPointFormatList(vec![
240 ECPointFormat::Uncompressed,
242 ])))
243}
244pub fn fn_ec_point_formats_server_extension() -> Result<ServerExtension, FnError> {
245 Ok(ServerExtension::ECPointFormats(ECPointFormatList(vec![
246 ECPointFormat::Uncompressed,
248 ])))
249}
250nyi_fn! {
251 }
253pub 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 }
295nyi_fn! {
296 }
298pub 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 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 }
322pub 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 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 Ok(CertificateExtension::SignedCertificateTimestamp(
338 VecU16OfPayloadU16(vec![PayloadU16::new(Vec::from([42u8; 128]))]),
339 ))
340}
341nyi_fn! {
342 }
344nyi_fn! {
345 }
347nyi_fn! {
348 }
350nyi_fn! {
351 }
353pub 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 }
363nyi_fn! {
364 }
366nyi_fn! {
367 }
369nyi_fn! {
370 }
372nyi_fn! {
373 }
375nyi_fn! {
376 }
378nyi_fn! {
379 }
381nyi_fn! {
382 }
384nyi_fn! {
385 }
387nyi_fn! {
388 }
390nyi_fn! {
391 }
393pub 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 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 }
410nyi_fn! {
411 }
413nyi_fn! {
414 }
416nyi_fn! {
417 }
419pub fn fn_new_preshared_key_identity(
421 identity: &PayloadU16,
422) -> Result<PresharedKeyIdentity, FnError> {
423 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; 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; 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}
466pub 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}
478pub 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}
512pub 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}
522pub 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], )))
532}
533nyi_fn! {
534 }
536pub 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 }
551nyi_fn! {
552 }
554pub 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}
574pub 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 }
627nyi_fn! {
628 }
630nyi_fn! {
631 }
633nyi_fn! {
634 }
636pub fn fn_transport_parameters_extension(parameters: &Vec<u8>) -> Result<ClientExtension, FnError> {
638 Ok(ClientExtension::TransportParameters(parameters.clone()))
641}
642pub fn fn_transport_parameters_server_extension(
643 parameters: &Vec<u8>,
644) -> Result<ServerExtension, FnError> {
645 Ok(ServerExtension::TransportParameters(parameters.clone()))
648}
649nyi_fn! {
650 }
652nyi_fn! {
653 }
655
656pub 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}
666pub fn fn_transport_parameters_draft_extension(
668 parameters: &Vec<u8>,
669) -> Result<ClientExtension, FnError> {
670 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 Ok(ServerExtension::TransportParametersDraft(
682 parameters.clone(),
683 ))
684}
685pub 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}