From c0a76558345a1f617c52d18149265ef79e477f48 Mon Sep 17 00:00:00 2001 From: "John W. Bruce" Date: Tue, 11 Apr 2017 11:57:20 -0700 Subject: [PATCH] Maxing Out Sessions Can Cause SPOID Failures (This is a merge of http://go/wvgerrit/25581) To prevent dead DRM Plugins from being instantiated when there are no sessions available, the time at which the device ID is queried has been moved from instantiation-time to SPOID-calculation-time. SPOIDs can now fail to be generated. Which means anything that depends on a SPOID may fail because of this. However, this is a more actionable problem for apps than having them receive a dead or unusable DRM Plugin object. Bug: 36660726 Test: libwvdrmdrmplugin_hidl_test Change-Id: Ice6a8eabfee8d48bf2af02e2e7169aa95af9f2e4 --- .../mediadrm/include_hidl/WVDrmPlugin.h | 27 +++- .../mediadrm/src_hidl/WVDrmPlugin.cpp | 117 ++++++++++------ .../mediadrm/test/WVDrmPlugin_test.cpp | 125 +----------------- 3 files changed, 106 insertions(+), 163 deletions(-) diff --git a/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h b/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h index 11237ead..4e283b2c 100644 --- a/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h +++ b/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h @@ -308,12 +308,21 @@ struct WVDrmPlugin : public IDrmPlugin, IDrmPluginListener, class CdmIdentifierBuilder { public: - CdmIdentifierBuilder(bool useSpoid, const std::string& appPackageName); + CdmIdentifierBuilder(bool useSpoid, const WVDrmPlugin& parent, + const std::string& appPackageName); - const CdmIdentifier& get_identifier(); - const std::string& get_device_unique_id(); + // Fills in the passed-in struct with the CDM Identifier for the current + // combination of Origin, Application, and Device. This is needed by some + // calls into the CDM in order to identify which CDM instance should receive + // the call. Calling this will seal the CDM Identifier Builder, thus making + // it an error to change the origin. + status_t getCdmIdentifier(CdmIdentifier* identifier); - bool set_device_id(const std::string& id); + // Gets the application-safe device-unique ID. On non-SPOID devices, this is + // the device-unique ID from OEMCrypto. On SPOID devices, this is the SPOID. + // On SPOID devices, calling this will seal the CDM Identifier Builder, thus + // making it an error to change the origin. + status_t getDeviceUniqueId(std::string* id); const std::string& origin() const { return mCdmIdentifier.origin; } bool set_origin(const std::string& id); @@ -325,10 +334,16 @@ struct WVDrmPlugin : public IDrmPlugin, IDrmPluginListener, bool mIsIdentifierSealed; bool mUseSpoid; - std::string mDeviceId; std::string mAppPackageName; + const WVDrmPlugin& mParent; - void calculateSpoid(); + status_t calculateSpoid(); + + // Gets the device-unique ID from OEMCrypto. This must be private, since + // this value must not be exposed to applications on SPOID devices. Code + // outside this class should use getDeviceUniqueId() to get the + // application-safe device-unique ID. + status_t getOemcryptoDeviceId(std::string* id); } mCdmIdentifierBuilder; sp const mCDM; diff --git a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp index 116383ed..ab668fa4 100644 --- a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp @@ -104,14 +104,10 @@ WVDrmPlugin::WVDrmPlugin(const sp& cdm, const std::string& appPackageName, WVGenericCryptoInterface* crypto, bool useSpoid) - : mCdmIdentifierBuilder(useSpoid, appPackageName), + : mCdmIdentifierBuilder(useSpoid, *this, appPackageName), mCDM(cdm), mCrypto(crypto), - mCryptoSessions() { - std::string deviceId; - queryProperty(wvcdm::QUERY_KEY_DEVICE_ID, deviceId); - mCdmIdentifierBuilder.set_device_id(deviceId); -} + mCryptoSessions() {} WVDrmPlugin::~WVDrmPlugin() { typedef map::iterator mapIterator; @@ -130,10 +126,16 @@ Return WVDrmPlugin::openSession(openSession_cb _hidl_cb) { status_t status = android::OK; std::vector sessionId; + CdmIdentifier identifier; + status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier); + if (status != android::OK) { + _hidl_cb(toStatus(status), toHidlVec(sessionId)); + return Void(); + } + CdmSessionId cdmSessionId; CdmResponseType res = - mCDM->OpenSession("com.widevine", &mPropertySet, - mCdmIdentifierBuilder.get_identifier(), this, + mCDM->OpenSession("com.widevine", &mPropertySet, identifier, this, &cdmSessionId); if (!isCdmResponseTypeSuccess(res)) { @@ -213,6 +215,14 @@ Return WVDrmPlugin::getKeyRequest( std::vector request; const std::vector scopeId = toVector(scope); + CdmIdentifier identifier; + status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier); + if (status != android::OK) { + _hidl_cb(toStatus(status), toHidlVec(request), requestType, + defaultUrl.c_str()); + return Void(); + } + CdmLicenseType cdmLicenseType; CdmSessionId cdmSessionId; CdmKeySetId cdmKeySetId; @@ -285,8 +295,7 @@ Return WVDrmPlugin::getKeyRequest( CdmKeyRequest keyRequest; CdmResponseType res = mCDM->GenerateKeyRequest( cdmSessionId, cdmKeySetId, cdmInitDataType, processedInitData, - cdmLicenseType, cdmParameters, &mPropertySet, - mCdmIdentifierBuilder.get_identifier(), &keyRequest); + cdmLicenseType, cdmParameters, &mPropertySet, identifier, &keyRequest); requestType = ConvertFromCdmKeyRequestType(keyRequest.type); @@ -431,6 +440,16 @@ Return WVDrmPlugin::restoreKeys(const hidl_vec& sessionId, const hidl_string& certificateType, const hidl_string& certificateAuthority, getProvisionRequest_cb _hidl_cb) { + status_t status = android::OK; + std::string defaultUrl; + std::vector request; + + CdmIdentifier identifier; + status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier); + if (status != android::OK) { + _hidl_cb(toStatus(status), toHidlVec(request), hidl_string(defaultUrl)); + return Void(); + } CdmProvisioningRequest cdmProvisionRequest; std::string cdmDefaultUrl; @@ -443,10 +462,8 @@ Return WVDrmPlugin::restoreKeys(const hidl_vec& sessionId, std::string cdmCertAuthority = certificateAuthority; CdmResponseType res = mCDM->GetProvisioningRequest( - cdmCertType, cdmCertAuthority, mCdmIdentifierBuilder.get_identifier(), - &cdmProvisionRequest, &cdmDefaultUrl); - std::string defaultUrl; - std::vector request; + cdmCertType, cdmCertAuthority, identifier, &cdmProvisionRequest, + &cdmDefaultUrl); if (isCdmResponseTypeSuccess(res)) { request = StrToVector(cdmProvisionRequest); defaultUrl.clear(); @@ -470,14 +487,20 @@ Return WVDrmPlugin::provideProvisionResponse( std::vector certificate; std::vector wrappedKey; + CdmIdentifier identifier; + status_t status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier); + if (status != android::OK) { + _hidl_cb(toStatus(status), toHidlVec(certificate), toHidlVec(wrappedKey)); + } + CdmProvisioningResponse cdmResponse(resp.begin(), resp.end()); if (cdmResponse == kSpecialUnprovisionResponse) { - if (mCdmIdentifierBuilder.get_identifier() == kDefaultCdmIdentifier) { + if (identifier == kDefaultCdmIdentifier) { _hidl_cb(toStatus(kErrorNoOriginSpecified), toHidlVec(certificate), toHidlVec(wrappedKey)); return Void(); } - _hidl_cb(toStatus(unprovision(mCdmIdentifierBuilder.get_identifier())), + _hidl_cb(toStatus(unprovision(identifier)), toHidlVec(certificate), toHidlVec(wrappedKey)); return Void(); @@ -485,8 +508,7 @@ Return WVDrmPlugin::provideProvisionResponse( std::string cdmCertificate; std::string cdmWrappedKey; CdmResponseType res = mCDM->HandleProvisioningResponse( - mCdmIdentifierBuilder.get_identifier(), cdmResponse, &cdmCertificate, - &cdmWrappedKey); + identifier, cdmResponse, &cdmCertificate, &cdmWrappedKey); if (isCdmResponseTypeSuccess(res)) { certificate = StrToVector(cdmCertificate); wrappedKey = StrToVector(cdmWrappedKey); @@ -650,7 +672,11 @@ Return WVDrmPlugin::getPropertyByteArray( std::vector value; if (name == "deviceUniqueId") { - value = StrToVector(mCdmIdentifierBuilder.get_device_unique_id()); + std::string id; + status = mCdmIdentifierBuilder.getDeviceUniqueId(&id); + if (status == android::OK) { + value = StrToVector(id); + } } else if (name == "provisioningUniqueId") { status = queryProperty(wvcdm::QUERY_KEY_PROVISIONING_ID, value); } else if (name == "serviceCertificate") { @@ -1285,31 +1311,36 @@ status_t WVDrmPlugin::unprovision(const CdmIdentifier& identifier) { // Implementation for the CdmIdentifierBuilder inner class WVDrmPlugin::CdmIdentifierBuilder::CdmIdentifierBuilder( - bool useSpoid, const std::string& appPackageName) + bool useSpoid, const WVDrmPlugin& parent, const std::string& appPackageName) : mCdmIdentifier(), mIsIdentifierSealed(false), mUseSpoid(useSpoid), - mDeviceId(), - mAppPackageName(appPackageName) {} + mAppPackageName(appPackageName), + mParent(parent) {} -const CdmIdentifier& WVDrmPlugin::CdmIdentifierBuilder::get_identifier() { - if (!mIsIdentifierSealed) calculateSpoid(); - mIsIdentifierSealed = true; - return mCdmIdentifier; -} +status_t WVDrmPlugin::CdmIdentifierBuilder::getCdmIdentifier( + CdmIdentifier* identifier) { + if (!mIsIdentifierSealed) { + status_t res = calculateSpoid(); + if (res != android::OK) return res; -const std::string& WVDrmPlugin::CdmIdentifierBuilder::get_device_unique_id() { - if (mUseSpoid) { - return get_identifier().spoid; - } else { - return mDeviceId; + mIsIdentifierSealed = true; } + *identifier = mCdmIdentifier; + return android::OK; } -bool WVDrmPlugin::CdmIdentifierBuilder::set_device_id(const std::string& id) { - if (mIsIdentifierSealed) return false; - mDeviceId = id; - return true; +status_t WVDrmPlugin::CdmIdentifierBuilder::getDeviceUniqueId(std::string* id) { + if (mUseSpoid) { + CdmIdentifier identifier; + status_t res = getCdmIdentifier(&identifier); + if (res != android::OK) return res; + + *id = identifier.spoid; + return android::OK; + } else { + return getOemcryptoDeviceId(id); + } } bool WVDrmPlugin::CdmIdentifierBuilder::set_origin(const std::string& id) { @@ -1318,12 +1349,16 @@ bool WVDrmPlugin::CdmIdentifierBuilder::set_origin(const std::string& id) { return true; } -void WVDrmPlugin::CdmIdentifierBuilder::calculateSpoid() { +status_t WVDrmPlugin::CdmIdentifierBuilder::calculateSpoid() { if (mUseSpoid) { + std::string deviceId; + status_t res = getOemcryptoDeviceId(&deviceId); + if (res != android::OK) return res; + uint8_t hash[SHA256_DIGEST_LENGTH]; SHA256_CTX ctx; SHA256_Init(&ctx); - SHA256_Update(&ctx, mDeviceId.data(), mDeviceId.length()); + SHA256_Update(&ctx, deviceId.data(), deviceId.length()); SHA256_Update(&ctx, mAppPackageName.data(), mAppPackageName.length()); SHA256_Update(&ctx, origin().data(), origin().length()); SHA256_Final(hash, &ctx); @@ -1331,6 +1366,12 @@ void WVDrmPlugin::CdmIdentifierBuilder::calculateSpoid() { mCdmIdentifier.spoid = std::string(reinterpret_cast(hash), SHA256_DIGEST_LENGTH); } + return android::OK; +} + +status_t WVDrmPlugin::CdmIdentifierBuilder::getOemcryptoDeviceId( + std::string* id) { + return mParent.queryProperty(wvcdm::QUERY_KEY_DEVICE_ID, *id); } } // namespace widevine diff --git a/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp b/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp index ea8cb105..8b1b5a88 100644 --- a/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp +++ b/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp @@ -114,7 +114,6 @@ const std::string kAppId("com.unittest.mock.app.id"); const uint8_t* const kUnprovisionResponse = reinterpret_cast("unprovision"); const size_t kUnprovisionResponseSize = 11; -const std::string kDeviceId = "0123456789ABCDEF"; } class MockCDM : public WvContentDecryptionModule { @@ -282,9 +281,6 @@ TEST_F(WVDrmPluginTest, OpensSessions) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); EXPECT_CALL(*cdm, OpenSession(StrEq("com.widevine"), _, HasOrigin(EMPTY_ORIGIN), _, _)) @@ -314,9 +310,6 @@ TEST_F(WVDrmPluginTest, ClosesSessions) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); EXPECT_CALL(*cdm, CloseSession(cdmSessionId)) .Times(1); @@ -330,9 +323,6 @@ TEST_F(WVDrmPluginTest, ClosesSessionWithoutReturningError) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); EXPECT_CALL(*cdm, CloseSession(cdmSessionId)) .WillOnce(testing::Return(wvcdm::SESSION_NOT_FOUND_1)); @@ -347,9 +337,6 @@ TEST_F(WVDrmPluginTest, DISABLED_GeneratesKeyRequests) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); static const size_t kInitDataSize = 128; uint8_t initDataRaw[kInitDataSize]; @@ -535,9 +522,6 @@ TEST_F(WVDrmPluginTest, AddsKeys) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); static const uint32_t kResponseSize = 256; uint8_t responseRaw[kResponseSize]; @@ -591,9 +575,6 @@ TEST_F(WVDrmPluginTest, HandlesPrivacyCertCaseOfAddKey) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); sp > listener = new StrictMock(); @@ -662,9 +643,6 @@ TEST_F(WVDrmPluginTest, RemovesKeys) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); EXPECT_CALL(*cdm, RemoveKeys(cdmSessionId)) .Times(1); @@ -678,9 +656,6 @@ TEST_F(WVDrmPluginTest, RestoresKeys) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); static const size_t kKeySetIdSize = 32; uint8_t keySetIdRaw[kKeySetIdSize]; @@ -704,9 +679,6 @@ TEST_F(WVDrmPluginTest, QueriesKeyStatus) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); std::map expectedLicenseStatus; CdmQueryMap cdmLicenseStatus; @@ -747,9 +719,6 @@ TEST_F(WVDrmPluginTest, GetsProvisioningRequests) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); static const uint32_t kRequestSize = 256; uint8_t requestRaw[kRequestSize]; @@ -783,9 +752,6 @@ TEST_F(WVDrmPluginTest, HandlesProvisioningResponses) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); static const uint32_t kResponseSize = 512; uint8_t responseRaw[kResponseSize]; @@ -818,9 +784,6 @@ TEST_F(WVDrmPluginTest, UnprovisionsDevice) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); EXPECT_CALL(*cdm, Unprovision(kSecurityLevelL1, HasOrigin(EMPTY_ORIGIN))) .Times(1); @@ -836,9 +799,6 @@ TEST_F(WVDrmPluginTest, MuxesUnprovisioningErrors) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); // Tests that both Unprovisions are called even if one fails. Also tests that // no matter which fails, the function always propagates the error. @@ -864,9 +824,6 @@ TEST_F(WVDrmPluginTest, UnprovisionsOrigin) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); std::vector cert; std::vector key; @@ -900,9 +857,6 @@ TEST_F(WVDrmPluginTest, WillNotUnprovisionWithoutOrigin) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); std::vector cert; std::vector key; @@ -926,9 +880,6 @@ TEST_F(WVDrmPluginTest, MuxesOriginUnprovisioningErrors) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); std::vector cert; std::vector key; @@ -979,9 +930,6 @@ TEST_F(WVDrmPluginTest, GetsSecureStops) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); static const uint32_t kStopSize = 53; static const uint32_t kStopCount = 7; @@ -1038,9 +986,6 @@ TEST_F(WVDrmPluginTest, ReleasesAllSecureStops) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); EXPECT_CALL(*cdm, ReleaseAllUsageInfo(StrEq(""))) .Times(1); @@ -1059,9 +1004,6 @@ TEST_F(WVDrmPluginTest, ReleasesSecureStop) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); static const uint32_t kMessageSize = 128; uint8_t messageRaw[kMessageSize]; @@ -1085,9 +1027,6 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); CdmQueryMap l1Map; l1Map[QUERY_KEY_SECURITY_LEVEL] = QUERY_VALUE_SECURITY_LEVEL_L1; @@ -1095,6 +1034,7 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { CdmQueryMap l3Map; l3Map[QUERY_KEY_SECURITY_LEVEL] = QUERY_VALUE_SECURITY_LEVEL_L3; + static const std::string deviceId("0123456789\0ABCDEF", 17); static const std::string systemId = "The Universe"; static const std::string provisioningId("Life\0&Everything", 16); static const std::string openSessions = "42"; @@ -1107,6 +1047,10 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { .WillOnce(DoAll(SetArgPointee<2>(QUERY_VALUE_SECURITY_LEVEL_L3), testing::Return(wvcdm::NO_ERROR))); + EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) + .WillOnce(DoAll(SetArgPointee<2>(deviceId), + testing::Return(wvcdm::NO_ERROR))); + EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_SYSTEM_ID, _)) .WillOnce(DoAll(SetArgPointee<2>(systemId), testing::Return(wvcdm::NO_ERROR))); @@ -1174,7 +1118,7 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { [&](Status status, hidl_vec vectorResult) { ASSERT_EQ(Status::OK, status); std::vector id(vectorResult); - EXPECT_THAT(id, ElementsAreArray(kDeviceId.data(), kDeviceId.size())); + EXPECT_THAT(id, ElementsAreArray(deviceId.data(), deviceId.size())); }); plugin.getPropertyString( @@ -1219,9 +1163,6 @@ TEST_F(WVDrmPluginTest, DoesNotGetUnknownProperties) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); WVDrmPlugin plugin(cdm.get(), appPackageName, &crypto, false); std::string stringResult; @@ -1246,9 +1187,6 @@ TEST_F(WVDrmPluginTest, DoesNotSetUnknownProperties) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); static const uint32_t kValueSize = 32; uint8_t valueRaw[kValueSize]; @@ -1273,9 +1211,6 @@ TEST_F(WVDrmPluginTest, FailsGenericMethodsWithoutAnAlgorithmSet) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); std::vector keyId; std::vector input; @@ -1343,9 +1278,6 @@ TEST_F(WVDrmPluginTest, CallsGenericEncrypt) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); static const size_t kDataSize = 256; uint8_t keyIdRaw[KEY_ID_SIZE]; @@ -1414,9 +1346,6 @@ TEST_F(WVDrmPluginTest, CallsGenericDecrypt) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); static const size_t kDataSize = 256; uint8_t keyIdRaw[KEY_ID_SIZE]; @@ -1485,9 +1414,6 @@ TEST_F(WVDrmPluginTest, CallsGenericSign) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); static const size_t kDataSize = 256; uint8_t keyIdRaw[KEY_ID_SIZE]; @@ -1559,9 +1485,6 @@ TEST_F(WVDrmPluginTest, CallsGenericVerify) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); static const size_t kDataSize = 256; static const size_t kSignatureSize = 16; @@ -1649,9 +1572,6 @@ TEST_F(WVDrmPluginTest, RegistersForEvents) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); // Provide expected behavior to support session creation EXPECT_CALL(*cdm, OpenSession(StrEq("com.widevine"), _, _, _, _)) @@ -1676,9 +1596,6 @@ TEST_F(WVDrmPluginTest, UnregistersForAllEventsOnDestruction) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); uint8_t sessionIdRaw1[kSessionIdSize]; uint8_t sessionIdRaw2[kSessionIdSize]; @@ -1723,9 +1640,6 @@ TEST_F(WVDrmPluginTest, DISABLED_MarshalsEvents) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); sp > listener = new StrictMock(); @@ -1810,9 +1724,6 @@ TEST_F(WVDrmPluginTest, DISABLED_GeneratesProvisioningNeededEvent) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); sp > listener = new StrictMock(); @@ -1845,9 +1756,6 @@ TEST_F(WVDrmPluginTest, ProvidesExpectedDefaultPropertiesToCdm) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); const CdmClientPropertySet* propertySet = NULL; @@ -1887,9 +1795,6 @@ TEST_F(WVDrmPluginTest, CanSetAppId) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); const CdmClientPropertySet* propertySet = NULL; @@ -1945,9 +1850,6 @@ TEST_P(WVDrmPluginOriginTest, CanSetOrigin) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); OriginTestVariant params = GetParam(); @@ -1994,9 +1896,6 @@ TEST_F(WVDrmPluginTest, CanSetSecurityLevel) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); const CdmClientPropertySet* propertySet = NULL; @@ -2127,9 +2026,6 @@ TEST_F(WVDrmPluginTest, CanSetPrivacyMode) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); const CdmClientPropertySet* propertySet = NULL; @@ -2181,9 +2077,6 @@ TEST_F(WVDrmPluginTest, CanSetServiceCertificate) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); const CdmClientPropertySet* propertySet = NULL; @@ -2257,9 +2150,6 @@ TEST_F(WVDrmPluginTest, CanSetSessionSharing) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); const CdmClientPropertySet* propertySet = NULL; @@ -2336,9 +2226,6 @@ TEST_F(WVDrmPluginTest, AllowsStoringOfSessionSharingId) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; - EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_DEVICE_ID, _)) - .WillOnce(DoAll(SetArgPointee<2>(kDeviceId), - testing::Return(wvcdm::NO_ERROR))); CdmClientPropertySet* propertySet = NULL;