• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef CLEARKEY_DRM_PLUGIN_H_
18 #define CLEARKEY_DRM_PLUGIN_H_
19 
20 #include <media/drm/DrmAPI.h>
21 #include <media/stagefright/foundation/ABase.h>
22 #include <media/stagefright/MediaErrors.h>
23 #include <utils/Errors.h>
24 #include <utils/KeyedVector.h>
25 #include <utils/List.h>
26 #include <utils/String8.h>
27 #include <utils/Vector.h>
28 
29 #include "SessionLibrary.h"
30 #include "Utils.h"
31 
32 namespace clearkeydrm {
33 
34 using android::KeyedVector;
35 using android::List;
36 using android::status_t;
37 using android::String8;
38 using android::Vector;
39 
40 class DrmPlugin : public android::DrmPlugin {
41 public:
DrmPlugin(SessionLibrary * sessionLibrary)42     explicit DrmPlugin(SessionLibrary* sessionLibrary)
43             : mSessionLibrary(sessionLibrary) {}
~DrmPlugin()44     virtual ~DrmPlugin() {}
45 
46     virtual status_t openSession(Vector<uint8_t>& sessionId);
47 
48     virtual status_t closeSession(const Vector<uint8_t>& sessionId);
49 
50     virtual status_t getKeyRequest(
51             const Vector<uint8_t>& scope,
52             const Vector<uint8_t>& mimeType,
53             const String8& initDataType,
54             KeyType keyType,
55             const KeyedVector<String8, String8>& optionalParameters,
56             Vector<uint8_t>& request,
57             String8& defaultUrl,
58             DrmPlugin::KeyRequestType *keyRequestType);
59 
60     virtual status_t provideKeyResponse(
61             const Vector<uint8_t>& scope,
62             const Vector<uint8_t>& response,
63             Vector<uint8_t>& keySetId);
64 
removeKeys(const Vector<uint8_t> & sessionId)65     virtual status_t removeKeys(const Vector<uint8_t>& sessionId) {
66         if (sessionId.size() == 0) {
67             return android::BAD_VALUE;
68         }
69 
70         return android::ERROR_DRM_CANNOT_HANDLE;
71     }
72 
restoreKeys(const Vector<uint8_t> & sessionId,const Vector<uint8_t> & keySetId)73     virtual status_t restoreKeys(
74             const Vector<uint8_t>& sessionId,
75             const Vector<uint8_t>& keySetId) {
76         if (sessionId.size() == 0 || keySetId.size() == 0) {
77             return android::BAD_VALUE;
78         }
79         return android::ERROR_DRM_CANNOT_HANDLE;
80     }
81 
queryKeyStatus(const Vector<uint8_t> & sessionId,KeyedVector<String8,String8> & infoMap)82     virtual status_t queryKeyStatus(
83             const Vector<uint8_t>& sessionId,
84             KeyedVector<String8, String8>& infoMap) const {
85         if (sessionId.size() == 0) {
86             return android::BAD_VALUE;
87         }
88         UNUSED(infoMap);
89         return android::ERROR_DRM_CANNOT_HANDLE;
90     }
91 
getProvisionRequest(const String8 & cert_type,const String8 & cert_authority,Vector<uint8_t> & request,String8 & defaultUrl)92     virtual status_t getProvisionRequest(
93             const String8& cert_type,
94             const String8& cert_authority,
95             Vector<uint8_t>& request,
96             String8& defaultUrl) {
97         UNUSED(cert_type);
98         UNUSED(cert_authority);
99         UNUSED(request);
100         UNUSED(defaultUrl);
101         return android::ERROR_DRM_CANNOT_HANDLE;
102     }
103 
provideProvisionResponse(const Vector<uint8_t> & response,Vector<uint8_t> & certificate,Vector<uint8_t> & wrappedKey)104     virtual status_t provideProvisionResponse(
105             const Vector<uint8_t>& response,
106             Vector<uint8_t>& certificate,
107             Vector<uint8_t>& wrappedKey) {
108         UNUSED(certificate);
109         UNUSED(wrappedKey);
110         if (response.size() == 0) {
111             // empty response
112             return android::BAD_VALUE;
113         }
114         return android::ERROR_DRM_CANNOT_HANDLE;
115     }
116 
getSecureStops(List<Vector<uint8_t>> & secureStops)117     virtual status_t getSecureStops(List<Vector<uint8_t> >& secureStops) {
118         UNUSED(secureStops);
119         return android::ERROR_DRM_CANNOT_HANDLE;
120     }
121 
getSecureStop(Vector<uint8_t> const & ssid,Vector<uint8_t> & secureStop)122     virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) {
123         if (ssid.size() == 0) {
124             return android::BAD_VALUE;
125         }
126 
127         UNUSED(secureStop);
128         return android::ERROR_DRM_CANNOT_HANDLE;
129     }
130 
releaseSecureStops(const Vector<uint8_t> & ssRelease)131     virtual status_t releaseSecureStops(const Vector<uint8_t>& ssRelease) {
132         if (ssRelease.size() == 0) {
133             return android::BAD_VALUE;
134         }
135         return android::ERROR_DRM_CANNOT_HANDLE;
136     }
137 
releaseAllSecureStops()138     virtual status_t releaseAllSecureStops() {
139         return android::ERROR_DRM_CANNOT_HANDLE;
140     }
141 
142     virtual status_t getPropertyString(
143             const String8& name, String8& value) const;
144 
getPropertyByteArray(const String8 & name,Vector<uint8_t> & value)145     virtual status_t getPropertyByteArray(
146             const String8& name, Vector<uint8_t>& value) const {
147         UNUSED(name);
148         UNUSED(value);
149         return android::ERROR_DRM_CANNOT_HANDLE;
150     }
151 
setPropertyString(const String8 & name,const String8 & value)152     virtual status_t setPropertyString(
153             const String8& name, const String8& value) {
154         UNUSED(name);
155         UNUSED(value);
156         return android::ERROR_DRM_CANNOT_HANDLE;
157     }
158 
setPropertyByteArray(const String8 & name,const Vector<uint8_t> & value)159     virtual status_t setPropertyByteArray(
160             const String8& name, const Vector<uint8_t>& value) {
161         UNUSED(name);
162         UNUSED(value);
163         return android::ERROR_DRM_CANNOT_HANDLE;
164     }
165 
setCipherAlgorithm(const Vector<uint8_t> & sessionId,const String8 & algorithm)166     virtual status_t setCipherAlgorithm(
167             const Vector<uint8_t>& sessionId, const String8& algorithm) {
168         if (sessionId.size() == 0 || algorithm.size() == 0) {
169             return android::BAD_VALUE;
170         }
171         return android::ERROR_DRM_CANNOT_HANDLE;
172     }
173 
setMacAlgorithm(const Vector<uint8_t> & sessionId,const String8 & algorithm)174     virtual status_t setMacAlgorithm(
175             const Vector<uint8_t>& sessionId, const String8& algorithm) {
176         if (sessionId.size() == 0 || algorithm.size() == 0) {
177             return android::BAD_VALUE;
178         }
179         return android::ERROR_DRM_CANNOT_HANDLE;
180     }
181 
encrypt(const Vector<uint8_t> & sessionId,const Vector<uint8_t> & keyId,const Vector<uint8_t> & input,const Vector<uint8_t> & iv,Vector<uint8_t> & output)182     virtual status_t encrypt(
183             const Vector<uint8_t>& sessionId,
184             const Vector<uint8_t>& keyId,
185             const Vector<uint8_t>& input,
186             const Vector<uint8_t>& iv,
187             Vector<uint8_t>& output) {
188         if (sessionId.size() == 0 || keyId.size() == 0 ||
189                 input.size() == 0 || iv.size() == 0) {
190             return android::BAD_VALUE;
191         }
192         UNUSED(output);
193         return android::ERROR_DRM_CANNOT_HANDLE;
194     }
195 
decrypt(const Vector<uint8_t> & sessionId,const Vector<uint8_t> & keyId,const Vector<uint8_t> & input,const Vector<uint8_t> & iv,Vector<uint8_t> & output)196     virtual status_t decrypt(
197             const Vector<uint8_t>& sessionId,
198             const Vector<uint8_t>& keyId,
199             const Vector<uint8_t>& input,
200             const Vector<uint8_t>& iv,
201             Vector<uint8_t>& output) {
202         if (sessionId.size() == 0 || keyId.size() == 0 ||
203                 input.size() == 0 || iv.size() == 0) {
204             return android::BAD_VALUE;
205         }
206         UNUSED(output);
207         return android::ERROR_DRM_CANNOT_HANDLE;
208     }
209 
sign(const Vector<uint8_t> & sessionId,const Vector<uint8_t> & keyId,const Vector<uint8_t> & message,Vector<uint8_t> & signature)210     virtual status_t sign(
211             const Vector<uint8_t>& sessionId,
212             const Vector<uint8_t>& keyId,
213             const Vector<uint8_t>& message,
214             Vector<uint8_t>& signature) {
215         if (sessionId.size() == 0 || keyId.size() == 0 ||
216                 message.size() == 0) {
217             return android::BAD_VALUE;
218         }
219         UNUSED(signature);
220         return android::ERROR_DRM_CANNOT_HANDLE;
221     }
222 
verify(const Vector<uint8_t> & sessionId,const Vector<uint8_t> & keyId,const Vector<uint8_t> & message,const Vector<uint8_t> & signature,bool & match)223     virtual status_t verify(
224             const Vector<uint8_t>& sessionId,
225             const Vector<uint8_t>& keyId,
226             const Vector<uint8_t>& message,
227             const Vector<uint8_t>& signature, bool& match) {
228         if (sessionId.size() == 0 || keyId.size() == 0 ||
229                 message.size() == 0 || signature.size() == 0) {
230             return android::BAD_VALUE;
231         }
232         UNUSED(match);
233         return android::ERROR_DRM_CANNOT_HANDLE;
234     }
235 
signRSA(const Vector<uint8_t> & sessionId,const String8 & algorithm,const Vector<uint8_t> & message,const Vector<uint8_t> & wrappedKey,Vector<uint8_t> & signature)236     virtual status_t signRSA(
237             const Vector<uint8_t>& sessionId,
238             const String8& algorithm,
239             const Vector<uint8_t>& message,
240             const Vector<uint8_t>& wrappedKey,
241             Vector<uint8_t>& signature) {
242         if (sessionId.size() == 0 || algorithm.size() == 0 ||
243                 message.size() == 0 || wrappedKey.size() == 0) {
244             return android::BAD_VALUE;
245         }
246         UNUSED(signature);
247         return android::ERROR_DRM_CANNOT_HANDLE;
248     }
249 
250 private:
251     DISALLOW_EVIL_CONSTRUCTORS(DrmPlugin);
252 
253     SessionLibrary* mSessionLibrary;
254 };
255 
256 } // namespace clearkeydrm
257 
258 #endif // CLEARKEY_DRM_PLUGIN_H_
259