Update Simulcrypt ECMg
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
#include "media_cas_packager_sdk/public/wv_cas_ca_descriptor.h"
|
||||
|
||||
#include <bitset>
|
||||
#include <vector>
|
||||
|
||||
#include "glog/logging.h"
|
||||
#include "absl/strings/str_cat.h"
|
||||
@@ -21,39 +22,44 @@ namespace cas {
|
||||
namespace {
|
||||
|
||||
// Size of fixed portion of CA descriptor (before any private bytes).
|
||||
static constexpr uint32_t kCaDescriptorBaseSize = 6;
|
||||
constexpr uint32_t kCaDescriptorBaseSize = 6;
|
||||
|
||||
// Size of fixed portion of CA descriptor that follows the length field.
|
||||
// This and the size of any private bytes must be placed in the length field.
|
||||
static constexpr uint32_t kCaDescriptorBasePostLengthSize = 4;
|
||||
constexpr uint32_t kCaDescriptorBasePostLengthSize = 4;
|
||||
|
||||
// Bitfield lengths for the CA descriptor fields
|
||||
static constexpr int kNumBitsCaDescriptorTagField = 8;
|
||||
static constexpr int kNumBitsCaDescriptorLengthField = 8;
|
||||
static constexpr int kNumBitsCaSystemIdField = 16;
|
||||
static constexpr int kNumBitsCaDescriptorReservedField = 3;
|
||||
static constexpr int kNumBitsCaDescriptorPidField = 13;
|
||||
constexpr int kNumBitsCaDescriptorTagField = 8;
|
||||
constexpr int kNumBitsCaDescriptorLengthField = 8;
|
||||
constexpr int kNumBitsCaSystemIdField = 16;
|
||||
constexpr int kNumBitsCaDescriptorReservedField = 3;
|
||||
constexpr int kNumBitsCaDescriptorPidField = 13;
|
||||
|
||||
// Bitfield constants for the CA descriptor fields.
|
||||
|
||||
// CA descriptor tag value, from table 2-45.
|
||||
static constexpr uint32_t kCaDescriptorTag = 9;
|
||||
constexpr uint32_t kCaDescriptorTag = 9;
|
||||
|
||||
// CA System ID for Widevine. From table in
|
||||
// https://en.wikipedia.org/wiki/Conditional_access
|
||||
static constexpr uint32_t kWidevineCaSystemId = 0x4AD4;
|
||||
constexpr uint32_t kWidevineCaSystemId = 0x4AD4;
|
||||
|
||||
// Value for CA descriptor reserved field should be set to 1.
|
||||
static constexpr uint32_t kReservedBit = 0x0007;
|
||||
constexpr uint32_t kReservedBit = 0x0007;
|
||||
|
||||
// The range of valid PIDs, from section 2.4.3.3, and table 2-3.
|
||||
static constexpr uint32_t kMinValidPID = 0x0010;
|
||||
static constexpr uint32_t kMaxValidPID = 0x1FFE;
|
||||
constexpr uint32_t kMinValidPID = 0x0010;
|
||||
constexpr uint32_t kMaxValidPID = 0x1FFE;
|
||||
|
||||
// Maximum number of entitlement key ids shown in private data.
|
||||
constexpr uint32_t kMaxNumOfEntitlementKeyIds = 2;
|
||||
// Entitlement key id length is fixed to 16 bytes.
|
||||
constexpr uint16_t kEntitlementKeyIdLength = 16;
|
||||
} // namespace
|
||||
|
||||
Status WvCasCaDescriptor::GenerateCaDescriptor(
|
||||
uint16_t ca_pid, const std::string& provider, const std::string& content_id,
|
||||
const std::vector<std::string>& entitlement_key_ids,
|
||||
std::string* serialized_ca_desc) const {
|
||||
if (serialized_ca_desc == nullptr) {
|
||||
return {error::INVALID_ARGUMENT,
|
||||
@@ -62,10 +68,25 @@ Status WvCasCaDescriptor::GenerateCaDescriptor(
|
||||
if (ca_pid < kMinValidPID || ca_pid > kMaxValidPID) {
|
||||
return {error::INVALID_ARGUMENT, "PID value is out of the valid range."};
|
||||
}
|
||||
if (entitlement_key_ids.size() > kMaxNumOfEntitlementKeyIds) {
|
||||
return {error::INVALID_ARGUMENT,
|
||||
absl::StrCat("Number of entitlement key ids shouldn't exceed ",
|
||||
kMaxNumOfEntitlementKeyIds)};
|
||||
}
|
||||
for (const auto& entitlement_key_id : entitlement_key_ids) {
|
||||
if (entitlement_key_id.size() != kEntitlementKeyIdLength) {
|
||||
return {error::INVALID_ARGUMENT,
|
||||
absl::StrCat("Entitlement key id length must be ",
|
||||
kEntitlementKeyIdLength,
|
||||
". The offending key id is ", entitlement_key_id)};
|
||||
}
|
||||
}
|
||||
|
||||
std::string private_data = "";
|
||||
// Field of Entitlement_key_ids could be empty.
|
||||
if (!provider.empty() && !content_id.empty()) {
|
||||
private_data = GeneratePrivateData(provider, content_id);
|
||||
private_data =
|
||||
GeneratePrivateData(provider, content_id, entitlement_key_ids);
|
||||
}
|
||||
|
||||
const size_t descriptor_length =
|
||||
@@ -107,10 +128,14 @@ size_t WvCasCaDescriptor::CaDescriptorBaseSize() const {
|
||||
}
|
||||
|
||||
std::string WvCasCaDescriptor::GeneratePrivateData(
|
||||
const std::string& provider, const std::string& content_id) const {
|
||||
const std::string& provider, const std::string& content_id,
|
||||
const std::vector<std::string>& entitlement_key_ids) const {
|
||||
CaDescriptorPrivateData private_data;
|
||||
private_data.set_provider(provider);
|
||||
private_data.set_content_id(content_id);
|
||||
for (const auto& entitlement_key_id : entitlement_key_ids) {
|
||||
private_data.add_entitlement_key_ids(entitlement_key_id);
|
||||
}
|
||||
return private_data.SerializeAsString();
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <stddef.h>
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <cstdint>
|
||||
#include "common/status.h"
|
||||
@@ -48,6 +49,9 @@ class WvCasCaDescriptor {
|
||||
// |ca_pid| the 13-bit PID of the ECMs
|
||||
// |provider| provider name, put in private data for client to construct pssh
|
||||
// |content_id| content ID, put in private data for client to construct pssh
|
||||
// |entitlement_key_ids| entitlement key ids, put in private data for client
|
||||
// to select entitlement keys from single fat license. This field is only used
|
||||
// when client uses single fat license.
|
||||
// |serialized_ca_desc| a std::string object to receive the encoded descriptor.
|
||||
//
|
||||
// Notes:
|
||||
@@ -55,10 +59,10 @@ class WvCasCaDescriptor {
|
||||
// section (for an EMM stream) or into a TS Program Map Table section (for an
|
||||
// ECM stream). The descriptor will be 6 bytes plus any bytes added as
|
||||
// (user-defined) private data.
|
||||
virtual Status GenerateCaDescriptor(uint16_t ca_pid,
|
||||
const std::string& provider,
|
||||
const std::string& content_id,
|
||||
std::string* serialized_ca_desc) const;
|
||||
virtual Status GenerateCaDescriptor(
|
||||
uint16_t ca_pid, const std::string& provider, const std::string& content_id,
|
||||
const std::vector<std::string>& entitlement_key_ids,
|
||||
std::string* serialized_ca_desc) const;
|
||||
|
||||
// Return the base size (before private data is added) of the CA
|
||||
// descriptor. The user can call this to plan the layout of the Table section
|
||||
@@ -66,8 +70,9 @@ class WvCasCaDescriptor {
|
||||
virtual size_t CaDescriptorBaseSize() const;
|
||||
|
||||
// Return private data in the CA descriptor.
|
||||
virtual std::string GeneratePrivateData(const std::string& provider,
|
||||
const std::string& content_id) const;
|
||||
virtual std::string GeneratePrivateData(
|
||||
const std::string& provider, const std::string& content_id,
|
||||
const std::vector<std::string>& entitlement_key_ids) const;
|
||||
};
|
||||
|
||||
} // namespace cas
|
||||
|
||||
@@ -20,9 +20,11 @@ namespace cas {
|
||||
namespace {
|
||||
|
||||
// Random value for PID
|
||||
static constexpr int kTestPid = 50;
|
||||
static constexpr char kProvider[] = "widevine_test";
|
||||
static constexpr char kContentId[] = "1234";
|
||||
constexpr int kTestPid = 50;
|
||||
constexpr char kProvider[] = "widevine_test";
|
||||
constexpr char kContentId[] = "1234";
|
||||
const std::vector<std::string>* const kEntitlementKeyIds =
|
||||
new std::vector<std::string>({"fakekey1fakekey1", "fakekey2fakekey2"});
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -31,6 +33,7 @@ class WvCasCaDescriptorTest : public Test {
|
||||
WvCasCaDescriptorTest() {}
|
||||
WvCasCaDescriptor ca_descriptor_;
|
||||
std::string actual_ca_descriptor_;
|
||||
std::vector<std::string> entitlement_key_ids_;
|
||||
};
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, BaseSize) {
|
||||
@@ -38,38 +41,46 @@ TEST_F(WvCasCaDescriptorTest, BaseSize) {
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, BasicGoodGen) {
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(kTestPid, "", "",
|
||||
&actual_ca_descriptor_));
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(
|
||||
kTestPid, /*provider=*/"", /*content_id=*/"", /*entitlement_key_ids=*/{},
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x04\x4a\xd4\xE0\x32", 6);
|
||||
EXPECT_EQ(expected_ca_descriptor, actual_ca_descriptor_);
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, NoReturnStringFail) {
|
||||
EXPECT_EQ(error::INVALID_ARGUMENT,
|
||||
ca_descriptor_.GenerateCaDescriptor(kTestPid, "", "", nullptr)
|
||||
ca_descriptor_
|
||||
.GenerateCaDescriptor(
|
||||
kTestPid, /*provider=*/"", /*content_id=*/"",
|
||||
/*entitlement_key_ids=*/{}, /*serialized_ca_desc=*/nullptr)
|
||||
.error_code());
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PidTooLowFail) {
|
||||
const uint32_t bad_pid = 0x10 - 1;
|
||||
EXPECT_EQ(error::INVALID_ARGUMENT,
|
||||
ca_descriptor_
|
||||
.GenerateCaDescriptor(bad_pid, "", "", &actual_ca_descriptor_)
|
||||
.error_code());
|
||||
EXPECT_EQ(
|
||||
error::INVALID_ARGUMENT,
|
||||
ca_descriptor_
|
||||
.GenerateCaDescriptor(bad_pid, /*provider=*/"", /*content_id=*/"",
|
||||
entitlement_key_ids_, &actual_ca_descriptor_)
|
||||
.error_code());
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PidMinOK) {
|
||||
const uint32_t min_pid = 0x10;
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(min_pid, "", "",
|
||||
&actual_ca_descriptor_));
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(
|
||||
min_pid, /*provider=*/"", /*content_id=*/"", /*entitlement_key_ids=*/{},
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x04\x4a\xd4\xE0\x10", 6);
|
||||
EXPECT_EQ(expected_ca_descriptor, actual_ca_descriptor_);
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PidMaxOK) {
|
||||
const uint32_t max_pid = 0x1FFE;
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(max_pid, "", "",
|
||||
&actual_ca_descriptor_));
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(
|
||||
max_pid, /*provider=*/"", /*content_id=*/"", /*entitlement_key_ids=*/{},
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x04\x4a\xd4\xff\xfe");
|
||||
EXPECT_EQ(expected_ca_descriptor, actual_ca_descriptor_);
|
||||
}
|
||||
@@ -78,83 +89,93 @@ TEST_F(WvCasCaDescriptorTest, PidTooHighFail) {
|
||||
const uint32_t bad_pid = 0x1FFF;
|
||||
EXPECT_EQ(error::INVALID_ARGUMENT,
|
||||
ca_descriptor_
|
||||
.GenerateCaDescriptor(bad_pid, "", "", &actual_ca_descriptor_)
|
||||
.GenerateCaDescriptor(
|
||||
bad_pid, /*provider=*/"", /*content_id=*/"",
|
||||
/*entitlement_key_ids=*/{}, &actual_ca_descriptor_)
|
||||
.error_code());
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PidOneByte) {
|
||||
EXPECT_OK(
|
||||
ca_descriptor_.GenerateCaDescriptor(255, "", "", &actual_ca_descriptor_));
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(
|
||||
255, /*provider=*/"", /*content_id=*/"", /*entitlement_key_ids=*/{},
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x04\x4a\xd4\xe0\xff", 6);
|
||||
EXPECT_EQ(expected_ca_descriptor, actual_ca_descriptor_);
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PidSecondByte) {
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(0x1F00, "", "",
|
||||
&actual_ca_descriptor_));
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(
|
||||
0x1F00, /*provider=*/"", /*content_id=*/"", /*entitlement_key_ids=*/{},
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x04\x4a\xd4\xff\x00", 6);
|
||||
EXPECT_EQ(expected_ca_descriptor, actual_ca_descriptor_);
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PidTwelveBits) {
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(0xFFF, "", "",
|
||||
&actual_ca_descriptor_));
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(
|
||||
0xFFF, /*provider=*/"", /*content_id=*/"", /*entitlement_key_ids=*/{},
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x04\x4a\xd4\xef\xff");
|
||||
EXPECT_EQ(expected_ca_descriptor, actual_ca_descriptor_);
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PidThirteenthBit) {
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(0x1000, "", "",
|
||||
&actual_ca_descriptor_));
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(
|
||||
0x1000, /*provider=*/"", /*content_id=*/"", /*entitlement_key_ids=*/{},
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x04\x4a\xd4\xf0\x00", 6);
|
||||
EXPECT_EQ(expected_ca_descriptor, actual_ca_descriptor_);
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PidTwelthBit) {
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(0x800, "", "",
|
||||
&actual_ca_descriptor_));
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(
|
||||
0x800, /*provider=*/"", /*content_id=*/"", /*entitlement_key_ids=*/{},
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x04\x4a\xd4\xe8\x00", 6);
|
||||
EXPECT_EQ(expected_ca_descriptor, actual_ca_descriptor_);
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PidElevenththBit) {
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(0x400, "", "",
|
||||
&actual_ca_descriptor_));
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(
|
||||
0x400, /*provider=*/"", /*content_id=*/"", /*entitlement_key_ids=*/{},
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x04\x4a\xd4\xe4\x00", 6);
|
||||
EXPECT_EQ(expected_ca_descriptor, actual_ca_descriptor_);
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PidTenthBit) {
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(0x200, "", "",
|
||||
&actual_ca_descriptor_));
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(
|
||||
0x200, /*provider=*/"", /*content_id=*/"", /*entitlement_key_ids=*/{},
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x04\x4a\xd4\xe2\x00", 6);
|
||||
EXPECT_EQ(expected_ca_descriptor, actual_ca_descriptor_);
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PidNinthBit) {
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(0x100, "", "",
|
||||
&actual_ca_descriptor_));
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(
|
||||
0x100, /*provider=*/"", /*content_id=*/"", /*entitlement_key_ids=*/{},
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x04\x4a\xd4\xe1\x00", 6);
|
||||
EXPECT_EQ(expected_ca_descriptor, actual_ca_descriptor_);
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PrivateDataOnlyProviderIgnored) {
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(kTestPid, kProvider, "",
|
||||
&actual_ca_descriptor_));
|
||||
TEST_F(WvCasCaDescriptorTest, PrivateDataWithNoContentIdIgnored) {
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(
|
||||
kTestPid, kProvider, "", entitlement_key_ids_, &actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x04\x4a\xd4\xe0\x32", 6);
|
||||
EXPECT_EQ(expected_ca_descriptor, actual_ca_descriptor_);
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PrivateDataOnlyContentIdIgnored) {
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(kTestPid, "", kContentId,
|
||||
&actual_ca_descriptor_));
|
||||
TEST_F(WvCasCaDescriptorTest, PrivateDataWithNoProviderIgnored) {
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(
|
||||
kTestPid, "", kContentId, entitlement_key_ids_, &actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x04\x4a\xd4\xe0\x32", 6);
|
||||
EXPECT_EQ(expected_ca_descriptor, actual_ca_descriptor_);
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PrivateData) {
|
||||
TEST_F(WvCasCaDescriptorTest, PrivateDataWithNoEntitlementKeyIds) {
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(kTestPid, kProvider, kContentId,
|
||||
&actual_ca_descriptor_));
|
||||
{}, &actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x19\x4a\xd4\xe0\x32", 6);
|
||||
CaDescriptorPrivateData private_data;
|
||||
private_data.set_provider(kProvider);
|
||||
@@ -163,6 +184,44 @@ TEST_F(WvCasCaDescriptorTest, PrivateData) {
|
||||
actual_ca_descriptor_);
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest,
|
||||
PrivateDataFailedWhenNumberOfEntitlementKeyIdsExceedLimit) {
|
||||
const std::vector<std::string> entitlement_key_ids = {
|
||||
"fakekey1fakekey1", "fakekey2fakekey2", "fakekey3fakekey3"};
|
||||
Status status = {error::INVALID_ARGUMENT,
|
||||
"Number of entitlement key ids shouldn't exceed 2"};
|
||||
EXPECT_EQ(status, ca_descriptor_.GenerateCaDescriptor(
|
||||
kTestPid, kProvider, kContentId, entitlement_key_ids,
|
||||
&actual_ca_descriptor_));
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest,
|
||||
PrivateDataFailedWhenEntitlementKeyIdLengthExceedLimit) {
|
||||
const std::vector<std::string> entitlement_key_ids = {
|
||||
"fakekey1fakekey1", "fakekey2fakekey2fakekey2"};
|
||||
Status status = {error::INVALID_ARGUMENT,
|
||||
"Entitlement key id length must be 16. The offending key id "
|
||||
"is fakekey2fakekey2fakekey2"};
|
||||
EXPECT_EQ(status, ca_descriptor_.GenerateCaDescriptor(
|
||||
kTestPid, kProvider, kContentId, entitlement_key_ids,
|
||||
&actual_ca_descriptor_));
|
||||
}
|
||||
|
||||
TEST_F(WvCasCaDescriptorTest, PrivateData) {
|
||||
EXPECT_OK(ca_descriptor_.GenerateCaDescriptor(kTestPid, kProvider, kContentId,
|
||||
*kEntitlementKeyIds,
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x3d\x4a\xd4\xe0\x32", 6);
|
||||
CaDescriptorPrivateData private_data;
|
||||
private_data.set_provider(kProvider);
|
||||
private_data.set_content_id(kContentId);
|
||||
for (const auto& entitlementKeyId : *kEntitlementKeyIds) {
|
||||
private_data.add_entitlement_key_ids(entitlementKeyId);
|
||||
}
|
||||
EXPECT_EQ(expected_ca_descriptor + private_data.SerializeAsString(),
|
||||
actual_ca_descriptor_);
|
||||
}
|
||||
|
||||
class FakePrivateDataCaDescriptor : public WvCasCaDescriptor {
|
||||
public:
|
||||
void set_private_data(std::string private_data) {
|
||||
@@ -170,8 +229,8 @@ class FakePrivateDataCaDescriptor : public WvCasCaDescriptor {
|
||||
}
|
||||
|
||||
std::string GeneratePrivateData(
|
||||
const std::string& provider,
|
||||
const std::string& content_id) const override {
|
||||
const std::string& provider, const std::string& content_id,
|
||||
const std::vector<std::string>& entitlement_key_ids) const override {
|
||||
return private_data_;
|
||||
}
|
||||
|
||||
@@ -183,7 +242,8 @@ TEST_F(WvCasCaDescriptorTest, PrivateDataOneByte) {
|
||||
FakePrivateDataCaDescriptor fake_descriptor;
|
||||
fake_descriptor.set_private_data("X");
|
||||
EXPECT_OK(fake_descriptor.GenerateCaDescriptor(
|
||||
kTestPid, kProvider, kContentId, &actual_ca_descriptor_));
|
||||
kTestPid, kProvider, kContentId, *kEntitlementKeyIds,
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x05\x4a\xd4\xe0\x32X", 7);
|
||||
EXPECT_EQ(expected_ca_descriptor, actual_ca_descriptor_);
|
||||
}
|
||||
@@ -193,7 +253,8 @@ TEST_F(WvCasCaDescriptorTest, PrivateDataMultipleBytes) {
|
||||
FakePrivateDataCaDescriptor fake_descriptor;
|
||||
fake_descriptor.set_private_data(private_data_bytes);
|
||||
EXPECT_OK(fake_descriptor.GenerateCaDescriptor(
|
||||
kTestPid, kProvider, kContentId, &actual_ca_descriptor_));
|
||||
kTestPid, kProvider, kContentId, *kEntitlementKeyIds,
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\x0e\x4a\xd4\xe0\x32", 6);
|
||||
EXPECT_EQ(expected_ca_descriptor + private_data_bytes, actual_ca_descriptor_);
|
||||
}
|
||||
@@ -203,7 +264,8 @@ TEST_F(WvCasCaDescriptorTest, PrivateDataMaxNumberBytes) {
|
||||
FakePrivateDataCaDescriptor fake_descriptor;
|
||||
fake_descriptor.set_private_data(private_data_bytes);
|
||||
EXPECT_OK(fake_descriptor.GenerateCaDescriptor(
|
||||
kTestPid, kProvider, kContentId, &actual_ca_descriptor_));
|
||||
kTestPid, kProvider, kContentId, *kEntitlementKeyIds,
|
||||
&actual_ca_descriptor_));
|
||||
const std::string expected_ca_descriptor("\x09\xff\x4a\xd4\xe0\x32", 6);
|
||||
EXPECT_EQ(expected_ca_descriptor + private_data_bytes, actual_ca_descriptor_);
|
||||
}
|
||||
@@ -212,11 +274,12 @@ TEST_F(WvCasCaDescriptorTest, PrivateDataTooManyBytesFail) {
|
||||
const std::string private_data_bytes(252, 'X');
|
||||
FakePrivateDataCaDescriptor fake_descriptor;
|
||||
fake_descriptor.set_private_data(private_data_bytes);
|
||||
EXPECT_EQ(error::INVALID_ARGUMENT,
|
||||
fake_descriptor
|
||||
.GenerateCaDescriptor(kTestPid, kProvider, kContentId,
|
||||
&actual_ca_descriptor_)
|
||||
.error_code());
|
||||
EXPECT_EQ(
|
||||
error::INVALID_ARGUMENT,
|
||||
fake_descriptor
|
||||
.GenerateCaDescriptor(kTestPid, kProvider, kContentId,
|
||||
*kEntitlementKeyIds, &actual_ca_descriptor_)
|
||||
.error_code());
|
||||
}
|
||||
|
||||
} // namespace cas
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
using testing::_;
|
||||
using testing::DoAll;
|
||||
using testing::Return;
|
||||
using testing::SetArgumentPointee;
|
||||
using testing::SetArgPointee;
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -59,9 +59,10 @@ class HardcodedWvCasKeyFetcher : public WvCasKeyFetcher {
|
||||
const std::string& signing_iv)
|
||||
: WvCasKeyFetcher(signing_provider, signing_key, signing_iv) {}
|
||||
~HardcodedWvCasKeyFetcher() override {}
|
||||
MOCK_CONST_METHOD2(MakeHttpRequest,
|
||||
Status(const std::string& signed_request_json,
|
||||
std::string* http_response_json));
|
||||
MOCK_METHOD(Status, MakeHttpRequest,
|
||||
(const std::string& signed_request_json,
|
||||
std::string* http_response_json),
|
||||
(const, override));
|
||||
};
|
||||
|
||||
class MockWvCasKeyFetcher : public WvCasKeyFetcher {
|
||||
@@ -168,7 +169,7 @@ TEST_F(WvCasKeyFetcherTest, TestRequestEntitlementKey) {
|
||||
EXPECT_EQ(signed_request_json, kSignedCasEncryptionRequest);
|
||||
|
||||
EXPECT_CALL(mock_key_fetcher, MakeHttpRequest(kSignedCasEncryptionRequest, _))
|
||||
.WillOnce(DoAll(SetArgumentPointee<1>(std::string(kHttpResponse)),
|
||||
.WillOnce(DoAll(SetArgPointee<1>(std::string(kHttpResponse)),
|
||||
Return(OkStatus())));
|
||||
std::string actual_signed_response;
|
||||
EXPECT_OK(mock_key_fetcher.MakeHttpRequest(signed_request_json,
|
||||
|
||||
@@ -43,6 +43,9 @@ ABSL_FLAG(int32_t, data_id, 0, "EMMG data_id.");
|
||||
ABSL_FLAG(int32_t, data_type, 1, "EMMG data_type");
|
||||
ABSL_FLAG(std::string, content_provider, "", "Content provider");
|
||||
ABSL_FLAG(std::string, content_id, "", "Content id");
|
||||
ABSL_FLAG(
|
||||
std::vector<std::string>, entitlement_key_ids, {},
|
||||
"Comma-separated list of entitlement_key_ids to put into private data");
|
||||
ABSL_FLAG(int32_t, bandwidth, 100, "Requested bandwidth in kbps");
|
||||
ABSL_FLAG(int32_t, max_num_message, 100,
|
||||
"Maximum number of messages that can be sent");
|
||||
@@ -59,6 +62,7 @@ void BuildEmmgConfig(widevine::cas::EmmgConfig *config) {
|
||||
config->data_type = absl::GetFlag(FLAGS_data_type);
|
||||
config->content_provider = absl::GetFlag(FLAGS_content_provider);
|
||||
config->content_id = absl::GetFlag(FLAGS_content_id);
|
||||
config->entitlement_key_ids = absl::GetFlag(FLAGS_entitlement_key_ids);
|
||||
config->bandwidth = absl::GetFlag(FLAGS_bandwidth);
|
||||
config->max_num_message = absl::GetFlag(FLAGS_max_num_message);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user