pub use crate::ToPeerDataStream; use tokio_rustls::rustls::pki_types::{CertificateDer, PrivatePkcs8KeyDer}; use serde::{Deserialize, Serialize}; use uuid::Uuid; use crate::cert::LeafCertPair; #[derive(Debug, Serialize, Deserialize)] pub enum FromServerConnTypeMessage { SendCommand, Subscribe, OpenDataStream(Uuid), } #[derive(Debug, Serialize, Deserialize)] pub enum ToServerConnTypeReply { OkSendCommand, OkSubscribe, // You are now a DataStream, wait the Open message OkDataStreamRequestAccepted, // The stream is open, you can pipe in-out the content you want! OkDataStreamOpen, GenericFailure, } #[derive(Debug, Serialize, Deserialize)] pub enum FromServerCommandMessage { ChangeName { name: String }, WhoAmI, } #[derive(Debug, Serialize, Deserialize)] pub enum ToServerCommandReply { NameChanged, NameNotAvailable, YouAre { name: String }, GenericFailure, } #[derive(Debug, Serialize, Deserialize)] pub enum ToServerMessageBody { Request { conn_id: Uuid }, } #[derive(Debug, Serialize, Deserialize)] pub enum ToServerMessage { Ping, Msg { reply_id: u64, body: ToServerMessageBody, }, } #[derive(Debug, Serialize, Deserialize)] pub enum FromServerReplyBody { RequestAccepted, RequestFailed, Pong, } #[derive(Debug, Serialize, Deserialize)] pub enum FromServerReply { Pong, Msg { reply_id: u64, body: FromServerReplyBody } } #[derive(Debug, Serialize, Deserialize)] pub enum FromGuestServerMessage { Announce { name: String } } pub fn okannounce_to_cert<'a>(server_cert: Vec, server_prkey: Vec) -> (CertificateDer<'a>, PrivatePkcs8KeyDer<'a>) { let server_cert = CertificateDer::from(server_cert); let server_prkey = PrivatePkcs8KeyDer::from(server_prkey); (server_cert, server_prkey) } #[derive(Debug, Serialize, Deserialize)] pub struct OkAnnoucePayload { server_cert: Vec, ca_chain: Vec>, server_prkey: Vec, } impl OkAnnoucePayload { pub fn parse<'a>(self) -> LeafCertPair<'a> { LeafCertPair::parse(self.server_cert, self.ca_chain, self.server_prkey) } } #[derive(Debug, Serialize, Deserialize)] pub enum ToGuestServerMessage { OkAnnounce(OkAnnoucePayload), FailedNameAlreadyOccupied, } impl ToGuestServerMessage { pub fn make_okannounce(server_leaf: &LeafCertPair) -> Self { ToGuestServerMessage::OkAnnounce(OkAnnoucePayload { server_cert: server_leaf.cert().to_vec(), ca_chain: server_leaf.fullchain().into_iter().map(|c| c.to_vec()).collect(), server_prkey: server_leaf.prkey().secret_pkcs8_der().to_vec(), }) } }