From 68b15554f6dca3b056eac517fe5fa2fd4ee80a33 Mon Sep 17 00:00:00 2001 From: Jeff Tinker Date: Wed, 30 Apr 2014 10:19:03 -0700 Subject: Allow device to be unprovisioned bug: 12247651 Change-Id: I564ac8de3da2430342a028f4058e2c5ac2d85d5e --- drm/mediadrm/plugins/clearkey/DrmPlugin.h | 4 ++++ include/media/IDrm.h | 2 ++ media/libmedia/IDrm.cpp | 20 +++++++++++++++++++- media/libmediaplayerservice/Drm.cpp | 17 +++++++++++++++++ media/libmediaplayerservice/Drm.h | 2 ++ 5 files changed, 44 insertions(+), 1 deletion(-) diff --git a/drm/mediadrm/plugins/clearkey/DrmPlugin.h b/drm/mediadrm/plugins/clearkey/DrmPlugin.h index bfbc6bf..27df9cd 100644 --- a/drm/mediadrm/plugins/clearkey/DrmPlugin.h +++ b/drm/mediadrm/plugins/clearkey/DrmPlugin.h @@ -104,6 +104,10 @@ public: return android::ERROR_DRM_CANNOT_HANDLE; } + virtual status_t unprovisionDevice() { + return android::ERROR_DRM_CANNOT_HANDLE; + } + virtual status_t getSecureStops(List >& secureStops) { UNUSED(secureStops); return android::ERROR_DRM_CANNOT_HANDLE; diff --git a/include/media/IDrm.h b/include/media/IDrm.h index 32ae28e..68de87a 100644 --- a/include/media/IDrm.h +++ b/include/media/IDrm.h @@ -70,6 +70,8 @@ struct IDrm : public IInterface { Vector &certificate, Vector &wrappedKey) = 0; + virtual status_t unprovisionDevice() = 0; + virtual status_t getSecureStops(List > &secureStops) = 0; virtual status_t releaseSecureStops(Vector const &ssRelease) = 0; diff --git a/media/libmedia/IDrm.cpp b/media/libmedia/IDrm.cpp index f1a6a9f..1904839 100644 --- a/media/libmedia/IDrm.cpp +++ b/media/libmedia/IDrm.cpp @@ -53,7 +53,8 @@ enum { SIGN, SIGN_RSA, VERIFY, - SET_LISTENER + SET_LISTENER, + UNPROVISION_DEVICE }; struct BpDrm : public BpInterface { @@ -229,6 +230,15 @@ struct BpDrm : public BpInterface { return reply.readInt32(); } + virtual status_t unprovisionDevice() { + Parcel data, reply; + data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); + + remote()->transact(UNPROVISION_DEVICE, data, &reply); + + return reply.readInt32(); + } + virtual status_t getSecureStops(List > &secureStops) { Parcel data, reply; data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); @@ -619,6 +629,14 @@ status_t BnDrm::onTransact( return OK; } + case UNPROVISION_DEVICE: + { + CHECK_INTERFACE(IDrm, data, reply); + status_t result = unprovisionDevice(); + reply->writeInt32(result); + return OK; + } + case GET_SECURE_STOPS: { CHECK_INTERFACE(IDrm, data, reply); diff --git a/media/libmediaplayerservice/Drm.cpp b/media/libmediaplayerservice/Drm.cpp index d50037f..d222316 100644 --- a/media/libmediaplayerservice/Drm.cpp +++ b/media/libmediaplayerservice/Drm.cpp @@ -417,6 +417,23 @@ status_t Drm::provideProvisionResponse(Vector const &response, return mPlugin->provideProvisionResponse(response, certificate, wrappedKey); } +status_t Drm::unprovisionDevice() { + Mutex::Autolock autoLock(mLock); + + if (mInitCheck != OK) { + return mInitCheck; + } + + if (mPlugin == NULL) { + return -EINVAL; + } + + if (!checkPermission("android.permission.REMOVE_DRM_CERTIFICATES")) { + return -EPERM; + } + + return mPlugin->unprovisionDevice(); +} status_t Drm::getSecureStops(List > &secureStops) { Mutex::Autolock autoLock(mLock); diff --git a/media/libmediaplayerservice/Drm.h b/media/libmediaplayerservice/Drm.h index 3d4b0fc..9e23e2e 100644 --- a/media/libmediaplayerservice/Drm.h +++ b/media/libmediaplayerservice/Drm.h @@ -75,6 +75,8 @@ struct Drm : public BnDrm, Vector &certificate, Vector &wrappedKey); + virtual status_t unprovisionDevice(); + virtual status_t getSecureStops(List > &secureStops); virtual status_t releaseSecureStops(Vector const &ssRelease); -- cgit v1.1