MediaDrm API update

Clarify offline usage of sessions and keys and implement
implement CryptoSession to support additional crypto use
cases.

Change-Id: I3788e7b187cd20c4224bf07f3fc6bef48ee38bd6
This commit is contained in:
Jeff Tinker
2013-03-30 16:30:21 -07:00
parent 1a8aa0dd05
commit 9a16115975
3 changed files with 110 additions and 28 deletions

View File

@@ -32,21 +32,25 @@ class WVDrmPlugin : public android::DrmPlugin {
virtual status_t closeSession(const Vector<uint8_t>& sessionId); virtual status_t closeSession(const Vector<uint8_t>& sessionId);
virtual status_t getLicenseRequest( virtual status_t getKeyRequest(
const Vector<uint8_t>& sessionId, const Vector<uint8_t>& sessionId,
const Vector<uint8_t>& initData, const Vector<uint8_t>& initData,
const String8& mimeType, const String8& mimeType,
LicenseType licenseType, KeyType keyType,
const KeyedVector<String8, String8>& optionalParameters, const KeyedVector<String8, String8>& optionalParameters,
Vector<uint8_t>& request, Vector<uint8_t>& request,
String8& defaultUrl); String8& defaultUrl);
virtual status_t provideLicenseResponse(const Vector<uint8_t>& sessionId, virtual status_t provideKeyResponse(const Vector<uint8_t>& sessionId,
const Vector<uint8_t>& response); const Vector<uint8_t>& response,
Vector<uint8_t>& keySetId);
virtual status_t removeLicense(const Vector<uint8_t>& sessionId); virtual status_t removeKeys(const Vector<uint8_t>& keySetId);
virtual status_t queryLicenseStatus( virtual status_t restoreKeys(const Vector<uint8_t>& sessionId,
const Vector<uint8_t>& keySetId);
virtual status_t queryKeyStatus(
const Vector<uint8_t>& sessionId, const Vector<uint8_t>& sessionId,
KeyedVector<String8, String8>& infoMap) const; KeyedVector<String8, String8>& infoMap) const;
@@ -68,6 +72,34 @@ class WVDrmPlugin : public android::DrmPlugin {
virtual status_t setPropertyByteArray(const String8& name, virtual status_t setPropertyByteArray(const String8& name,
const Vector<uint8_t>& value); const Vector<uint8_t>& value);
virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId,
String8 const &algorithm);
virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId,
String8 const &algorithm);
virtual status_t encrypt(Vector<uint8_t> const &sessionId,
Vector<uint8_t> const &keyId,
Vector<uint8_t> const &input,
Vector<uint8_t> const &iv,
Vector<uint8_t> &output);
virtual status_t decrypt(Vector<uint8_t> const &sessionId,
Vector<uint8_t> const &keyId,
Vector<uint8_t> const &input,
Vector<uint8_t> const &iv,
Vector<uint8_t> &output);
virtual status_t sign(Vector<uint8_t> const &sessionId,
Vector<uint8_t> const &keyId,
Vector<uint8_t> const &message,
Vector<uint8_t> &signature);
virtual status_t verify(Vector<uint8_t> const &sessionId,
Vector<uint8_t> const &keyId,
Vector<uint8_t> const &message,
Vector<uint8_t> const &signature,
bool &match);
private: private:
DISALLOW_EVIL_CONSTRUCTORS(WVDrmPlugin); DISALLOW_EVIL_CONSTRUCTORS(WVDrmPlugin);

View File

