blob: 980ebca08a4507d7f67df8b931d3dd1fbaeec627 [file] [log] [blame]
zstein398c3fd2017-07-19 13:38:02 -07001/*
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "pc/srtp_transport.h"
12
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <string.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020014
Steve Anton36b29d12017-10-30 09:57:42 -070015#include <vector>
16
Yves Gerey3e707812018-11-28 16:47:49 +010017#include "call/rtp_demuxer.h"
Steve Anton10542f22019-01-11 09:11:00 -080018#include "media/base/fake_rtp.h"
19#include "p2p/base/dtls_transport_internal.h"
20#include "p2p/base/fake_packet_transport.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "pc/test/rtp_transport_test_util.h"
22#include "pc/test/srtp_test_util.h"
23#include "rtc_base/async_packet_socket.h"
24#include "rtc_base/byte_order.h"
Yves Gerey3e707812018-11-28 16:47:49 +010025#include "rtc_base/checks.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000026#include "rtc_base/containers/flat_set.h"
Steve Anton10542f22019-01-11 09:11:00 -080027#include "rtc_base/ssl_stream_adapter.h"
Yves Gerey3e707812018-11-28 16:47:49 +010028#include "rtc_base/third_party/sigslot/sigslot.h"
29#include "test/gtest.h"
Zhi Huangcf990f52017-09-22 12:12:30 -070030
Mirko Bonadei7750d802021-07-26 17:27:42 +020031using rtc::kSrtpAeadAes128Gcm;
Zhi Huangcf990f52017-09-22 12:12:30 -070032using rtc::kTestKey1;
33using rtc::kTestKey2;
34using rtc::kTestKeyLen;
zstein398c3fd2017-07-19 13:38:02 -070035
36namespace webrtc {
Zhi Huangcf990f52017-09-22 12:12:30 -070037static const uint8_t kTestKeyGcm128_1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ12";
38static const uint8_t kTestKeyGcm128_2[] = "21ZYXWVUTSRQPONMLKJIHGFEDCBA";
39static const int kTestKeyGcm128Len = 28; // 128 bits key + 96 bits salt.
40static const uint8_t kTestKeyGcm256_1[] =
41 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr";
42static const uint8_t kTestKeyGcm256_2[] =
43 "rqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA";
44static const int kTestKeyGcm256Len = 44; // 256 bits key + 96 bits salt.
zstein398c3fd2017-07-19 13:38:02 -070045
Mirko Bonadei6a489f22019-04-09 15:11:12 +020046class SrtpTransportTest : public ::testing::Test, public sigslot::has_slots<> {
Zhi Huangcf990f52017-09-22 12:12:30 -070047 protected:
48 SrtpTransportTest() {
49 bool rtcp_mux_enabled = true;
zstein398c3fd2017-07-19 13:38:02 -070050
Zhi Huangcf990f52017-09-22 12:12:30 -070051 rtp_packet_transport1_ =
Mirko Bonadei317a1f02019-09-17 17:06:18 +020052 std::make_unique<rtc::FakePacketTransport>("fake_packet_transport1");
Zhi Huangcf990f52017-09-22 12:12:30 -070053 rtp_packet_transport2_ =
Mirko Bonadei317a1f02019-09-17 17:06:18 +020054 std::make_unique<rtc::FakePacketTransport>("fake_packet_transport2");
zstein398c3fd2017-07-19 13:38:02 -070055
Zhi Huangcf990f52017-09-22 12:12:30 -070056 bool asymmetric = false;
57 rtp_packet_transport1_->SetDestination(rtp_packet_transport2_.get(),
58 asymmetric);
zstein398c3fd2017-07-19 13:38:02 -070059
Mirko Bonadei317a1f02019-09-17 17:06:18 +020060 srtp_transport1_ = std::make_unique<SrtpTransport>(rtcp_mux_enabled);
61 srtp_transport2_ = std::make_unique<SrtpTransport>(rtcp_mux_enabled);
Zhi Huangcf990f52017-09-22 12:12:30 -070062
Zhi Huang365381f2018-04-13 16:44:34 -070063 srtp_transport1_->SetRtpPacketTransport(rtp_packet_transport1_.get());
64 srtp_transport2_->SetRtpPacketTransport(rtp_packet_transport2_.get());
Zhi Huangcf990f52017-09-22 12:12:30 -070065
Zhi Huang365381f2018-04-13 16:44:34 -070066 srtp_transport1_->SignalRtcpPacketReceived.connect(
67 &rtp_sink1_, &TransportObserver::OnRtcpPacketReceived);
68 srtp_transport2_->SignalRtcpPacketReceived.connect(
69 &rtp_sink2_, &TransportObserver::OnRtcpPacketReceived);
70
71 RtpDemuxerCriteria demuxer_criteria;
72 // 0x00 is the payload type used in kPcmuFrame.
Tomas Gunnarsson8a5ac162022-01-03 14:16:46 +000073 demuxer_criteria.payload_types().insert(0x00);
Zhi Huang365381f2018-04-13 16:44:34 -070074
75 srtp_transport1_->RegisterRtpDemuxerSink(demuxer_criteria, &rtp_sink1_);
76 srtp_transport2_->RegisterRtpDemuxerSink(demuxer_criteria, &rtp_sink2_);
zstein398c3fd2017-07-19 13:38:02 -070077 }
Zhi Huangcf990f52017-09-22 12:12:30 -070078
Zhi Huang365381f2018-04-13 16:44:34 -070079 ~SrtpTransportTest() {
80 if (srtp_transport1_) {
81 srtp_transport1_->UnregisterRtpDemuxerSink(&rtp_sink1_);
82 }
83 if (srtp_transport2_) {
84 srtp_transport2_->UnregisterRtpDemuxerSink(&rtp_sink2_);
85 }
Zhi Huangcf990f52017-09-22 12:12:30 -070086 }
87
88 // With external auth enabled, SRTP doesn't write the auth tag and
89 // unprotect would fail. Check accessing the information about the
90 // tag instead, similar to what the actual code would do that relies
91 // on external auth.
92 void TestRtpAuthParams(SrtpTransport* transport, const std::string& cs) {
93 int overhead;
94 EXPECT_TRUE(transport->GetSrtpOverhead(&overhead));
95 switch (rtc::SrtpCryptoSuiteFromName(cs)) {
Mirko Bonadei7750d802021-07-26 17:27:42 +020096 case rtc::kSrtpAes128CmSha1_32:
Zhi Huangcf990f52017-09-22 12:12:30 -070097 EXPECT_EQ(32 / 8, overhead); // 32-bit tag.
98 break;
Mirko Bonadei7750d802021-07-26 17:27:42 +020099 case rtc::kSrtpAes128CmSha1_80:
Zhi Huangcf990f52017-09-22 12:12:30 -0700100 EXPECT_EQ(80 / 8, overhead); // 80-bit tag.
101 break;
102 default:
Artem Titovd3251962021-11-15 16:57:07 +0100103 RTC_DCHECK_NOTREACHED();
Zhi Huangcf990f52017-09-22 12:12:30 -0700104 break;
105 }
106
107 uint8_t* auth_key = nullptr;
108 int key_len = 0;
109 int tag_len = 0;
110 EXPECT_TRUE(transport->GetRtpAuthParams(&auth_key, &key_len, &tag_len));
111 EXPECT_NE(nullptr, auth_key);
112 EXPECT_EQ(160 / 8, key_len); // Length of SHA-1 is 160 bits.
113 EXPECT_EQ(overhead, tag_len);
114 }
115
116 void TestSendRecvRtpPacket(const std::string& cipher_suite_name) {
117 size_t rtp_len = sizeof(kPcmuFrame);
118 size_t packet_size = rtp_len + rtc::rtp_auth_tag_len(cipher_suite_name);
119 rtc::Buffer rtp_packet_buffer(packet_size);
120 char* rtp_packet_data = rtp_packet_buffer.data<char>();
121 memcpy(rtp_packet_data, kPcmuFrame, rtp_len);
122 // In order to be able to run this test function multiple times we can not
123 // use the same sequence number twice. Increase the sequence number by one.
124 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2,
125 ++sequence_number_);
126 rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len,
127 packet_size);
128 rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len,
129 packet_size);
130
131 char original_rtp_data[sizeof(kPcmuFrame)];
132 memcpy(original_rtp_data, rtp_packet_data, rtp_len);
133
134 rtc::PacketOptions options;
Artem Titov880fa812021-07-30 22:30:23 +0200135 // Send a packet from `srtp_transport1_` to `srtp_transport2_` and verify
Zhi Huangcf990f52017-09-22 12:12:30 -0700136 // that the packet can be successfully received and decrypted.
137 ASSERT_TRUE(srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options,
138 cricket::PF_SRTP_BYPASS));
139 if (srtp_transport1_->IsExternalAuthActive()) {
140 TestRtpAuthParams(srtp_transport1_.get(), cipher_suite_name);
141 } else {
Zhi Huang365381f2018-04-13 16:44:34 -0700142 ASSERT_TRUE(rtp_sink2_.last_recv_rtp_packet().data());
143 EXPECT_EQ(0, memcmp(rtp_sink2_.last_recv_rtp_packet().data(),
144 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700145 // Get the encrypted packet from underneath packet transport and verify
146 // the data is actually encrypted.
147 auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
148 srtp_transport1_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700149 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
150 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700151 }
152
153 // Do the same thing in the opposite direction;
154 ASSERT_TRUE(srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options,
155 cricket::PF_SRTP_BYPASS));
156 if (srtp_transport2_->IsExternalAuthActive()) {
157 TestRtpAuthParams(srtp_transport2_.get(), cipher_suite_name);
158 } else {
Zhi Huang365381f2018-04-13 16:44:34 -0700159 ASSERT_TRUE(rtp_sink1_.last_recv_rtp_packet().data());
160 EXPECT_EQ(0, memcmp(rtp_sink1_.last_recv_rtp_packet().data(),
161 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700162 auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
163 srtp_transport2_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700164 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
165 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700166 }
167 }
168
169 void TestSendRecvRtcpPacket(const std::string& cipher_suite_name) {
Zhi Huang365381f2018-04-13 16:44:34 -0700170 size_t rtcp_len = sizeof(::kRtcpReport);
Zhi Huangcf990f52017-09-22 12:12:30 -0700171 size_t packet_size =
172 rtcp_len + 4 + rtc::rtcp_auth_tag_len(cipher_suite_name);
173 rtc::Buffer rtcp_packet_buffer(packet_size);
174 char* rtcp_packet_data = rtcp_packet_buffer.data<char>();
Zhi Huang365381f2018-04-13 16:44:34 -0700175 memcpy(rtcp_packet_data, ::kRtcpReport, rtcp_len);
Zhi Huangcf990f52017-09-22 12:12:30 -0700176
177 rtc::CopyOnWriteBuffer rtcp_packet1to2(rtcp_packet_data, rtcp_len,
178 packet_size);
179 rtc::CopyOnWriteBuffer rtcp_packet2to1(rtcp_packet_data, rtcp_len,
180 packet_size);
181
182 rtc::PacketOptions options;
Artem Titov880fa812021-07-30 22:30:23 +0200183 // Send a packet from `srtp_transport1_` to `srtp_transport2_` and verify
Zhi Huangcf990f52017-09-22 12:12:30 -0700184 // that the packet can be successfully received and decrypted.
185 ASSERT_TRUE(srtp_transport1_->SendRtcpPacket(&rtcp_packet1to2, options,
186 cricket::PF_SRTP_BYPASS));
Zhi Huang365381f2018-04-13 16:44:34 -0700187 ASSERT_TRUE(rtp_sink2_.last_recv_rtcp_packet().data());
188 EXPECT_EQ(0, memcmp(rtp_sink2_.last_recv_rtcp_packet().data(),
189 rtcp_packet_data, rtcp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700190 // Get the encrypted packet from underneath packet transport and verify the
191 // data is actually encrypted.
192 auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
193 srtp_transport1_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700194 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
195 rtcp_packet_data, rtcp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700196
197 // Do the same thing in the opposite direction;
198 ASSERT_TRUE(srtp_transport2_->SendRtcpPacket(&rtcp_packet2to1, options,
199 cricket::PF_SRTP_BYPASS));
Zhi Huang365381f2018-04-13 16:44:34 -0700200 ASSERT_TRUE(rtp_sink1_.last_recv_rtcp_packet().data());
201 EXPECT_EQ(0, memcmp(rtp_sink1_.last_recv_rtcp_packet().data(),
202 rtcp_packet_data, rtcp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700203 fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
204 srtp_transport2_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700205 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
206 rtcp_packet_data, rtcp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700207 }
208
209 void TestSendRecvPacket(bool enable_external_auth,
210 int cs,
211 const uint8_t* key1,
212 int key1_len,
213 const uint8_t* key2,
214 int key2_len,
215 const std::string& cipher_suite_name) {
216 EXPECT_EQ(key1_len, key2_len);
217 EXPECT_EQ(cipher_suite_name, rtc::SrtpCryptoSuiteToName(cs));
218 if (enable_external_auth) {
219 srtp_transport1_->EnableExternalAuth();
220 srtp_transport2_->EnableExternalAuth();
221 }
Zhi Huangc99b6c72017-11-10 16:44:46 -0800222 std::vector<int> extension_ids;
223 EXPECT_TRUE(srtp_transport1_->SetRtpParams(
224 cs, key1, key1_len, extension_ids, cs, key2, key2_len, extension_ids));
225 EXPECT_TRUE(srtp_transport2_->SetRtpParams(
226 cs, key2, key2_len, extension_ids, cs, key1, key1_len, extension_ids));
227 EXPECT_TRUE(srtp_transport1_->SetRtcpParams(
228 cs, key1, key1_len, extension_ids, cs, key2, key2_len, extension_ids));
229 EXPECT_TRUE(srtp_transport2_->SetRtcpParams(
230 cs, key2, key2_len, extension_ids, cs, key1, key1_len, extension_ids));
Zhi Huange830e682018-03-30 10:48:35 -0700231 EXPECT_TRUE(srtp_transport1_->IsSrtpActive());
232 EXPECT_TRUE(srtp_transport2_->IsSrtpActive());
Zhi Huangcf990f52017-09-22 12:12:30 -0700233 if (rtc::IsGcmCryptoSuite(cs)) {
234 EXPECT_FALSE(srtp_transport1_->IsExternalAuthActive());
235 EXPECT_FALSE(srtp_transport2_->IsExternalAuthActive());
236 } else if (enable_external_auth) {
237 EXPECT_TRUE(srtp_transport1_->IsExternalAuthActive());
238 EXPECT_TRUE(srtp_transport2_->IsExternalAuthActive());
239 }
240 TestSendRecvRtpPacket(cipher_suite_name);
241 TestSendRecvRtcpPacket(cipher_suite_name);
242 }
243
244 void TestSendRecvPacketWithEncryptedHeaderExtension(
245 const std::string& cs,
246 const std::vector<int>& encrypted_header_ids) {
247 size_t rtp_len = sizeof(kPcmuFrameWithExtensions);
248 size_t packet_size = rtp_len + rtc::rtp_auth_tag_len(cs);
249 rtc::Buffer rtp_packet_buffer(packet_size);
250 char* rtp_packet_data = rtp_packet_buffer.data<char>();
251 memcpy(rtp_packet_data, kPcmuFrameWithExtensions, rtp_len);
252 // In order to be able to run this test function multiple times we can not
253 // use the same sequence number twice. Increase the sequence number by one.
254 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2,
255 ++sequence_number_);
256 rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len,
257 packet_size);
258 rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len,
259 packet_size);
260
261 char original_rtp_data[sizeof(kPcmuFrameWithExtensions)];
262 memcpy(original_rtp_data, rtp_packet_data, rtp_len);
263
264 rtc::PacketOptions options;
Artem Titov880fa812021-07-30 22:30:23 +0200265 // Send a packet from `srtp_transport1_` to `srtp_transport2_` and verify
Zhi Huangcf990f52017-09-22 12:12:30 -0700266 // that the packet can be successfully received and decrypted.
267 ASSERT_TRUE(srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options,
268 cricket::PF_SRTP_BYPASS));
Zhi Huang365381f2018-04-13 16:44:34 -0700269 ASSERT_TRUE(rtp_sink2_.last_recv_rtp_packet().data());
270 EXPECT_EQ(0, memcmp(rtp_sink2_.last_recv_rtp_packet().data(),
271 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700272 // Get the encrypted packet from underneath packet transport and verify the
273 // data and header extension are actually encrypted.
274 auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
275 srtp_transport1_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700276 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
277 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700278 CompareHeaderExtensions(
279 reinterpret_cast<const char*>(
280 fake_rtp_packet_transport->last_sent_packet()->data()),
281 fake_rtp_packet_transport->last_sent_packet()->size(),
282 original_rtp_data, rtp_len, encrypted_header_ids, false);
283
284 // Do the same thing in the opposite direction;
285 ASSERT_TRUE(srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options,
286 cricket::PF_SRTP_BYPASS));
Zhi Huang365381f2018-04-13 16:44:34 -0700287 ASSERT_TRUE(rtp_sink1_.last_recv_rtp_packet().data());
288 EXPECT_EQ(0, memcmp(rtp_sink1_.last_recv_rtp_packet().data(),
289 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700290 fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
291 srtp_transport2_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700292 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
293 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700294 CompareHeaderExtensions(
295 reinterpret_cast<const char*>(
296 fake_rtp_packet_transport->last_sent_packet()->data()),
297 fake_rtp_packet_transport->last_sent_packet()->size(),
298 original_rtp_data, rtp_len, encrypted_header_ids, false);
299 }
300
301 void TestSendRecvEncryptedHeaderExtension(int cs,
302 const uint8_t* key1,
303 int key1_len,
304 const uint8_t* key2,
305 int key2_len,
306 const std::string& cs_name) {
307 std::vector<int> encrypted_headers;
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800308 encrypted_headers.push_back(kHeaderExtensionIDs[0]);
Zhi Huangcf990f52017-09-22 12:12:30 -0700309 // Don't encrypt header ids 2 and 3.
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800310 encrypted_headers.push_back(kHeaderExtensionIDs[1]);
Zhi Huangcf990f52017-09-22 12:12:30 -0700311 EXPECT_EQ(key1_len, key2_len);
312 EXPECT_EQ(cs_name, rtc::SrtpCryptoSuiteToName(cs));
Zhi Huangc99b6c72017-11-10 16:44:46 -0800313 EXPECT_TRUE(srtp_transport1_->SetRtpParams(cs, key1, key1_len,
314 encrypted_headers, cs, key2,
315 key2_len, encrypted_headers));
316 EXPECT_TRUE(srtp_transport2_->SetRtpParams(cs, key2, key2_len,
317 encrypted_headers, cs, key1,
318 key1_len, encrypted_headers));
Zhi Huange830e682018-03-30 10:48:35 -0700319 EXPECT_TRUE(srtp_transport1_->IsSrtpActive());
320 EXPECT_TRUE(srtp_transport2_->IsSrtpActive());
Zhi Huangcf990f52017-09-22 12:12:30 -0700321 EXPECT_FALSE(srtp_transport1_->IsExternalAuthActive());
322 EXPECT_FALSE(srtp_transport2_->IsExternalAuthActive());
323 TestSendRecvPacketWithEncryptedHeaderExtension(cs_name, encrypted_headers);
324 }
325
326 std::unique_ptr<SrtpTransport> srtp_transport1_;
327 std::unique_ptr<SrtpTransport> srtp_transport2_;
328
329 std::unique_ptr<rtc::FakePacketTransport> rtp_packet_transport1_;
330 std::unique_ptr<rtc::FakePacketTransport> rtp_packet_transport2_;
331
Zhi Huang365381f2018-04-13 16:44:34 -0700332 TransportObserver rtp_sink1_;
333 TransportObserver rtp_sink2_;
334
Zhi Huangcf990f52017-09-22 12:12:30 -0700335 int sequence_number_ = 0;
zstein398c3fd2017-07-19 13:38:02 -0700336};
337
Zhi Huangcf990f52017-09-22 12:12:30 -0700338class SrtpTransportTestWithExternalAuth
339 : public SrtpTransportTest,
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200340 public ::testing::WithParamInterface<bool> {};
zstein398c3fd2017-07-19 13:38:02 -0700341
Zhi Huangcf990f52017-09-22 12:12:30 -0700342TEST_P(SrtpTransportTestWithExternalAuth,
343 SendAndRecvPacket_AES_CM_128_HMAC_SHA1_80) {
344 bool enable_external_auth = GetParam();
Mirko Bonadei7750d802021-07-26 17:27:42 +0200345 TestSendRecvPacket(enable_external_auth, rtc::kSrtpAes128CmSha1_80, kTestKey1,
346 kTestKeyLen, kTestKey2, kTestKeyLen,
347 rtc::kCsAesCm128HmacSha1_80);
zstein398c3fd2017-07-19 13:38:02 -0700348}
349
Zhi Huangcf990f52017-09-22 12:12:30 -0700350TEST_F(SrtpTransportTest,
351 SendAndRecvPacketWithHeaderExtension_AES_CM_128_HMAC_SHA1_80) {
Mirko Bonadei7750d802021-07-26 17:27:42 +0200352 TestSendRecvEncryptedHeaderExtension(rtc::kSrtpAes128CmSha1_80, kTestKey1,
Zhi Huangcf990f52017-09-22 12:12:30 -0700353 kTestKeyLen, kTestKey2, kTestKeyLen,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200354 rtc::kCsAesCm128HmacSha1_80);
Zhi Huangcf990f52017-09-22 12:12:30 -0700355}
zstein398c3fd2017-07-19 13:38:02 -0700356
Zhi Huangcf990f52017-09-22 12:12:30 -0700357TEST_P(SrtpTransportTestWithExternalAuth,
358 SendAndRecvPacket_AES_CM_128_HMAC_SHA1_32) {
359 bool enable_external_auth = GetParam();
Mirko Bonadei7750d802021-07-26 17:27:42 +0200360 TestSendRecvPacket(enable_external_auth, rtc::kSrtpAes128CmSha1_32, kTestKey1,
361 kTestKeyLen, kTestKey2, kTestKeyLen,
362 rtc::kCsAesCm128HmacSha1_32);
Zhi Huangcf990f52017-09-22 12:12:30 -0700363}
zstein398c3fd2017-07-19 13:38:02 -0700364
Zhi Huangcf990f52017-09-22 12:12:30 -0700365TEST_F(SrtpTransportTest,
366 SendAndRecvPacketWithHeaderExtension_AES_CM_128_HMAC_SHA1_32) {
Mirko Bonadei7750d802021-07-26 17:27:42 +0200367 TestSendRecvEncryptedHeaderExtension(rtc::kSrtpAes128CmSha1_32, kTestKey1,
Zhi Huangcf990f52017-09-22 12:12:30 -0700368 kTestKeyLen, kTestKey2, kTestKeyLen,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200369 rtc::kCsAesCm128HmacSha1_32);
Zhi Huangcf990f52017-09-22 12:12:30 -0700370}
zstein398c3fd2017-07-19 13:38:02 -0700371
Zhi Huangcf990f52017-09-22 12:12:30 -0700372TEST_P(SrtpTransportTestWithExternalAuth,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200373 SendAndRecvPacket_kSrtpAeadAes128Gcm) {
Zhi Huangcf990f52017-09-22 12:12:30 -0700374 bool enable_external_auth = GetParam();
Mirko Bonadei7750d802021-07-26 17:27:42 +0200375 TestSendRecvPacket(enable_external_auth, rtc::kSrtpAeadAes128Gcm,
Zhi Huangcf990f52017-09-22 12:12:30 -0700376 kTestKeyGcm128_1, kTestKeyGcm128Len, kTestKeyGcm128_2,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200377 kTestKeyGcm128Len, rtc::kCsAeadAes128Gcm);
Zhi Huangcf990f52017-09-22 12:12:30 -0700378}
zstein398c3fd2017-07-19 13:38:02 -0700379
Zhi Huangcf990f52017-09-22 12:12:30 -0700380TEST_F(SrtpTransportTest,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200381 SendAndRecvPacketWithHeaderExtension_kSrtpAeadAes128Gcm) {
Zhi Huangcf990f52017-09-22 12:12:30 -0700382 TestSendRecvEncryptedHeaderExtension(
Mirko Bonadei7750d802021-07-26 17:27:42 +0200383 rtc::kSrtpAeadAes128Gcm, kTestKeyGcm128_1, kTestKeyGcm128Len,
384 kTestKeyGcm128_2, kTestKeyGcm128Len, rtc::kCsAeadAes128Gcm);
Zhi Huangcf990f52017-09-22 12:12:30 -0700385}
386
387TEST_P(SrtpTransportTestWithExternalAuth,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200388 SendAndRecvPacket_kSrtpAeadAes256Gcm) {
Zhi Huangcf990f52017-09-22 12:12:30 -0700389 bool enable_external_auth = GetParam();
Mirko Bonadei7750d802021-07-26 17:27:42 +0200390 TestSendRecvPacket(enable_external_auth, rtc::kSrtpAeadAes256Gcm,
Zhi Huangcf990f52017-09-22 12:12:30 -0700391 kTestKeyGcm256_1, kTestKeyGcm256Len, kTestKeyGcm256_2,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200392 kTestKeyGcm256Len, rtc::kCsAeadAes256Gcm);
Zhi Huangcf990f52017-09-22 12:12:30 -0700393}
394
395TEST_F(SrtpTransportTest,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200396 SendAndRecvPacketWithHeaderExtension_kSrtpAeadAes256Gcm) {
Zhi Huangcf990f52017-09-22 12:12:30 -0700397 TestSendRecvEncryptedHeaderExtension(
Mirko Bonadei7750d802021-07-26 17:27:42 +0200398 rtc::kSrtpAeadAes256Gcm, kTestKeyGcm256_1, kTestKeyGcm256Len,
399 kTestKeyGcm256_2, kTestKeyGcm256Len, rtc::kCsAeadAes256Gcm);
Zhi Huangcf990f52017-09-22 12:12:30 -0700400}
401
402// Run all tests both with and without external auth enabled.
Mirko Bonadeic84f6612019-01-31 12:20:57 +0100403INSTANTIATE_TEST_SUITE_P(ExternalAuth,
404 SrtpTransportTestWithExternalAuth,
405 ::testing::Values(true, false));
Zhi Huangcf990f52017-09-22 12:12:30 -0700406
407// Test directly setting the params with bogus keys.
408TEST_F(SrtpTransportTest, TestSetParamsKeyTooShort) {
Zhi Huangc99b6c72017-11-10 16:44:46 -0800409 std::vector<int> extension_ids;
Zhi Huangcf990f52017-09-22 12:12:30 -0700410 EXPECT_FALSE(srtp_transport1_->SetRtpParams(
Mirko Bonadei7750d802021-07-26 17:27:42 +0200411 rtc::kSrtpAes128CmSha1_80, kTestKey1, kTestKeyLen - 1, extension_ids,
412 rtc::kSrtpAes128CmSha1_80, kTestKey1, kTestKeyLen - 1, extension_ids));
Zhi Huangcf990f52017-09-22 12:12:30 -0700413 EXPECT_FALSE(srtp_transport1_->SetRtcpParams(
Mirko Bonadei7750d802021-07-26 17:27:42 +0200414 rtc::kSrtpAes128CmSha1_80, kTestKey1, kTestKeyLen - 1, extension_ids,
415 rtc::kSrtpAes128CmSha1_80, kTestKey1, kTestKeyLen - 1, extension_ids));
zstein398c3fd2017-07-19 13:38:02 -0700416}
417
418} // namespace webrtc