1*ffe74184SMartin Algesten #![warn(rust_2018_idioms)] 2*ffe74184SMartin Algesten #![allow(dead_code)] 3*ffe74184SMartin Algesten 4*ffe74184SMartin Algesten use async_trait::async_trait; 5*ffe74184SMartin Algesten use thiserror::Error; 6*ffe74184SMartin Algesten 7*ffe74184SMartin Algesten use std::io; 8*ffe74184SMartin Algesten 9*ffe74184SMartin Algesten #[cfg(feature = "vnet")] 10*ffe74184SMartin Algesten #[macro_use] 11*ffe74184SMartin Algesten extern crate lazy_static; 12*ffe74184SMartin Algesten 13*ffe74184SMartin Algesten #[cfg(target_family = "windows")] 14*ffe74184SMartin Algesten #[macro_use] 15*ffe74184SMartin Algesten extern crate bitflags; 16*ffe74184SMartin Algesten 17*ffe74184SMartin Algesten pub mod fixed_big_int; 18*ffe74184SMartin Algesten pub mod replay_detector; 19*ffe74184SMartin Algesten 20*ffe74184SMartin Algesten /// KeyingMaterialExporter to extract keying material. 21*ffe74184SMartin Algesten /// 22*ffe74184SMartin Algesten /// This trait sits here to avoid getting a direct dependency between 23*ffe74184SMartin Algesten /// the dtls and srtp crates. 24*ffe74184SMartin Algesten #[async_trait] 25*ffe74184SMartin Algesten pub trait KeyingMaterialExporter { export_keying_material( &self, label: &str, context: &[u8], length: usize, ) -> std::result::Result<Vec<u8>, KeyingMaterialExporterError>26*ffe74184SMartin Algesten async fn export_keying_material( 27*ffe74184SMartin Algesten &self, 28*ffe74184SMartin Algesten label: &str, 29*ffe74184SMartin Algesten context: &[u8], 30*ffe74184SMartin Algesten length: usize, 31*ffe74184SMartin Algesten ) -> std::result::Result<Vec<u8>, KeyingMaterialExporterError>; 32*ffe74184SMartin Algesten } 33*ffe74184SMartin Algesten 34*ffe74184SMartin Algesten /// Possible errors while exporting keying material. 35*ffe74184SMartin Algesten /// 36*ffe74184SMartin Algesten /// These errors might have been more logically kept in the dtls 37*ffe74184SMartin Algesten /// crate, but that would have required a direct depdency between 38*ffe74184SMartin Algesten /// srtp and dtls. 39*ffe74184SMartin Algesten #[derive(Debug, Error, PartialEq)] 40*ffe74184SMartin Algesten #[non_exhaustive] 41*ffe74184SMartin Algesten pub enum KeyingMaterialExporterError { 42*ffe74184SMartin Algesten #[error("tls handshake is in progress")] 43*ffe74184SMartin Algesten HandshakeInProgress, 44*ffe74184SMartin Algesten #[error("context is not supported for export_keying_material")] 45*ffe74184SMartin Algesten ContextUnsupported, 46*ffe74184SMartin Algesten #[error("export_keying_material can not be used with a reserved label")] 47*ffe74184SMartin Algesten ReservedExportKeyingMaterial, 48*ffe74184SMartin Algesten #[error("no cipher suite for export_keying_material")] 49*ffe74184SMartin Algesten CipherSuiteUnset, 50*ffe74184SMartin Algesten #[error("export_keying_material io: {0}")] 51*ffe74184SMartin Algesten Io(#[source] error::IoError), 52*ffe74184SMartin Algesten #[error("export_keying_material hash: {0}")] 53*ffe74184SMartin Algesten Hash(String), 54*ffe74184SMartin Algesten } 55*ffe74184SMartin Algesten 56*ffe74184SMartin Algesten impl From<io::Error> for KeyingMaterialExporterError { from(e: io::Error) -> Self57*ffe74184SMartin Algesten fn from(e: io::Error) -> Self { 58*ffe74184SMartin Algesten KeyingMaterialExporterError::Io(error::IoError(e)) 59*ffe74184SMartin Algesten } 60*ffe74184SMartin Algesten } 61*ffe74184SMartin Algesten 62*ffe74184SMartin Algesten #[cfg(feature = "buffer")] 63*ffe74184SMartin Algesten pub mod buffer; 64*ffe74184SMartin Algesten 65*ffe74184SMartin Algesten #[cfg(feature = "conn")] 66*ffe74184SMartin Algesten pub mod conn; 67*ffe74184SMartin Algesten 68*ffe74184SMartin Algesten #[cfg(feature = "ifaces")] 69*ffe74184SMartin Algesten pub mod ifaces; 70*ffe74184SMartin Algesten 71*ffe74184SMartin Algesten #[cfg(feature = "vnet")] 72*ffe74184SMartin Algesten pub mod vnet; 73*ffe74184SMartin Algesten 74*ffe74184SMartin Algesten #[cfg(feature = "marshal")] 75*ffe74184SMartin Algesten pub mod marshal; 76*ffe74184SMartin Algesten 77*ffe74184SMartin Algesten #[cfg(feature = "buffer")] 78*ffe74184SMartin Algesten pub use crate::buffer::Buffer; 79*ffe74184SMartin Algesten 80*ffe74184SMartin Algesten #[cfg(feature = "conn")] 81*ffe74184SMartin Algesten pub use crate::conn::Conn; 82*ffe74184SMartin Algesten 83*ffe74184SMartin Algesten #[cfg(feature = "marshal")] 84*ffe74184SMartin Algesten pub use crate::marshal::{exact_size_buf::ExactSizeBuf, Marshal, MarshalSize, Unmarshal}; 85*ffe74184SMartin Algesten 86*ffe74184SMartin Algesten mod error; 87*ffe74184SMartin Algesten pub use error::{Error, Result}; 88*ffe74184SMartin Algesten 89*ffe74184SMartin Algesten #[cfg(feature = "sync")] 90*ffe74184SMartin Algesten pub mod sync; 91