1/**
2 * Copyright (C) 2016 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 */
16package [email protected];
17
18import IDrmPluginListener;
19
20/**
21 * Ref: frameworks/native/include/media/drm/DrmAPI.h:DrmPlugin
22 *
23 * IDrmPlugin is used to interact with a specific drm plugin that was
24 * created by IDrm::createPlugin. A drm plugin provides methods for
25 * obtaining drm keys that may be used by a codec to decrypt protected
26 * video content.
27 */
28interface IDrmPlugin {
29
30    /**
31     * Open a new session with the DrmPlugin object. A session ID is returned
32     * in the sessionId parameter.
33     * @return status the status of the call. The status must be OK or one of
34     * the following errors: ERROR_DRM_NOT_PROVISIONED if the device requires
35     * provisioning before it can open a session, ERROR_DRM_RESOURCE_BUSY if
36     * there are insufficent resources available to open a session,
37     * ERROR_DRM_CANNOT_HANDLE, if openSession is not supported at the time of
38     * the call or ERROR_DRM_INVALID_STATE if the HAL is in a state where a
39     * session cannot be opened.
40     * @return sessionId the session ID for the newly opened session
41     */
42    openSession() generates (Status status, SessionId sessionId);
43
44    /**
45     * Close a session on the DrmPlugin object
46     *
47     * @param sessionId the session id the call applies to
48     * @return status the status of the call.  The status must be OK or one of
49     * the following errors: ERROR_DRM_SESSION_NOT_OPENED if the session is not
50     * opened, BAD_VALUE if the sessionId is invalid or ERROR_DRM_INVALID_STATE
51     * if the HAL is in a state where the session cannot be closed.
52     */
53    closeSession(SessionId sessionId) generates (Status status);
54
55    /**
56     * A key request/response exchange occurs between the app and a License
57     * Server to obtain the keys required to decrypt the content.
58     * getKeyRequest() is used to obtain an opaque key request blob that is
59     * delivered to the license server.
60     *
61     * @param scope may be a sessionId or a keySetId, depending on the
62     * specified keyType. When the keyType is OFFLINE or STREAMING,
63     * scope should be set to the sessionId the keys will be provided to.
64     * When the keyType is RELEASE, scope should be set to the keySetId
65     * of the keys being released.
66     * @param initData container-specific data, its meaning is interpreted
67     * based on the mime type provided in the mimeType parameter. It could
68     * contain, for example, the content ID, key ID or other data obtained
69     * from the content metadata that is required to generate the key request.
70     * initData may be empty when keyType is RELEASE.
71     * @param mimeType identifies the mime type of the content
72     * @param keyType specifies if the keys are to be used for streaming,
73     * offline or a release
74     * @param optionalParameters included in the key request message to
75     * allow a client application to provide additional message parameters to
76     * the server.
77     *
78     * @return status the status of the call.  The status must be OK or one of
79     * the following errors: ERROR_DRM_SESSION_NOT_OPENED if the session is not
80     * opened, ERROR_DRM_NOT_PROVISIONED if the device requires provisioning
81     * before it can generate a key request, ERROR_DRM_CANNOT_HANDLE if
82     * getKeyRequest is not supported at the time of the call, BAD_VALUE if any
83     * parameters are invalid or ERROR_DRM_INVALID_STATE if the HAL is in a state
84     * where a key request cannot be generated.
85     * @return request if successful, the opaque key request blob is returned
86     * @return requestType indicates type information about the returned
87     * request. The type may be one of INITIAL, RENEWAL or RELEASE. An
88     * INITIAL request is the first key request for a license. RENEWAL is a
89     * subsequent key request used to refresh the keys in a license. RELEASE
90     * corresponds to a keyType of RELEASE, which indicates keys are being
91     * released.
92     * @return defaultUrl the URL that the request may be sent to, if
93     * provided by the drm HAL. The app may choose to override this
94     * URL.
95     */
96    getKeyRequest(vec<uint8_t> scope, vec<uint8_t> initData,
97            string mimeType, KeyType keyType, KeyedVector optionalParameters)
98        generates (Status status, vec<uint8_t> request,
99                KeyRequestType requestType, string defaultUrl);
100
101    /**
102     * After a key response is received by the app, it is provided to the
103     * Drm plugin using provideKeyResponse.
104     *
105     * @param scope may be a sessionId or a keySetId depending on the type
106     * of the response. Scope should be set to the sessionId when the response
107     * is for either streaming or offline key requests. Scope should be set to
108     * the keySetId when the response is for a release request.
109     * @param response the response from the key server that is being
110     * provided to the drm HAL.
111     *
112     * @return status the status of the call.  The status must be OK or one of
113     * the following errors: ERROR_DRM_SESSION_NOT_OPENED if the session is not
114     * opened, ERROR_DRM_NOT_PROVISIONED if the device requires provisioning
115     * before it can handle the key response, ERROR_DRM_DEVICE_REVOKED if the
116     * device has been disabled by the license policy, ERROR_DRM_CANNOT_HANDLE
117     * if provideKeyResponse is not supported at the time of the call, BAD_VALUE
118     * if any parameters are invalid or ERROR_DRM_INVALID_STATE if the HAL is
119     * in a state where a key response cannot be handled.
120     * @return keySetId when the response is for an offline key request, a
121     * keySetId is returned in the keySetId vector parameter that can be used
122     * to later restore the keys to a new session with the method restoreKeys.
123     * When the response is for a streaming or release request, no keySetId is
124     * returned.
125     */
126    provideKeyResponse(vec<uint8_t> scope, vec<uint8_t> response)
127        generates (Status status, vec<uint8_t> keySetId);
128
129    /**
130     * Remove the current keys from a session
131     *
132     * @param sessionId the session id the call applies to
133     * @return status the status of the call.  The status must be OK or one of
134     * the following errors: ERROR_DRM_SESSION_NOT_OPENED if the session is not
135     * opened, BAD_VALUE if the sessionId is invalid or ERROR_DRM_INVALID_STATE
136     * if the HAL is in a state where the keys cannot be removed.
137     */
138    removeKeys(SessionId sessionId) generates (Status status);
139
140    /**
141     * Restore persisted offline keys into a new session
142     *
143     * @param sessionId the session id the call applies to
144     * @param keySetId identifies the keys to load, obtained from a prior
145     * call to provideKeyResponse().
146     * @return status the status of the call. The status must be OK or one of
147     * the following errors: ERROR_DRM_SESSION_NOT_OPENED if the session is not
148     * opened, BAD_VALUE if any parameters are invalid or ERROR_DRM_INVALID_STATE
149     * if the HAL is in a state where keys cannot be restored.
150     */
151    restoreKeys(SessionId sessionId,
152            vec<uint8_t> keySetId) generates (Status status);
153
154    /**
155     * Request an informative description of the license for the session. The
156     * status is in the form of {name, value} pairs. Since DRM license policies
157     * vary by vendor, the specific status field names are determined by each
158     * DRM vendor. Refer to your DRM provider documentation for definitions of
159     * the field names for a particular drm scheme.
160     *
161     * @param sessionId the session id the call applies to
162     * @return status the status of the call. The status must be OK or one of
163     * the following errors: ERROR_DRM_SESSION_NOT_OPENED if the session is not
164     * opened, BAD_VALUE if the sessionId is invalid or ERROR_DRM_INVALID_STATE
165     * if the HAL is in a state where key status cannot be queried.
166     * @return infoList a list of name value pairs describing the license
167     */
168    queryKeyStatus(SessionId sessionId)
169        generates (Status status, KeyedVector infoList);
170
171    /**
172     * A provision request/response exchange occurs between the app and a
173     * provisioning server to retrieve a device certificate. getProvisionRequest
174     * is used to obtain an opaque provisioning request blob that is delivered
175     * to the provisioning server.
176     *
177     * @param certificateType the type of certificate requested, e.g. "X.509"
178     * @param certificateAuthority identifies the certificate authority. A
179     * certificate authority (CA) is an entity which issues digital certificates
180     * for use by other parties. It is an example of a trusted third party.
181     * @return status the status of the call. The status must be OK or one of
182     * the following errors: ERROR_DRM_CANNOT_HANDLE if the drm scheme does not
183     * require provisioning or ERROR_DRM_INVALID_STATE if the HAL is in a state
184     * where the provision request cannot be generated.
185     * @return request if successful the opaque certificate request blob
186     * is returned
187     * @return defaultUrl URL that the provisioning request should be
188     * sent to, if known by the HAL implementation.  If the HAL implementation
189     * does not provide a defaultUrl, the returned string must be empty.
190     */
191    getProvisionRequest(string certificateType, string certificateAuthority)
192        generates (Status status, vec<uint8_t> request, string defaultUrl);
193
194    /**
195     * After a provision response is received by the app from a provisioning
196     * server, it is provided to the Drm HAL using provideProvisionResponse.
197     * The HAL implementation must receive the provision request and
198     * store the provisioned credentials.
199     *
200     * @param response the opaque provisioning response received by the
201     * app from a provisioning server.
202
203     * @return status the status of the call. The status must be OK or one of
204     * the following errors: ERROR_DRM_DEVICE_REVOKED if the device has been
205     * disabled by the license policy, BAD_VALUE if any parameters are invalid
206     * or ERROR_DRM_INVALID_STATE if the HAL is in a state where the provision
207     * response cannot be handled.
208     * @return certificate the public certificate resulting from the provisioning
209     * operation, if any. An empty vector indicates that no certificate was
210     * returned.
211     * @return wrappedKey an opaque object containing encrypted private key
212     * material to be used by signRSA when computing an RSA signature on a
213     * message, see the signRSA method.
214     */
215    provideProvisionResponse(vec<uint8_t> response) generates (Status status,
216            vec<uint8_t> certificate, vec<uint8_t> wrappedKey);
217
218    /**
219     * SecureStop is a way of enforcing the concurrent stream limit per
220     * subscriber. It can securely monitor the lifetime of sessions across
221     * device reboots by periodically persisting the session lifetime
222     * status in secure storage.
223     *
224     * A signed version of the sessionID is written to persistent storage on the
225     * device when each MediaCrypto object is created and periodically during
226     * playback. The sessionID is signed by the device private key to prevent
227     * tampering.
228     *
229     * When playback is completed the session is destroyed, and the secure
230     * stops are queried by the app. The app then delivers the secure stop
231     * message to a server which verifies the signature to confirm that the
232     * session and its keys have been removed from the device. The persisted
233     * record on the device is removed after receiving and verifying the
234     * signed response from the server.
235     */
236
237    /**
238     * Get all secure stops on the device
239     *
240     * @return status the status of the call. The status must be OK or
241     * ERROR_DRM_INVALID_STATE if the HAL is in a state where the secure stops
242     * cannot be returned.
243     * @return secureStops a list of the secure stop opaque objects
244     */
245    getSecureStops() generates
246        (Status status, vec<SecureStop> secureStops);
247
248    /**
249     * Get all secure stops by secure stop ID
250     *
251     * @param secureStopId the ID of the secure stop to return. The
252     * secure stop ID is delivered by the key server as part of the key
253     * response and must also be known by the app.
254     *
255     * @return status the status of the call. The status must be OK or one of
256     * the following errors: BAD_VALUE if the secureStopId is invalid or
257     * ERROR_DRM_INVALID_STATE if the HAL is in a state where the secure stop
258     * cannot be returned.
259     * @return secureStop the secure stop opaque object
260     */
261
262    getSecureStop(SecureStopId secureStopId)
263        generates (Status status, SecureStop secureStop);
264
265    /**
266     * Release all secure stops on the device
267     *
268     * @return status the status of the call. The status must be OK or
269     * ERROR_DRM_INVALID_STATE if the HAL is in a state where the secure
270     * stops cannot be released.
271     */
272    releaseAllSecureStops() generates (Status status);
273
274    /**
275     * Release a secure stop by secure stop ID
276     *
277     * @param secureStopId the ID of the secure stop to release. The
278     * secure stop ID is delivered by the key server as part of the key
279     * response and must also be known by the app.
280     *
281     * @return status the status of the call. The status must be OK or one of
282     * the following errors: BAD_VALUE if the secureStopId is invalid or
283     * ERROR_DRM_INVALID_STATE if the HAL is in a state where the secure stop
284     * cannot be released.
285     */
286    releaseSecureStop(vec<uint8_t> secureStopId) generates (Status status);
287
288    /**
289     * A drm scheme can have properties that are settable and readable
290     * by an app. There are a few forms of property access methods,
291     * depending on the data type of the property.
292     *
293     * Property values defined by the public API are:
294     *   "vendor" [string] identifies the maker of the drm scheme
295     *   "version" [string] identifies the version of the drm scheme
296     *   "description" [string] describes the drm scheme
297     *   'deviceUniqueId' [byte array] The device unique identifier is
298     *   established during device provisioning and provides a means of
299     *   uniquely identifying each device.
300     *
301     * Since drm scheme properties may vary, additional field names may be
302     * defined by each DRM vendor. Refer to your DRM provider documentation
303     * for definitions of its additional field names.
304     */
305
306    /**
307     * Read a string property value given the property name.
308     *
309     * @param propertyName the name of the property
310     * @return status the status of the call. The status must be OK or one of
311     * the following errors: BAD_VALUE if the property name is invalid,
312     * ERROR_DRM_CANNOT_HANDLE if the property is not supported, or
313     * ERROR_DRM_INVALID_STATE if the HAL is in a state where the property
314     * cannot be obtained.
315     * @return value the property value string
316     */
317    getPropertyString(string propertyName)
318        generates (Status status, string value);
319
320    /**
321     * Read a byte array property value given the property name.
322     *
323     * @param propertyName the name of the property
324     * @return status the status of the call. The status must be OK or one of
325     * the following errors: BAD_VALUE if the property name is invalid,
326     * ERROR_DRM_CANNOT_HANDLE if the property is not supported, or
327     * ERROR_DRM_INVALID_STATE if the HAL is in a state where the property
328     * cannot be obtained.
329     * @return value the property value byte array
330     */
331    getPropertyByteArray(string propertyName)
332        generates (Status status, vec<uint8_t> value);
333
334    /**
335     * Write a property string value given the property name
336     *
337     * @param propertyName the name of the property
338     * @param value the value to write
339     * @return status the status of the call. The status must be OK or one of
340     * the following errors: BAD_VALUE if the property name is invalid,
341     * ERROR_DRM_CANNOT_HANDLE if the property is not supported, or
342     * ERROR_DRM_INVALID_STATE if the HAL is in a state where the property
343     * cannot be set.
344     */
345    setPropertyString(string propertyName, string value)
346        generates (Status status);
347
348    /**
349     * Write a property byte array value given the property name
350     *
351     * @param propertyName the name of the property
352     * @param value the value to write
353     * @return status the status of the call. The status must be OK or one of
354     * the following errors: BAD_VALUE if the property name is invalid,
355     * ERROR_DRM_CANNOT_HANDLE if the property is not supported, or
356     * ERROR_DRM_INVALID_STATE if the HAL is in a state where the property
357     * cannot be set.
358     */
359    setPropertyByteArray(string propertyName, vec<uint8_t> value )
360        generates (Status status);
361
362    /**
363     * The following methods implement operations on a CryptoSession to support
364     * encrypt, decrypt, sign verify operations on operator-provided
365     * session keys.
366     */
367
368    /**
369     * Set the cipher algorithm to be used for the specified session.
370     *
371     * @param sessionId the session id the call applies to
372     * @param algorithm the algorithm to use. The string conforms to JCA
373     * Standard Names for Cipher Transforms and is case insensitive. An
374     * example algorithm is "AES/CBC/PKCS5Padding".
375     * @return status the status of the call. The status must be OK or one of
376     * the following errors: ERROR_DRM_SESSION_NOT_OPENED if the session is not
377     * opened, BAD_VALUE if any parameters are invalid or ERROR_DRM_INVALID_STATE
378     * if the HAL is in a state where the algorithm cannot be set.
379     */
380    setCipherAlgorithm(SessionId sessionId, string algorithm)
381        generates (Status status);
382
383    /**
384     * Set the MAC algorithm to be used for computing hashes in a session.
385     *
386     * @param sessionId the session id the call applies to
387     * @param algorithm the algorithm to use. The string conforms to JCA
388     * Standard Names for Mac Algorithms and is case insensitive. An example MAC
389     * algorithm string is "HmacSHA256".
390     * @return status the status of the call. The status must be OK or one of the
391     * following errors: ERROR_DRM_SESSION_NOT_OPENED if the session is not
392     * opened, BAD_VALUE if any parameters are invalid or ERROR_DRM_INVALID_STATE
393     * if the HAL is in a state where the algorithm cannot be set.
394     */
395    setMacAlgorithm(SessionId sessionId, string algorithm)
396        generates (Status status);
397
398    /**
399     * Encrypt the provided input buffer with the cipher algorithm specified by
400     * setCipherAlgorithm and the key selected by keyId, and return the
401     * encrypted data.
402     *
403     * @param sessionId the session id the call applies to
404     * @param keyId the ID of the key to use for encryption
405     * @param input the input data to encrypt
406     * @param iv the initialization vector to use for encryption
407     * @return status the status of the call. The status must be OK or one of the
408     * following errors: ERROR_DRM_SESSION_NOT_OPENED if the session is not opened,
409     * BAD_VALUE if any parameters are invalid or ERROR_DRM_INVALID_STATE
410     * if the HAL is in a state where the encrypt operation cannot be performed.
411     * @return output the decrypted data
412     */
413    encrypt(SessionId sessionId, vec<uint8_t> keyId, vec<uint8_t> input,
414            vec<uint8_t> iv) generates (Status status, vec<uint8_t> output);
415
416    /**
417     * Decrypt the provided input buffer with the cipher algorithm
418     * specified by setCipherAlgorithm and the key selected by keyId,
419     * and return the decrypted data.
420     *
421     * @param sessionId the session id the call applies to
422     * @param keyId the ID of the key to use for decryption
423     * @param input the input data to decrypt
424     * @param iv the initialization vector to use for decryption
425     * @return status the status of the call. The status must be OK or one of
426     * the following errors: ERROR_DRM_SESSION_NOT_OPENED if the session is not
427     * opened, BAD_VALUE if any parameters are invalid or ERROR_DRM_INVALID_STATE
428     * if the HAL is in a state where the decrypt operation cannot be
429     * performed.
430     * @return output the decrypted data
431     */
432    decrypt(SessionId sessionId, vec<uint8_t> keyId, vec<uint8_t> input,
433            vec<uint8_t> iv) generates (Status status, vec<uint8_t> output);
434
435    /**
436     * Compute a signature over the provided message using the mac algorithm
437     * specified by setMacAlgorithm and the key selected by keyId and return
438     * the signature.
439     *
440     * @param sessionId the session id the call applies to
441     * @param keyId the ID of the key to use for decryption
442     * @param message the message to compute a signature over
443     * @return status the status of the call. The status must be OK or one of
444     * the following errors: ERROR_DRM_SESSION_NOT_OPENED if the session is not
445     * opened, BAD_VALUE if any parameters are invalid or ERROR_DRM_INVALID_STATE
446     * if the HAL is in a state where the sign operation cannot be
447     * performed.
448     * @return signature the computed signature
449     */
450    sign(SessionId sessionId, vec<uint8_t> keyId, vec<uint8_t> message)
451        generates (Status status, vec<uint8_t> signature);
452
453    /**
454     * Compute a hash of the provided message using the mac algorithm specified
455     * by setMacAlgorithm and the key selected by keyId, and compare with the
456     * expected result.
457     *
458     * @param sessionId the session id the call applies to
459     * @param keyId the ID of the key to use for decryption
460     * @param message the message to compute a hash of
461     * @param signature the signature to verify
462     * @return status the status of the call. The status must be OK or one of
463     * the following errors: ERROR_DRM_SESSION_NOT_OPENED if the session is not
464     * opened, BAD_VALUE if any parameters are invalid or ERROR_DRM_INVALID_STATE
465     * if the HAL is in a state where the verify operation cannot be
466     * performed.
467     * @return match true if the signature is verified positively,
468     * false otherwise.
469     */
470    verify(SessionId sessionId, vec<uint8_t> keyId, vec<uint8_t> message,
471            vec<uint8_t> signature) generates (Status status, bool match);
472
473    /**
474     * Compute an RSA signature on the provided message using the specified
475     * algorithm.
476     *
477     * @param sessionId the session id the call applies to
478     * @param algorithm the signing algorithm, such as "RSASSA-PSS-SHA1"
479     * or "PKCS1-BlockType1"
480     * @param message the message to compute the signature on
481     * @param wrappedKey the private key returned during provisioning as
482     * returned by provideProvisionResponse.
483     * @return status the status of the call. The status must be OK or one of
484     * the following errors: ERROR_DRM_SESSION_NOT_OPENED if the session is
485     * not opened, BAD_VALUE if any parameters are invalid or
486     * ERROR_DRM_INVALID_STATE if the HAL is in a state where the signRSA
487     * operation cannot be performed.
488     * @return signature the RSA signature computed over the message
489     */
490    signRSA(SessionId sessionId, string algorithm, vec<uint8_t> message,
491        vec<uint8_t> wrappedkey)
492        generates (Status status, vec<uint8_t> signature);
493
494    /**
495     * Plugins call the following methods to deliver events to the
496     * java app.
497     */
498
499    /**
500     * Set a listener for a drm session. This allows the drm HAL to
501     * make asynchronous calls back to the client of IDrm.
502     *
503     * @param listener instance of IDrmPluginListener to receive the events
504     */
505    setListener(IDrmPluginListener listener);
506
507    /**
508     * Legacy event sending method, it sends events of various types using a
509     * single overloaded set of parameters. This form is deprecated.
510     *
511     * @param eventType the type of the event
512     * @param sessionId identifies the session the event originated from
513     * @param data event-specific data blob
514     */
515    sendEvent(EventType eventType, SessionId sessionId, vec<uint8_t> data);
516
517    /**
518     * Send a license expiration update to the listener. The expiration
519     * update indicates how long the current license is valid before it
520     * needs to be renewed.
521     *
522     * @param sessionId identifies the session the event originated from
523     * @param expiryTimeInMS the time when the keys need to be renewed.
524     * The time is in milliseconds, relative to the Unix epoch. A time of 0
525     * indicates that the keys never expire.
526     */
527     sendExpirationUpdate(SessionId sessionId, int64_t expiryTimeInMS);
528
529    /**
530     * Send a keys change event to the listener. The keys change event
531     * indicates the status of each key in the session. Keys can be
532     * indicated as being usable, expired, outputnotallowed or statuspending.
533     *
534     * @param sessionId identifies the session the event originated from
535     * @param keyStatusList indicates the status for each key ID in the
536     * session.
537     * @param hasNewUsableKey indicates if the event includes at least one
538     * key that has become usable.
539     */
540    sendKeysChange(SessionId sessionId, vec<KeyStatus> keyStatusList,
541            bool hasNewUsableKey);
542};
543