1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "media/base/fake_rtp.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <stdint.h>
14*d9f75844SAndroid Build Coastguard Worker #include <string.h>
15*d9f75844SAndroid Build Coastguard Worker
16*d9f75844SAndroid Build Coastguard Worker #include "absl/algorithm/container.h"
17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
18*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
19*d9f75844SAndroid Build Coastguard Worker
CompareHeaderExtensions(const char * packet1,size_t packet1_size,const char * packet2,size_t packet2_size,const std::vector<int> & encrypted_headers,bool expect_equal)20*d9f75844SAndroid Build Coastguard Worker void CompareHeaderExtensions(const char* packet1,
21*d9f75844SAndroid Build Coastguard Worker size_t packet1_size,
22*d9f75844SAndroid Build Coastguard Worker const char* packet2,
23*d9f75844SAndroid Build Coastguard Worker size_t packet2_size,
24*d9f75844SAndroid Build Coastguard Worker const std::vector<int>& encrypted_headers,
25*d9f75844SAndroid Build Coastguard Worker bool expect_equal) {
26*d9f75844SAndroid Build Coastguard Worker // Sanity check: packets must be large enough to contain the RTP header and
27*d9f75844SAndroid Build Coastguard Worker // extensions header.
28*d9f75844SAndroid Build Coastguard Worker RTC_CHECK_GE(packet1_size, 12 + 4);
29*d9f75844SAndroid Build Coastguard Worker RTC_CHECK_GE(packet2_size, 12 + 4);
30*d9f75844SAndroid Build Coastguard Worker // RTP extension headers are the same.
31*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(packet1 + 12, packet2 + 12, 4));
32*d9f75844SAndroid Build Coastguard Worker // Check for one-byte header extensions.
33*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ('\xBE', packet1[12]);
34*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ('\xDE', packet1[13]);
35*d9f75844SAndroid Build Coastguard Worker // Determine position and size of extension headers.
36*d9f75844SAndroid Build Coastguard Worker size_t extension_words = packet1[14] << 8 | packet1[15];
37*d9f75844SAndroid Build Coastguard Worker const char* extension_data1 = packet1 + 12 + 4;
38*d9f75844SAndroid Build Coastguard Worker const char* extension_end1 = extension_data1 + extension_words * 4;
39*d9f75844SAndroid Build Coastguard Worker const char* extension_data2 = packet2 + 12 + 4;
40*d9f75844SAndroid Build Coastguard Worker // Sanity check: packets must be large enough to contain the RTP header
41*d9f75844SAndroid Build Coastguard Worker // extensions.
42*d9f75844SAndroid Build Coastguard Worker RTC_CHECK_GE(packet1_size, 12 + 4 + extension_words * 4);
43*d9f75844SAndroid Build Coastguard Worker RTC_CHECK_GE(packet2_size, 12 + 4 + extension_words * 4);
44*d9f75844SAndroid Build Coastguard Worker while (extension_data1 < extension_end1) {
45*d9f75844SAndroid Build Coastguard Worker uint8_t id = (*extension_data1 & 0xf0) >> 4;
46*d9f75844SAndroid Build Coastguard Worker uint8_t len = (*extension_data1 & 0x0f) + 1;
47*d9f75844SAndroid Build Coastguard Worker extension_data1++;
48*d9f75844SAndroid Build Coastguard Worker extension_data2++;
49*d9f75844SAndroid Build Coastguard Worker EXPECT_LE(extension_data1, extension_end1);
50*d9f75844SAndroid Build Coastguard Worker if (id == 15) {
51*d9f75844SAndroid Build Coastguard Worker // Finished parsing.
52*d9f75844SAndroid Build Coastguard Worker break;
53*d9f75844SAndroid Build Coastguard Worker }
54*d9f75844SAndroid Build Coastguard Worker
55*d9f75844SAndroid Build Coastguard Worker // The header extension doesn't get encrypted if the id is not in the
56*d9f75844SAndroid Build Coastguard Worker // list of header extensions to encrypt.
57*d9f75844SAndroid Build Coastguard Worker if (expect_equal || !absl::c_linear_search(encrypted_headers, id)) {
58*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(extension_data1, extension_data2, len));
59*d9f75844SAndroid Build Coastguard Worker } else {
60*d9f75844SAndroid Build Coastguard Worker EXPECT_NE(0, memcmp(extension_data1, extension_data2, len));
61*d9f75844SAndroid Build Coastguard Worker }
62*d9f75844SAndroid Build Coastguard Worker
63*d9f75844SAndroid Build Coastguard Worker extension_data1 += len;
64*d9f75844SAndroid Build Coastguard Worker extension_data2 += len;
65*d9f75844SAndroid Build Coastguard Worker // Skip padding.
66*d9f75844SAndroid Build Coastguard Worker while (extension_data1 < extension_end1 && *extension_data1 == 0) {
67*d9f75844SAndroid Build Coastguard Worker extension_data1++;
68*d9f75844SAndroid Build Coastguard Worker extension_data2++;
69*d9f75844SAndroid Build Coastguard Worker }
70*d9f75844SAndroid Build Coastguard Worker }
71*d9f75844SAndroid Build Coastguard Worker }
72