s2n_quic_crypto/
zero_rtt.rs

1// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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    /// Create a ZeroRTT cipher suite with a given secret
12    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 {}