Support Offline Licenses

Bug: 8621588

Merge of the following CLs from the Widevine CDM repository:

https://widevine-internal-review.googlesource.com/#/c/5602/
https://widevine-internal-review.googlesource.com/#/c/5431/
https://widevine-internal-review.googlesource.com/#/c/5660/

Change-Id: If37940e2535e1a1eca95e4394d8cf9bf689e9c3a
This commit is contained in:
Jeff Tinker
2013-05-15 19:23:36 -07:00
parent 898d870126
commit 1b295f4c81
30 changed files with 1647 additions and 471 deletions

View File

@@ -36,14 +36,14 @@ class WvCdmEngineTest : public testing::Test {
const std::string& init_data) {
wvcdm::CdmAppParameterMap app_parameters;
std::string server_url;
std::string key_set_id;
EXPECT_EQ(cdm_engine_.GenerateKeyRequest(session_id_,
true, // is_key_system_present
key_system,
init_data,
kLicenseTypeStreaming,
app_parameters,
&key_msg_,
&server_url), wvcdm::KEY_MESSAGE);
key_set_id,
init_data,
kLicenseTypeStreaming,
app_parameters,
&key_msg_,
&server_url), wvcdm::KEY_MESSAGE);
}
void GenerateRenewalRequest(const std::string& key_system,
@@ -125,7 +125,7 @@ class WvCdmEngineTest : public testing::Test {
return "";
}
url_request.PostRequest(key_msg_);
url_request.PostRequestChunk(key_msg_);
std::string http_response;
std::string message_body;
int resp_bytes = url_request.GetResponse(http_response);
@@ -166,7 +166,9 @@ class WvCdmEngineTest : public testing::Test {
EXPECT_EQ(cdm_engine_.RenewKey(session_id_, resp), wvcdm::KEY_ADDED);
}
else {
EXPECT_EQ(cdm_engine_.AddKey(session_id_, resp), wvcdm::KEY_ADDED);
std::string key_set_id;
EXPECT_EQ(cdm_engine_.AddKey(session_id_, resp, key_set_id),
wvcdm::KEY_ADDED);
}
}

View File

