7个版本 (有破坏性)

0.7.0 2020年12月5日
0.6.0 2020年5月10日
0.5.0 2020年2月29日
0.4.0 2019年8月30日
0.1.0 2019年6月4日

#315 in 多媒体

MIT/Apache

40KB
772

srtp

https://docs.rs/srtp/


lib.rs:

libsrtp2的绑定

此crate提供了一个对libsrtp2库的安全接口。

使用OpenSSL的DTLS-SRTP

#
#
use openssl::pkey::PKey;
use openssl::ssl::{Ssl, SslAcceptor, SslMethod};
use openssl::x509::X509;

openssl::init();

let mut ctx = SslAcceptor::mozilla_modern(SslMethod::dtls())?;
ctx.set_tlsext_use_srtp(srtp::openssl::SRTP_PROFILE_NAMES)?;
let pkey = PKey::private_key_from_pem(pkey)?;
let cert = X509::from_pem(cert)?;
ctx.set_private_key(&*pkey)?;
ctx.set_certificate(&*cert)?;
ctx.check_private_key()?;
let ctx = ctx.build().into_context();

let mut ssl = Ssl::new(&ctx)?;
ssl.set_mtu(1200)?;
let stream = if is_server {
    ssl.accept(stream)?
} else {
    ssl.connect(stream)?
};

let (mut inbound, mut outbound) =
    srtp::openssl::session_pair(stream.ssl(), Default::default())?;

let mut pkt = b"not a valid SRTP packet".to_vec();
if let Err(err) = inbound.unprotect(&mut pkt) {
    println!("Failed to unprotect inbound SRTP packet: {}", err);
}

let mut pkt = b"not a valid RTP packet".to_vec();
if let Err(err) = outbound.protect(&mut pkt) {
    println!("Failed to protect outbound RTP packet: {}", err);
}

独立使用

创建一个Session以解密每个传入的SRTP数据包。

let key = &[0u8; 30][..]; // DO NOT USE IT ON PRODUCTION
let mut packet = b"not a valid SRTP packet".to_vec();

let mut session = srtp::Session::with_inbound_template(srtp::StreamPolicy {
    key,
    rtp: srtp::CryptoPolicy::aes_cm_128_hmac_sha1_80(),
    rtcp: srtp::CryptoPolicy::aes_cm_128_hmac_sha1_80(),
    ..Default::default()
}).unwrap();

match session.unprotect(&mut packet) {
    Ok(()) => println!("SRTP packet unprotected"),
    Err(err) => println!("Error unprotecting SRTP packet: {}", err),
};

依赖项

~1.5–4.5MB
~95K SLoC