rvoip_rtp_core/api/server/security/
mod.rs1use std::net::SocketAddr;
6use std::sync::Arc;
7use std::any::Any;
8use async_trait::async_trait;
9use tokio::net::UdpSocket;
10use tokio::sync::Mutex;
11
12use crate::api::common::error::SecurityError;
13use crate::api::common::config::{SecurityInfo, SecurityMode, SrtpProfile};
14
15pub mod default;
17pub mod core;
18pub mod client;
19pub mod dtls;
20pub mod srtp;
21pub mod util;
22
23pub use default::DefaultServerSecurityContext;
25pub use client::context::DefaultClientSecurityContext;
26
27#[derive(Clone)]
30pub struct SocketHandle {
31 pub socket: Arc<UdpSocket>,
33 pub remote_addr: Option<SocketAddr>,
35}
36
37#[derive(Clone)]
39pub struct ConnectionConfig {
40 pub role: ConnectionRole,
42 pub srtp_profiles: Vec<SrtpProfile>,
44 pub fingerprint_algorithm: String,
46 pub certificate_path: Option<String>,
48 pub private_key_path: Option<String>,
50}
51
52impl Default for ConnectionConfig {
53 fn default() -> Self {
54 Self {
55 role: ConnectionRole::Server,
56 srtp_profiles: vec![SrtpProfile::AesCm128HmacSha1_80, SrtpProfile::AesGcm128],
57 fingerprint_algorithm: "sha-256".to_string(),
58 certificate_path: None,
59 private_key_path: None,
60 }
61 }
62}
63
64#[derive(Clone)]
66pub enum ConnectionRole {
67 Client,
69 Server,
71}
72
73#[derive(Debug, Clone)]
75pub struct ServerSecurityConfig {
76 pub security_mode: SecurityMode,
78 pub fingerprint_algorithm: String,
80 pub certificate_path: Option<String>,
82 pub private_key_path: Option<String>,
84 pub srtp_profiles: Vec<SrtpProfile>,
86 pub require_client_certificate: bool,
88 pub srtp_key: Option<Vec<u8>>,
90}
91
92impl Default for ServerSecurityConfig {
93 fn default() -> Self {
94 Self {
95 security_mode: SecurityMode::DtlsSrtp,
96 fingerprint_algorithm: "sha-256".to_string(),
97 certificate_path: None,
98 private_key_path: None,
99 srtp_profiles: vec![
100 SrtpProfile::AesCm128HmacSha1_80,
101 SrtpProfile::AesGcm128,
102 ],
103 require_client_certificate: false,
104 srtp_key: None,
105 }
106 }
107}
108
109#[async_trait]
113pub trait ClientSecurityContext: Send + Sync {
114 async fn set_socket(&self, socket: SocketHandle) -> Result<(), SecurityError>;
116
117 async fn get_remote_fingerprint(&self) -> Result<Option<String>, SecurityError>;
119
120 async fn get_fingerprint(&self) -> Result<String, SecurityError>;
122
123 async fn get_fingerprint_algorithm(&self) -> Result<String, SecurityError>;
125
126 async fn close(&self) -> Result<(), SecurityError>;
128
129 fn is_secure(&self) -> bool;
131
132 fn get_security_info(&self) -> SecurityInfo;
134
135 async fn wait_for_handshake(&self) -> Result<(), SecurityError>;
137
138 async fn is_handshake_complete(&self) -> Result<bool, SecurityError>;
140
141 async fn process_dtls_packet(&self, data: &[u8]) -> Result<(), SecurityError>;
143
144 async fn start_handshake_with_remote(&self, remote_addr: SocketAddr) -> Result<(), SecurityError>;
146
147 fn as_any(&self) -> &dyn Any;
149}
150
151#[async_trait]
155pub trait ServerSecurityContext: Send + Sync {
156 async fn initialize(&self) -> Result<(), SecurityError>;
158
159 async fn set_socket(&self, socket: SocketHandle) -> Result<(), SecurityError>;
161
162 async fn get_fingerprint(&self) -> Result<String, SecurityError>;
164
165 async fn get_fingerprint_algorithm(&self) -> Result<String, SecurityError>;
167
168 async fn start_listening(&self) -> Result<(), SecurityError>;
170
171 async fn stop_listening(&self) -> Result<(), SecurityError>;
173
174 async fn start_packet_handler(&self) -> Result<(), SecurityError>;
178
179 async fn capture_initial_packet(&self) -> Result<Option<(Vec<u8>, SocketAddr)>, SecurityError>;
181
182 async fn create_client_context(&self, addr: SocketAddr) -> Result<Arc<dyn ClientSecurityContext + Send + Sync>, SecurityError>;
184
185 async fn get_client_contexts(&self) -> Vec<Arc<dyn ClientSecurityContext + Send + Sync>>;
187
188 async fn remove_client(&self, addr: SocketAddr) -> Result<(), SecurityError>;
190
191 async fn on_client_secure(&self, callback: Box<dyn Fn(Arc<dyn ClientSecurityContext + Send + Sync>) + Send + Sync>) -> Result<(), SecurityError>;
193
194 async fn get_supported_srtp_profiles(&self) -> Vec<SrtpProfile>;
196
197 fn is_secure(&self) -> bool;
199
200 fn get_security_info(&self) -> SecurityInfo;
202
203 async fn process_client_packet(&self, addr: SocketAddr, data: &[u8]) -> Result<(), SecurityError>;
205
206 async fn is_ready(&self) -> Result<bool, SecurityError>;
209
210 fn get_config(&self) -> &ServerSecurityConfig;
212}
213
214pub async fn new(config: ServerSecurityConfig) -> Result<Arc<dyn ServerSecurityContext + Send + Sync>, SecurityError> {
216 match config.security_mode {
217 SecurityMode::Srtp => {
218 let srtp_ctx = srtp::SrtpServerSecurityContext::new(config).await?;
220 Ok(srtp_ctx as Arc<dyn ServerSecurityContext + Send + Sync>)
221 },
222 SecurityMode::DtlsSrtp => {
223 let dtls_ctx = DefaultServerSecurityContext::new(config).await?;
225 Ok(dtls_ctx as Arc<dyn ServerSecurityContext + Send + Sync>)
226 },
227 SecurityMode::SdesSrtp |
228 SecurityMode::MikeySrtp |
229 SecurityMode::ZrtpSrtp => {
230 let dtls_ctx = DefaultServerSecurityContext::new(config).await?;
232 Ok(dtls_ctx as Arc<dyn ServerSecurityContext + Send + Sync>)
233 },
234 SecurityMode::None => {
235 let dtls_ctx = DefaultServerSecurityContext::new(config).await?;
237 Ok(dtls_ctx as Arc<dyn ServerSecurityContext + Send + Sync>)
238 }
239 }
240}