#!/usr/bin/perl use strict; use warnings; use NGCP::Rtpengine::Test; use NGCP::Rtpclient::SRTP; use NGCP::Rtpengine::AutoTest; use Test::More; use NGCP::Rtpclient::ICE; use POSIX; autotest_start(qw(--config-file=none -t -1 -i 203.0.113.1 -i 2001:db8:4321::1 -n 2223 -c 12345 -f -L 7 -E -u 2222 --silence-detect=1)) or die; my ($sock_a, $sock_b, $sock_c, $sock_d, $port_a, $port_b, $port_c, $ssrc_a, $ssrc_b, $resp, $sock_ax, $sock_bx, $port_ax, $port_bx, $srtp_ctx_a, $srtp_ctx_b, $srtp_ctx_a_rev, $srtp_ctx_b_rev, $ufrag_a, $ufrag_b, @ret1, @ret2, @ret3, @ret4, $srtp_key_a, $srtp_key_b, $ts, $seq, $ftr, $ttr, $ttr2); ($sock_a, $sock_b, $sock_c) = new_call([qw(198.51.100.14 6060)], [qw(198.51.100.14 6062)], [qw(198.51.100.14 6064)]); ($port_a) = offer('sub, multi codec, sub w diff codec', { }, < ft() }, < ft(), 'to-tag' => $ttr, flags => ['allow transcoding'] }, < ft(), codec => { transcode => ['PCMA'] } }, < ft(), 'to-tag' => $ttr, flags => ['allow transcoding'] }, < ft(), codec => { transcode => ['PCMA'] } }, < ft(), 'to-tag' => $ttr }, < ft() }, < ft(), 'to-tag' => $ttr }, < 'foo' }, < 'bar' }, < 'foo' }, < 'foo', 'to-tag' => $ttr }, < 'foo' }, < 'bar' }, < 'foo' }, < 'bar', 'to-tag' => $ttr }, < ft(), 'transport-protocol' => 'RTP/SAVP', SDES => ['no-AEAD_AES_256_GCM', 'no-AEAD_AES_128_GCM'] }, < ft(), 'to-tag' => $ttr }, < $NGCP::Rtpclient::SRTP::crypto_suites{AES_256_CM_HMAC_SHA1_80}, key => $srtp_key_a, }; snd($sock_b, $port_a, rtp(0, 2001, 4160, 0x3456, "\x00" x 160)); rcv($sock_a, $port_b, rtpm(0, 2001, 4160, $ssrc_a, "\x00" x 160)); snd($sock_a, $port_b, rtp(0, 4001, 7160, 0x6543, "\x00" x 160)); rcv($sock_b, $port_a, rtpm(0, 4001, 7160, $ssrc_b, "\x00" x 160)); srtp_rcv($sock_c, $port_c, rtpm(0, 4001, 7160, $ssrc_b, "\x00" x 160), $srtp_ctx_a); ($sock_a, $sock_b, $sock_c) = new_call([qw(198.51.100.14 6012)], [qw(198.51.100.14 6014)], [qw(198.51.100.14 6016)]); ($port_a) = offer('SRTP sub', { }, < ft(), 'transport-protocol' => 'RTP/SAVP', SDES => ['no-AEAD_AES_256_GCM', 'no-AEAD_AES_128_GCM'] }, < ft(), 'to-tag' => $ttr }, < $NGCP::Rtpclient::SRTP::crypto_suites{AES_CM_128_HMAC_SHA1_80}, key => $srtp_key_a, }; snd($sock_b, $port_a, rtp(0, 2001, 4160, 0x3456, "\x00" x 160)); rcv($sock_a, $port_b, rtpm(0, 2001, 4160, $ssrc_a, "\x00" x 160)); snd($sock_a, $port_b, rtp(0, 4001, 7160, 0x6543, "\x00" x 160)); rcv($sock_b, $port_a, rtpm(0, 4001, 7160, $ssrc_b, "\x00" x 160)); srtp_rcv($sock_c, $port_c, rtpm(0, 4001, 7160, $ssrc_b, "\x00" x 160), $srtp_ctx_a); ($sock_a, $sock_b, $sock_c) = new_call([qw(198.51.100.14 6018)], [qw(198.51.100.14 6020)], [qw(198.51.100.14 6022)]); ($port_a) = offer('SRTP call RTP sub', { }, < $NGCP::Rtpclient::SRTP::crypto_suites{AES_CM_128_HMAC_SHA1_80}, key => 'DVM+BTeYX2UI1LaA9bgXrcBEDBxoItA9/39fSoRF', }; $srtp_ctx_b = { cs => $NGCP::Rtpclient::SRTP::crypto_suites{AES_CM_128_HMAC_SHA1_80}, key => 'eMlRvW8mWU4WodT9JOvAM+pn6I0/EXOhT9n0KeKk', }; srtp_snd($sock_b, $port_a, rtp(0, 2000, 4000, 0x3456, "\x00" x 160), $srtp_ctx_b); ($ssrc_a) = srtp_rcv($sock_a, $port_b, rtpm(0, 2000, 4000, -1, "\x00" x 160), $srtp_ctx_b); srtp_snd($sock_a, $port_b, rtp(0, 4000, 7000, 0x6543, "\x00" x 160), $srtp_ctx_a); ($ssrc_b) = srtp_rcv($sock_b, $port_a, rtpm(0, 4000, 7000, -1, "\x00" x 160), $srtp_ctx_a); ($ftr, $ttr, $port_c) = subscribe_request('SRTP call RTP sub', { 'from-tag' => ft(), 'transport-protocol' => 'RTP/AVP', }, < ft(), 'to-tag' => $ttr }, < ft(), ICE => 'force' }, < ft(), 'to-tag' => $ttr }, < ft() }, < ft(), 'to-tag' => $ttr }, < ft() }, < ft(), 'to-tag' => $ttr }, < { accept => ['PCMA'] } }, < ft() }, < ft(), 'to-tag' => $ttr }, < ft() }, < ft(), 'to-tag' => $ttr }, < ft() }, < ft(), 'to-tag' => $ttr }, < ft(), codec => { strip => ['PCMA'], transcode => ['PCMU'] } }, < ft(), 'to-tag' => $ttr, flags => ['allow transcoding'] }, <