#![allow(dead_code)]
use alloc::boxed::Box;
use alloc::string::ToString;
use alloc::vec::Vec;
use crate::quic::cid::{CidPair, ConnectionId};
use crate::quic::crypto::{AeadAlg, derive_dir_keys, derive_initial_secrets};
use crate::quic::endpoint::Endpoint;
use crate::quic::tls_glue::{HookHandle, build_hooks};
use crate::rng::{OsRng, RngCore};
use crate::tls::Error;
use crate::tls::codec::{CipherSuite, NamedGroup};
use crate::tls::conn::{ClientConfig, ClientConnection};
use crate::tls::quic_hooks::Level;
pub(crate) const DEFAULT_CID_LEN: usize = 8;
pub(crate) fn build_initial_endpoint(peer_dcid: ConnectionId, our_scid: ConnectionId) -> Endpoint {
let (client_secret, server_secret) = derive_initial_secrets(peer_dcid.as_slice());
let mut ep = Endpoint::new(CidPair::new(peer_dcid, our_scid));
ep.crypto.levels[Level::Initial as usize].tx =
Some(derive_dir_keys(AeadAlg::Aes128Gcm, &client_secret));
ep.crypto.levels[Level::Initial as usize].rx =
Some(derive_dir_keys(AeadAlg::Aes128Gcm, &server_secret));
ep
}
pub(crate) fn build_tls_engine(
tls_cfg: ClientConfig,
server_name: &str,
transport_params: Vec<u8>,
) -> Result<(ClientConnection, HookHandle), Error> {
let (hooks, handle) = build_hooks(transport_params);
let suites = [
CipherSuite::AES_128_GCM_SHA256,
CipherSuite::AES_256_GCM_SHA384,
CipherSuite::CHACHA20_POLY1305_SHA256,
];
let groups = [
NamedGroup::X25519,
NamedGroup::SECP256R1,
NamedGroup::SECP384R1,
];
let mut rng = OsRng;
let engine = ClientConnection::new_for_quic(
tls_cfg,
server_name,
&mut rng,
&suites,
&groups,
hooks as Box<_>,
);
Ok((engine, handle))
}
pub(crate) fn random_default_cid() -> ConnectionId {
let mut rng = OsRng;
ConnectionId::random(&mut rng, DEFAULT_CID_LEN)
}
pub(crate) fn random_default_cid_with<R: RngCore>(rng: &mut R) -> ConnectionId {
ConnectionId::random(rng, DEFAULT_CID_LEN)
}
pub(crate) fn snify(name: &str) -> alloc::string::String {
name.to_string()
}