@@ -48,18 +48,18 @@ status_t WVDrmPlugin::closeSession(const Vector<uint8_t>& sessionId) {
} }
} }
status_t WVDrmPlugin::getLicenseRequest( status_t WVDrmPlugin::getKeyRequest(
const Vector<uint8_t>& sessionId, const Vector<uint8_t>& sessionId,
const Vector<uint8_t>& initData, const Vector<uint8_t>& initData,
const String8& mimeType, const String8& mimeType,
LicenseType licenseType, KeyType keyType,
const KeyedVector<String8, String8>& optionalParameters, const KeyedVector<String8, String8>& optionalParameters,
Vector<uint8_t>& request, Vector<uint8_t>& request,
String8& defaultUrl) { String8& defaultUrl) {
CdmLicenseType cdmLicenseType; CdmLicenseType cdmLicenseType;
if (licenseType == kLicenseType_Offline) { if (keyType == kKeyType_Offline) {
cdmLicenseType = kLicenseTypeOffline; cdmLicenseType = kLicenseTypeOffline;
} else if (licenseType == kLicenseType_Streaming) { } else if (keyType == kKeyType_Streaming) {
cdmLicenseType = kLicenseTypeStreaming; cdmLicenseType = kLicenseTypeStreaming;
} else { } else {
return BAD_TYPE; return BAD_TYPE;
@@ -100,9 +100,11 @@ status_t WVDrmPlugin::getLicenseRequest(
return android::OK; return android::OK;
} }
status_t WVDrmPlugin::provideLicenseResponse( status_t WVDrmPlugin::provideKeyResponse(
const Vector<uint8_t>& sessionId, const Vector<uint8_t>& sessionId,
const Vector<uint8_t>& response) { const Vector<uint8_t>& response,
Vector<uint8_t>& keySetId) {
// TODO: return keySetId for persisted offline content
CdmSessionId cdmSessionId(sessionId.begin(), sessionId.end()); CdmSessionId cdmSessionId(sessionId.begin(), sessionId.end());
CdmKeyResponse cdmResponse(response.begin(), response.end()); CdmKeyResponse cdmResponse(response.begin(), response.end());
@@ -115,19 +117,18 @@ status_t WVDrmPlugin::provideLicenseResponse(
} }
} }
status_t WVDrmPlugin::removeLicense(const Vector<uint8_t>& sessionId) { status_t WVDrmPlugin::removeKeys(const Vector<uint8_t>& keySetId) {
CdmSessionId cdmSessionId(sessionId.begin(), sessionId.end()); // TODO: remove persisted offline keys associated with keySetId
return android::UNKNOWN_ERROR;
CdmResponseType res = mCDM->CancelKeyRequest(cdmSessionId);
if (res == wvcdm::NO_ERROR) {
return android::OK;
} else {
return android::UNKNOWN_ERROR;
}
} }
status_t WVDrmPlugin::queryLicenseStatus( status_t WVDrmPlugin::restoreKeys(const Vector<uint8_t>& sessionId,
const Vector<uint8_t>& keySetId) {
// TODO: restore persisted offline keys associated with keySetId
return android::UNKNOWN_ERROR;
}
status_t WVDrmPlugin::queryKeyStatus(
const Vector<uint8_t>& sessionId, const Vector<uint8_t>& sessionId,
KeyedVector<String8, String8>& infoMap) const { KeyedVector<String8, String8>& infoMap) const {
CdmSessionId cdmSessionId(sessionId.begin(), sessionId.end()); CdmSessionId cdmSessionId(sessionId.begin(), sessionId.end());
@@ -179,7 +180,8 @@ status_t WVDrmPlugin::getProvisionRequest(Vector<uint8_t>& request,
} }
status_t WVDrmPlugin::provideProvisionResponse( status_t WVDrmPlugin::provideProvisionResponse(
const Vector<uint8_t>& response) { const Vector<uint8_t>& response) {
CdmProvisioningResponse cdmResponse(response.begin(), response.end()); CdmProvisioningResponse cdmResponse(response.begin(), response.end());
CdmResponseType res = mCDM->HandleProvisioningResponse(cdmResponse); CdmResponseType res = mCDM->HandleProvisioningResponse(cdmResponse);
@@ -252,6 +254,54 @@ status_t WVDrmPlugin::setPropertyByteArray(const String8& name,
return -EPERM; return -EPERM;
} }
status_t WVDrmPlugin::setCipherAlgorithm(Vector<uint8_t> const &sessionId,
String8 const &algorithm) {
// TODO: Implement this function once the OEMCrypto API supports it
return -EPERM;
}
status_t WVDrmPlugin::setMacAlgorithm(Vector<uint8_t> const &sessionId,
String8 const &algorithm) {
// TODO: Implement this function once the OEMCrypto API supports it
return -EPERM;
}
status_t WVDrmPlugin::encrypt(Vector<uint8_t> const &sessionId,
Vector<uint8_t> const &keyId,
Vector<uint8_t> const &input,
Vector<uint8_t> const &iv,
Vector<uint8_t> &output) {
// TODO: Implement this function once the OEMCrypto API supports it
return -EPERM;
}
status_t WVDrmPlugin::decrypt(Vector<uint8_t> const &sessionId,
Vector<uint8_t> const &keyId,
Vector<uint8_t> const &input,
Vector<uint8_t> const &iv,
Vector<uint8_t> &output) {
// TODO: Implement this function once the OEMCrypto API supports it
return -EPERM;
}
status_t WVDrmPlugin::sign(Vector<uint8_t> const &sessionId,
Vector<uint8_t> const &keyId,
Vector<uint8_t> const &message,
Vector<uint8_t> &signature) {
// TODO: Implement this function once the OEMCrypto API supports it
return -EPERM;
}
status_t WVDrmPlugin::verify(Vector<uint8_t> const &sessionId,
Vector<uint8_t> const &keyId,
Vector<uint8_t> const &message,
Vector<uint8_t> 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 // TODO: Hook up to event listener methods on CDM once Android API for
// eventing is finalized. // eventing is finalized.
} // namespace wvdrm } // namespace wvdrm

View File

@@ -143,9 +143,9 @@ public class MediaDrmAPITest extends TabActivity {
byte[] sessionId = drm.openSession(); byte[] sessionId = drm.openSession();
MediaDrm.LicenseRequest drmRequest; MediaDrm.KeyRequest drmRequest;
drmRequest = drm.getLicenseRequest(sessionId, kKeyId, "video/mp4", drmRequest = drm.getKeyRequest(sessionId, kKeyId, "video/mp4",
MediaDrm.MEDIA_DRM_LICENSE_TYPE_STREAMING, null); MediaDrm.MEDIA_DRM_KEY_TYPE_STREAMING, null);
PostRequestTask postTask = new PostRequestTask(drmRequest.data); PostRequestTask postTask = new PostRequestTask(drmRequest.data);
postTask.execute(kServerUrl + ":" + kPort + kClientAuth); postTask.execute(kServerUrl + ":" + kPort + kClientAuth);
@@ -162,7 +162,7 @@ public class MediaDrmAPITest extends TabActivity {
} else { } else {
byte[] drmResponse = parseResponseBody(responseBody); byte[] drmResponse = parseResponseBody(responseBody);
drm.provideLicenseResponse(sessionId, drmResponse); drm.provideKeyResponse(sessionId, drmResponse);
drm.closeSession(sessionId); drm.closeSession(sessionId);
} }