s2n_quic_crypto/
zero_rtt.rs1use crate::{cipher_suite::TLS_AES_128_GCM_SHA256 as CipherSuite, header_key::HeaderKey};
5use s2n_quic_core::crypto::{self, packet_protection, scatter, HeaderProtectionMask, Key};
6
7#[derive(Debug)]
8pub struct ZeroRttKey(CipherSuite);
9
10impl ZeroRttKey {
11 pub fn new(secret: crate::Prk) -> (Self, ZeroRttHeaderKey) {
13 let (key, header_key) = CipherSuite::new(secret);
14 let key = Self(key);
15 let header_key = ZeroRttHeaderKey(header_key);
16 (key, header_key)
17 }
18}
19
20impl crypto::ZeroRttKey for ZeroRttKey {}
21
22impl Key for ZeroRttKey {
23 fn decrypt(
24 &self,
25 packet_number: u64,
26 header: &[u8],
27 payload: &mut [u8],
28 ) -> Result<(), packet_protection::Error> {
29 self.0.decrypt(packet_number, header, payload)
30 }
31
32 fn encrypt(
33 &mut self,
34 packet_number: u64,
35 header: &[u8],
36 payload: &mut scatter::Buffer,
37 ) -> Result<(), packet_protection::Error> {
38 self.0.encrypt(packet_number, header, payload)
39 }
40
41 fn tag_len(&self) -> usize {
42 self.0.tag_len()
43 }
44
45 fn aead_confidentiality_limit(&self) -> u64 {
46 self.0.aead_confidentiality_limit()
47 }
48
49 fn aead_integrity_limit(&self) -> u64 {
50 self.0.aead_integrity_limit()
51 }
52
53 #[inline]
54 fn cipher_suite(&self) -> s2n_quic_core::crypto::tls::CipherSuite {
55 self.0.cipher_suite()
56 }
57}
58
59#[derive(Debug)]
60pub struct ZeroRttHeaderKey(HeaderKey);
61
62impl crypto::HeaderKey for ZeroRttHeaderKey {
63 fn opening_header_protection_mask(&self, sample: &[u8]) -> HeaderProtectionMask {
64 self.0.opening_header_protection_mask(sample)
65 }
66
67 fn opening_sample_len(&self) -> usize {
68 self.0.opening_sample_len()
69 }
70
71 fn sealing_header_protection_mask(&self, sample: &[u8]) -> HeaderProtectionMask {
72 self.0.sealing_header_protection_mask(sample)
73 }
74
75 fn sealing_sample_len(&self) -> usize {
76 self.0.sealing_sample_len()
77 }
78}
79
80impl crypto::ZeroRttHeaderKey for ZeroRttHeaderKey {}