Source release 15.0.0
This commit is contained in:
@@ -6,13 +6,14 @@
|
||||
|
||||
#include "test_base.h"
|
||||
|
||||
#include <getopt.h>
|
||||
#include <openssl/aes.h>
|
||||
#include <openssl/bio.h>
|
||||
#include <openssl/cmac.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "cdm_engine.h"
|
||||
#include "crypto_session.h"
|
||||
@@ -21,10 +22,13 @@
|
||||
#include "log.h"
|
||||
#include "oec_device_features.h"
|
||||
#include "oec_test_data.h"
|
||||
#include "platform.h"
|
||||
#include "properties.h"
|
||||
#include "test_printers.h"
|
||||
#include "url_request.h"
|
||||
|
||||
using wvcdm::metrics::EngineMetrics;
|
||||
|
||||
namespace wvcdm {
|
||||
namespace {
|
||||
void show_menu(char* prog_name) {
|
||||
@@ -34,22 +38,20 @@ void show_menu(char* prog_name) {
|
||||
<< std::endl;
|
||||
std::cout << " e.g. adb shell '" << prog_name << " --server=\"url\"'"
|
||||
<< std::endl;
|
||||
std::cout << " or adb shell '" << prog_name << " -u\"url\"'" << std::endl
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " -v/--verbose" << std::endl;
|
||||
std::cout << " --verbose" << std::endl;
|
||||
std::cout << " increase logging verbosity (may be repeated)" << std::endl
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " -f/--no_filter" << std::endl;
|
||||
std::cout << " --no_filter" << std::endl;
|
||||
std::cout << " Do not filter out inappropriate tests" << std::endl
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " -c/--cast" << std::endl;
|
||||
std::cout << " --cast" << std::endl;
|
||||
std::cout << " Run tests appropriate for a Cast Receiver" << std::endl
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " -i/--license_server_id=<gp/cp/st>" << std::endl;
|
||||
std::cout << " --license_server_id=<gp/cp/st>" << std::endl;
|
||||
std::cout << " specifies which default server settings to use: "
|
||||
<< std::endl;
|
||||
std::cout << " gp for GooglePlay server" << std::endl;
|
||||
@@ -57,11 +59,11 @@ void show_menu(char* prog_name) {
|
||||
std::cout << " st for Content Protection Staging server" << std::endl
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " -k/--keyid=<key_id>" << std::endl;
|
||||
std::cout << " --keyid=<key_id>" << std::endl;
|
||||
std::cout << " configure the key id or pssh, in hex format" << std::endl
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " -s/--service_certificate=<cert>" << std::endl;
|
||||
std::cout << " --service_certificate=<cert>" << std::endl;
|
||||
std::cout << " configure the signed license service certificate" << std::endl;
|
||||
std::cout << " Specify the SignedDeviceCertificate (from "
|
||||
<< "device_certificate.proto) " << std::endl;
|
||||
@@ -76,16 +78,16 @@ void show_menu(char* prog_name) {
|
||||
std::cout << " adb shell sh /system/bin/run_request_license_test.sh"
|
||||
<< std::endl << std::endl;
|
||||
|
||||
std::cout << " -S/--provisioning_certificate=<cert>" << std::endl;
|
||||
std::cout << " --provisioning_certificate=<cert>" << std::endl;
|
||||
std::cout << " configure the signed provisioning service certificate" << std::endl
|
||||
<< " in hex" << std::endl << std::endl;
|
||||
|
||||
std::cout << " -u/--license_server_url=<url>" << std::endl;
|
||||
std::cout << " --license_server_url=<url>" << std::endl;
|
||||
std::cout << " configure the license server url, please include http[s]"
|
||||
<< " in the url" << std::endl
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " -p/--provisioning_server_url=<url>" << std::endl;
|
||||
std::cout << " --provisioning_server_url=<url>" << std::endl;
|
||||
std::cout << " configure the provisioning server url, please include http[s]"
|
||||
<< " in the url" << std::endl
|
||||
<< std::endl;
|
||||
@@ -186,25 +188,35 @@ TestCryptoSession::TestCryptoSession(metrics::CryptoMetrics* crypto_metrics)
|
||||
}
|
||||
}
|
||||
|
||||
bool TestCryptoSession::GenerateNonce(uint32_t* nonce) {
|
||||
for (int i = 0; !CryptoSession::GenerateNonce(nonce); i++) {
|
||||
CdmResponseType TestCryptoSession::GenerateNonce(uint32_t* nonce) {
|
||||
CdmResponseType status = CryptoSession::GenerateNonce(nonce);
|
||||
for (int i = 0; status != NO_ERROR; i++) {
|
||||
LOGV("Recovering from nonce flood.");
|
||||
if (i > 2) return false;
|
||||
if (i > 2) return status;
|
||||
sleep(1);
|
||||
status = CryptoSession::GenerateNonce(nonce);
|
||||
}
|
||||
return true;
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
class TestCryptoSessionFactory : public CryptoSessionFactory {
|
||||
CryptoSession* MakeCryptoSession(metrics::CryptoMetrics* crypto_metrics) {
|
||||
// We need to add extra locking here because we need to make sure that there
|
||||
// are no other OEMCrypto calls between OEMCrypto_Initialize and
|
||||
// InstallTestRootOfTrust. OEMCrypto_Initialize is called in the production
|
||||
// CryptoSession::Init and is wrapped in crypto_lock_, but
|
||||
// InstallTestRootOfTrust is only called in the constructor of the
|
||||
// TestCryptoSession, above.
|
||||
std::unique_lock<std::mutex> auto_lock(init_lock_);
|
||||
return new TestCryptoSession(crypto_metrics);
|
||||
}
|
||||
std::mutex init_lock_;
|
||||
};
|
||||
|
||||
void WvCdmTestBase::SetUp() {
|
||||
::testing::Test::SetUp();
|
||||
Properties::set_provisioning_messages_are_binary(binary_provisioning_);
|
||||
Properties::Init();
|
||||
Properties::set_provisioning_messages_are_binary(binary_provisioning_);
|
||||
// Log the current test name, to help with debugging when the log and stdout
|
||||
// are not the same.
|
||||
const ::testing::TestInfo* const test_info =
|
||||
@@ -252,8 +264,10 @@ void WvCdmTestBase::Provision() {
|
||||
|
||||
CdmSessionId session_id;
|
||||
FileSystem file_system;
|
||||
|
||||
// TODO(fredgc): provision for different SPOIDs.
|
||||
CdmEngine cdm_engine(&file_system);
|
||||
CdmEngine cdm_engine(&file_system,
|
||||
std::shared_ptr<EngineMetrics>(new EngineMetrics));
|
||||
|
||||
CdmResponseType result = cdm_engine.GetProvisioningRequest(
|
||||
cert_type, cert_authority, config_.provisioning_service_certificate(),
|
||||
@@ -315,7 +329,8 @@ void WvCdmTestBase::Provision() {
|
||||
void WvCdmTestBase::EnsureProvisioned() {
|
||||
CdmSessionId session_id;
|
||||
FileSystem file_system;
|
||||
CdmEngine cdm_engine(&file_system);
|
||||
CdmEngine cdm_engine(&file_system,
|
||||
std::shared_ptr<EngineMetrics>(new EngineMetrics));
|
||||
CdmResponseType status =
|
||||
cdm_engine.OpenSession(config_.key_system(), NULL, NULL, &session_id);
|
||||
if (status == NEED_PROVISIONING) {
|
||||
@@ -335,77 +350,53 @@ bool WvCdmTestBase::Initialize(int argc, char **argv) {
|
||||
bool force_load_test_keybox = false; // TODO(fredgc): obsolete. remove.
|
||||
bool filter_tests = true;
|
||||
bool show_usage = false;
|
||||
|
||||
static const struct option long_options[] = {
|
||||
{"license_server_id", required_argument, NULL, 'i'},
|
||||
{"keyid", required_argument, NULL, 'k'},
|
||||
{"service_certificate", required_argument, NULL, 's'},
|
||||
{"provisioning_certificate", required_argument, NULL, 'S'},
|
||||
{"license_server_url", required_argument, NULL, 'u'},
|
||||
{"provisioning_server_url", required_argument, NULL, 'p'},
|
||||
{"cast", no_argument, NULL, 'c'},
|
||||
{"no_filter", no_argument, NULL, 'f'},
|
||||
{"verbose", no_argument, NULL, 'v'},
|
||||
{NULL, 0, NULL, '\0'}};
|
||||
|
||||
int option_index = 0;
|
||||
int opt = 0;
|
||||
int verbosity = 0;
|
||||
while ((opt = getopt_long(argc, argv, "i:k:s:S:u:p:cfv", long_options,
|
||||
&option_index)) != -1) {
|
||||
switch (opt) {
|
||||
case 'i': {
|
||||
std::string license_id(optarg);
|
||||
if (!license_id.compare("gp")) {
|
||||
|
||||
// Skip the first element, which is the program name.
|
||||
const std::vector<std::string> args(argv + 1, argv + argc);
|
||||
for (const std::string& arg : args) {
|
||||
if (arg == "--verbose") {
|
||||
++verbosity;
|
||||
} else if (arg == "--no_filter") {
|
||||
filter_tests = false;
|
||||
} else if (arg == "--cast") {
|
||||
is_cast_receiver = true;
|
||||
} else {
|
||||
const auto index = arg.find('=');
|
||||
if (index == std::string::npos) {
|
||||
std::cerr << "Argument values need to be specified using --arg=foo" << std::endl;
|
||||
show_usage = true;
|
||||
break;
|
||||
}
|
||||
|
||||
const std::string arg_prefix = arg.substr(0, index);
|
||||
const std::string arg_value = arg.substr(index + 1);
|
||||
if (arg_prefix == "--license_server_id") {
|
||||
if (arg_value == "gp") {
|
||||
default_config_ = ConfigTestEnv(kGooglePlayServer);
|
||||
} else if (!license_id.compare("cp")) {
|
||||
} else if (arg_value == "cp") {
|
||||
default_config_ = ConfigTestEnv(kContentProtectionUatServer);
|
||||
} else if (!license_id.compare("st")) {
|
||||
} else if (arg_value == "st") {
|
||||
default_config_ = ConfigTestEnv(kContentProtectionStagingServer);
|
||||
} else {
|
||||
std::cout << "Invalid license server id" << optarg << std::endl;
|
||||
std::cerr << "Invalid license server id: " << arg_value << std::endl;
|
||||
show_usage = true;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'k': {
|
||||
std::string key_id(optarg);
|
||||
default_config_.set_key_id(key_id);
|
||||
break;
|
||||
}
|
||||
case 's': {
|
||||
std::string certificate(a2bs_hex(optarg));
|
||||
} else if (arg_prefix == "--keyid") {
|
||||
default_config_.set_key_id(arg_value);
|
||||
} else if (arg_prefix == "--service_certificate") {
|
||||
const std::string certificate(a2bs_hex(arg_value));
|
||||
default_config_.set_license_service_certificate(certificate);
|
||||
break;
|
||||
}
|
||||
case 'S': {
|
||||
std::string certificate(a2bs_hex(optarg));
|
||||
} else if (arg_prefix == "--provisioning_certificate") {
|
||||
const std::string certificate(a2bs_hex(arg_value));
|
||||
default_config_.set_provisioning_service_certificate(certificate);
|
||||
break;
|
||||
}
|
||||
case 'u': {
|
||||
std::string server(optarg);
|
||||
default_config_.set_license_server(server);
|
||||
break;
|
||||
}
|
||||
case 'p': {
|
||||
std::string server(optarg);
|
||||
default_config_.set_provisioning_server(server);
|
||||
break;
|
||||
}
|
||||
case 'c': {
|
||||
is_cast_receiver = true;
|
||||
break;
|
||||
}
|
||||
case 'f': {
|
||||
filter_tests = false;
|
||||
break;
|
||||
}
|
||||
case 'v': {
|
||||
++verbosity;
|
||||
break;
|
||||
}
|
||||
case '?': {
|
||||
} else if (arg_prefix == "--license_server_url") {
|
||||
default_config_.set_license_server(arg_value);
|
||||
} else if (arg_prefix == "--provisioning_server_url") {
|
||||
default_config_.set_provisioning_server(arg_value);
|
||||
} else {
|
||||
std::cerr << "Unknown argument " << arg_prefix << std::endl;
|
||||
show_usage = true;
|
||||
break;
|
||||
}
|
||||
@@ -591,7 +582,6 @@ void TestLicenseHolder::SignAndLoadLicense() {
|
||||
std::string session_key_s(session_key_.begin(), session_key_.end());
|
||||
std::string encrypted_session_key;
|
||||
EXPECT_TRUE(rsa_key_.Encrypt(session_key_s, &encrypted_session_key));
|
||||
|
||||
video_widevine::SignedMessage signed_response;
|
||||
signed_response.set_msg(license_data);
|
||||
signed_response.set_type(video_widevine::SignedMessage_MessageType_LICENSE);
|
||||
@@ -602,8 +592,10 @@ void TestLicenseHolder::SignAndLoadLicense() {
|
||||
signed_response.SerializeToString(&response_data);
|
||||
|
||||
CdmKeySetId key_set_id;
|
||||
CdmLicenseType license_type; // Required for AddKey. Result value ignored.
|
||||
EXPECT_EQ(KEY_ADDED,
|
||||
cdm_engine_->AddKey(session_id_, response_data, &key_set_id));
|
||||
cdm_engine_->AddKey(session_id_, response_data,
|
||||
&license_type, &key_set_id));
|
||||
}
|
||||
|
||||
void TestLicenseHolder::DeriveKeysFromSessionKey() {
|
||||
|
||||
Reference in New Issue
Block a user