diff options
Diffstat (limited to 'drm/mediadrm/plugins')
| -rw-r--r-- | drm/mediadrm/plugins/clearkey/ClearKeyUUID.cpp | 11 | ||||
| -rw-r--r-- | drm/mediadrm/plugins/clearkey/DrmPlugin.cpp | 44 | ||||
| -rw-r--r-- | drm/mediadrm/plugins/clearkey/DrmPlugin.h | 17 | ||||
| -rw-r--r-- | drm/mediadrm/plugins/clearkey/InitDataParser.cpp | 2 | ||||
| -rw-r--r-- | drm/mediadrm/plugins/clearkey/tests/Android.bp | 1 | ||||
| -rw-r--r-- | drm/mediadrm/plugins/clearkey/tests/InitDataParserUnittest.cpp | 3 | ||||
| -rw-r--r-- | drm/mediadrm/plugins/clearkey/tests/JsonWebKeyUnittest.cpp | 10 | ||||
| -rw-r--r-- | drm/mediadrm/plugins/mock/Android.bp | 2 |
8 files changed, 70 insertions, 20 deletions
diff --git a/drm/mediadrm/plugins/clearkey/ClearKeyUUID.cpp b/drm/mediadrm/plugins/clearkey/ClearKeyUUID.cpp index ed050f791a..0259a42a15 100644 --- a/drm/mediadrm/plugins/clearkey/ClearKeyUUID.cpp +++ b/drm/mediadrm/plugins/clearkey/ClearKeyUUID.cpp @@ -21,12 +21,19 @@ namespace clearkeydrm { bool isClearKeyUUID(const uint8_t uuid[16]) { - static const uint8_t kClearKeyUUID[16] = { + static const uint8_t kCommonPsshBoxUUID[16] = { 0x10,0x77,0xEF,0xEC,0xC0,0xB2,0x4D,0x02, 0xAC,0xE3,0x3C,0x1E,0x52,0xE2,0xFB,0x4B }; - return !memcmp(uuid, kClearKeyUUID, sizeof(kClearKeyUUID)); + // To be used in mpd to specify drm scheme for players + static const uint8_t kClearKeyUUID[16] = { + 0xE2,0x71,0x9D,0x58,0xA9,0x85,0xB3,0xC9, + 0x78,0x1A,0xB0,0x30,0xAF,0x78,0xD3,0x0E + }; + + return !memcmp(uuid, kCommonPsshBoxUUID, sizeof(kCommonPsshBoxUUID)) || + !memcmp(uuid, kClearKeyUUID, sizeof(kClearKeyUUID)); } } // namespace clearkeydrm diff --git a/drm/mediadrm/plugins/clearkey/DrmPlugin.cpp b/drm/mediadrm/plugins/clearkey/DrmPlugin.cpp index 5fdac5cadf..ec07d87b1c 100644 --- a/drm/mediadrm/plugins/clearkey/DrmPlugin.cpp +++ b/drm/mediadrm/plugins/clearkey/DrmPlugin.cpp @@ -25,10 +25,28 @@ #include "Session.h" +namespace { +const android::String8 kStreaming("Streaming"); +const android::String8 kOffline("Offline"); +const android::String8 kTrue("True"); + +const android::String8 kQueryKeyLicenseType("LicenseType"); + // Value: "Streaming" or "Offline" +const android::String8 kQueryKeyPlayAllowed("PlayAllowed"); + // Value: "True" or "False" +const android::String8 kQueryKeyRenewAllowed("RenewAllowed"); + // Value: "True" or "False" +}; + namespace clearkeydrm { using android::sp; +DrmPlugin::DrmPlugin(SessionLibrary* sessionLibrary) + : mSessionLibrary(sessionLibrary) { + mPlayPolicy.clear(); +} + status_t DrmPlugin::openSession(Vector<uint8_t>& sessionId) { sp<Session> session = mSessionLibrary->createSession(); sessionId = session->sessionId(); @@ -60,18 +78,28 @@ status_t DrmPlugin::getKeyRequest( if (scope.size() == 0) { return android::BAD_VALUE; } + if (keyType != kKeyType_Streaming) { return android::ERROR_DRM_CANNOT_HANDLE; } + *keyRequestType = DrmPlugin::kKeyRequestType_Initial; defaultUrl.clear(); sp<Session> session = mSessionLibrary->findSession(scope); if (!session.get()) { return android::ERROR_DRM_SESSION_NOT_OPENED; } + return session->getKeyRequest(initData, mimeType, &request); } +void DrmPlugin::setPlayPolicy() { + mPlayPolicy.clear(); + mPlayPolicy.add(kQueryKeyLicenseType, kStreaming); + mPlayPolicy.add(kQueryKeyPlayAllowed, kTrue); + mPlayPolicy.add(kQueryKeyRenewAllowed, kTrue); +} + status_t DrmPlugin::provideKeyResponse( const Vector<uint8_t>& scope, const Vector<uint8_t>& response, @@ -83,6 +111,8 @@ status_t DrmPlugin::provideKeyResponse( if (!session.get()) { return android::ERROR_DRM_SESSION_NOT_OPENED; } + + setPlayPolicy(); status_t res = session->provideKeyResponse(response); if (res == android::OK) { // This is for testing AMediaDrm_setOnEventListener only. @@ -111,4 +141,18 @@ status_t DrmPlugin::getPropertyString( return android::OK; } +status_t DrmPlugin::queryKeyStatus( + const Vector<uint8_t>& sessionId, + KeyedVector<String8, String8>& infoMap) const { + + if (sessionId.size() == 0) { + return android::BAD_VALUE; + } + + infoMap.clear(); + for (size_t i = 0; i < mPlayPolicy.size(); ++i) { + infoMap.add(mPlayPolicy.keyAt(i), mPlayPolicy.valueAt(i)); + } + return android::OK; +} } // namespace clearkeydrm diff --git a/drm/mediadrm/plugins/clearkey/DrmPlugin.h b/drm/mediadrm/plugins/clearkey/DrmPlugin.h index 58421b9d01..f37a70699a 100644 --- a/drm/mediadrm/plugins/clearkey/DrmPlugin.h +++ b/drm/mediadrm/plugins/clearkey/DrmPlugin.h @@ -39,8 +39,8 @@ using android::Vector; class DrmPlugin : public android::DrmPlugin { public: - explicit DrmPlugin(SessionLibrary* sessionLibrary) - : mSessionLibrary(sessionLibrary) {} + explicit DrmPlugin(SessionLibrary* sessionLibrary); + virtual ~DrmPlugin() {} virtual status_t openSession(Vector<uint8_t>& sessionId); @@ -81,13 +81,7 @@ public: virtual status_t queryKeyStatus( const Vector<uint8_t>& sessionId, - KeyedVector<String8, String8>& infoMap) const { - if (sessionId.size() == 0) { - return android::BAD_VALUE; - } - UNUSED(infoMap); - return android::ERROR_DRM_CANNOT_HANDLE; - } + KeyedVector<String8, String8>& infoMap) const; virtual status_t getProvisionRequest( const String8& cert_type, @@ -248,9 +242,12 @@ public: } private: - DISALLOW_EVIL_CONSTRUCTORS(DrmPlugin); + void setPlayPolicy(); + android::KeyedVector<android::String8, android::String8> mPlayPolicy; SessionLibrary* mSessionLibrary; + + DISALLOW_EVIL_CONSTRUCTORS(DrmPlugin); }; } // namespace clearkeydrm diff --git a/drm/mediadrm/plugins/clearkey/InitDataParser.cpp b/drm/mediadrm/plugins/clearkey/InitDataParser.cpp index 6a4f8d5695..caff3939be 100644 --- a/drm/mediadrm/plugins/clearkey/InitDataParser.cpp +++ b/drm/mediadrm/plugins/clearkey/InitDataParser.cpp @@ -136,7 +136,7 @@ String8 InitDataParser::generateRequest(const Vector<const uint8_t*>& keyIds) { AString encodedId; for (size_t i = 0; i < keyIds.size(); ++i) { encodedId.clear(); - android::encodeBase64(keyIds[i], kKeyIdSize, &encodedId); + android::encodeBase64Url(keyIds[i], kKeyIdSize, &encodedId); if (i != 0) { request.append(","); } diff --git a/drm/mediadrm/plugins/clearkey/tests/Android.bp b/drm/mediadrm/plugins/clearkey/tests/Android.bp index ac57d653c6..0fcfc6436b 100644 --- a/drm/mediadrm/plugins/clearkey/tests/Android.bp +++ b/drm/mediadrm/plugins/clearkey/tests/Android.bp @@ -34,4 +34,5 @@ cc_test { "libstagefright_foundation", "libutils", ], + header_libs: ["media_plugin_headers"], } diff --git a/drm/mediadrm/plugins/clearkey/tests/InitDataParserUnittest.cpp b/drm/mediadrm/plugins/clearkey/tests/InitDataParserUnittest.cpp index 84ed242246..8c496566cc 100644 --- a/drm/mediadrm/plugins/clearkey/tests/InitDataParserUnittest.cpp +++ b/drm/mediadrm/plugins/clearkey/tests/InitDataParserUnittest.cpp @@ -59,7 +59,7 @@ class InitDataParserTest : public ::testing::Test { (size_t)requestString.find(kRequestSuffix)); for (size_t i = 0; i < expectedKeys.size(); ++i) { AString encodedIdAString; - android::encodeBase64(expectedKeys[i], kKeyIdSize, + android::encodeBase64Url(expectedKeys[i], kKeyIdSize, &encodedIdAString); String8 encodedId(encodedIdAString.c_str()); encodedId.removeAll(kBase64Padding); @@ -231,5 +231,4 @@ TEST_F(InitDataParserTest, FailsForPsshBadKeyCount) { attemptParseExpectingFailure(initData, kCencMimeType); } - } // namespace clearkeydrm diff --git a/drm/mediadrm/plugins/clearkey/tests/JsonWebKeyUnittest.cpp b/drm/mediadrm/plugins/clearkey/tests/JsonWebKeyUnittest.cpp index c3b0d84c61..d9f3ea6703 100644 --- a/drm/mediadrm/plugins/clearkey/tests/JsonWebKeyUnittest.cpp +++ b/drm/mediadrm/plugins/clearkey/tests/JsonWebKeyUnittest.cpp @@ -284,14 +284,14 @@ TEST_F(JsonWebKeyTest, ExtractKeys) { "\"keys\":" "[{" "\"kid\":\"Y2xlYXJrZXlrZXlpZDAx\"" - "\"k\":\"SGVsbG8gRnJpZW5kISE\"" + "\"k\":\"SGVsbG8gRnJpZW5kICE-Pw\"" "\"kty\":\"oct\"" "\"alg\":\"A128KW1\"" "}" "{" "\"kty\":\"oct\"" "\"alg\":\"A128KW2\"" - "\"k\":\"SGVsbG8gRnJpZW5kIQ\"" + "\"k\":\"SGVsbG8gRnJpZW5kICE_\"" "\"kid\":\"Y2xlYXJrZXlrZXlpZDAy\"" "}" "{" @@ -303,7 +303,7 @@ TEST_F(JsonWebKeyTest, ExtractKeys) { "{" "\"alg\":\"A128KW3\"" "\"kid\":\"Y2xlYXJrZXlrZXlpZDAz\"" - "\"k\":\"R29vZCBkYXkh\"" + "\"k\":\"SGVsbG8gPz4-IEZyaWVuZCA_Pg\"" "\"kty\":\"oct\"" "}]" "}"); @@ -313,8 +313,8 @@ TEST_F(JsonWebKeyTest, ExtractKeys) { EXPECT_TRUE(keys.size() == 3); const String8 clearKeys[] = - { String8("Hello Friend!!"), String8("Hello Friend!"), - String8("Good day!") }; + { String8("Hello Friend !>?"), String8("Hello Friend !?"), + String8("Hello ?>> Friend ?>") }; verifyKeys(keys, clearKeys); } diff --git a/drm/mediadrm/plugins/mock/Android.bp b/drm/mediadrm/plugins/mock/Android.bp index 7f448195c5..abd18840f3 100644 --- a/drm/mediadrm/plugins/mock/Android.bp +++ b/drm/mediadrm/plugins/mock/Android.bp @@ -22,6 +22,8 @@ cc_library_shared { vendor: true, relative_install_path: "mediadrm", + header_libs: ["media_plugin_headers"], + shared_libs: [ "libutils", "liblog", |