@@ -6,6 +6,136 @@
namespace wvcdm {
namespace {
std::string kKeySetId1 = "ksid05e79dab2750370195d1";
std::string kKeySetId2 = "ksid17fe1e9005934171bbd1";
std::string kKeySetId3 = "ksid2eadb793100566012934";
std::string kPsshData1 = "0801121093789920E8D6520098577DF8F2DD5546";
std::string kPsshData2 = "0801121030313233343536373839616263646566";
std::string kPsshData3 = "08011210e02562e04cd55351b14b3d748d36ed8e";
std::string kKeyRequest1 = "0801128D0C0ACF0B080112EF090AB0020802121007D9FFDE"
"13AA95C122678053362136BD18D6DDC78C05228E023082010A0282010100B2873F12C61"
"8883986B67A404733168D34676EA3261231B4EB12CB6F862AAE529D21B449D78E7A8FBB"
"9CC1A8AE119D89EC571EA23EE92517AFB86EA089E81CF3A773AEDEDFC1979AEE115D657"
"FE372CBF4178E57F60BEDD15491EF28891ED8663437019C0EF5F79FD0ADDAAE87281DD9"
"10ED10356DD6B606C0DD2452343329151BD23A42060869252892BD2C0368787E880F716"
"438E5835BC93FED65D0017D8758E20E5E614B44BAFAF7286484624CC5EB109D85F1C048"
"9B25A75528C0CD23961067192EF65766EAB5E97FE7EBE25D63DDE41BB34048B8A378EAE"
"AEBC86C44AB4AA757F29B48C9476660DCC4EE656EB35AC309213399CBEF38394FE32B88"
"3F9B02030100012899203001128002435CAFA39AD7DC12A40F943FE8DE10C5DD911059D"
"7B0990742E11419B2E6E797EAE46B5D017F0EF3F429AA43E4F570BBE46F56BBCEACBDFA"
"8495E4451249D39D5FEFC4F5557498B233C4C9C101E2388E107582D3C3FBF266AB9FE96"
"A40405A2098583B33D7AD083E105458DF7AE92FD517D538B4671614DA0D167F9661EE0C"
"574AB95A5BE87B1BEE27659D875A37A1730F84033ACB6BCA8D3C575A2692E7390F062BC"
"E1E58D9C621A1A11CB215615ED0C5C12";
std::string kKeyRequest2 = "0801128D0C0ACF0B080112EF090AB0020802121007D9FFDE"
"13AA95C122678053362136BD188BDCC78C05228E023082010A0282010100C53F667AAA8"
"27758D3ABF81DAFA223373473EE13E4C500A09CD35CE2620D5DA0D987A237EBFCE1F793"
"D6F88187749A85B3AF4D737899EF19C3029461E95202E9DF91DD5869FE482FCA17160AF"
"7AC380D03880EBE3EA55B7FB3ED5ED6B9FAD19234AA75BB642A9A86AEF7CDA86F7B2EC7"
"C40C31C380F95C1F3C1564B012D530A7971AA656BBD27DAB715F0D5771FB7608453AF88"
"A331E3E5852F6F9B076A95C807307E541C39216D64B02D180A1009AFB60777EF7C72275"
"033ABD6FDF12145FFD379B6CB25F1127A783A40D65BF95AB74A08E39209EF2C0341A92A"
"217FD223734C7D1F0DC0D5B50FBA521FF1F841D1E5ED18DFC13A6D28E5A0A4FACBE6C78"
"31B5020301000128992030011280022DBC4444671C0C4CF0FBB3BB30C80C78FAFA67223"
"C6FE3F0BB495B1959B7472E8A64BC13838B3FB731FAC0609FEAB325FE8B7358C2F63D5E"
"E6C0380B85DBA3FE207B9D6AE7C31467A36A9E8D3D786CC4C383BC2774131D6C099D06D"
"052ED13A4545A0026A4FC949DE3B79D1C0C6A0D581A3D3598E46D3E4AC827C94045D693"
"37CAF103CC8839EA7FF020C0721AB17B140640C5E31C1727073CA48F445DA5EE55521D8"
"85732BAA17BD672B62C717ADBC13F235";
std::string kKeyRequest3 = "0801128D0C0ACF0B080112EF090AB0020802121007D9FFDE"
"13AA95C122678053362136BD18D6DDC78C05228E023082010A0282010100B2873F12C61"
"8883986B67A404733168D34676EA3261231B4EB12CB6F862AAE529D21B449D78E7A8FBB"
"9CC1A8AE119D89EC571EA23EE92517AFB86EA089E81CF3A773AEDEDFC1979AEE115D657"
"FE372CBF4178E57F60BEDD15491EF28891ED8663437019C0EF5F79FD0ADDAAE87281DD9"
"10ED10356DD6B606C0DD2452343329151BD23A42060869252892BD2C0368787E880F716"
"438E5835BC93FED65D0017D8758E20E5E614B44BAFAF7286484624CC5EB109D85F1C048"
"9B25A75528C0CD23961067192EF65766EAB5E97FE7EBE25D63DDE41BB34048B8A378EAE"
"AEBC86C44AB4AA757F29B48C9476660DCC4EE656EB35AC309213399CBEF38394FE32B88"
"3F9B02030100012899203001128002435CAFA39AD7DC12A40F943FE8DE10C5DD911059D"
"7B0990742E11419B2E6E797EAE46B5D017F0EF3F429AA43E4F570BBE46F56BBCEACBDFA"
"8495E4451249D39D5FEFC4F5557498B233C4C9C101E2388E107582D3C3FBF266AB9FE96"
"A40405A2098583B33D7AD083E105458DF7AE92FD517D538B4671614DA0D167F9661EE0C"
"574AB95A5BE87B1BEE27659D875A37A1730F84033ACB6BCA8D3C575A2692E7390F062BC"
"E1E58D9C621A1A11CB215615ED0C5C12";
std::string kKeyResponse1 = "080212C2040A460A0939383736353433323112086D03DC5"
"FD3BB58031A2B596E4B58753250316A5F53785073494E6B377459354E7967396755464B"
"6963455954335A34626738366C77200128001283010801180120809A9E0128809A9E013"
"0AC02426C68747470733A2F2F6A6D7431372E676F6F676C652E636F6D2F766964656F2D"
"6465762F6865617274626561742F63656E633F736F757263653D594F555455424526766"
"964656F5F69643D45474843364F484E624F6F266F617574683D79612E67747371617769"
"646576696E65483C503C1A661210EBA4B8B97E17DC6C45D359222B9327121A50583647C"
"BC8240C2760A79DC72DF7FC0216C0943F12307B9AAED429277A6D0024F93CCA17B7F2BA"
"C19875E041F12E6729A98E0DFF2EA9806D6C20AF801A5A3E19DAF918FC9AF230C8765DF"
"B5BE869DF7320011A80010A10E02562E04CD55351B14B3D748D36ED8E12107C9AC11A9D"
"39304821C47969729A43321A2077E79664AF73B13FC6C55B5B9B2000E174E94F7D9E9BB"
"B58A547A82FAAAF46182002280242340A202031C7ADB3C2F80975499E285CEE0AF8343A"
"F3DF50A49EEBCCEB3747C955FEFB12107E021073F71CF814A9CCAA7008B38CD81A80010"
"A100065901A64A25899A5193664ABF9AF621210874AB758C27A29677D62D2EE092905E2"
"1A207C4AD3CB7A80740215598D5E74883";
std::string kKeyResponse2 = "080212C2040A460A0939383736353433323112080C1913B"
"45E8893481A2B596E4B58753250316A5F53785073494E6B377459354E7967396755464B"
"6963455954335A34626738366C77200128001283010801180120809A9E0128809A9E013"
"0AC02426C68747470733A2F2F6A6D7431372E676F6F676C652E636F6D2F766964656F2D"
"6465762F6865617274626561742F63656E633F736F757263653D594F555455424526766"
"964656F5F69643D45474843364F484E624F6F266F617574683D79612E67747371617769"
"646576696E65483C503C1A661210A2B662DC43891A32E65E0CC31CD597B21A50046489D"
"7EE8A674A4976800FD0553075498F90FD1997A63AECFF3481BF5CA908502676FA7E7E6B"
"02179FE6C42FAE7351EF85C8494BBE0782CB4C7A5AA6E439590C2D39DD5DB2B1A3DA91E"
"3D43FA5ABDD20011A80010A10E02562E04CD55351B14B3D748D36ED8E1210B0EF7CC3B2"
"0E10F4F704DBCF3142AB611A20F684136083E458C6B2977DB4D1FC559F2AFF2C454FEDF"
"CD68F29D50D351D58DC2002280242340A20223C0E4281615524569AF90EC3BE98349B27"
"0016C5DCC4CFDF11CB55C9DCFB231210888EF5E2311B3B3407549903D8F30D771A80010"
"A100065901A64A25899A5193664ABF9AF621210F38F473DC71703C52CC970FCACFA2111"
"1A20067E176521B6176A97157EDB9D06C";
std::string kKeyResponse3 = "080212C2040A460A0939383736353433323112086D03DC5"
"FD3BB58031A2B596E4B58753250316A5F53785073494E6B377459354E7967396755464B"
"6963455954335A34626738366C77200128001283010801180120809A9E0128809A9E013"
"0AC02426C68747470733A2F2F6A6D7431372E676F6F676C652E636F6D2F766964656F2D"
"6465762F6865617274626561742F63656E633F736F757263653D594F555455424526766"
"964656F5F69643D45474843364F484E624F6F266F617574683D79612E67747371617769"
"646576696E65483C503C1A661210EBA4B8B97E17DC6C45D359222B9327121A50583647C"
"BC8240C2760A79DC72DF7FC0216C0943F12307B9AAED429277A6D0024F93CCA17B7F2BA"
"C19875E041F12E6729A98E0DFF2EA9806D6C20AF801A5A3E19DAF918FC9AF230C8765DF"
"B5BE869DF7320011A80010A10E02562E04CD55351B14B3D748D36ED8E12107C9AC11A9D"
"39304821C47969729A43321A2077E79664AF73B13FC6C55B5B9B2000E174E94F7D9E9BB"
"B58A547A82FAAAF46182002280242340A202031C7ADB3C2F80975499E285CEE0AF8343A"
"F3DF50A49EEBCCEB3747C955FEFB12107E021073F71CF814A9CCAA7008B38CD81A80010"
"A100065901A64A25899A5193664ABF9AF621210874AB758C27A29677D62D2EE092905E2"
"1A207C4AD3CB7A80740215598D5E74883";
std::string kKeyRenewalRequest1 = "";
std::string kKeyRenewalRequest2 = "0801125E124A1A480A460A0939383736353433323"
"112080C1913B45E8893481A2B596E4B58753250316A5F53785073494E6B377459354E79"
"67396755464B6963455954335A34626738366C772001280018022A0C383231353639373"
"13400000030151A20789770161DD09DD5210E1A399DCA51C7741D2FC83488B731D22F4C"
"B01E74D240";
std::string kKeyRenewalRequest3 = "0801125E124A1A480A460A0939383736353433323"
"112086D03DC5FD3BB58031A2B596E4B58753250316A5F53785073494E6B377459354E79"
"67396755464B6963455954335A34626738366C772001280018022A0C313736393630363"
"23739000030151A209ABDAF1E996DFED08BF64B71356DAD8244BFAD335749206C2A1749"
"61CB15B9AD";
std::string kKeyRenewalResponse1 = "";
std::string kKeyRenewalResponse2 = "";
std::string kKeyRenewalResponse3 = "080212EC010A460A093938373635343332311208"
"6D03DC5FD3BB58031A2B596E4B58753250316A5F53785073494E6B377459354E7967396"
"755464B6963455954335A34626738366C77200128011283010801180120809A9E012880"
"9A9E0130AC02426C68747470733A2F2F6A6D7431372E676F6F676C652E636F6D2F76696"
"4656F2D6465762F6865617274626561742F63656E633F736F757263653D594F55545542"
"4526766964656F5F69643D45474843364F484E624F6F266F617574683D79612E6774737"
"1617769646576696E65483C503C1A16200342120A106B63746C0000012C697A0C870000"
"000820E3DDC78C051A20466E04142A0F410F5BA032BD8B0B77C800E9972C707E034E2ED"
"E83661C6C5386";
std::string kKeyReleaseServerUrl1 = "http://hamid.kir.corp.google.com:8888/drm";
std::string kKeyReleaseServerUrl2 = "https://www.youtube.com/api/drm/widevine?video_id=03681262dc412c06&source=YOUTUBE";
std::string kKeyReleaseServerUrl3 = "https://jmt17.google.com/video-dev/license/GetCencLicense";
}
TEST(DeviceFilesTest, StoreCertificate) {
std::string device_base_path =
DeviceFiles::GetBasePath(DeviceFiles::kBasePath);
@@ -93,4 +223,341 @@ TEST(DeviceFilesTest, RetrieveCertificate) {
EXPECT_TRUE(File::Remove(device_base_path));
}
TEST(DeviceFilesTest, StoreLicense) {
std::string device_base_path =
DeviceFiles::GetBasePath(DeviceFiles::kBasePath);
std::string license_path_1 = device_base_path + kKeySetId1 +
DeviceFiles::kLicenseFileNameExt;
if (!File::Exists(device_base_path))
EXPECT_TRUE(File::CreateDirectory(device_base_path));
if (File::Exists(license_path_1))
EXPECT_TRUE(File::Remove(license_path_1));
EXPECT_TRUE(DeviceFiles::StoreLicense(kKeySetId1,
DeviceFiles::kLicenseStateActive,
kPsshData1, kKeyRequest1,
kKeyResponse1, kKeyRenewalRequest1,
kKeyRenewalResponse1,
kKeyReleaseServerUrl1));
size_t size = sizeof(DeviceFiles::LicenseState) + kPsshData1.size() +
kKeyRequest1.size() + kKeyResponse1.size() +
kKeyRenewalRequest1.size() + kKeyRenewalResponse1.size() +
kKeyReleaseServerUrl1.size();
EXPECT_TRUE(File::Exists(license_path_1));
EXPECT_GT(File::FileSize(license_path_1), static_cast<ssize_t>(size));
}
TEST(DeviceFilesTest, StoreLicenseInitial) {
std::string device_base_path =
DeviceFiles::GetBasePath(DeviceFiles::kBasePath);
std::string license_path_1 = device_base_path + kKeySetId1 +
DeviceFiles::kLicenseFileNameExt;
if (!File::Exists(device_base_path))
EXPECT_TRUE(File::Remove(device_base_path));
EXPECT_TRUE(DeviceFiles::StoreLicense(kKeySetId1,
DeviceFiles::kLicenseStateActive,
kPsshData1, kKeyRequest1,
kKeyResponse1, kKeyRenewalRequest1,
kKeyRenewalResponse1,
kKeyReleaseServerUrl1));
size_t size = sizeof(DeviceFiles::LicenseState) + kPsshData1.size() +
kKeyRequest1.size() + kKeyResponse1.size() +
kKeyRenewalRequest1.size() + kKeyRenewalResponse1.size() +
kKeyReleaseServerUrl1.size();
EXPECT_TRUE(File::Exists(license_path_1));
EXPECT_GT(File::FileSize(license_path_1), static_cast<ssize_t>(size));
}
TEST(DeviceFilesTest, StoreLicenses) {
std::string device_base_path =
DeviceFiles::GetBasePath(DeviceFiles::kBasePath);
std::string license_path_1 = device_base_path + kKeySetId1 +
DeviceFiles::kLicenseFileNameExt;
std::string license_path_2 = device_base_path + kKeySetId2 +
DeviceFiles::kLicenseFileNameExt;
std::string license_path_3 = device_base_path + kKeySetId3 +
DeviceFiles::kLicenseFileNameExt;
if (!File::Exists(device_base_path))
EXPECT_TRUE(File::Remove(device_base_path));
EXPECT_TRUE(DeviceFiles::StoreLicense(kKeySetId1,
DeviceFiles::kLicenseStateActive,
kPsshData1, kKeyRequest1,
kKeyResponse1, kKeyRenewalRequest1,
kKeyRenewalResponse1,
kKeyReleaseServerUrl1));
size_t size = sizeof(DeviceFiles::LicenseState) + kPsshData1.size() +
kKeyRequest1.size() + kKeyResponse1.size() +
kKeyRenewalRequest1.size() + kKeyRenewalResponse1.size() +
kKeyReleaseServerUrl1.size();
EXPECT_TRUE(File::Exists(license_path_1));
EXPECT_GT(File::FileSize(license_path_1), static_cast<ssize_t>(size));
EXPECT_TRUE(DeviceFiles::StoreLicense(kKeySetId2,
DeviceFiles::kLicenseStateReleasing,
kPsshData2, kKeyRequest2,
kKeyResponse2, kKeyRenewalRequest2,
kKeyRenewalResponse2,
kKeyReleaseServerUrl2));
size = sizeof(DeviceFiles::LicenseState) + kPsshData2.size() +
kKeyRequest2.size() + kKeyResponse2.size() +
kKeyRenewalRequest2.size() + kKeyRenewalResponse2.size() +
kKeyReleaseServerUrl2.size();
EXPECT_TRUE(File::Exists(license_path_2));
EXPECT_GT(File::FileSize(license_path_2), static_cast<ssize_t>(size));
EXPECT_TRUE(DeviceFiles::StoreLicense(kKeySetId3,
DeviceFiles::kLicenseStateReleasing,
kPsshData3, kKeyRequest3,
kKeyResponse3, kKeyRenewalRequest3,
kKeyRenewalResponse3,
kKeyReleaseServerUrl3));
size = sizeof(DeviceFiles::LicenseState) + kPsshData3.size() +
kKeyRequest3.size() + kKeyResponse3.size() +
kKeyRenewalRequest3.size() + kKeyRenewalResponse3.size() +
kKeyReleaseServerUrl3.size();
EXPECT_TRUE(File::Exists(license_path_3));
EXPECT_GT(File::FileSize(license_path_3), static_cast<ssize_t>(size));
}
TEST(DeviceFilesTest, RetrieveLicenses) {
std::string device_base_path =
DeviceFiles::GetBasePath(DeviceFiles::kBasePath);
std::string license_path_1 = device_base_path + kKeySetId1 +
DeviceFiles::kLicenseFileNameExt;
std::string license_path_2 = device_base_path + kKeySetId2 +
DeviceFiles::kLicenseFileNameExt;
std::string license_path_3 = device_base_path + kKeySetId3 +
DeviceFiles::kLicenseFileNameExt;
if (!File::Exists(device_base_path))
EXPECT_TRUE(File::Remove(device_base_path));
EXPECT_TRUE(DeviceFiles::StoreLicense(kKeySetId1,
DeviceFiles::kLicenseStateActive,
kPsshData1, kKeyRequest1,
kKeyResponse1, kKeyRenewalRequest1,
kKeyRenewalResponse1,
kKeyReleaseServerUrl1));
size_t size = sizeof(DeviceFiles::LicenseState) + kPsshData1.size() +
kKeyRequest1.size() + kKeyResponse1.size() +
kKeyRenewalRequest1.size() + kKeyRenewalResponse1.size() +
kKeyReleaseServerUrl1.size();
EXPECT_TRUE(File::Exists(license_path_1));
EXPECT_GT(File::FileSize(license_path_1), static_cast<ssize_t>(size));
EXPECT_TRUE(DeviceFiles::StoreLicense(kKeySetId2,
DeviceFiles::kLicenseStateReleasing,
kPsshData2, kKeyRequest2,
kKeyResponse2, kKeyRenewalRequest2,
kKeyRenewalResponse2,
kKeyReleaseServerUrl2));
size = sizeof(DeviceFiles::LicenseState) + kPsshData2.size() +
kKeyRequest2.size() + kKeyResponse2.size() +
kKeyRenewalRequest2.size() + kKeyRenewalResponse2.size() +
kKeyReleaseServerUrl2.size();
EXPECT_TRUE(File::Exists(license_path_2));
EXPECT_GT(File::FileSize(license_path_2), static_cast<ssize_t>(size));
EXPECT_TRUE(DeviceFiles::StoreLicense(kKeySetId3,
DeviceFiles::kLicenseStateReleasing,
kPsshData3, kKeyRequest3,
kKeyResponse3, kKeyRenewalRequest3,
kKeyRenewalResponse3,
kKeyReleaseServerUrl3));
size = sizeof(DeviceFiles::LicenseState) + kPsshData3.size() +
kKeyRequest3.size() + kKeyResponse3.size() +
kKeyRenewalRequest3.size() + kKeyRenewalResponse3.size() +
kKeyReleaseServerUrl3.size();
EXPECT_TRUE(File::Exists(license_path_3));
EXPECT_GT(File::FileSize(license_path_3), static_cast<ssize_t>(size));
DeviceFiles::LicenseState state;
std::string pssh_data, key_request, key_response, key_renewal_request,
key_renewal_response, release_server_url;
EXPECT_TRUE(DeviceFiles::RetrieveLicense(kKeySetId1, &state, &pssh_data,
&key_request, &key_response,
&key_renewal_request,
&key_renewal_response,
&release_server_url));
EXPECT_TRUE(state == DeviceFiles::kLicenseStateActive);
EXPECT_TRUE(memcmp(pssh_data.data(), kPsshData1.data(), pssh_data.size())
== 0);
EXPECT_TRUE(memcmp(key_request.data(), kKeyRequest1.data(),
key_request.size()) == 0);
EXPECT_TRUE(memcmp(key_response.data(), kKeyResponse1.data(),
key_response.size()) == 0);
EXPECT_TRUE(memcmp(key_renewal_request.data(), kKeyRenewalRequest1.data(),
key_renewal_request.size()) == 0);
EXPECT_TRUE(memcmp(key_renewal_response.data(), kKeyRenewalResponse1.data(),
key_renewal_response.size()) == 0);
EXPECT_TRUE(DeviceFiles::RetrieveLicense(kKeySetId2, &state, &pssh_data,
&key_request, &key_response,
&key_renewal_request,
&key_renewal_response,
&release_server_url));
EXPECT_TRUE(state == DeviceFiles::kLicenseStateReleasing);
EXPECT_TRUE(memcmp(pssh_data.data(), kPsshData2.data(), pssh_data.size())
== 0);
EXPECT_TRUE(memcmp(key_request.data(), kKeyRequest2.data(),
key_request.size()) == 0);
EXPECT_TRUE(memcmp(key_response.data(), kKeyResponse2.data(),
key_response.size()) == 0);
EXPECT_TRUE(memcmp(key_renewal_request.data(), kKeyRenewalRequest2.data(),
key_renewal_request.size()) == 0);
EXPECT_TRUE(memcmp(key_renewal_response.data(), kKeyRenewalResponse2.data(),
key_renewal_response.size()) == 0);
EXPECT_TRUE(DeviceFiles::RetrieveLicense(kKeySetId3, &state, &pssh_data,
&key_request, &key_response,
&key_renewal_request,
&key_renewal_response,
&release_server_url));
EXPECT_TRUE(state == DeviceFiles::kLicenseStateReleasing);
EXPECT_TRUE(memcmp(pssh_data.data(), kPsshData3.data(), pssh_data.size())
== 0);
EXPECT_TRUE(memcmp(key_request.data(), kKeyRequest3.data(),
key_request.size()) == 0);
EXPECT_TRUE(memcmp(key_response.data(), kKeyResponse3.data(),
key_response.size()) == 0);
EXPECT_TRUE(memcmp(key_renewal_request.data(), kKeyRenewalRequest3.data(),
key_renewal_request.size()) == 0);
EXPECT_TRUE(memcmp(key_renewal_response.data(), kKeyRenewalResponse3.data(),
key_renewal_response.size()) == 0);
}
TEST(DeviceFilesTest, UpdateLicenseState) {
std::string device_base_path =
DeviceFiles::GetBasePath(DeviceFiles::kBasePath);
std::string license_path_1 = device_base_path + kKeySetId1 +
DeviceFiles::kLicenseFileNameExt;
if (!File::Exists(device_base_path))
EXPECT_TRUE(File::Remove(device_base_path));
EXPECT_TRUE(DeviceFiles::StoreLicense(kKeySetId1,
DeviceFiles::kLicenseStateActive,
kPsshData1, kKeyRequest1,
kKeyResponse1, kKeyRenewalRequest1,
kKeyRenewalResponse1,
kKeyReleaseServerUrl1));
size_t size = sizeof(DeviceFiles::LicenseState) + kPsshData1.size() +
kKeyRequest1.size() + kKeyResponse1.size() +
kKeyRenewalRequest1.size() + kKeyRenewalResponse1.size() +
kKeyReleaseServerUrl1.size();
EXPECT_TRUE(File::Exists(license_path_1));
EXPECT_GT(File::FileSize(license_path_1), static_cast<ssize_t>(size));
DeviceFiles::LicenseState state;
std::string pssh_data, key_request, key_response, key_renewal_request,
key_renewal_response, release_server_url;
EXPECT_TRUE(DeviceFiles::RetrieveLicense(kKeySetId1, &state, &pssh_data,
&key_request, &key_response,
&key_renewal_request,
&key_renewal_response,
&release_server_url));
EXPECT_TRUE(state == DeviceFiles::kLicenseStateActive);
EXPECT_TRUE(memcmp(pssh_data.data(), kPsshData1.data(), pssh_data.size())
== 0);
EXPECT_TRUE(memcmp(key_request.data(), kKeyRequest1.data(),
key_request.size()) == 0);
EXPECT_TRUE(memcmp(key_response.data(), kKeyResponse1.data(),
key_response.size()) == 0);
EXPECT_TRUE(memcmp(key_renewal_request.data(), kKeyRenewalRequest1.data(),
key_renewal_request.size()) == 0);
EXPECT_TRUE(memcmp(key_renewal_response.data(), kKeyRenewalResponse1.data(),
key_renewal_response.size()) == 0);
EXPECT_TRUE(DeviceFiles::StoreLicense(kKeySetId1,
DeviceFiles::kLicenseStateReleasing,
kPsshData1, kKeyRequest1,
kKeyResponse1, kKeyRenewalRequest1,
kKeyRenewalResponse1,
kKeyReleaseServerUrl1));
size = sizeof(DeviceFiles::LicenseState) + kPsshData1.size() +
kKeyRequest1.size() + kKeyResponse1.size() +
kKeyRenewalRequest1.size() + kKeyRenewalResponse1.size() +
kKeyReleaseServerUrl1.size();
EXPECT_TRUE(File::Exists(license_path_1));
EXPECT_GT(File::FileSize(license_path_1), static_cast<ssize_t>(size));
EXPECT_TRUE(DeviceFiles::RetrieveLicense(kKeySetId1, &state, &pssh_data,
&key_request, &key_response,
&key_renewal_request,
&key_renewal_response,
&release_server_url));
EXPECT_TRUE(state == DeviceFiles::kLicenseStateReleasing);
EXPECT_TRUE(memcmp(pssh_data.data(), kPsshData1.data(), pssh_data.size())
== 0);
EXPECT_TRUE(memcmp(key_request.data(), kKeyRequest1.data(),
key_request.size()) == 0);
EXPECT_TRUE(memcmp(key_response.data(), kKeyResponse1.data(),
key_response.size()) == 0);
EXPECT_TRUE(memcmp(key_renewal_request.data(), kKeyRenewalRequest1.data(),
key_renewal_request.size()) == 0);
EXPECT_TRUE(memcmp(key_renewal_response.data(), kKeyRenewalResponse1.data(),
key_renewal_response.size()) == 0);
}
TEST(DeviceFilesTest, DeleteLicense) {
std::string device_base_path =
DeviceFiles::GetBasePath(DeviceFiles::kBasePath);
std::string license_path_1 = device_base_path + kKeySetId1 +
DeviceFiles::kLicenseFileNameExt;
if (!File::Exists(device_base_path))
EXPECT_TRUE(File::Remove(device_base_path));
EXPECT_TRUE(DeviceFiles::StoreLicense(kKeySetId1,
DeviceFiles::kLicenseStateActive,
kPsshData1, kKeyRequest1,
kKeyResponse1, kKeyRenewalRequest1,
kKeyRenewalResponse1,
kKeyReleaseServerUrl1));
size_t size = sizeof(DeviceFiles::LicenseState) + kPsshData1.size() +
kKeyRequest1.size() + kKeyResponse1.size() +
kKeyRenewalRequest1.size() + kKeyRenewalResponse1.size() +
kKeyReleaseServerUrl1.size();
EXPECT_TRUE(File::Exists(license_path_1));
EXPECT_GT(File::FileSize(license_path_1), static_cast<ssize_t>(size));
DeviceFiles::LicenseState state;
std::string pssh_data, key_request, key_response, key_renewal_request,
key_renewal_response, release_server_url;
EXPECT_TRUE(DeviceFiles::RetrieveLicense(kKeySetId1, &state, &pssh_data,
&key_request, &key_response,
&key_renewal_request,
&key_renewal_response,
&release_server_url));
EXPECT_TRUE(state == DeviceFiles::kLicenseStateActive);
EXPECT_TRUE(memcmp(pssh_data.data(), kPsshData1.data(), pssh_data.size())
== 0);
EXPECT_TRUE(memcmp(key_request.data(), kKeyRequest1.data(),
key_request.size()) == 0);
EXPECT_TRUE(memcmp(key_response.data(), kKeyResponse1.data(),
key_response.size()) == 0);
EXPECT_TRUE(memcmp(key_renewal_request.data(), kKeyRenewalRequest1.data(),
key_renewal_request.size()) == 0);
EXPECT_TRUE(memcmp(key_renewal_response.data(), kKeyRenewalResponse1.data(),
key_renewal_response.size()) == 0);
EXPECT_TRUE(DeviceFiles::DeleteLicense(kKeySetId1));
EXPECT_FALSE(DeviceFiles::RetrieveLicense(kKeySetId1, &state, &pssh_data,
&key_request, &key_response,
&key_renewal_request,
&key_renewal_response,
&release_server_url));
EXPECT_TRUE(File::Remove(device_base_path));
}
}

View File

@@ -44,6 +44,10 @@ void LicenseRequest::GetDrmMessage(const std::string& response,
if (drm_msg_pos != std::string::npos) {
drm_msg = response.substr(drm_msg_pos);
} else {
// TODO(edwinwong, rfrias): hack to get HTTP message body out for
// non-Google Play webservers. Need to clean this up. Possibly test
// for GLS and decide which part is the drm message
drm_msg = response.substr(header_end_pos);
LOGE("drm msg not found");
}
} else {

View File

@@ -2,6 +2,8 @@
#include "url_request.h"
#include <sstream>
#include "http_socket.h"
#include "log.h"
#include "string_conversions.h"
@@ -79,7 +81,7 @@ int UrlRequest::GetStatusCode(const std::string& response) {
return status_code;
}
bool UrlRequest::PostRequest(const std::string& data) {
bool UrlRequest::PostRequestChunk(const std::string& data) {
request_.assign("POST /");
request_.append(socket_.resource_path());
request_.append(" HTTP/1.1\r\n");
@@ -103,6 +105,31 @@ bool UrlRequest::PostRequest(const std::string& data) {
return true;
}
bool UrlRequest::PostRequest(const std::string& data) {
request_.assign("POST /");
request_.append(socket_.resource_path());
request_.append(" HTTP/1.1\r\n");
request_.append("Host: ");
request_.append(socket_.domain_name());
request_.append("\r\nConnection: Keep-Alive\r\n");
request_.append("User-Agent: Widevine CDM v1.0\r\n");
request_.append("Accept-Encoding: gzip,deflate\r\n");
request_.append("Accept-Language: en-us,fr\r\n");
request_.append("Accept-Charset: iso-8859-1,*,utf-8\r\n");
std::ostringstream ss;
ss << data.size();
request_.append("Content-Length: ");
request_.append(ss.str());
request_.append("\r\n\r\n");
request_.append(data);
// terminates with \r\n, then ends with an empty line
request_.append("\r\n\r\n");
socket_.Write(request_.c_str(), request_.size());
return true;
}
bool UrlRequest::PostCertRequestInQueryString(const std::string& data) {
request_.assign("POST /");
request_.append(socket_.resource_path());

View File

@@ -21,6 +21,7 @@ class UrlRequest {
int GetStatusCode(const std::string& response);
bool is_connected() const { return is_connected_; }
bool PostRequest(const std::string& data);
bool PostRequestChunk(const std::string& data);
bool PostCertRequestInQueryString(const std::string& data);
private: