Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/media/psshparser/gtest/TestPsshParser.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
* License, v. 2.0. If a copy of the MPL was not distributed with this
5
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "gtest/gtest.h"
8
#include <algorithm>
9
#include <stdint.h>
10
#include <vector>
11
12
#include "psshparser/PsshParser.h"
13
#include "mozilla/ArrayUtils.h"
14
15
using namespace std;
16
17
// This is the CENC initData from Google's web-platform tests.
18
// https://github.com/w3c/web-platform-tests/blob/master/encrypted-media/Google/encrypted-media-utils.js#L50
19
const uint8_t gGoogleWPTCencInitData[] = {
20
  0x00, 0x00, 0x00, 0x00,                          // size = 0
21
  0x70, 0x73, 0x73, 0x68,                          // 'pssh'
22
  0x01,                                            // version = 1
23
  0x00, 0x00, 0x00,                                // flags
24
  0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02,  // Common SystemID
25
  0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B,
26
  0x00, 0x00, 0x00, 0x01,                          // key count
27
  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // key
28
  0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
29
  0x00, 0x00, 0x00, 0x00                           // datasize
30
};
31
32
// Example CENC initData from the EME spec format registry:
33
// https://w3c.github.io/encrypted-media/format-registry/initdata/cenc.html
34
const uint8_t gW3SpecExampleCencInitData[] = {
35
  0x00, 0x00, 0x00, 0x44, 0x70, 0x73, 0x73, 0x68, // BMFF box header (68 bytes, 'pssh')
36
  0x01, 0x00, 0x00, 0x00,                         // Full box header (version = 1, flags = 0)
37
  0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02, // SystemID
38
  0xac, 0xe3, 0x3c, 0x1e, 0x52, 0xe2, 0xfb, 0x4b,
39
  0x00, 0x00, 0x00, 0x02,                         // KID_count (2)
40
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // First KID ("0123456789012345")
41
  0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
42
  0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // Second KID ("ABCDEFGHIJKLMNOP")
43
  0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
44
  0x00, 0x00, 0x00, 0x00                         // Size of Data (0)
45
};
46
47
// Invalid box size, would overflow if used.
48
const uint8_t gOverflowBoxSize[] = {
49
  0xff, 0xff, 0xff, 0xff,                          // size = UINT32_MAX
50
};
51
52
// Valid box size, but key count too large.
53
const uint8_t gTooLargeKeyCountInitData[] = {
54
  0x00, 0x00, 0x00, 0x34,                          // size = too big a number
55
  0x70, 0x73, 0x73, 0x68,                          // 'pssh'
56
  0x01,                                            // version = 1
57
  0xff, 0xff, 0xff,                                // flags
58
  0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02,  // Common SystemID
59
  0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B,
60
  0xff, 0xff, 0xff, 0xff,                          // key count = UINT32_MAX
61
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  // key
62
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
63
  0xff, 0xff, 0xff, 0xff                           // datasize
64
};
65
66
// Non common SystemID PSSH.
67
// No keys Ids can be extracted, but don't consider the box invalid.
68
const uint8_t gNonCencInitData[] = {
69
  0x00, 0x00, 0x00, 0x5c,                          // size = 92
70
  0x70, 0x73, 0x73, 0x68,                          // 'pssh'
71
  0x01,                                            // version = 1
72
  0x00, 0x00, 0x00,                                // flags
73
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  // Invalid SystemID
74
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
75
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  // Some data to pad out the box.
76
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
77
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
78
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
79
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
80
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
81
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
82
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
83
};
84
85
const uint8_t gNonPSSHBoxZeroSize[] = {
86
  0x00, 0x00, 0x00, 0x00,                          // size = 0
87
  0xff, 0xff, 0xff, 0xff,                          // something other than 'pssh'
88
};
89
90
// Two lots of the google init data. To ensure we handle
91
// multiple boxes with size 0.
92
const uint8_t g2xGoogleWPTCencInitData[] = {
93
  0x00, 0x00, 0x00, 0x00,                          // size = 0
94
  0x70, 0x73, 0x73, 0x68,                          // 'pssh'
95
  0x01,                                            // version = 1
96
  0x00, 0x00, 0x00,                                // flags
97
  0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02,  // Common SystemID
98
  0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B,
99
  0x00, 0x00, 0x00, 0x01,                          // key count
100
  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // key
101
  0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
102
  0x00, 0x00, 0x00, 0x00,                          // datasize
103
104
  0x00, 0x00, 0x00, 0x00,                          // size = 0
105
  0x70, 0x73, 0x73, 0x68,                          // 'pssh'
106
  0x01,                                            // version = 1
107
  0x00, 0x00, 0x00,                                // flags
108
  0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02,  // Common SystemID
109
  0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B,
110
  0x00, 0x00, 0x00, 0x01,                          // key count
111
  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // key
112
  0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
113
  0x00, 0x00, 0x00, 0x00                           // datasize
114
};
115
116
0
TEST(PsshParser, ParseCencInitData) {
117
0
  std::vector<std::vector<uint8_t>> keyIds;
118
0
  bool rv;
119
0
120
0
  rv = ParseCENCInitData(gGoogleWPTCencInitData, MOZ_ARRAY_LENGTH(gGoogleWPTCencInitData), keyIds);
121
0
  EXPECT_TRUE(rv);
122
0
  EXPECT_EQ(1u, keyIds.size());
123
0
  EXPECT_EQ(16u, keyIds[0].size());
124
0
  EXPECT_EQ(0, memcmp(&keyIds[0].front(), &gGoogleWPTCencInitData[32], 16));
125
0
126
0
  rv = ParseCENCInitData(gW3SpecExampleCencInitData, MOZ_ARRAY_LENGTH(gW3SpecExampleCencInitData), keyIds);
127
0
  EXPECT_TRUE(rv);
128
0
  EXPECT_EQ(2u, keyIds.size());
129
0
  EXPECT_EQ(16u, keyIds[0].size());
130
0
  EXPECT_EQ(0, memcmp(&keyIds[0].front(), &gW3SpecExampleCencInitData[32], 16));
131
0
  EXPECT_EQ(0, memcmp(&keyIds[1].front(), &gW3SpecExampleCencInitData[48], 16));
132
0
133
0
  rv = ParseCENCInitData(gOverflowBoxSize, MOZ_ARRAY_LENGTH(gOverflowBoxSize), keyIds);
134
0
  EXPECT_FALSE(rv);
135
0
  EXPECT_EQ(0u, keyIds.size());
136
0
137
0
  rv = ParseCENCInitData(gTooLargeKeyCountInitData, MOZ_ARRAY_LENGTH(gTooLargeKeyCountInitData), keyIds);
138
0
  EXPECT_FALSE(rv);
139
0
  EXPECT_EQ(0u, keyIds.size());
140
0
141
0
  rv = ParseCENCInitData(gNonCencInitData, MOZ_ARRAY_LENGTH(gNonCencInitData), keyIds);
142
0
  EXPECT_TRUE(rv);
143
0
  EXPECT_EQ(0u, keyIds.size());
144
0
145
0
  rv = ParseCENCInitData(gNonPSSHBoxZeroSize, MOZ_ARRAY_LENGTH(gNonPSSHBoxZeroSize), keyIds);
146
0
  EXPECT_FALSE(rv);
147
0
  EXPECT_EQ(0u, keyIds.size());
148
0
149
0
  rv = ParseCENCInitData(g2xGoogleWPTCencInitData, MOZ_ARRAY_LENGTH(g2xGoogleWPTCencInitData), keyIds);
150
0
  EXPECT_TRUE(rv);
151
0
  EXPECT_EQ(2u, keyIds.size());
152
0
  EXPECT_EQ(16u, keyIds[0].size());
153
0
  EXPECT_EQ(16u, keyIds[1].size());
154
0
  EXPECT_EQ(0, memcmp(&keyIds[0].front(), &g2xGoogleWPTCencInitData[32], 16));
155
0
  EXPECT_EQ(0, memcmp(&keyIds[1].front(), &g2xGoogleWPTCencInitData[84], 16));
156
0
}