use std::net::SocketAddr;
use tracing::debug;
use crate::api::common::config::{SecurityInfo, SecurityMode, SrtpProfile};
use crate::api::server::security::{ConnectionConfig, ConnectionRole};
use crate::dtls::{DtlsRole, DtlsVersion};
use crate::api::server::security::srtp::keys;
pub fn role_to_dtls_role(role: ConnectionRole) -> DtlsRole {
match role {
ConnectionRole::Client => DtlsRole::Client,
ConnectionRole::Server => DtlsRole::Server,
}
}
pub fn connection_config_to_dtls_config(config: &ConnectionConfig) -> crate::dtls::DtlsConfig {
crate::dtls::DtlsConfig {
role: role_to_dtls_role(config.role.clone()),
version: DtlsVersion::Dtls12, mtu: 1500, max_retransmissions: 5, srtp_profiles: keys::convert_profiles(&config.srtp_profiles),
}
}
pub fn create_security_info(
mode: SecurityMode,
fingerprint: Option<String>,
fingerprint_algorithm: &str,
profiles: &[SrtpProfile],
) -> SecurityInfo {
SecurityInfo {
mode,
fingerprint,
fingerprint_algorithm: Some(fingerprint_algorithm.to_string()),
crypto_suites: profiles
.iter()
.map(|p| keys::profile_to_string(*p))
.collect(),
key_params: None,
srtp_profile: Some("AES_CM_128_HMAC_SHA1_80".to_string()), }
}
pub fn addr_to_string(addr: SocketAddr) -> String {
format!("{}:{}", addr.ip(), addr.port())
}
pub fn string_to_security_mode(mode: &str) -> SecurityMode {
match mode.to_lowercase().as_str() {
"dtls-srtp" => SecurityMode::DtlsSrtp,
"srtp" => SecurityMode::Srtp,
"none" => SecurityMode::None,
_ => {
debug!("Unknown security mode: {}, defaulting to DTLS-SRTP", mode);
SecurityMode::DtlsSrtp
}
}
}
pub fn security_mode_to_string(mode: SecurityMode) -> &'static str {
match mode {
SecurityMode::DtlsSrtp => "dtls_srtp",
SecurityMode::Srtp => "srtp",
SecurityMode::None => "none",
SecurityMode::SdesSrtp => "sdes_srtp",
SecurityMode::MikeySrtp => "mikey_srtp",
SecurityMode::ZrtpSrtp => "zrtp_srtp",
}
}
pub fn security_context_to_string(
address: SocketAddr,
mode: SecurityMode,
fingerprint: Option<&str>,
handshake_complete: bool,
) -> String {
let mode_str = security_mode_to_string(mode);
let fingerprint_str = fingerprint.unwrap_or("none");
let handshake_str = if handshake_complete {
"complete"
} else {
"incomplete"
};
format!(
"SecurityContext({}, mode={}, fingerprint={}, handshake={})",
addr_to_string(address),
mode_str,
fingerprint_str,
handshake_str
)
}
pub fn convert_srtp_profiles(_profiles: &[SrtpProfile]) -> Vec<crate::srtp::SrtpCryptoSuite> {
todo!("Implement convert_srtp_profiles in Phase 6")
}
pub fn srtp_profile_to_string(_profile: SrtpProfile) -> String {
todo!("Implement srtp_profile_to_string in Phase 6")
}
pub fn get_crypto_suite_strings(_profiles: &[SrtpProfile]) -> Vec<String> {
todo!("Implement get_crypto_suite_strings in Phase 6")
}