From 9a16115975d7edb8278184f6a0873de407b09a61 Mon Sep 17 00:00:00 2001 From: Jeff Tinker Date: Sat, 30 Mar 2013 16:30:21 -0700 Subject: [PATCH] MediaDrm API update Clarify offline usage of sessions and keys and implement implement CryptoSession to support additional crypto use cases. Change-Id: I3788e7b187cd20c4224bf07f3fc6bef48ee38bd6 --- libwvdrmengine/mediadrm/include/WVDrmPlugin.h | 44 ++++++++-- libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp | 86 +++++++++++++++---- .../com/widevine/test/MediaDrmAPITest.java | 8 +- 3 files changed, 110 insertions(+), 28 deletions(-) diff --git a/libwvdrmengine/mediadrm/include/WVDrmPlugin.h b/libwvdrmengine/mediadrm/include/WVDrmPlugin.h index 30d66e13..0d0cfab8 100644 --- a/libwvdrmengine/mediadrm/include/WVDrmPlugin.h +++ b/libwvdrmengine/mediadrm/include/WVDrmPlugin.h @@ -32,21 +32,25 @@ class WVDrmPlugin : public android::DrmPlugin { virtual status_t closeSession(const Vector& sessionId); - virtual status_t getLicenseRequest( + virtual status_t getKeyRequest( const Vector& sessionId, const Vector& initData, const String8& mimeType, - LicenseType licenseType, + KeyType keyType, const KeyedVector& optionalParameters, Vector& request, String8& defaultUrl); - virtual status_t provideLicenseResponse(const Vector& sessionId, - const Vector& response); + virtual status_t provideKeyResponse(const Vector& sessionId, + const Vector& response, + Vector& keySetId); - virtual status_t removeLicense(const Vector& sessionId); + virtual status_t removeKeys(const Vector& keySetId); - virtual status_t queryLicenseStatus( + virtual status_t restoreKeys(const Vector& sessionId, + const Vector& keySetId); + + virtual status_t queryKeyStatus( const Vector& sessionId, KeyedVector& infoMap) const; @@ -68,6 +72,34 @@ class WVDrmPlugin : public android::DrmPlugin { virtual status_t setPropertyByteArray(const String8& name, const Vector& value); + virtual status_t setCipherAlgorithm(Vector const &sessionId, + String8 const &algorithm); + + virtual status_t setMacAlgorithm(Vector const &sessionId, + String8 const &algorithm); + + virtual status_t encrypt(Vector const &sessionId, + Vector const &keyId, + Vector const &input, + Vector const &iv, + Vector &output); + + virtual status_t decrypt(Vector const &sessionId, + Vector const &keyId, + Vector const &input, + Vector const &iv, + Vector &output); + + virtual status_t sign(Vector const &sessionId, + Vector const &keyId, + Vector const &message, + Vector &signature); + + virtual status_t verify(Vector const &sessionId, + Vector const &keyId, + Vector const &message, + Vector const &signature, + bool &match); private: DISALLOW_EVIL_CONSTRUCTORS(WVDrmPlugin); diff --git a/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp index 90421b41..61e3eb13 100644 --- a/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp @@ -48,18 +48,18 @@ status_t WVDrmPlugin::closeSession(const Vector& sessionId) { } } -status_t WVDrmPlugin::getLicenseRequest( +status_t WVDrmPlugin::getKeyRequest( const Vector& sessionId, const Vector& initData, const String8& mimeType, - LicenseType licenseType, + KeyType keyType, const KeyedVector& optionalParameters, Vector& request, String8& defaultUrl) { CdmLicenseType cdmLicenseType; - if (licenseType == kLicenseType_Offline) { + if (keyType == kKeyType_Offline) { cdmLicenseType = kLicenseTypeOffline; - } else if (licenseType == kLicenseType_Streaming) { + } else if (keyType == kKeyType_Streaming) { cdmLicenseType = kLicenseTypeStreaming; } else { return BAD_TYPE; @@ -100,9 +100,11 @@ status_t WVDrmPlugin::getLicenseRequest( return android::OK; } -status_t WVDrmPlugin::provideLicenseResponse( +status_t WVDrmPlugin::provideKeyResponse( const Vector& sessionId, - const Vector& response) { + const Vector& response, + Vector& keySetId) { + // TODO: return keySetId for persisted offline content CdmSessionId cdmSessionId(sessionId.begin(), sessionId.end()); CdmKeyResponse cdmResponse(response.begin(), response.end()); @@ -115,19 +117,18 @@ status_t WVDrmPlugin::provideLicenseResponse( } } -status_t WVDrmPlugin::removeLicense(const Vector& sessionId) { - CdmSessionId cdmSessionId(sessionId.begin(), sessionId.end()); - - CdmResponseType res = mCDM->CancelKeyRequest(cdmSessionId); - - if (res == wvcdm::NO_ERROR) { - return android::OK; - } else { - return android::UNKNOWN_ERROR; - } +status_t WVDrmPlugin::removeKeys(const Vector& keySetId) { + // TODO: remove persisted offline keys associated with keySetId + return android::UNKNOWN_ERROR; } -status_t WVDrmPlugin::queryLicenseStatus( +status_t WVDrmPlugin::restoreKeys(const Vector& sessionId, + const Vector& keySetId) { + // TODO: restore persisted offline keys associated with keySetId + return android::UNKNOWN_ERROR; +} + +status_t WVDrmPlugin::queryKeyStatus( const Vector& sessionId, KeyedVector& infoMap) const { CdmSessionId cdmSessionId(sessionId.begin(), sessionId.end()); @@ -179,7 +180,8 @@ status_t WVDrmPlugin::getProvisionRequest(Vector& request, } status_t WVDrmPlugin::provideProvisionResponse( - const Vector& response) { + const Vector& response) { + CdmProvisioningResponse cdmResponse(response.begin(), response.end()); CdmResponseType res = mCDM->HandleProvisioningResponse(cdmResponse); @@ -252,6 +254,54 @@ status_t WVDrmPlugin::setPropertyByteArray(const String8& name, return -EPERM; } +status_t WVDrmPlugin::setCipherAlgorithm(Vector const &sessionId, + String8 const &algorithm) { + // TODO: Implement this function once the OEMCrypto API supports it + return -EPERM; +} + +status_t WVDrmPlugin::setMacAlgorithm(Vector const &sessionId, + String8 const &algorithm) { + // TODO: Implement this function once the OEMCrypto API supports it + return -EPERM; +} + +status_t WVDrmPlugin::encrypt(Vector const &sessionId, + Vector const &keyId, + Vector const &input, + Vector const &iv, + Vector &output) { + // TODO: Implement this function once the OEMCrypto API supports it + return -EPERM; +} + +status_t WVDrmPlugin::decrypt(Vector const &sessionId, + Vector const &keyId, + Vector const &input, + Vector const &iv, + Vector &output) { + // TODO: Implement this function once the OEMCrypto API supports it + return -EPERM; +} + +status_t WVDrmPlugin::sign(Vector const &sessionId, + Vector const &keyId, + Vector const &message, + Vector &signature) { + // TODO: Implement this function once the OEMCrypto API supports it + return -EPERM; +} + +status_t WVDrmPlugin::verify(Vector const &sessionId, + Vector const &keyId, + Vector const &message, + Vector const &signature, + bool &match) { + // TODO: Implement this function once the OEMCrypto API supports it + return -EPERM; +} + + // TODO: Hook up to event listener methods on CDM once Android API for // eventing is finalized. } // namespace wvdrm diff --git a/libwvdrmengine/test/java/src/com/widevine/test/MediaDrmAPITest.java b/libwvdrmengine/test/java/src/com/widevine/test/MediaDrmAPITest.java index 6e7bb942..ce5e4c71 100644 --- a/libwvdrmengine/test/java/src/com/widevine/test/MediaDrmAPITest.java +++ b/libwvdrmengine/test/java/src/com/widevine/test/MediaDrmAPITest.java @@ -143,9 +143,9 @@ public class MediaDrmAPITest extends TabActivity { byte[] sessionId = drm.openSession(); - MediaDrm.LicenseRequest drmRequest; - drmRequest = drm.getLicenseRequest(sessionId, kKeyId, "video/mp4", - MediaDrm.MEDIA_DRM_LICENSE_TYPE_STREAMING, null); + MediaDrm.KeyRequest drmRequest; + drmRequest = drm.getKeyRequest(sessionId, kKeyId, "video/mp4", + MediaDrm.MEDIA_DRM_KEY_TYPE_STREAMING, null); PostRequestTask postTask = new PostRequestTask(drmRequest.data); postTask.execute(kServerUrl + ":" + kPort + kClientAuth); @@ -162,7 +162,7 @@ public class MediaDrmAPITest extends TabActivity { } else { byte[] drmResponse = parseResponseBody(responseBody); - drm.provideLicenseResponse(sessionId, drmResponse); + drm.provideKeyResponse(sessionId, drmResponse); drm.closeSession(sessionId); }