|
|
|
@ -13,7 +13,7 @@ use Crypt::Rijndael; |
|
|
|
use Digest::SHA qw(hmac_sha1); |
|
|
|
use MIME::Base64; |
|
|
|
use Data::Dumper; |
|
|
|
use SRTP; |
|
|
|
use NGCP::Rtpclient::SRTP; |
|
|
|
|
|
|
|
my ($NUM, $RUNTIME, $STREAMS, $PAYLOAD, $INTERVAL, $RTCP_INTERVAL, $STATS_INTERVAL) |
|
|
|
= (1000, 30, 1, 160, 20, 5, 5); |
|
|
|
@ -116,7 +116,8 @@ sub rtcp_encrypt { |
|
|
|
|
|
|
|
if (!$$dctx{rtcp_session_key}) { |
|
|
|
($$dctx{rtcp_session_key}, $$dctx{rtcp_session_auth_key}, $$dctx{rtcp_session_salt}) |
|
|
|
= SRTP::gen_rtcp_session_keys($$dctx{rtp_master_key}, $$dctx{rtp_master_salt}); |
|
|
|
= NGCP::Rtpclient::SRTP::gen_rtcp_session_keys($$dctx{rtp_master_key}, |
|
|
|
$$dctx{rtp_master_salt}); |
|
|
|
} |
|
|
|
|
|
|
|
($NOENC && $NOENC{rtcp_packet}) and return $NOENC{rtcp_packet}; |
|
|
|
@ -131,7 +132,7 @@ sub rtcp_encrypt { |
|
|
|
|
|
|
|
my $hmac = hmac_sha1($pkt, $$dctx{rtcp_session_auth_key}); |
|
|
|
|
|
|
|
SRTP::append_mki(\$pkt, @$dctx{qw(rtp_mki_len rtp_mki)}); |
|
|
|
NGCP::Rtpclient::SRTP::append_mki(\$pkt, @$dctx{qw(rtp_mki_len rtp_mki)}); |
|
|
|
|
|
|
|
#$pkt .= pack("N", 1); # mki |
|
|
|
$pkt .= substr($hmac, 0, 10); |
|
|
|
@ -150,13 +151,14 @@ sub rtp_encrypt { |
|
|
|
|
|
|
|
if (!$$dctx{rtp_session_key}) { |
|
|
|
($$dctx{rtp_session_key}, $$dctx{rtp_session_auth_key}, $$dctx{rtp_session_salt}) |
|
|
|
= SRTP::gen_rtp_session_keys($$dctx{rtp_master_key}, $$dctx{rtp_master_salt}); |
|
|
|
= NGCP::Rtpclient::SRTP::gen_rtp_session_keys($$dctx{rtp_master_key}, |
|
|
|
$$dctx{rtp_master_salt}); |
|
|
|
} |
|
|
|
|
|
|
|
($NOENC && $NOENC{rtp_packet}) and return $NOENC{rtp_packet}; |
|
|
|
|
|
|
|
my ($pkt, $roc) = SRTP::encrypt_rtp(@$dctx{qw(crypto_suite rtp_session_key rtp_session_salt |
|
|
|
rtp_session_auth_key rtp_roc rtp_mki rtp_mki_len unenc_srtp unauth_srtp)}, $r); |
|
|
|
my ($pkt, $roc) = NGCP::Rtpclient::SRTP::encrypt_rtp(@$dctx{qw(crypto_suite rtp_session_key |
|
|
|
rtp_session_salt rtp_session_auth_key rtp_roc rtp_mki rtp_mki_len unenc_srtp unauth_srtp)}, $r); |
|
|
|
$roc == ($$dctx{rtp_roc} // 0) or print("ROC is now $roc\n"); |
|
|
|
$$dctx{rtp_roc} = $roc; |
|
|
|
|
|
|
|
@ -165,7 +167,8 @@ sub rtp_encrypt { |
|
|
|
return $pkt; |
|
|
|
} |
|
|
|
|
|
|
|
$SUITES and @SRTP::crypto_suites = grep {my $x = $$_{str}; grep {$x eq $_} @$SUITES} @SRTP::crypto_suites; |
|
|
|
$SUITES and @NGCP::Rtpclient::SRTP::crypto_suites = grep {my $x = $$_{str}; grep {$x eq $_} @$SUITES} |
|
|
|
@NGCP::Rtpclient::SRTP::crypto_suites; |
|
|
|
|
|
|
|
sub savp_sdp { |
|
|
|
my ($ctx, $ctx_o) = @_; |
|
|
|
@ -179,7 +182,8 @@ sub savp_sdp { |
|
|
|
$$ctx{out}{unauth_srtp} = $$ctx{in}{unauth_srtp}; |
|
|
|
} |
|
|
|
else { |
|
|
|
$$ctx{out}{crypto_suite} = $SRTP::crypto_suites[rand(@SRTP::crypto_suites)]; |
|
|
|
$$ctx{out}{crypto_suite} = |
|
|
|
$NGCP::Rtpclient::SRTP::crypto_suites[rand(@NGCP::Rtpclient::SRTP::crypto_suites)]; |
|
|
|
$$ctx{out}{crypto_tag} = int(rand(100)); |
|
|
|
$$ctx{out}{unenc_srtp} = rand() < .5 ? 0 : 1; |
|
|
|
$$ctx{out}{unenc_srtcp} = rand() < .5 ? 0 : 1; |
|
|
|
@ -327,10 +331,10 @@ sub savp_crypto { |
|
|
|
@a or die; |
|
|
|
my $i = 0; |
|
|
|
while (@a >= 8) { |
|
|
|
$$ctx[$i]{in}{crypto_suite} = $SRTP::crypto_suites{$a[1]} or die; |
|
|
|
$$ctx[$i]{in}{crypto_suite} = $NGCP::Rtpclient::SRTP::crypto_suites{$a[1]} or die; |
|
|
|
$$ctx[$i]{in}{crypto_tag} = $a[0]; |
|
|
|
($$ctx[$i]{in}{rtp_master_key}, $$ctx[$i]{in}{rtp_master_salt}) |
|
|
|
= SRTP::decode_inline_base64($a[2]); |
|
|
|
= NGCP::Rtpclient::SRTP::decode_inline_base64($a[2]); |
|
|
|
$$ctx[$i]{in}{rtp_mki} = $a[5]; |
|
|
|
$$ctx[$i]{in}{rtp_mki_len} = $a[6]; |
|
|
|
undef($$ctx[$i]{in}{rtp_session_key}); |
|
|
|
@ -517,7 +521,7 @@ sub port_setup { |
|
|
|
while (1) { |
|
|
|
socket(my $rtp, $$pr{family}, SOCK_DGRAM, 0) or die $!; |
|
|
|
socket(my $rtcp, $$pr{family}, SOCK_DGRAM, 0) or die $!; |
|
|
|
my $port = rand(0x7000) << 1 + 1024; |
|
|
|
my $port = (rand(0x7000) << 1) + 1024; |
|
|
|
bind($rtp, $$pr{sockaddr}($port, |
|
|
|
inet_pton($$pr{family}, $$pr{address}))) or next; |
|
|
|
bind($rtcp, $$pr{sockaddr}($port + 1, |
|
|
|
|