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:
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user