18d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce/*
28d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * Copyright (C) 2014 The Android Open Source Project
38d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce *
48d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * Licensed under the Apache License, Version 2.0 (the "License");
58d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * you may not use this file except in compliance with the License.
68d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * You may obtain a copy of the License at
78d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce *
88d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce *      http://www.apache.org/licenses/LICENSE-2.0
98d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce *
108d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * Unless required by applicable law or agreed to in writing, software
118d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * distributed under the License is distributed on an "AS IS" BASIS,
128d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * See the License for the specific language governing permissions and
148d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * limitations under the License.
158d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce */
168d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
178d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce#include <gtest/gtest.h>
188d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce#include <string.h>
198d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
208d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce#include <media/stagefright/foundation/AString.h>
218d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce#include <media/stagefright/foundation/base64.h>
228d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce#include <utils/String8.h>
238d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce#include <utils/Vector.h>
248d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
258d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce#include "InitDataParser.h"
268d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
278d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Brucenamespace clearkeydrm {
288d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
298d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruceusing namespace android;
308d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
318d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Brucenamespace {
328d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kKeyIdSize = 16;
338d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const String8 kCencType("cenc");
348d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const String8 kWebMType("webm");
358d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const String8 kBase64Padding("=");
368d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
378d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
388d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruceclass InitDataParserTest : public ::testing::Test {
398d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce  protected:
408d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    status_t attemptParse(const Vector<uint8_t>& initData,
418d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                          const String8& initDataType,
428d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                          Vector<uint8_t>* licenseRequest) {
438d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        InitDataParser parser;
448d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        return parser.parse(initData, initDataType, licenseRequest);
458d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    }
468d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
478d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    void attemptParseExpectingSuccess(const Vector<uint8_t>& initData,
488d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                      const String8& initDataType,
498d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                      const Vector<String8>& expectedKeys) {
508d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        const String8 kRequestPrefix("{\"kids\":[");
518d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        const String8 kRequestSuffix("],\"type\":\"temporary\"}");
528d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        Vector<uint8_t> request;
538d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        ASSERT_EQ(android::OK, attemptParse(initData, initDataType, &request));
548d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
558d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        String8 requestString(reinterpret_cast<const char*>(request.array()),
568d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                              request.size());
578d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        EXPECT_EQ(0, requestString.find(kRequestPrefix));
588d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        EXPECT_EQ(requestString.size() - kRequestSuffix.size(),
598d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                  requestString.find(kRequestSuffix));
608d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        for (size_t i = 0; i < expectedKeys.size(); ++i) {
618d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce            AString encodedIdAString;
628d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce            android::encodeBase64(expectedKeys[i], kKeyIdSize,
638d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                  &encodedIdAString);
648d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce            String8 encodedId(encodedIdAString.c_str());
658d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce            encodedId.removeAll(kBase64Padding);
668d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce            EXPECT_TRUE(requestString.contains(encodedId));
678d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        }
688d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    }
698d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
708d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    void attemptParseExpectingFailure(const Vector<uint8_t>& initData,
718d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                      const String8& initDataType) {
728d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        Vector<uint8_t> request;
738d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        ASSERT_NE(android::OK, attemptParse(initData, initDataType, &request));
748d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        EXPECT_EQ(0, request.size());
758d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    }
768d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce};
778d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
788d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(InitDataParserTest, ParsesSingleKeyPssh) {
798d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t pssh[52] = {
808d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 52,                                    // Total Size
818d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        'p', 's', 's', 'h',                             // PSSH
828d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        1, 0, 0, 0,                                     // Version
838d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02, // System ID
848d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xac, 0xe3, 0x3c, 0x1e, 0x52, 0xe2, 0xfb, 0x4b,
858d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 1,                                     // Key Count
868d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // Key ID #1
878d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x38, 0x39, 0x30, 0x41, 0x42, 0x43, 0x44, 0x45, //   "01234567890ABCDE"
888d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 0                                      // Data Size (always 0)
898d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
908d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Vector<uint8_t> initData;
918d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    initData.appendArray(pssh, 52);
928d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
938d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Vector<String8> expectedKeys;
948d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    expectedKeys.push(String8("01234567890ABCDE"));
958d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
968d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptParseExpectingSuccess(initData, kCencType, expectedKeys);
978d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
988d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
998d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(InitDataParserTest, ParsesMultipleKeyPssh) {
1008d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t pssh[84] = {
1018d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 84,                                    // Total Size
1028d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        'p', 's', 's', 'h',                             // PSSH
1038d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        1, 0, 0, 0,                                     // Version
1048d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02, // System ID
1058d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xac, 0xe3, 0x3c, 0x1e, 0x52, 0xe2, 0xfb, 0x4b,
1068d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 3,                                     // Key Count
1078d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // Key ID #1
1088d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x38, 0x39, 0x30, 0x41, 0x42, 0x43, 0x44, 0x45, //   "01234567890ABCDE"
1098d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x43, 0x6c, 0x65, 0x61, 0x72, 0x4b, 0x65, 0x79, // Key ID #2
1108d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x43, 0x6c, 0x65, 0x61, 0x72, 0x4b, 0x65, 0x79, //   "ClearKeyClearKey"
1118d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x20, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x20, // Key ID #3
1128d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x20, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x20, //   " GOOGLE  GOOGLE "
1138d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 0                                      // Data Size (always 0)
1148d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1158d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Vector<uint8_t> initData;
1168d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    initData.appendArray(pssh, 84);
1178d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1188d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Vector<String8> expectedKeys;
1198d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    expectedKeys.push(String8("01234567890ABCDE"));
1208d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    expectedKeys.push(String8("ClearKeyClearKey"));
1218d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    expectedKeys.push(String8(" GOOGLE  GOOGLE "));
1228d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1238d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptParseExpectingSuccess(initData, kCencType, expectedKeys);
1248d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
1258d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1268d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(InitDataParserTest, ParsesWebM) {
1278d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t initDataRaw[16] = {
1288d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // Key ID
1298d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x38, 0x39, 0x30, 0x41, 0x42, 0x43, 0x44, 0x45, //   "01234567890ABCDE"
1308d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1318d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Vector<uint8_t> initData;
1328d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    initData.appendArray(initDataRaw, 16);
1338d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1348d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Vector<String8> expectedKeys;
1358d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    expectedKeys.push(String8("01234567890ABCDE"));
1368d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1378d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptParseExpectingSuccess(initData, kWebMType, expectedKeys);
1388d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
1398d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1408d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(InitDataParserTest, FailsForPsshTooSmall) {
1418d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t pssh[16] = {
1428d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 52,
1438d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        'p', 's', 's', 'h',
1448d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        1, 0, 0, 0,
1458d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x10, 0x77, 0xef, 0xec
1468d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1478d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Vector<uint8_t> initData;
1488d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    initData.appendArray(pssh, 16);
1498d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1508d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptParseExpectingFailure(initData, kCencType);
1518d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
1528d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1538d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(InitDataParserTest, FailsForWebMTooSmall) {
1548d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t initDataRaw[8] = {
1558d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
1568d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1578d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Vector<uint8_t> initData;
1588d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    initData.appendArray(initDataRaw, 8);
1598d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1608d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptParseExpectingFailure(initData, kWebMType);
1618d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
1628d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1638d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(InitDataParserTest, FailsForPsshBadSystemId) {
1648d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t pssh[52] = {
1658d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 52,                                    // Total Size
1668d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        'p', 's', 's', 'h',                             // PSSH
1678d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        1, 0, 0, 0,                                     // Version
1688d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xac, 0xe3, 0x3c, 0x1e, 0x52, 0xe2, 0xfb, 0x4b, // System ID
1698d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02,
1708d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 1,                                     // Key Count
1718d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // Key ID #1
1728d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x38, 0x39, 0x30, 0x41, 0x42, 0x43, 0x44, 0x45, //   "01234567890ABCDE"
1738d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 0                                      // Data Size (always 0)
1748d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1758d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Vector<uint8_t> initData;
1768d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    initData.appendArray(pssh, 52);
1778d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1788d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptParseExpectingFailure(initData, kCencType);
1798d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
1808d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1818d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(InitDataParserTest, FailsForPsshBadSize) {
1828d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t pssh[52] = {
1838d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 70, 200,                                  // Total Size
1848d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        'p', 's', 's', 'h',                             // PSSH
1858d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        1, 0, 0, 0,                                     // Version
1868d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02, // System ID
1878d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xac, 0xe3, 0x3c, 0x1e, 0x52, 0xe2, 0xfb, 0x4b,
1888d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 1,                                     // Key Count
1898d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // Key ID #1
1908d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x38, 0x39, 0x30, 0x41, 0x42, 0x43, 0x44, 0x45, //   "01234567890ABCDE"
1918d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 0                                      // Data Size (always 0)
1928d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1938d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Vector<uint8_t> initData;
1948d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    initData.appendArray(pssh, 52);
1958d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1968d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptParseExpectingFailure(initData, kCencType);
1978d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
1988d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1998d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(InitDataParserTest, FailsForPsshWrongVersion) {
2008d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t pssh[52] = {
2018d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 52,                                    // Total Size
2028d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        'p', 's', 's', 'h',                             // PSSH
2038d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 0,                                     // Version
2048d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02, // System ID
2058d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xac, 0xe3, 0x3c, 0x1e, 0x52, 0xe2, 0xfb, 0x4b,
2068d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 1,                                     // Key Count
2078d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // Key ID #1
2088d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x38, 0x39, 0x30, 0x41, 0x42, 0x43, 0x44, 0x45, //   "01234567890ABCDE"
2098d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 0                                      // Data Size (always 0)
2108d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
2118d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Vector<uint8_t> initData;
2128d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    initData.appendArray(pssh, 52);
2138d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2148d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptParseExpectingFailure(initData, kCencType);
2158d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
2168d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2178d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(InitDataParserTest, FailsForPsshBadKeyCount) {
2188d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t pssh[52] = {
2198d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 52,                                    // Total Size
2208d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        'p', 's', 's', 'h',                             // PSSH
2218d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        1, 0, 0, 0,                                     // Version
2228d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02, // System ID
2238d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xac, 0xe3, 0x3c, 0x1e, 0x52, 0xe2, 0xfb, 0x4b,
2248d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 7,                                     // Key Count
2258d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // Key ID #1
2268d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x38, 0x39, 0x30, 0x41, 0x42, 0x43, 0x44, 0x45, //   "01234567890ABCDE"
2278d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0, 0, 0, 0                                      // Data Size (always 0)
2288d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
2298d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Vector<uint8_t> initData;
2308d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    initData.appendArray(pssh, 52);
2318d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2328d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptParseExpectingFailure(initData, kCencType);
2338d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
2348d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2358d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}  // namespace clearkeydrm
236