Index: talk/session/media/channel_unittest.cc |
diff --git a/talk/session/media/channel_unittest.cc b/talk/session/media/channel_unittest.cc |
index 35e7142c13d649ac5bf529989831bc403cc794a0..78c781de67895884aa942c4c675adc401fdca1fe 100644 |
--- a/talk/session/media/channel_unittest.cc |
+++ b/talk/session/media/channel_unittest.cc |
@@ -125,7 +125,7 @@ template<class T> |
class ChannelTest : public testing::Test, public sigslot::has_slots<> { |
public: |
enum Flags { RTCP = 0x1, RTCP_MUX = 0x2, SECURE = 0x4, SSRC_MUX = 0x8, |
- DTLS = 0x10 }; |
+ DTLS = 0x10, GCM_CIPHER = 0x20 }; |
ChannelTest(bool verify_playout, |
const uint8_t* rtp_data, |
@@ -152,6 +152,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> { |
int flags1, int flags2, rtc::Thread* thread) { |
media_channel1_ = ch1; |
media_channel2_ = ch2; |
+ transport_controller1_.SetEnableGcmCiphers((flags1 & GCM_CIPHER) != 0); |
+ transport_controller2_.SetEnableGcmCiphers((flags2 & GCM_CIPHER) != 0); |
channel1_.reset(CreateChannel(thread, &media_engine_, ch1, |
&transport_controller1_, |
(flags1 & RTCP) != 0)); |
@@ -399,6 +401,20 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> { |
bool CheckNoRtcp2() { |
return media_channel2_->CheckNoRtcp(); |
} |
+ bool CheckGcmCipher(typename T::Channel* channel, int flags) { |
+ int suite; |
+ if (!channel->transport_channel()->GetSrtpCryptoSuite(&suite)) { |
+ return false; |
+ } |
+ |
+ if (flags & GCM_CIPHER) { |
+ return (suite == rtc::SRTP_AEAD_AES_128_GCM || |
+ suite == rtc::SRTP_AEAD_AES_256_GCM); |
+ } else { |
+ return (suite == rtc::SRTP_AES128_CM_SHA1_80 || |
+ suite == rtc::SRTP_AES128_CM_SHA1_32); |
+ } |
+ } |
void CreateContent(int flags, |
const cricket::AudioCodec& audio_codec, |
@@ -1246,8 +1262,8 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> { |
// Test that we properly send SRTP with RTCP in both directions. |
// You can pass in DTLS and/or RTCP_MUX as flags. |
void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) { |
- ASSERT((flags1_in & ~(RTCP_MUX | DTLS)) == 0); |
- ASSERT((flags2_in & ~(RTCP_MUX | DTLS)) == 0); |
+ ASSERT((flags1_in & ~(RTCP_MUX | DTLS | GCM_CIPHER)) == 0); |
+ ASSERT((flags2_in & ~(RTCP_MUX | DTLS | GCM_CIPHER)) == 0); |
int flags1 = RTCP | SECURE | flags1_in; |
int flags2 = RTCP | SECURE | flags2_in; |
@@ -1264,6 +1280,10 @@ class ChannelTest : public testing::Test, public sigslot::has_slots<> { |
EXPECT_TRUE(channel2_->secure()); |
EXPECT_EQ(dtls1 && dtls2, channel1_->secure_dtls()); |
EXPECT_EQ(dtls1 && dtls2, channel2_->secure_dtls()); |
+ // A GCM cipher is only used if both channels support GCM ciphers. |
+ int common_gcm_flags = (flags1 & GCM_CIPHER) & (flags2 & GCM_CIPHER); |
+ EXPECT_TRUE(CheckGcmCipher(channel1_.get(), common_gcm_flags)); |
+ EXPECT_TRUE(CheckGcmCipher(channel2_.get(), common_gcm_flags)); |
EXPECT_TRUE(SendRtp1()); |
EXPECT_TRUE(SendRtp2()); |
EXPECT_TRUE(SendRtcp1()); |
@@ -2087,6 +2107,21 @@ TEST_F(VoiceChannelTest, SendDtlsSrtpToDtlsSrtp) { |
Base::SendSrtpToSrtp(DTLS, DTLS); |
} |
+TEST_F(VoiceChannelTest, SendDtlsSrtpToDtlsSrtpGcmBoth) { |
+ MAYBE_SKIP_TEST(HaveDtlsSrtp); |
+ Base::SendSrtpToSrtp(DTLS | GCM_CIPHER, DTLS | GCM_CIPHER); |
+} |
+ |
+TEST_F(VoiceChannelTest, SendDtlsSrtpToDtlsSrtpGcmOne) { |
+ MAYBE_SKIP_TEST(HaveDtlsSrtp); |
+ Base::SendSrtpToSrtp(DTLS | GCM_CIPHER, DTLS); |
+} |
+ |
+TEST_F(VoiceChannelTest, SendDtlsSrtpToDtlsSrtpGcmTwo) { |
+ MAYBE_SKIP_TEST(HaveDtlsSrtp); |
+ Base::SendSrtpToSrtp(DTLS, DTLS | GCM_CIPHER); |
+} |
+ |
TEST_F(VoiceChannelTest, SendDtlsSrtpToDtlsSrtpRtcpMux) { |
MAYBE_SKIP_TEST(HaveDtlsSrtp); |
Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX); |
@@ -2423,6 +2458,21 @@ TEST_F(VideoChannelTest, SendDtlsSrtpToDtlsSrtp) { |
Base::SendSrtpToSrtp(DTLS, DTLS); |
} |
+TEST_F(VideoChannelTest, SendDtlsSrtpToDtlsSrtpGcmBoth) { |
+ MAYBE_SKIP_TEST(HaveDtlsSrtp); |
+ Base::SendSrtpToSrtp(DTLS | GCM_CIPHER, DTLS | GCM_CIPHER); |
+} |
+ |
+TEST_F(VideoChannelTest, SendDtlsSrtpToDtlsSrtpGcmOne) { |
+ MAYBE_SKIP_TEST(HaveDtlsSrtp); |
+ Base::SendSrtpToSrtp(DTLS | GCM_CIPHER, DTLS); |
+} |
+ |
+TEST_F(VideoChannelTest, SendDtlsSrtpToDtlsSrtpGcmTwo) { |
+ MAYBE_SKIP_TEST(HaveDtlsSrtp); |
+ Base::SendSrtpToSrtp(DTLS, DTLS | GCM_CIPHER); |
+} |
+ |
TEST_F(VideoChannelTest, SendDtlsSrtpToDtlsSrtpRtcpMux) { |
MAYBE_SKIP_TEST(HaveDtlsSrtp); |
Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX); |