xref: /webrtc/util/src/lib.rs (revision ffe74184)
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