Migration from jb-mr2 to master for Widevine CDM
Android development of the widevine CDM has been done on the jb-mr2 branch of the cdm code base. This CL contains a merge of that jb-mr2 work to CDM master, and also reflects the evolution of the common Modular DRM code base since jb-mr2 branched. Change-Id: I1d7e1a12d092c00044a4298261146cb97808d4ef
This commit is contained in:
@@ -24,29 +24,6 @@ std::string g_license_server;
|
||||
std::string g_port;
|
||||
wvcdm::KeyId g_wrong_key_id;
|
||||
int g_use_full_path = 0; // cannot use boolean in getopt_long
|
||||
|
||||
// returns production-rooted certificates that have test bit set, this test
|
||||
// uses this url
|
||||
const std::string kProductionTestProvisioningServerUrl =
|
||||
"https://www.googleapis.com/"
|
||||
"certificateprovisioning/v1exttest/devicecertificates/create"
|
||||
"?key=AIzaSyB-5OLKTx2iU5mko18DfdwK5611JIjbUhE";
|
||||
|
||||
// url returned by GetProvisioningRequest()
|
||||
const std::string kProductionProvisioningServerUrl =
|
||||
"https://www.googleapis.com/"
|
||||
"certificateprovisioning/v1/devicecertificates/create"
|
||||
"?key=AIzaSyB-5OLKTx2iU5mko18DfdwK5611JIjbUhE";
|
||||
|
||||
// TODO(edwinwong, rfrias): refactor to set these parameters though config
|
||||
std::string kServerSdkClientAuth = "";
|
||||
wvcdm::KeyId kServerSdkKeyId = wvcdm::a2bs_hex(
|
||||
"000000347073736800000000"
|
||||
"edef8ba979d64acea3c827dcd51d21ed00000014"
|
||||
"0801121030313233343536373839414243444546");
|
||||
std::string kServerSdkLicenseServer = "http://kir03fcpg174.widevine.net/"
|
||||
"widevine/cgi-bin/drm.cgi";
|
||||
|
||||
} // namespace
|
||||
|
||||
namespace wvcdm {
|
||||
@@ -66,10 +43,11 @@ class TestWvCdmEventListener : public WvCdmEventListener {
|
||||
TestWvCdmEventListener() : WvCdmEventListener() {}
|
||||
virtual void onEvent(const CdmSessionId& id, CdmEventType event) {
|
||||
session_id_ = id;
|
||||
event_type_ = event;
|
||||
event_type_ = event;
|
||||
}
|
||||
CdmSessionId session_id() { return session_id_; };
|
||||
CdmEventType event_type() { return event_type_; };
|
||||
CdmSessionId session_id() { return session_id_; }
|
||||
CdmEventType event_type() { return event_type_; }
|
||||
|
||||
private:
|
||||
CdmSessionId session_id_;
|
||||
CdmEventType event_type_;
|
||||
@@ -88,10 +66,10 @@ class WvCdmRequestLicenseTest : public testing::Test {
|
||||
std::string server_url;
|
||||
std::string key_set_id;
|
||||
EXPECT_EQ(wvcdm::KEY_MESSAGE,
|
||||
decryptor_.GenerateKeyRequest(session_id_, key_set_id, init_data,
|
||||
license_type, app_parameters,
|
||||
&key_msg_, &server_url));
|
||||
EXPECT_EQ(0, static_cast<int>(server_url.size()));
|
||||
decryptor_.GenerateKeyRequest(session_id_, key_set_id, init_data,
|
||||
license_type, app_parameters,
|
||||
&key_msg_, &server_url));
|
||||
EXPECT_EQ(0u, server_url.size());
|
||||
}
|
||||
|
||||
void GenerateRenewalRequest(const std::string& key_system,
|
||||
@@ -101,14 +79,13 @@ class WvCdmRequestLicenseTest : public testing::Test {
|
||||
std::string init_data;
|
||||
wvcdm::CdmAppParameterMap app_parameters;
|
||||
std::string server_url;
|
||||
std::string key_set_id;
|
||||
EXPECT_EQ(wvcdm::KEY_MESSAGE,
|
||||
decryptor_.GenerateKeyRequest(session_id_, key_set_id, init_data,
|
||||
license_type, app_parameters,
|
||||
&key_msg_, &server_url));
|
||||
decryptor_.GenerateKeyRequest(session_id_, key_set_id_, init_data,
|
||||
license_type, app_parameters,
|
||||
&key_msg_, &server_url));
|
||||
// TODO(edwinwong, rfrias): Add tests cases for when license server url
|
||||
// is empty on renewal. Need appropriate key id at the server.
|
||||
EXPECT_NE(0, static_cast<int>(server_url.size()));
|
||||
EXPECT_NE(0u, server_url.size());
|
||||
}
|
||||
|
||||
void GenerateKeyRelease(CdmKeySetId key_set_id) {
|
||||
@@ -117,120 +94,29 @@ class WvCdmRequestLicenseTest : public testing::Test {
|
||||
wvcdm::CdmAppParameterMap app_parameters;
|
||||
std::string server_url;
|
||||
EXPECT_EQ(wvcdm::KEY_MESSAGE,
|
||||
decryptor_.GenerateKeyRequest(session_id, key_set_id, init_data,
|
||||
kLicenseTypeRelease, app_parameters,
|
||||
&key_msg_, &server_url));
|
||||
decryptor_.GenerateKeyRequest(session_id, key_set_id, init_data,
|
||||
kLicenseTypeRelease, app_parameters,
|
||||
&key_msg_, &server_url));
|
||||
}
|
||||
|
||||
void DumpResponse(const std::string& description,
|
||||
const std::string& response) {
|
||||
if (description.empty())
|
||||
return;
|
||||
|
||||
LOGD("%s (%d bytes):", description.c_str(), response.size());
|
||||
|
||||
size_t remaining = response.size();
|
||||
size_t portion = 0;
|
||||
size_t start = 0;
|
||||
while (remaining > 0) {
|
||||
// LOGX may not get to empty its buffer if it is too large,
|
||||
// pick an arbitrary small size to be safe
|
||||
portion = (remaining < 512) ? remaining : 512;
|
||||
LOGD("%s", response.substr(start, portion).c_str());
|
||||
start += portion;
|
||||
remaining -= portion;
|
||||
}
|
||||
LOGD("total bytes dumped(%d)", start);
|
||||
}
|
||||
|
||||
// concatinates all chunks into one blob
|
||||
// TODO (edwinwong) move this function to url_request class as GetMessageBody
|
||||
void ConcatenateChunkedResponse(const std::string http_response,
|
||||
std::string* message_body) {
|
||||
if (http_response.empty())
|
||||
return;
|
||||
|
||||
message_body->clear();
|
||||
const std::string kChunkedTag = "Transfer-Encoding: chunked\r\n\r\n";
|
||||
size_t chunked_tag_pos = http_response.find(kChunkedTag);
|
||||
if (std::string::npos != chunked_tag_pos) {
|
||||
// processes chunked encoding
|
||||
size_t chunk_size = 0;
|
||||
size_t chunk_size_pos = chunked_tag_pos + kChunkedTag.size();
|
||||
sscanf(&http_response[chunk_size_pos], "%x", &chunk_size);
|
||||
if (chunk_size > http_response.size()) {
|
||||
// precaution, in case we misread chunk size
|
||||
LOGE("invalid chunk size %u", chunk_size);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* searches for chunks
|
||||
*
|
||||
* header
|
||||
* chunk size\r\n <-- chunk_size_pos @ beginning of chunk size
|
||||
* chunk data\r\n <-- chunk_pos @ beginning of chunk data
|
||||
* chunk size\r\n
|
||||
* chunk data\r\n
|
||||
* 0\r\n
|
||||
*/
|
||||
const std::string kCrLf = "\r\n";
|
||||
size_t chunk_pos = http_response.find(kCrLf, chunk_size_pos) +
|
||||
kCrLf.size();
|
||||
message_body->assign(&http_response[0], chunk_size_pos);
|
||||
while ((chunk_size > 0) && (std::string::npos != chunk_pos)) {
|
||||
message_body->append(&http_response[chunk_pos], chunk_size);
|
||||
|
||||
// searches for next chunk
|
||||
chunk_size_pos = chunk_pos + chunk_size + kCrLf.size();
|
||||
sscanf(&http_response[chunk_size_pos], "%x", &chunk_size);
|
||||
if (chunk_size > http_response.size()) {
|
||||
// precaution, in case we misread chunk size
|
||||
LOGE("invalid chunk size %u", chunk_size);
|
||||
break;
|
||||
}
|
||||
chunk_pos = http_response.find(kCrLf, chunk_size_pos) + kCrLf.size();
|
||||
}
|
||||
} else {
|
||||
// response is not chunked encoded
|
||||
message_body->assign(http_response);
|
||||
}
|
||||
}
|
||||
|
||||
// posts a request and extracts the drm message from the response
|
||||
// Post a request and extract the drm message from the response
|
||||
std::string GetKeyRequestResponse(const std::string& server_url,
|
||||
const std::string& client_auth,
|
||||
int expected_response) {
|
||||
std::string port;
|
||||
if (server_url.find("https") != std::string::npos) {
|
||||
port.assign("443");
|
||||
} else {
|
||||
port.assign(g_port);
|
||||
}
|
||||
UrlRequest url_request(server_url + client_auth, port);
|
||||
|
||||
// Use secure connection and chunk transfer coding.
|
||||
UrlRequest url_request(server_url + client_auth, g_port, true, true);
|
||||
if (!url_request.is_connected()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// TODO(edwinwong, rfrias): need a cleaner solution to handle
|
||||
// HTTP servers that use chunking vs those that do not
|
||||
if (server_url.compare(kServerSdkLicenseServer) == 0)
|
||||
url_request.PostRequest(key_msg_);
|
||||
else
|
||||
url_request.PostRequestChunk(key_msg_);
|
||||
|
||||
std::string http_response;
|
||||
std::string message_body;
|
||||
int resp_bytes = url_request.GetResponse(http_response);
|
||||
if (resp_bytes) {
|
||||
ConcatenateChunkedResponse(http_response, &message_body);
|
||||
}
|
||||
url_request.PostRequest(key_msg_);
|
||||
std::string message;
|
||||
int resp_bytes = url_request.GetResponse(&message);
|
||||
LOGD("end %d bytes response dump", resp_bytes);
|
||||
LOGD("end %s ", message.c_str());
|
||||
|
||||
// Youtube server returns 400 for invalid message while play server returns
|
||||
// 500, so just test inequity here for invalid message
|
||||
int status_code = url_request.GetStatusCode(message_body);
|
||||
int status_code = url_request.GetStatusCode(message);
|
||||
if (expected_response == 200) {
|
||||
EXPECT_EQ(200, status_code);
|
||||
} else {
|
||||
@@ -240,7 +126,7 @@ class WvCdmRequestLicenseTest : public testing::Test {
|
||||
std::string drm_msg;
|
||||
if (200 == status_code) {
|
||||
LicenseRequest lic_request;
|
||||
lic_request.GetDrmMessage(message_body, drm_msg);
|
||||
lic_request.GetDrmMessage(message, drm_msg);
|
||||
LOGV("drm msg: %u bytes\r\n%s", drm_msg.size(),
|
||||
HexEncode(reinterpret_cast<const uint8_t*>(drm_msg.data()),
|
||||
drm_msg.size()).c_str());
|
||||
@@ -248,61 +134,49 @@ class WvCdmRequestLicenseTest : public testing::Test {
|
||||
return drm_msg;
|
||||
}
|
||||
|
||||
// Posts a request and extracts the signed provisioning message from
|
||||
// Post a request and extract the signed provisioning message from
|
||||
// the HTTP response.
|
||||
std::string GetCertRequestResponse(const std::string& server_url,
|
||||
int expected_response) {
|
||||
std::string port;
|
||||
if (server_url.find("https") != std::string::npos) {
|
||||
port.assign("443");
|
||||
} else {
|
||||
port.assign(g_port);
|
||||
}
|
||||
UrlRequest url_request(server_url, port);
|
||||
|
||||
// Use secure connection and chunk transfer coding.
|
||||
UrlRequest url_request(server_url, g_port, true, true);
|
||||
if (!url_request.is_connected()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
url_request.PostCertRequestInQueryString(key_msg_);
|
||||
std::string http_response;
|
||||
std::string message_body;
|
||||
int resp_bytes = url_request.GetResponse(http_response);
|
||||
if (resp_bytes) {
|
||||
ConcatenateChunkedResponse(http_response, &message_body);
|
||||
}
|
||||
std::string message;
|
||||
int resp_bytes = url_request.GetResponse(&message);
|
||||
LOGD("end %d bytes response dump", resp_bytes);
|
||||
|
||||
// Youtube server returns 400 for invalid message while play server returns
|
||||
// 500, so just test inequity here for invalid message
|
||||
int status_code = url_request.GetStatusCode(message_body);
|
||||
int status_code = url_request.GetStatusCode(message);
|
||||
if (expected_response == 200) {
|
||||
EXPECT_EQ(200, status_code);
|
||||
} else {
|
||||
EXPECT_NE(200, status_code);
|
||||
}
|
||||
return message_body;
|
||||
return message;
|
||||
}
|
||||
|
||||
void VerifyKeyRequestResponse(const std::string& server_url,
|
||||
const std::string& client_auth,
|
||||
std::string& init_data,
|
||||
bool is_renewal) {
|
||||
std::string resp = GetKeyRequestResponse(server_url,
|
||||
client_auth,
|
||||
200);
|
||||
std::string& init_data, bool is_renewal) {
|
||||
std::string resp = GetKeyRequestResponse(server_url, client_auth, 200);
|
||||
|
||||
if (is_renewal) {
|
||||
// TODO application makes a license request, CDM will renew the license
|
||||
// when appropriate
|
||||
EXPECT_EQ(decryptor_.AddKey(session_id_, resp, key_set_id_),
|
||||
wvcdm::KEY_ADDED);
|
||||
}
|
||||
else {
|
||||
EXPECT_EQ(decryptor_.AddKey(session_id_, resp, key_set_id_),
|
||||
wvcdm::KEY_ADDED);
|
||||
EXPECT_EQ(decryptor_.AddKey(session_id_, resp, &key_set_id_),
|
||||
wvcdm::KEY_ADDED);
|
||||
} else {
|
||||
EXPECT_EQ(decryptor_.AddKey(session_id_, resp, &key_set_id_),
|
||||
wvcdm::KEY_ADDED);
|
||||
}
|
||||
}
|
||||
|
||||
wvcdm::ConfigTestEnv config_;
|
||||
wvcdm::WvContentDecryptionModule decryptor_;
|
||||
CdmKeyMessage key_msg_;
|
||||
CdmSessionId session_id_;
|
||||
@@ -311,15 +185,14 @@ class WvCdmRequestLicenseTest : public testing::Test {
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, ProvisioningTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
std::string provisioning_server_url = "";
|
||||
std::string provisioning_server_url;
|
||||
|
||||
EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.GetProvisioningRequest(&key_msg_,
|
||||
&provisioning_server_url));
|
||||
EXPECT_STREQ(provisioning_server_url.data(),
|
||||
kProductionProvisioningServerUrl.data());
|
||||
EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.GetProvisioningRequest(
|
||||
&key_msg_, &provisioning_server_url));
|
||||
EXPECT_EQ(provisioning_server_url, config_.provisioning_server_url());
|
||||
|
||||
std::string response = GetCertRequestResponse(
|
||||
kProductionTestProvisioningServerUrl, 200);
|
||||
std::string response =
|
||||
GetCertRequestResponse(config_.provisioning_test_server_url(), 200);
|
||||
EXPECT_NE(0, static_cast<int>(response.size()));
|
||||
EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.HandleProvisioningResponse(response));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
@@ -327,23 +200,26 @@ TEST_F(WvCdmRequestLicenseTest, ProvisioningTest) {
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, ProvisioningRetryTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
std::string provisioning_server_url = "";
|
||||
std::string provisioning_server_url;
|
||||
|
||||
EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.GetProvisioningRequest(&key_msg_,
|
||||
&provisioning_server_url));
|
||||
EXPECT_STREQ(provisioning_server_url.data(),
|
||||
kProductionProvisioningServerUrl.data());
|
||||
EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.GetProvisioningRequest(
|
||||
&key_msg_, &provisioning_server_url));
|
||||
EXPECT_EQ(provisioning_server_url, config_.provisioning_server_url());
|
||||
|
||||
EXPECT_EQ(wvcdm::NO_ERROR,
|
||||
decryptor_.GetProvisioningRequest(
|
||||
&key_msg_, &provisioning_server_url));
|
||||
EXPECT_STREQ(provisioning_server_url.data(),
|
||||
kProductionProvisioningServerUrl.data());
|
||||
EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.GetProvisioningRequest(
|
||||
&key_msg_, &provisioning_server_url));
|
||||
EXPECT_EQ(provisioning_server_url, config_.provisioning_server_url());
|
||||
|
||||
std::string response = GetCertRequestResponse(
|
||||
kProductionTestProvisioningServerUrl, 200);
|
||||
std::string response =
|
||||
GetCertRequestResponse(config_.provisioning_test_server_url(), 200);
|
||||
EXPECT_NE(0, static_cast<int>(response.size()));
|
||||
EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.HandleProvisioningResponse(response));
|
||||
|
||||
response =
|
||||
GetCertRequestResponse(config_.provisioning_test_server_url(), 200);
|
||||
EXPECT_NE(0, static_cast<int>(response.size()));
|
||||
EXPECT_EQ(wvcdm::UNKNOWN_ERROR,
|
||||
decryptor_.HandleProvisioningResponse(response));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
@@ -372,17 +248,16 @@ TEST_F(WvCdmRequestLicenseTest, AddSteamingKeyTest) {
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, AddKeyOfflineTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
GenerateKeyRequest(g_key_system, kServerSdkKeyId, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(kServerSdkLicenseServer, kServerSdkClientAuth,
|
||||
kServerSdkKeyId, false);
|
||||
GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, RestoreOfflineKeyTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
GenerateKeyRequest(g_key_system, kServerSdkKeyId, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(kServerSdkLicenseServer, kServerSdkClientAuth,
|
||||
kServerSdkKeyId, false);
|
||||
GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
|
||||
CdmKeySetId key_set_id = key_set_id_;
|
||||
EXPECT_FALSE(key_set_id_.empty());
|
||||
decryptor_.CloseSession(session_id_);
|
||||
@@ -395,9 +270,9 @@ TEST_F(WvCdmRequestLicenseTest, RestoreOfflineKeyTest) {
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, ReleaseOfflineKeyTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
GenerateKeyRequest(g_key_system, kServerSdkKeyId, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(kServerSdkLicenseServer, kServerSdkClientAuth,
|
||||
kServerSdkKeyId, false);
|
||||
GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
|
||||
CdmKeySetId key_set_id = key_set_id_;
|
||||
EXPECT_FALSE(key_set_id_.empty());
|
||||
decryptor_.CloseSession(session_id_);
|
||||
@@ -412,15 +287,14 @@ TEST_F(WvCdmRequestLicenseTest, ReleaseOfflineKeyTest) {
|
||||
key_set_id_.clear();
|
||||
GenerateKeyRelease(key_set_id);
|
||||
key_set_id_ = key_set_id;
|
||||
VerifyKeyRequestResponse(kServerSdkLicenseServer, kServerSdkClientAuth,
|
||||
kServerSdkKeyId, false);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, ExpiryOnReleaseOfflineKeyTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
GenerateKeyRequest(g_key_system, kServerSdkKeyId, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(kServerSdkLicenseServer, kServerSdkClientAuth,
|
||||
kServerSdkKeyId, false);
|
||||
GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
|
||||
CdmKeySetId key_set_id = key_set_id_;
|
||||
EXPECT_FALSE(key_set_id_.empty());
|
||||
decryptor_.CloseSession(session_id_);
|
||||
@@ -431,8 +305,8 @@ TEST_F(WvCdmRequestLicenseTest, ExpiryOnReleaseOfflineKeyTest) {
|
||||
CdmSessionId restore_session_id = session_id_;
|
||||
TestWvCdmEventListener listener;
|
||||
EXPECT_TRUE(decryptor_.AttachEventListener(restore_session_id, &listener));
|
||||
EXPECT_EQ(wvcdm::KEY_ADDED, decryptor_.RestoreKey(restore_session_id,
|
||||
key_set_id));
|
||||
EXPECT_EQ(wvcdm::KEY_ADDED,
|
||||
decryptor_.RestoreKey(restore_session_id, key_set_id));
|
||||
|
||||
session_id_.clear();
|
||||
key_set_id_.clear();
|
||||
@@ -442,8 +316,7 @@ TEST_F(WvCdmRequestLicenseTest, ExpiryOnReleaseOfflineKeyTest) {
|
||||
EXPECT_TRUE(listener.session_id().size() != 0);
|
||||
EXPECT_TRUE(listener.session_id().compare(restore_session_id) == 0);
|
||||
EXPECT_TRUE(listener.event_type() == LICENSE_EXPIRED_EVENT);
|
||||
VerifyKeyRequestResponse(kServerSdkLicenseServer, kServerSdkClientAuth,
|
||||
kServerSdkKeyId, false);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
decryptor_.CloseSession(restore_session_id);
|
||||
}
|
||||
|
||||
@@ -459,13 +332,11 @@ TEST_F(WvCdmRequestLicenseTest, StreamingLicenseRenewal) {
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, OfflineLicenseRenewal) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
GenerateKeyRequest(g_key_system, kServerSdkKeyId, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(kServerSdkLicenseServer, kServerSdkClientAuth,
|
||||
kServerSdkKeyId, false);
|
||||
GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
|
||||
GenerateRenewalRequest(g_key_system, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(kServerSdkLicenseServer, kServerSdkClientAuth,
|
||||
kServerSdkKeyId, true);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, true);
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
@@ -476,7 +347,8 @@ TEST_F(WvCdmRequestLicenseTest, QueryKeyStatus) {
|
||||
|
||||
CdmQueryMap query_info;
|
||||
CdmQueryMap::iterator itr;
|
||||
EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.QueryKeyStatus(session_id_, &query_info));
|
||||
EXPECT_EQ(wvcdm::NO_ERROR,
|
||||
decryptor_.QueryKeyStatus(session_id_, &query_info));
|
||||
|
||||
itr = query_info.find(wvcdm::QUERY_KEY_LICENSE_TYPE);
|
||||
ASSERT_TRUE(itr != query_info.end());
|
||||
@@ -507,7 +379,7 @@ TEST_F(WvCdmRequestLicenseTest, QueryKeyStatus) {
|
||||
|
||||
itr = query_info.find(wvcdm::QUERY_KEY_RENEWAL_SERVER_URL);
|
||||
ASSERT_TRUE(itr != query_info.end());
|
||||
EXPECT_LT(0, (int)itr->second.size());
|
||||
EXPECT_LT(0u, itr->second.size());
|
||||
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
@@ -519,13 +391,12 @@ TEST_F(WvCdmRequestLicenseTest, QueryStatus) {
|
||||
|
||||
itr = query_info.find(wvcdm::QUERY_KEY_SECURITY_LEVEL);
|
||||
ASSERT_TRUE(itr != query_info.end());
|
||||
EXPECT_EQ(2, (int)itr->second.size());
|
||||
EXPECT_EQ(wvcdm::QUERY_VALUE_SECURITY_LEVEL_L3.at(0),
|
||||
itr->second.at(0));
|
||||
EXPECT_EQ(2u, itr->second.size());
|
||||
EXPECT_EQ(wvcdm::QUERY_VALUE_SECURITY_LEVEL_L3.at(0), itr->second.at(0));
|
||||
|
||||
itr = query_info.find(wvcdm::QUERY_KEY_DEVICE_ID);
|
||||
ASSERT_TRUE(itr != query_info.end());
|
||||
EXPECT_GT((int)itr->second.size(), 0);
|
||||
EXPECT_GT(itr->second.size(), 0u);
|
||||
|
||||
itr = query_info.find(wvcdm::QUERY_KEY_SYSTEM_ID);
|
||||
ASSERT_TRUE(itr != query_info.end());
|
||||
@@ -536,9 +407,7 @@ TEST_F(WvCdmRequestLicenseTest, QueryStatus) {
|
||||
|
||||
itr = query_info.find(wvcdm::QUERY_KEY_PROVISIONING_ID);
|
||||
ASSERT_TRUE(itr != query_info.end());
|
||||
EXPECT_EQ(16, (int)itr->second.size());
|
||||
|
||||
decryptor_.CloseSession(session_id_);
|
||||
EXPECT_EQ(16u, itr->second.size());
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, QueryKeyControlInfo) {
|
||||
@@ -548,8 +417,8 @@ TEST_F(WvCdmRequestLicenseTest, QueryKeyControlInfo) {
|
||||
|
||||
CdmQueryMap query_info;
|
||||
CdmQueryMap::iterator itr;
|
||||
EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.QueryKeyControlInfo(session_id_,
|
||||
&query_info));
|
||||
EXPECT_EQ(wvcdm::NO_ERROR,
|
||||
decryptor_.QueryKeyControlInfo(session_id_, &query_info));
|
||||
|
||||
uint32_t oem_crypto_session_id;
|
||||
itr = query_info.find(wvcdm::QUERY_KEY_OEMCRYPTO_SESSION_ID);
|
||||
@@ -596,19 +465,14 @@ TEST_F(WvCdmRequestLicenseTest, ClearDecryptionTest) {
|
||||
size_t encrypt_length = data.encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_,
|
||||
data.is_encrypted,
|
||||
data.is_secure,
|
||||
data.key_id,
|
||||
&data.encrypt_data.front(),
|
||||
encrypt_length,
|
||||
data.iv,
|
||||
data.block_offset,
|
||||
&decrypt_buffer.front(),
|
||||
0));
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_.Decrypt(session_id_, data.is_encrypted, data.is_secure,
|
||||
data.key_id, &data.encrypt_data.front(),
|
||||
encrypt_length, data.iv, data.block_offset,
|
||||
&decrypt_buffer.front(), 0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data.decrypt_data.begin(), data.decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
decrypt_buffer.begin()));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
@@ -645,19 +509,14 @@ TEST_F(WvCdmRequestLicenseTest, ClearDecryptionNoKeyTest) {
|
||||
size_t encrypt_length = data.encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_,
|
||||
data.is_encrypted,
|
||||
data.is_secure,
|
||||
data.key_id,
|
||||
&data.encrypt_data.front(),
|
||||
encrypt_length,
|
||||
data.iv,
|
||||
data.block_offset,
|
||||
&decrypt_buffer.front(),
|
||||
0));
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_.Decrypt(session_id_, data.is_encrypted, data.is_secure,
|
||||
data.key_id, &data.encrypt_data.front(),
|
||||
encrypt_length, data.iv, data.block_offset,
|
||||
&decrypt_buffer.front(), 0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data.decrypt_data.begin(), data.decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
decrypt_buffer.begin()));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
@@ -696,131 +555,14 @@ TEST_F(WvCdmRequestLicenseTest, DecryptionTest) {
|
||||
size_t encrypt_length = data.encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_,
|
||||
data.is_encrypted,
|
||||
data.is_secure,
|
||||
data.key_id,
|
||||
&data.encrypt_data.front(),
|
||||
encrypt_length,
|
||||
data.iv,
|
||||
data.block_offset,
|
||||
&decrypt_buffer.front(),
|
||||
0));
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_.Decrypt(session_id_, data.is_encrypted, data.is_secure,
|
||||
data.key_id, &data.encrypt_data.front(),
|
||||
encrypt_length, data.iv, data.block_offset,
|
||||
&decrypt_buffer.front(), 0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data.decrypt_data.begin(), data.decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, OfflineLicenseDecryptionTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
GenerateKeyRequest(g_key_system, kServerSdkKeyId, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(kServerSdkLicenseServer, kServerSdkClientAuth,
|
||||
kServerSdkKeyId, false);
|
||||
|
||||
// key 1, encrypted, 256b
|
||||
DecryptionData data;
|
||||
data.is_encrypted = true;
|
||||
data.is_secure = false;
|
||||
data.key_id = wvcdm::a2bs_hex("30313233343536373839414243444546");
|
||||
data.encrypt_data = wvcdm::a2b_hex(
|
||||
"b6d7d2430aa82b1cb8bd32f02e1f3b2a8d84f9eddf935ced5a6a98022cbb4561"
|
||||
"8346a749fdb336858a64d7169fd0aa898a32891d14c24bed17fdc17fd62b8771"
|
||||
"a8e22e9f093fa0f2aacd293d471b8e886d5ed8d0998ab2fde2d908580ff88c93"
|
||||
"c0f0bbc14867267b3a3955bb6e7d05fca734a3aec3463d786d555cad83536ebe"
|
||||
"4496d934d40df2aba5aea98c1145a2890879568ae31bb8a85d74714a4ad75785"
|
||||
"7488523e697f5fd370eac746d56990a81cc76a178e3d6d65743520cdbc669412"
|
||||
"9e73b86214256c67430cf78662346cab3e2bdd6f095dddf75b7fb3868c5ff5ff"
|
||||
"3e1bbf08d456532ffa9df6e21a8bb2664c2d2a6d47ee78f9a6d53b2f2c8c087c");
|
||||
data.iv = wvcdm::a2b_hex("86856b9409743ca107b043e82068c7b6");
|
||||
data.block_offset = 0;
|
||||
data.decrypt_data = wvcdm::a2b_hex(
|
||||
"cc4a7fed8c5ac6e316e45317805c43e6d62a383ad738219c65e7a259dc12b46a"
|
||||
"d50a3f8ce2facec8eeadff9cfa6b649212b88602b41f6d4c510c05af07fd523a"
|
||||
"e7032634d9f8db5dd652d35f776376c5fc56e7031ed7cb28b72427fd4b367b6d"
|
||||
"8c4eb6e46ed1249de5d24a61aeb08ebd60984c10581042ca8b0ef6bc44ec34a0"
|
||||
"d4a77d68125c9bb1ace6f650e8716540f5b20d6482f7cfdf1b57a9ee9802160c"
|
||||
"a632ce42934347410abc61bb78fba11b093498572de38bca96101ecece455e3b"
|
||||
"5fef6805c44a2609cf97ce0dac7f15695c8058c590eda517f845108b90dfb29c"
|
||||
"e73f3656000399f2fd196bc6fc225f3a7b8f578237751fd485ff070b5289e5cf");
|
||||
|
||||
std::vector<uint8_t> decrypt_buffer;
|
||||
size_t encrypt_length = data.encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_,
|
||||
data.is_encrypted,
|
||||
data.is_secure,
|
||||
data.key_id,
|
||||
&data.encrypt_data.front(),
|
||||
encrypt_length,
|
||||
data.iv,
|
||||
data.block_offset,
|
||||
&decrypt_buffer.front(),
|
||||
0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data.decrypt_data.begin(), data.decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, RestoreOfflineLicenseDecryptionTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
GenerateKeyRequest(g_key_system, kServerSdkKeyId, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(kServerSdkLicenseServer, kServerSdkClientAuth,
|
||||
kServerSdkKeyId, false);
|
||||
CdmKeySetId key_set_id = key_set_id_;
|
||||
EXPECT_FALSE(key_set_id_.empty());
|
||||
decryptor_.CloseSession(session_id_);
|
||||
|
||||
session_id_.clear();
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
EXPECT_EQ(wvcdm::KEY_ADDED, decryptor_.RestoreKey(session_id_, key_set_id));
|
||||
|
||||
// key 1, encrypted, 256b
|
||||
DecryptionData data;
|
||||
data.is_encrypted = true;
|
||||
data.is_secure = false;
|
||||
data.key_id = wvcdm::a2bs_hex("30313233343536373839414243444546");
|
||||
data.encrypt_data = wvcdm::a2b_hex(
|
||||
"b6d7d2430aa82b1cb8bd32f02e1f3b2a8d84f9eddf935ced5a6a98022cbb4561"
|
||||
"8346a749fdb336858a64d7169fd0aa898a32891d14c24bed17fdc17fd62b8771"
|
||||
"a8e22e9f093fa0f2aacd293d471b8e886d5ed8d0998ab2fde2d908580ff88c93"
|
||||
"c0f0bbc14867267b3a3955bb6e7d05fca734a3aec3463d786d555cad83536ebe"
|
||||
"4496d934d40df2aba5aea98c1145a2890879568ae31bb8a85d74714a4ad75785"
|
||||
"7488523e697f5fd370eac746d56990a81cc76a178e3d6d65743520cdbc669412"
|
||||
"9e73b86214256c67430cf78662346cab3e2bdd6f095dddf75b7fb3868c5ff5ff"
|
||||
"3e1bbf08d456532ffa9df6e21a8bb2664c2d2a6d47ee78f9a6d53b2f2c8c087c");
|
||||
data.iv = wvcdm::a2b_hex("86856b9409743ca107b043e82068c7b6");
|
||||
data.block_offset = 0;
|
||||
data.decrypt_data = wvcdm::a2b_hex(
|
||||
"cc4a7fed8c5ac6e316e45317805c43e6d62a383ad738219c65e7a259dc12b46a"
|
||||
"d50a3f8ce2facec8eeadff9cfa6b649212b88602b41f6d4c510c05af07fd523a"
|
||||
"e7032634d9f8db5dd652d35f776376c5fc56e7031ed7cb28b72427fd4b367b6d"
|
||||
"8c4eb6e46ed1249de5d24a61aeb08ebd60984c10581042ca8b0ef6bc44ec34a0"
|
||||
"d4a77d68125c9bb1ace6f650e8716540f5b20d6482f7cfdf1b57a9ee9802160c"
|
||||
"a632ce42934347410abc61bb78fba11b093498572de38bca96101ecece455e3b"
|
||||
"5fef6805c44a2609cf97ce0dac7f15695c8058c590eda517f845108b90dfb29c"
|
||||
"e73f3656000399f2fd196bc6fc225f3a7b8f578237751fd485ff070b5289e5cf");
|
||||
|
||||
std::vector<uint8_t> decrypt_buffer;
|
||||
size_t encrypt_length = data.encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_,
|
||||
data.is_encrypted,
|
||||
data.is_secure,
|
||||
data.key_id,
|
||||
&data.encrypt_data.front(),
|
||||
encrypt_length,
|
||||
data.iv,
|
||||
data.block_offset,
|
||||
&decrypt_buffer.front(),
|
||||
0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data.decrypt_data.begin(), data.decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
|
||||
decrypt_buffer.begin()));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
@@ -887,20 +629,15 @@ TEST_F(WvCdmRequestLicenseTest, SwitchKeyDecryptionTest) {
|
||||
size_t encrypt_length = data[i].encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_,
|
||||
data[i].is_encrypted,
|
||||
data[i].is_secure,
|
||||
data[i].key_id,
|
||||
&data[i].encrypt_data.front(),
|
||||
encrypt_length,
|
||||
data[i].iv,
|
||||
data[i].block_offset,
|
||||
&decrypt_buffer.front(),
|
||||
0));
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.Decrypt(session_id_, data[i].is_encrypted, data[i].is_secure,
|
||||
data[i].key_id, &data[i].encrypt_data.front(),
|
||||
encrypt_length, data[i].iv, data[i].block_offset,
|
||||
&decrypt_buffer.front(), 0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data[i].decrypt_data.begin(),
|
||||
data[i].decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
data[i].decrypt_data.end(), decrypt_buffer.begin()));
|
||||
}
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
@@ -932,19 +669,14 @@ TEST_F(WvCdmRequestLicenseTest, PartialBlockDecryptionTest) {
|
||||
size_t encrypt_length = data.encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_,
|
||||
data.is_encrypted,
|
||||
data.is_secure,
|
||||
data.key_id,
|
||||
&data.encrypt_data.front(),
|
||||
encrypt_length,
|
||||
data.iv,
|
||||
data.block_offset,
|
||||
&decrypt_buffer.front(),
|
||||
0));
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_.Decrypt(session_id_, data.is_encrypted, data.is_secure,
|
||||
data.key_id, &data.encrypt_data.front(),
|
||||
encrypt_length, data.iv, data.block_offset,
|
||||
&decrypt_buffer.front(), 0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data.decrypt_data.begin(), data.decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
decrypt_buffer.begin()));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
@@ -975,16 +707,11 @@ TEST_F(WvCdmRequestLicenseTest, PartialBlockWithOffsetDecryptionTest) {
|
||||
size_t encrypt_length = data.encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_,
|
||||
data.is_encrypted,
|
||||
data.is_secure,
|
||||
data.key_id,
|
||||
&data.encrypt_data.front(),
|
||||
encrypt_length,
|
||||
data.iv,
|
||||
data.block_offset,
|
||||
&decrypt_buffer.front(),
|
||||
0));
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_.Decrypt(session_id_, data.is_encrypted, data.is_secure,
|
||||
data.key_id, &data.encrypt_data.front(),
|
||||
encrypt_length, data.iv, data.block_offset,
|
||||
&decrypt_buffer.front(), 0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data.decrypt_data.begin(), data.decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
@@ -992,6 +719,118 @@ TEST_F(WvCdmRequestLicenseTest, PartialBlockWithOffsetDecryptionTest) {
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, DISABLED_OfflineLicenseDecryptionTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
|
||||
/*
|
||||
// key 1, encrypted, 256b
|
||||
DecryptionData data;
|
||||
data.is_encrypted = true;
|
||||
data.is_secure = false;
|
||||
data.key_id = wvcdm::a2bs_hex("30313233343536373839414243444546");
|
||||
data.encrypt_data = wvcdm::a2b_hex(
|
||||
"b6d7d2430aa82b1cb8bd32f02e1f3b2a8d84f9eddf935ced5a6a98022cbb4561"
|
||||
"8346a749fdb336858a64d7169fd0aa898a32891d14c24bed17fdc17fd62b8771"
|
||||
"a8e22e9f093fa0f2aacd293d471b8e886d5ed8d0998ab2fde2d908580ff88c93"
|
||||
"c0f0bbc14867267b3a3955bb6e7d05fca734a3aec3463d786d555cad83536ebe"
|
||||
"4496d934d40df2aba5aea98c1145a2890879568ae31bb8a85d74714a4ad75785"
|
||||
"7488523e697f5fd370eac746d56990a81cc76a178e3d6d65743520cdbc669412"
|
||||
"9e73b86214256c67430cf78662346cab3e2bdd6f095dddf75b7fb3868c5ff5ff"
|
||||
"3e1bbf08d456532ffa9df6e21a8bb2664c2d2a6d47ee78f9a6d53b2f2c8c087c");
|
||||
data.iv = wvcdm::a2b_hex("86856b9409743ca107b043e82068c7b6");
|
||||
data.block_offset = 0;
|
||||
data.decrypt_data = wvcdm::a2b_hex(
|
||||
"cc4a7fed8c5ac6e316e45317805c43e6d62a383ad738219c65e7a259dc12b46a"
|
||||
"d50a3f8ce2facec8eeadff9cfa6b649212b88602b41f6d4c510c05af07fd523a"
|
||||
"e7032634d9f8db5dd652d35f776376c5fc56e7031ed7cb28b72427fd4b367b6d"
|
||||
"8c4eb6e46ed1249de5d24a61aeb08ebd60984c10581042ca8b0ef6bc44ec34a0"
|
||||
"d4a77d68125c9bb1ace6f650e8716540f5b20d6482f7cfdf1b57a9ee9802160c"
|
||||
"a632ce42934347410abc61bb78fba11b093498572de38bca96101ecece455e3b"
|
||||
"5fef6805c44a2609cf97ce0dac7f15695c8058c590eda517f845108b90dfb29c"
|
||||
"e73f3656000399f2fd196bc6fc225f3a7b8f578237751fd485ff070b5289e5cf");
|
||||
|
||||
std::vector<uint8_t> decrypt_buffer;
|
||||
size_t encrypt_length = data.encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_,
|
||||
data.is_encrypted,
|
||||
data.is_secure,
|
||||
data.key_id,
|
||||
&data.encrypt_data.front(),
|
||||
encrypt_length,
|
||||
data.iv,
|
||||
data.block_offset,
|
||||
&decrypt_buffer.front(),
|
||||
0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data.decrypt_data.begin(), data.decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
*/
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, DISABLED_RestoreOfflineLicenseDecryptionTest) {
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline);
|
||||
VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false);
|
||||
CdmKeySetId key_set_id = key_set_id_;
|
||||
EXPECT_FALSE(key_set_id_.empty());
|
||||
decryptor_.CloseSession(session_id_);
|
||||
|
||||
session_id_.clear();
|
||||
decryptor_.OpenSession(g_key_system, &session_id_);
|
||||
EXPECT_EQ(wvcdm::KEY_ADDED, decryptor_.RestoreKey(session_id_, key_set_id));
|
||||
/*
|
||||
// key 1, encrypted, 256b
|
||||
DecryptionData data;
|
||||
data.is_encrypted = true;
|
||||
data.is_secure = false;
|
||||
data.key_id = wvcdm::a2bs_hex("30313233343536373839414243444546");
|
||||
data.encrypt_data = wvcdm::a2b_hex(
|
||||
"b6d7d2430aa82b1cb8bd32f02e1f3b2a8d84f9eddf935ced5a6a98022cbb4561"
|
||||
"8346a749fdb336858a64d7169fd0aa898a32891d14c24bed17fdc17fd62b8771"
|
||||
"a8e22e9f093fa0f2aacd293d471b8e886d5ed8d0998ab2fde2d908580ff88c93"
|
||||
"c0f0bbc14867267b3a3955bb6e7d05fca734a3aec3463d786d555cad83536ebe"
|
||||
"4496d934d40df2aba5aea98c1145a2890879568ae31bb8a85d74714a4ad75785"
|
||||
"7488523e697f5fd370eac746d56990a81cc76a178e3d6d65743520cdbc669412"
|
||||
"9e73b86214256c67430cf78662346cab3e2bdd6f095dddf75b7fb3868c5ff5ff"
|
||||
"3e1bbf08d456532ffa9df6e21a8bb2664c2d2a6d47ee78f9a6d53b2f2c8c087c");
|
||||
data.iv = wvcdm::a2b_hex("86856b9409743ca107b043e82068c7b6");
|
||||
data.block_offset = 0;
|
||||
data.decrypt_data = wvcdm::a2b_hex(
|
||||
"cc4a7fed8c5ac6e316e45317805c43e6d62a383ad738219c65e7a259dc12b46a"
|
||||
"d50a3f8ce2facec8eeadff9cfa6b649212b88602b41f6d4c510c05af07fd523a"
|
||||
"e7032634d9f8db5dd652d35f776376c5fc56e7031ed7cb28b72427fd4b367b6d"
|
||||
"8c4eb6e46ed1249de5d24a61aeb08ebd60984c10581042ca8b0ef6bc44ec34a0"
|
||||
"d4a77d68125c9bb1ace6f650e8716540f5b20d6482f7cfdf1b57a9ee9802160c"
|
||||
"a632ce42934347410abc61bb78fba11b093498572de38bca96101ecece455e3b"
|
||||
"5fef6805c44a2609cf97ce0dac7f15695c8058c590eda517f845108b90dfb29c"
|
||||
"e73f3656000399f2fd196bc6fc225f3a7b8f578237751fd485ff070b5289e5cf");
|
||||
|
||||
std::vector<uint8_t> decrypt_buffer;
|
||||
size_t encrypt_length = data.encrypt_data.size();
|
||||
decrypt_buffer.resize(encrypt_length);
|
||||
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_,
|
||||
data.is_encrypted,
|
||||
data.is_secure,
|
||||
data.key_id,
|
||||
&data.encrypt_data.front(),
|
||||
encrypt_length,
|
||||
data.iv,
|
||||
data.block_offset,
|
||||
&decrypt_buffer.front(),
|
||||
0));
|
||||
|
||||
EXPECT_TRUE(std::equal(data.decrypt_data.begin(), data.decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
*/
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
// TODO(rfrias, edwinwong): pending L1 OEMCrypto due to key block handling
|
||||
/*
|
||||
TEST_F(WvCdmRequestLicenseTest, KeyControlBlockDecryptionTest) {
|
||||
@@ -1049,7 +888,7 @@ TEST_F(WvCdmRequestLicenseTest, KeyControlBlockDecryptionTest) {
|
||||
*/
|
||||
} // namespace wvcdm
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
int main(int argc, char** argv) {
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
wvcdm::ConfigTestEnv config;
|
||||
@@ -1065,16 +904,15 @@ int main(int argc, char **argv) {
|
||||
|
||||
int show_usage = 0;
|
||||
static const struct option long_options[] = {
|
||||
{ "use_full_path", no_argument, &g_use_full_path, 0 },
|
||||
{ "keyid", required_argument, NULL, 'k' },
|
||||
{ "port", required_argument, NULL, 'p' },
|
||||
{ "server", required_argument, NULL, 's' },
|
||||
{ NULL, 0, NULL, '\0' }
|
||||
};
|
||||
{"use_full_path", no_argument, &g_use_full_path, 0},
|
||||
{"keyid", required_argument, NULL, 'k'},
|
||||
{"port", required_argument, NULL, 'p'},
|
||||
{"server", required_argument, NULL, 's'}, {NULL, 0, NULL, '\0'}};
|
||||
|
||||
int option_index = 0;
|
||||
int opt = 0;
|
||||
while ((opt = getopt_long(argc, argv, "k:p:s:u", long_options, &option_index)) != -1) {
|
||||
while ((opt = getopt_long(argc, argv, "k:p:s:u", long_options,
|
||||
&option_index)) != -1) {
|
||||
switch (opt) {
|
||||
case 'k': {
|
||||
g_key_id.clear();
|
||||
@@ -1105,8 +943,10 @@ int main(int argc, char **argv) {
|
||||
if (show_usage) {
|
||||
std::cout << std::endl;
|
||||
std::cout << "usage: " << argv[0] << " [options]" << std::endl << std::endl;
|
||||
std::cout << " enclose multiple arguments in '' when using adb shell" << std::endl;
|
||||
std::cout << " e.g. adb shell '" << argv[0] << " --server=\"url\"'" << std::endl << std::endl;
|
||||
std::cout << " enclose multiple arguments in '' when using adb shell"
|
||||
<< std::endl;
|
||||
std::cout << " e.g. adb shell '" << argv[0] << " --server=\"url\"'"
|
||||
<< std::endl << std::endl;
|
||||
|
||||
std::cout << std::setw(30) << std::left << " --port=<connection port>";
|
||||
std::cout << "specifies the port number, in decimal format" << std::endl;
|
||||
@@ -1114,7 +954,9 @@ int main(int argc, char **argv) {
|
||||
std::cout << "default: " << g_port << std::endl;
|
||||
|
||||
std::cout << std::setw(30) << std::left << " --server=<server_url>";
|
||||
std::cout << "configure the license server url, please include http[s] in the url" << std::endl;
|
||||
std::cout
|
||||
<< "configure the license server url, please include http[s] in the url"
|
||||
<< std::endl;
|
||||
std::cout << std::setw(30) << std::left << " ";
|
||||
std::cout << "default: " << license_server << std::endl;
|
||||
|
||||
|
||||
18
libwvdrmengine/cdm/test/test_vectors.h
Normal file
18
libwvdrmengine/cdm/test/test_vectors.h
Normal file
@@ -0,0 +1,18 @@
|
||||
// Copyright 2013 Google Inc. All Rights Reserved.
|
||||
|
||||
// For platform specific test vectors
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace wvcdm {
|
||||
namespace test_vectors {
|
||||
|
||||
// for FileStore unit tests
|
||||
static const std::string kFileExists = "/system/bin/sh";
|
||||
static const std::string kDirExists = "/system/bin";
|
||||
static const std::string kFileDoesNotExist = "/system/bin/enoext";
|
||||
static const std::string kDirDoesNotExist = "/system/bin_enoext";
|
||||
static const std::string kTestDir = "/data/mediadrm/IDM0/";
|
||||
|
||||
} // namespace test_vectors
|
||||
} // namespace wvcdm
|
||||
@@ -21,12 +21,12 @@ LOCAL_C_INCLUDES := \
|
||||
external/gtest/include \
|
||||
external/openssl/include \
|
||||
external/stlport/stlport \
|
||||
$(LOCAL_PATH)/core/test/include \
|
||||
vendor/widevine/libwvdrmengine/test/gmock/include \
|
||||
vendor/widevine/libwvdrmengine/android/cdm/test \
|
||||
vendor/widevine/libwvdrmengine/cdm/core/include \
|
||||
vendor/widevine/libwvdrmengine/cdm/core/test \
|
||||
vendor/widevine/libwvdrmengine/cdm/include \
|
||||
vendor/widevine/libwvdrmengine/oemcrypto/include
|
||||
vendor/widevine/libwvdrmengine/oemcrypto/include \
|
||||
vendor/widevine/libwvdrmengine/test/gmock/include
|
||||
|
||||
LOCAL_C_INCLUDES += external/protobuf/src
|
||||
|
||||
|
||||
Reference in New Issue
Block a user