blob: 4e643935a9c5e010dd1c7e7ce43ab43fc281c04e [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"
Jonas Orelanded99dae2022-03-09 09:28:10 +010030#include "test/scoped_key_value_config.h"
Zhi Huangcf990f52017-09-22 12:12:30 -070031
Mirko Bonadei7750d802021-07-26 17:27:42 +020032using rtc::kSrtpAeadAes128Gcm;
Zhi Huangcf990f52017-09-22 12:12:30 -070033using rtc::kTestKey1;
34using rtc::kTestKey2;
35using rtc::kTestKeyLen;
zstein398c3fd2017-07-19 13:38:02 -070036
37namespace webrtc {
Zhi Huangcf990f52017-09-22 12:12:30 -070038static const uint8_t kTestKeyGcm128_1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ12";
39static const uint8_t kTestKeyGcm128_2[] = "21ZYXWVUTSRQPONMLKJIHGFEDCBA";
40static const int kTestKeyGcm128Len = 28; // 128 bits key + 96 bits salt.
41static const uint8_t kTestKeyGcm256_1[] =
42 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr";
43static const uint8_t kTestKeyGcm256_2[] =
44 "rqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA";
45static const int kTestKeyGcm256Len = 44; // 256 bits key + 96 bits salt.
zstein398c3fd2017-07-19 13:38:02 -070046
Mirko Bonadei6a489f22019-04-09 15:11:12 +020047class SrtpTransportTest : public ::testing::Test, public sigslot::has_slots<> {
Zhi Huangcf990f52017-09-22 12:12:30 -070048 protected:
49 SrtpTransportTest() {
50 bool rtcp_mux_enabled = true;
zstein398c3fd2017-07-19 13:38:02 -070051
Zhi Huangcf990f52017-09-22 12:12:30 -070052 rtp_packet_transport1_ =
Mirko Bonadei317a1f02019-09-17 17:06:18 +020053 std::make_unique<rtc::FakePacketTransport>("fake_packet_transport1");
Zhi Huangcf990f52017-09-22 12:12:30 -070054 rtp_packet_transport2_ =
Mirko Bonadei317a1f02019-09-17 17:06:18 +020055 std::make_unique<rtc::FakePacketTransport>("fake_packet_transport2");
zstein398c3fd2017-07-19 13:38:02 -070056
Zhi Huangcf990f52017-09-22 12:12:30 -070057 bool asymmetric = false;
58 rtp_packet_transport1_->SetDestination(rtp_packet_transport2_.get(),
59 asymmetric);
zstein398c3fd2017-07-19 13:38:02 -070060
Jonas Orelanded99dae2022-03-09 09:28:10 +010061 srtp_transport1_ =
62 std::make_unique<SrtpTransport>(rtcp_mux_enabled, field_trials_);
63 srtp_transport2_ =
64 std::make_unique<SrtpTransport>(rtcp_mux_enabled, field_trials_);
Zhi Huangcf990f52017-09-22 12:12:30 -070065
Zhi Huang365381f2018-04-13 16:44:34 -070066 srtp_transport1_->SetRtpPacketTransport(rtp_packet_transport1_.get());
67 srtp_transport2_->SetRtpPacketTransport(rtp_packet_transport2_.get());
Zhi Huangcf990f52017-09-22 12:12:30 -070068
Zhi Huang365381f2018-04-13 16:44:34 -070069 srtp_transport1_->SignalRtcpPacketReceived.connect(
70 &rtp_sink1_, &TransportObserver::OnRtcpPacketReceived);
71 srtp_transport2_->SignalRtcpPacketReceived.connect(
72 &rtp_sink2_, &TransportObserver::OnRtcpPacketReceived);
73
74 RtpDemuxerCriteria demuxer_criteria;
75 // 0x00 is the payload type used in kPcmuFrame.
Tomas Gunnarsson8a5ac162022-01-03 14:16:46 +000076 demuxer_criteria.payload_types().insert(0x00);
Zhi Huang365381f2018-04-13 16:44:34 -070077
78 srtp_transport1_->RegisterRtpDemuxerSink(demuxer_criteria, &rtp_sink1_);
79 srtp_transport2_->RegisterRtpDemuxerSink(demuxer_criteria, &rtp_sink2_);
zstein398c3fd2017-07-19 13:38:02 -070080 }
Zhi Huangcf990f52017-09-22 12:12:30 -070081
Zhi Huang365381f2018-04-13 16:44:34 -070082 ~SrtpTransportTest() {
83 if (srtp_transport1_) {
84 srtp_transport1_->UnregisterRtpDemuxerSink(&rtp_sink1_);
85 }
86 if (srtp_transport2_) {
87 srtp_transport2_->UnregisterRtpDemuxerSink(&rtp_sink2_);
88 }
Zhi Huangcf990f52017-09-22 12:12:30 -070089 }
90
91 // With external auth enabled, SRTP doesn't write the auth tag and
92 // unprotect would fail. Check accessing the information about the
93 // tag instead, similar to what the actual code would do that relies
94 // on external auth.
95 void TestRtpAuthParams(SrtpTransport* transport, const std::string& cs) {
96 int overhead;
97 EXPECT_TRUE(transport->GetSrtpOverhead(&overhead));
98 switch (rtc::SrtpCryptoSuiteFromName(cs)) {
Mirko Bonadei7750d802021-07-26 17:27:42 +020099 case rtc::kSrtpAes128CmSha1_32:
Zhi Huangcf990f52017-09-22 12:12:30 -0700100 EXPECT_EQ(32 / 8, overhead); // 32-bit tag.
101 break;
Mirko Bonadei7750d802021-07-26 17:27:42 +0200102 case rtc::kSrtpAes128CmSha1_80:
Zhi Huangcf990f52017-09-22 12:12:30 -0700103 EXPECT_EQ(80 / 8, overhead); // 80-bit tag.
104 break;
105 default:
Artem Titovd3251962021-11-15 16:57:07 +0100106 RTC_DCHECK_NOTREACHED();
Zhi Huangcf990f52017-09-22 12:12:30 -0700107 break;
108 }
109
110 uint8_t* auth_key = nullptr;
111 int key_len = 0;
112 int tag_len = 0;
113 EXPECT_TRUE(transport->GetRtpAuthParams(&auth_key, &key_len, &tag_len));
114 EXPECT_NE(nullptr, auth_key);
115 EXPECT_EQ(160 / 8, key_len); // Length of SHA-1 is 160 bits.
116 EXPECT_EQ(overhead, tag_len);
117 }
118
119 void TestSendRecvRtpPacket(const std::string& cipher_suite_name) {
120 size_t rtp_len = sizeof(kPcmuFrame);
121 size_t packet_size = rtp_len + rtc::rtp_auth_tag_len(cipher_suite_name);
122 rtc::Buffer rtp_packet_buffer(packet_size);
123 char* rtp_packet_data = rtp_packet_buffer.data<char>();
124 memcpy(rtp_packet_data, kPcmuFrame, rtp_len);
125 // In order to be able to run this test function multiple times we can not
126 // use the same sequence number twice. Increase the sequence number by one.
127 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2,
128 ++sequence_number_);
129 rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len,
130 packet_size);
131 rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len,
132 packet_size);
133
134 char original_rtp_data[sizeof(kPcmuFrame)];
135 memcpy(original_rtp_data, rtp_packet_data, rtp_len);
136
137 rtc::PacketOptions options;
Artem Titov880fa812021-07-30 22:30:23 +0200138 // Send a packet from `srtp_transport1_` to `srtp_transport2_` and verify
Zhi Huangcf990f52017-09-22 12:12:30 -0700139 // that the packet can be successfully received and decrypted.
140 ASSERT_TRUE(srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options,
141 cricket::PF_SRTP_BYPASS));
142 if (srtp_transport1_->IsExternalAuthActive()) {
143 TestRtpAuthParams(srtp_transport1_.get(), cipher_suite_name);
144 } else {
Zhi Huang365381f2018-04-13 16:44:34 -0700145 ASSERT_TRUE(rtp_sink2_.last_recv_rtp_packet().data());
146 EXPECT_EQ(0, memcmp(rtp_sink2_.last_recv_rtp_packet().data(),
147 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700148 // Get the encrypted packet from underneath packet transport and verify
149 // the data is actually encrypted.
150 auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
151 srtp_transport1_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700152 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
153 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700154 }
155
156 // Do the same thing in the opposite direction;
157 ASSERT_TRUE(srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options,
158 cricket::PF_SRTP_BYPASS));
159 if (srtp_transport2_->IsExternalAuthActive()) {
160 TestRtpAuthParams(srtp_transport2_.get(), cipher_suite_name);
161 } else {
Zhi Huang365381f2018-04-13 16:44:34 -0700162 ASSERT_TRUE(rtp_sink1_.last_recv_rtp_packet().data());
163 EXPECT_EQ(0, memcmp(rtp_sink1_.last_recv_rtp_packet().data(),
164 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700165 auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
166 srtp_transport2_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700167 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
168 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700169 }
170 }
171
172 void TestSendRecvRtcpPacket(const std::string& cipher_suite_name) {
Zhi Huang365381f2018-04-13 16:44:34 -0700173 size_t rtcp_len = sizeof(::kRtcpReport);
Zhi Huangcf990f52017-09-22 12:12:30 -0700174 size_t packet_size =
175 rtcp_len + 4 + rtc::rtcp_auth_tag_len(cipher_suite_name);
176 rtc::Buffer rtcp_packet_buffer(packet_size);
177 char* rtcp_packet_data = rtcp_packet_buffer.data<char>();
Zhi Huang365381f2018-04-13 16:44:34 -0700178 memcpy(rtcp_packet_data, ::kRtcpReport, rtcp_len);
Zhi Huangcf990f52017-09-22 12:12:30 -0700179
180 rtc::CopyOnWriteBuffer rtcp_packet1to2(rtcp_packet_data, rtcp_len,
181 packet_size);
182 rtc::CopyOnWriteBuffer rtcp_packet2to1(rtcp_packet_data, rtcp_len,
183 packet_size);
184
185 rtc::PacketOptions options;
Artem Titov880fa812021-07-30 22:30:23 +0200186 // Send a packet from `srtp_transport1_` to `srtp_transport2_` and verify
Zhi Huangcf990f52017-09-22 12:12:30 -0700187 // that the packet can be successfully received and decrypted.
188 ASSERT_TRUE(srtp_transport1_->SendRtcpPacket(&rtcp_packet1to2, options,
189 cricket::PF_SRTP_BYPASS));
Zhi Huang365381f2018-04-13 16:44:34 -0700190 ASSERT_TRUE(rtp_sink2_.last_recv_rtcp_packet().data());
191 EXPECT_EQ(0, memcmp(rtp_sink2_.last_recv_rtcp_packet().data(),
192 rtcp_packet_data, rtcp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700193 // Get the encrypted packet from underneath packet transport and verify the
194 // data is actually encrypted.
195 auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
196 srtp_transport1_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700197 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
198 rtcp_packet_data, rtcp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700199
200 // Do the same thing in the opposite direction;
201 ASSERT_TRUE(srtp_transport2_->SendRtcpPacket(&rtcp_packet2to1, options,
202 cricket::PF_SRTP_BYPASS));
Zhi Huang365381f2018-04-13 16:44:34 -0700203 ASSERT_TRUE(rtp_sink1_.last_recv_rtcp_packet().data());
204 EXPECT_EQ(0, memcmp(rtp_sink1_.last_recv_rtcp_packet().data(),
205 rtcp_packet_data, rtcp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700206 fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
207 srtp_transport2_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700208 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
209 rtcp_packet_data, rtcp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700210 }
211
212 void TestSendRecvPacket(bool enable_external_auth,
213 int cs,
214 const uint8_t* key1,
215 int key1_len,
216 const uint8_t* key2,
217 int key2_len,
218 const std::string& cipher_suite_name) {
219 EXPECT_EQ(key1_len, key2_len);
220 EXPECT_EQ(cipher_suite_name, rtc::SrtpCryptoSuiteToName(cs));
221 if (enable_external_auth) {
222 srtp_transport1_->EnableExternalAuth();
223 srtp_transport2_->EnableExternalAuth();
224 }
Zhi Huangc99b6c72017-11-10 16:44:46 -0800225 std::vector<int> extension_ids;
226 EXPECT_TRUE(srtp_transport1_->SetRtpParams(
227 cs, key1, key1_len, extension_ids, cs, key2, key2_len, extension_ids));
228 EXPECT_TRUE(srtp_transport2_->SetRtpParams(
229 cs, key2, key2_len, extension_ids, cs, key1, key1_len, extension_ids));
230 EXPECT_TRUE(srtp_transport1_->SetRtcpParams(
231 cs, key1, key1_len, extension_ids, cs, key2, key2_len, extension_ids));
232 EXPECT_TRUE(srtp_transport2_->SetRtcpParams(
233 cs, key2, key2_len, extension_ids, cs, key1, key1_len, extension_ids));
Zhi Huange830e682018-03-30 10:48:35 -0700234 EXPECT_TRUE(srtp_transport1_->IsSrtpActive());
235 EXPECT_TRUE(srtp_transport2_->IsSrtpActive());
Zhi Huangcf990f52017-09-22 12:12:30 -0700236 if (rtc::IsGcmCryptoSuite(cs)) {
237 EXPECT_FALSE(srtp_transport1_->IsExternalAuthActive());
238 EXPECT_FALSE(srtp_transport2_->IsExternalAuthActive());
239 } else if (enable_external_auth) {
240 EXPECT_TRUE(srtp_transport1_->IsExternalAuthActive());
241 EXPECT_TRUE(srtp_transport2_->IsExternalAuthActive());
242 }
243 TestSendRecvRtpPacket(cipher_suite_name);
244 TestSendRecvRtcpPacket(cipher_suite_name);
245 }
246
247 void TestSendRecvPacketWithEncryptedHeaderExtension(
248 const std::string& cs,
249 const std::vector<int>& encrypted_header_ids) {
250 size_t rtp_len = sizeof(kPcmuFrameWithExtensions);
251 size_t packet_size = rtp_len + rtc::rtp_auth_tag_len(cs);
252 rtc::Buffer rtp_packet_buffer(packet_size);
253 char* rtp_packet_data = rtp_packet_buffer.data<char>();
254 memcpy(rtp_packet_data, kPcmuFrameWithExtensions, rtp_len);
255 // In order to be able to run this test function multiple times we can not
256 // use the same sequence number twice. Increase the sequence number by one.
257 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2,
258 ++sequence_number_);
259 rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len,
260 packet_size);
261 rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len,
262 packet_size);
263
264 char original_rtp_data[sizeof(kPcmuFrameWithExtensions)];
265 memcpy(original_rtp_data, rtp_packet_data, rtp_len);
266
267 rtc::PacketOptions options;
Artem Titov880fa812021-07-30 22:30:23 +0200268 // Send a packet from `srtp_transport1_` to `srtp_transport2_` and verify
Zhi Huangcf990f52017-09-22 12:12:30 -0700269 // that the packet can be successfully received and decrypted.
270 ASSERT_TRUE(srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options,
271 cricket::PF_SRTP_BYPASS));
Zhi Huang365381f2018-04-13 16:44:34 -0700272 ASSERT_TRUE(rtp_sink2_.last_recv_rtp_packet().data());
273 EXPECT_EQ(0, memcmp(rtp_sink2_.last_recv_rtp_packet().data(),
274 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700275 // Get the encrypted packet from underneath packet transport and verify the
276 // data and header extension are actually encrypted.
277 auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
278 srtp_transport1_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700279 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
280 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700281 CompareHeaderExtensions(
282 reinterpret_cast<const char*>(
283 fake_rtp_packet_transport->last_sent_packet()->data()),
284 fake_rtp_packet_transport->last_sent_packet()->size(),
285 original_rtp_data, rtp_len, encrypted_header_ids, false);
286
287 // Do the same thing in the opposite direction;
288 ASSERT_TRUE(srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options,
289 cricket::PF_SRTP_BYPASS));
Zhi Huang365381f2018-04-13 16:44:34 -0700290 ASSERT_TRUE(rtp_sink1_.last_recv_rtp_packet().data());
291 EXPECT_EQ(0, memcmp(rtp_sink1_.last_recv_rtp_packet().data(),
292 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700293 fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
294 srtp_transport2_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700295 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
296 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700297 CompareHeaderExtensions(
298 reinterpret_cast<const char*>(
299 fake_rtp_packet_transport->last_sent_packet()->data()),
300 fake_rtp_packet_transport->last_sent_packet()->size(),
301 original_rtp_data, rtp_len, encrypted_header_ids, false);
302 }
303
304 void TestSendRecvEncryptedHeaderExtension(int cs,
305 const uint8_t* key1,
306 int key1_len,
307 const uint8_t* key2,
308 int key2_len,
309 const std::string& cs_name) {
310 std::vector<int> encrypted_headers;
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800311 encrypted_headers.push_back(kHeaderExtensionIDs[0]);
Zhi Huangcf990f52017-09-22 12:12:30 -0700312 // Don't encrypt header ids 2 and 3.
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800313 encrypted_headers.push_back(kHeaderExtensionIDs[1]);
Zhi Huangcf990f52017-09-22 12:12:30 -0700314 EXPECT_EQ(key1_len, key2_len);
315 EXPECT_EQ(cs_name, rtc::SrtpCryptoSuiteToName(cs));
Zhi Huangc99b6c72017-11-10 16:44:46 -0800316 EXPECT_TRUE(srtp_transport1_->SetRtpParams(cs, key1, key1_len,
317 encrypted_headers, cs, key2,
318 key2_len, encrypted_headers));
319 EXPECT_TRUE(srtp_transport2_->SetRtpParams(cs, key2, key2_len,
320 encrypted_headers, cs, key1,
321 key1_len, encrypted_headers));
Zhi Huange830e682018-03-30 10:48:35 -0700322 EXPECT_TRUE(srtp_transport1_->IsSrtpActive());
323 EXPECT_TRUE(srtp_transport2_->IsSrtpActive());
Zhi Huangcf990f52017-09-22 12:12:30 -0700324 EXPECT_FALSE(srtp_transport1_->IsExternalAuthActive());
325 EXPECT_FALSE(srtp_transport2_->IsExternalAuthActive());
326 TestSendRecvPacketWithEncryptedHeaderExtension(cs_name, encrypted_headers);
327 }
328
329 std::unique_ptr<SrtpTransport> srtp_transport1_;
330 std::unique_ptr<SrtpTransport> srtp_transport2_;
331
332 std::unique_ptr<rtc::FakePacketTransport> rtp_packet_transport1_;
333 std::unique_ptr<rtc::FakePacketTransport> rtp_packet_transport2_;
334
Zhi Huang365381f2018-04-13 16:44:34 -0700335 TransportObserver rtp_sink1_;
336 TransportObserver rtp_sink2_;
337
Zhi Huangcf990f52017-09-22 12:12:30 -0700338 int sequence_number_ = 0;
Jonas Orelanded99dae2022-03-09 09:28:10 +0100339 webrtc::test::ScopedKeyValueConfig field_trials_;
zstein398c3fd2017-07-19 13:38:02 -0700340};
341
Zhi Huangcf990f52017-09-22 12:12:30 -0700342class SrtpTransportTestWithExternalAuth
343 : public SrtpTransportTest,
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200344 public ::testing::WithParamInterface<bool> {};
zstein398c3fd2017-07-19 13:38:02 -0700345
Zhi Huangcf990f52017-09-22 12:12:30 -0700346TEST_P(SrtpTransportTestWithExternalAuth,
347 SendAndRecvPacket_AES_CM_128_HMAC_SHA1_80) {
348 bool enable_external_auth = GetParam();
Mirko Bonadei7750d802021-07-26 17:27:42 +0200349 TestSendRecvPacket(enable_external_auth, rtc::kSrtpAes128CmSha1_80, kTestKey1,
350 kTestKeyLen, kTestKey2, kTestKeyLen,
351 rtc::kCsAesCm128HmacSha1_80);
zstein398c3fd2017-07-19 13:38:02 -0700352}
353
Zhi Huangcf990f52017-09-22 12:12:30 -0700354TEST_F(SrtpTransportTest,
355 SendAndRecvPacketWithHeaderExtension_AES_CM_128_HMAC_SHA1_80) {
Mirko Bonadei7750d802021-07-26 17:27:42 +0200356 TestSendRecvEncryptedHeaderExtension(rtc::kSrtpAes128CmSha1_80, kTestKey1,
Zhi Huangcf990f52017-09-22 12:12:30 -0700357 kTestKeyLen, kTestKey2, kTestKeyLen,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200358 rtc::kCsAesCm128HmacSha1_80);
Zhi Huangcf990f52017-09-22 12:12:30 -0700359}
zstein398c3fd2017-07-19 13:38:02 -0700360
Zhi Huangcf990f52017-09-22 12:12:30 -0700361TEST_P(SrtpTransportTestWithExternalAuth,
362 SendAndRecvPacket_AES_CM_128_HMAC_SHA1_32) {
363 bool enable_external_auth = GetParam();
Mirko Bonadei7750d802021-07-26 17:27:42 +0200364 TestSendRecvPacket(enable_external_auth, rtc::kSrtpAes128CmSha1_32, kTestKey1,
365 kTestKeyLen, kTestKey2, kTestKeyLen,
366 rtc::kCsAesCm128HmacSha1_32);
Zhi Huangcf990f52017-09-22 12:12:30 -0700367}
zstein398c3fd2017-07-19 13:38:02 -0700368
Zhi Huangcf990f52017-09-22 12:12:30 -0700369TEST_F(SrtpTransportTest,
370 SendAndRecvPacketWithHeaderExtension_AES_CM_128_HMAC_SHA1_32) {
Mirko Bonadei7750d802021-07-26 17:27:42 +0200371 TestSendRecvEncryptedHeaderExtension(rtc::kSrtpAes128CmSha1_32, kTestKey1,
Zhi Huangcf990f52017-09-22 12:12:30 -0700372 kTestKeyLen, kTestKey2, kTestKeyLen,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200373 rtc::kCsAesCm128HmacSha1_32);
Zhi Huangcf990f52017-09-22 12:12:30 -0700374}
zstein398c3fd2017-07-19 13:38:02 -0700375
Zhi Huangcf990f52017-09-22 12:12:30 -0700376TEST_P(SrtpTransportTestWithExternalAuth,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200377 SendAndRecvPacket_kSrtpAeadAes128Gcm) {
Zhi Huangcf990f52017-09-22 12:12:30 -0700378 bool enable_external_auth = GetParam();
Mirko Bonadei7750d802021-07-26 17:27:42 +0200379 TestSendRecvPacket(enable_external_auth, rtc::kSrtpAeadAes128Gcm,
Zhi Huangcf990f52017-09-22 12:12:30 -0700380 kTestKeyGcm128_1, kTestKeyGcm128Len, kTestKeyGcm128_2,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200381 kTestKeyGcm128Len, rtc::kCsAeadAes128Gcm);
Zhi Huangcf990f52017-09-22 12:12:30 -0700382}
zstein398c3fd2017-07-19 13:38:02 -0700383
Zhi Huangcf990f52017-09-22 12:12:30 -0700384TEST_F(SrtpTransportTest,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200385 SendAndRecvPacketWithHeaderExtension_kSrtpAeadAes128Gcm) {
Zhi Huangcf990f52017-09-22 12:12:30 -0700386 TestSendRecvEncryptedHeaderExtension(
Mirko Bonadei7750d802021-07-26 17:27:42 +0200387 rtc::kSrtpAeadAes128Gcm, kTestKeyGcm128_1, kTestKeyGcm128Len,
388 kTestKeyGcm128_2, kTestKeyGcm128Len, rtc::kCsAeadAes128Gcm);
Zhi Huangcf990f52017-09-22 12:12:30 -0700389}
390
391TEST_P(SrtpTransportTestWithExternalAuth,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200392 SendAndRecvPacket_kSrtpAeadAes256Gcm) {
Zhi Huangcf990f52017-09-22 12:12:30 -0700393 bool enable_external_auth = GetParam();
Mirko Bonadei7750d802021-07-26 17:27:42 +0200394 TestSendRecvPacket(enable_external_auth, rtc::kSrtpAeadAes256Gcm,
Zhi Huangcf990f52017-09-22 12:12:30 -0700395 kTestKeyGcm256_1, kTestKeyGcm256Len, kTestKeyGcm256_2,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200396 kTestKeyGcm256Len, rtc::kCsAeadAes256Gcm);
Zhi Huangcf990f52017-09-22 12:12:30 -0700397}
398
399TEST_F(SrtpTransportTest,
Mirko Bonadei7750d802021-07-26 17:27:42 +0200400 SendAndRecvPacketWithHeaderExtension_kSrtpAeadAes256Gcm) {
Zhi Huangcf990f52017-09-22 12:12:30 -0700401 TestSendRecvEncryptedHeaderExtension(
Mirko Bonadei7750d802021-07-26 17:27:42 +0200402 rtc::kSrtpAeadAes256Gcm, kTestKeyGcm256_1, kTestKeyGcm256Len,
403 kTestKeyGcm256_2, kTestKeyGcm256Len, rtc::kCsAeadAes256Gcm);
Zhi Huangcf990f52017-09-22 12:12:30 -0700404}
405
406// Run all tests both with and without external auth enabled.
Mirko Bonadeic84f6612019-01-31 12:20:57 +0100407INSTANTIATE_TEST_SUITE_P(ExternalAuth,
408 SrtpTransportTestWithExternalAuth,
409 ::testing::Values(true, false));
Zhi Huangcf990f52017-09-22 12:12:30 -0700410
411// Test directly setting the params with bogus keys.
412TEST_F(SrtpTransportTest, TestSetParamsKeyTooShort) {
Zhi Huangc99b6c72017-11-10 16:44:46 -0800413 std::vector<int> extension_ids;
Zhi Huangcf990f52017-09-22 12:12:30 -0700414 EXPECT_FALSE(srtp_transport1_->SetRtpParams(
Mirko Bonadei7750d802021-07-26 17:27:42 +0200415 rtc::kSrtpAes128CmSha1_80, kTestKey1, kTestKeyLen - 1, extension_ids,
416 rtc::kSrtpAes128CmSha1_80, kTestKey1, kTestKeyLen - 1, extension_ids));
Zhi Huangcf990f52017-09-22 12:12:30 -0700417 EXPECT_FALSE(srtp_transport1_->SetRtcpParams(
Mirko Bonadei7750d802021-07-26 17:27:42 +0200418 rtc::kSrtpAes128CmSha1_80, kTestKey1, kTestKeyLen - 1, extension_ids,
419 rtc::kSrtpAes128CmSha1_80, kTestKey1, kTestKeyLen - 1, extension_ids));
zstein398c3fd2017-07-19 13:38:02 -0700420}
421
422} // namespace webrtc