use std::ops::Deref;
use rustls::quic::{HeaderProtectionKey, PacketKey};
use super::{KeyPhaseBit, LongSpecificBits, ShortSpecificBits};
pub fn encrypt_packet(key: &dyn PacketKey, pn: u64, pkt_buf: &mut [u8], body_offset: usize) {
let (aad, body_tag) = pkt_buf.split_at_mut(body_offset);
let (body, tag_buf) = body_tag.split_at_mut(body_tag.len() - key.tag_len());
let tag = key.encrypt_in_place(pn, aad, body).unwrap();
tag_buf.copy_from_slice(tag.as_ref());
}
pub fn protect_header(
key: &dyn HeaderProtectionKey,
pkt_buf: &mut [u8],
payload_offset: usize,
pn_len: usize,
) {
let (predata, payload) = pkt_buf.split_at_mut(payload_offset);
let first_byte = &mut predata[0];
let (max_pn_buf, sample) = payload.split_at_mut(4);
let sample_len = key.sample_len();
key.encrypt_in_place(&sample[..sample_len], first_byte, &mut max_pn_buf[..pn_len])
.unwrap();
}
pub fn encode_long_first_byte(first_byte: &mut u8, pn_len: usize) {
let specific_bits = LongSpecificBits::with_pn_len(pn_len);
*first_byte |= specific_bits.deref();
}
pub fn encode_short_first_byte(first_byte: &mut u8, pn_len: usize, key_phase: KeyPhaseBit) {
let mut specific_bits = ShortSpecificBits::with_pn_len(pn_len);
specific_bits.set_key_phase(key_phase);
*first_byte |= specific_bits.deref();
}
#[cfg(test)]
mod tests {}