From e1c76bebef41d362369627ed0c06ea9a01c6bddb Mon Sep 17 00:00:00 2001 From: Jeff Tinker Date: Wed, 3 Apr 2013 18:11:33 -0700 Subject: [PATCH] Make MediaDrm APIs public bug: 8603279 Change-Id: I9fab2673867ad413a084933cee7239d13e8b7893 --- api/current.txt | 60 +++ .../images/mediadrm_decryption_sequence.png | Bin 0 -> 67604 bytes docs/html/images/mediadrm_overview.png | Bin 0 -> 35383 bytes media/java/android/media/MediaDrm.java | 439 ++++++++++++------ .../java/android/media/MediaDrmException.java | 2 - media/jni/android_media_MediaDrm.cpp | 16 +- 6 files changed, 366 insertions(+), 151 deletions(-) create mode 100644 docs/html/images/mediadrm_decryption_sequence.png create mode 100644 docs/html/images/mediadrm_overview.png diff --git a/api/current.txt b/api/current.txt index d1be295516f54..f31580dbc8a35 100644 --- a/api/current.txt +++ b/api/current.txt @@ -11801,6 +11801,66 @@ package android.media { ctor public MediaCryptoException(java.lang.String); } + public final class MediaDrm { + ctor public MediaDrm(java.util.UUID) throws android.media.MediaDrmException; + method public void closeSession(byte[]); + method public android.media.MediaDrm.CryptoSession getCryptoSession(byte[], java.lang.String, java.lang.String); + method public android.media.MediaDrm.KeyRequest getKeyRequest(byte[], byte[], java.lang.String, int, java.util.HashMap); + method public byte[] getPropertyByteArray(java.lang.String); + method public java.lang.String getPropertyString(java.lang.String); + method public android.media.MediaDrm.ProvisionRequest getProvisionRequest(); + method public java.util.List getSecureStops(); + method public static final boolean isCryptoSchemeSupported(java.util.UUID); + method public byte[] openSession(); + method public byte[] provideKeyResponse(byte[], byte[]); + method public void provideProvisionResponse(byte[]); + method public java.util.HashMap queryKeyStatus(byte[]); + method public final void release(); + method public void releaseSecureStops(byte[]); + method public void removeKeys(byte[]); + method public void restoreKeys(byte[], byte[]); + method public void setOnEventListener(android.media.MediaDrm.OnEventListener); + method public void setPropertyByteArray(java.lang.String, byte[]); + method public void setPropertyString(java.lang.String, java.lang.String); + field public static final int EVENT_KEY_EXPIRED = 3; // 0x3 + field public static final int EVENT_KEY_REQUIRED = 2; // 0x2 + field public static final int EVENT_PROVISION_REQUIRED = 1; // 0x1 + field public static final int EVENT_VENDOR_DEFINED = 4; // 0x4 + field public static final int KEY_TYPE_OFFLINE = 2; // 0x2 + field public static final int KEY_TYPE_RELEASE = 3; // 0x3 + field public static final int KEY_TYPE_STREAMING = 1; // 0x1 + field public static final java.lang.String PROPERTY_ALGORITHM = "algorithm"; + field public static final java.lang.String PROPERTY_DESCRIPTION = "description"; + field public static final java.lang.String PROPERTY_DEVICE_UNIQUE_ID = "deviceUniqueId"; + field public static final java.lang.String PROPERTY_VENDOR = "vendor"; + field public static final java.lang.String PROPERTY_VERSION = "version"; + } + + public final class MediaDrm.CryptoSession { + method public byte[] decrypt(byte[], byte[], byte[]); + method public byte[] encrypt(byte[], byte[], byte[]); + method public byte[] sign(byte[], byte[]); + method public boolean verify(byte[], byte[], byte[]); + } + + public static final class MediaDrm.KeyRequest { + method public byte[] getData(); + method public java.lang.String getDefaultUrl(); + } + + public static abstract interface MediaDrm.OnEventListener { + method public abstract void onEvent(android.media.MediaDrm, byte[], int, int, byte[]); + } + + public static final class MediaDrm.ProvisionRequest { + method public byte[] getData(); + method public java.lang.String getDefaultUrl(); + } + + public final class MediaDrmException extends java.lang.Exception { + ctor public MediaDrmException(java.lang.String); + } + public final class MediaExtractor { ctor public MediaExtractor(); method public boolean advance(); diff --git a/docs/html/images/mediadrm_decryption_sequence.png b/docs/html/images/mediadrm_decryption_sequence.png new file mode 100644 index 0000000000000000000000000000000000000000..2bd95ea63ceab56c9d6a494fa7bdc1f7eb32f296 GIT binary patch literal 67604 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 + * Encrypted content is prepared using an encryption server and stored in a content + * library. The encrypted content is streamed or downloaded from the content library to + * client devices via content servers. Licenses to view the content are obtained from + * a License Server. + *

+ *

MediaDrm Overview diagram

+ *

+ * Keys are requested from the license server using a key request. The key + * response is delivered to the client app, which provides the response to the + * MediaDrm API. + *

+ * A Provisioning server may be required to distribute device-unique credentials to + * the devices. + *

+ * Enforcing requirements related to the number of devices that may play content + * simultaneously can be performed either through key renewal or using the secure + * stop methods. + *

+ * The following sequence diagram shows the interactions between the objects + * involved while playing back encrypted content: + *

+ *

MediaDrm Overview diagram

+ *

+ * The app first constructs {@link android.media.MediaExtractor} and + * {@link android.media.MediaCodec} objects. It accesses the DRM-scheme-identifying UUID, + * typically from metadata in the content, and uses this UUID to construct an instance + * of a MediaDrm object that is able to support the DRM scheme required by the content. + * Crypto schemes are assigned 16 byte UUIDs. The method {@link #isCryptoSchemeSupported} + * can be used to query if a given scheme is supported on the device. + *

+ * The app calls {@link #openSession} to generate a sessionId that will uniquely identify + * the session in subsequent interactions. The app next uses the MediaDrm object to + * obtain a key request message and send it to the license server, then provide + * the server's response to the MediaDrm object. + *

+ * Once the app has a sessionId, it can construct a MediaCrypto object from the UUID and + * sessionId. The MediaCrypto object is registered with the MediaCodec in the + * {@link MediaCodec.#configure} method to enable the codec to decrypt content. + *

+ * When the app has constructed {@link android.media.MediaExtractor}, + * {@link android.media.MediaCodec} and {@link android.media.MediaCrypto} objects, + * it proceeds to pull samples from the extractor and queue them into the decoder. For + * encrypted content, the samples returned from the extractor remain encrypted, they + * are only decrypted when the samples are delivered to the decoder. + *

* *

Callbacks

- *

Applications may want to register for informational events in order - * to be informed of some internal state update during playback or streaming. + *

Applications should register for informational events in order + * to be informed of key state updates during playback or streaming. * Registration for these events is done via a call to - * {@link #setOnEventListener(OnInfoListener)}setOnInfoListener, - * In order to receive the respective callback - * associated with this listener, applications are required to create + * {@link #setOnEventListener}. In order to receive the respective + * callback associated with this listener, applications are required to create * MediaDrm objects on a thread with its own Looper running (main UI * thread by default has a Looper running). - * - * @hide -- don't expose yet */ public final class MediaDrm { @@ -116,7 +160,7 @@ public final class MediaDrm { /** * Interface definition for a callback to be invoked when a drm event - * occurs. + * occurs */ public interface OnEventListener { @@ -132,10 +176,30 @@ public final class MediaDrm { void onEvent(MediaDrm md, byte[] sessionId, int event, int extra, byte[] data); } - public static final int MEDIA_DRM_EVENT_PROVISION_REQUIRED = 1; - public static final int MEDIA_DRM_EVENT_KEY_REQUIRED = 2; - public static final int MEDIA_DRM_EVENT_KEY_EXPIRED = 3; - public static final int MEDIA_DRM_EVENT_VENDOR_DEFINED = 4; + /** + * This event type indicates that the app needs to request a certificate from + * the provisioning server. The request message data is obtained using + * {@link #getProvisionRequest} + */ + public static final int EVENT_PROVISION_REQUIRED = 1; + + /** + * This event type indicates that the app needs to request keys from a license + * server. The request message data is obtained using {@link #getKeyRequest}. + */ + public static final int EVENT_KEY_REQUIRED = 2; + + /** + * This event type indicates that the licensed usage duration for keys in a session + * has expired. The keys are no longer valid. + */ + public static final int EVENT_KEY_EXPIRED = 3; + + /** + * This event may indicate some specific vendor-defined condition, see your + * DRM provider documentation for details + */ + public static final int EVENT_VENDOR_DEFINED = 4; private static final int DRM_EVENT = 200; @@ -183,7 +247,7 @@ public final class MediaDrm { } /* - * Called from native code when an interesting event happens. This method + * This method is called from native code when an event occurs. This method * just uses the EventHandler system to post the event back to the main app thread. * We use a weak reference to the original MediaPlayer object so that the native * code is safe from the object disappearing from underneath it. (This is @@ -203,89 +267,117 @@ public final class MediaDrm { } /** - * Open a new session with the MediaDrm object. A session ID is returned. + * Open a new session with the MediaDrm object. A session ID is returned. */ - public native byte[] openSession() throws MediaDrmException; + public native byte[] openSession(); /** - * Close a session on the MediaDrm object that was previously opened - * with {@link #openSession}. + * Close a session on the MediaDrm object that was previously opened + * with {@link #openSession}. */ - public native void closeSession(byte[] sessionId) throws MediaDrmException; + public native void closeSession(byte[] sessionId); - public static final int MEDIA_DRM_KEY_TYPE_STREAMING = 1; - public static final int MEDIA_DRM_KEY_TYPE_OFFLINE = 2; - public static final int MEDIA_DRM_KEY_TYPE_RELEASE = 3; + /** + * This key request type species that the keys will be for online use, they will + * not be saved to the device for subsequent use when the device is not connected + * to a network. + */ + public static final int KEY_TYPE_STREAMING = 1; - public final class KeyRequest { - public KeyRequest() {} - public byte[] data; - public String defaultUrl; + /** + * This key request type specifies that the keys will be for offline use, they + * will be saved to the device for use when the device is not connected to a network. + */ + public static final int KEY_TYPE_OFFLINE = 2; + + /** + * This key request type specifies that previously saved offline keys should be released. + */ + public static final int KEY_TYPE_RELEASE = 3; + + /** + * Contains the opaque data an app uses to request keys from a license server + */ + public final static class KeyRequest { + KeyRequest() {} + + /** + * Get the opaque message data + */ + public byte[] getData() { return mData; } + + /** + * Get the default URL to use when sending the key request message to a + * server, if known. The app may prefer to use a different license + * server URL from other sources. + */ + public String getDefaultUrl() { return mDefaultUrl; } + + private byte[] mData; + private String mDefaultUrl; }; /** * A key request/response exchange occurs between the app and a license server * to obtain or release keys used to decrypt encrypted content. + *

* getKeyRequest() is used to obtain an opaque key request byte array that is * delivered to the license server. The opaque key request byte array is returned * in KeyRequest.data. The recommended URL to deliver the key request to is * returned in KeyRequest.defaultUrl. - * + *

* After the app has received the key request response from the server, * it should deliver to the response to the DRM engine plugin using the method * {@link #provideKeyResponse}. * * @param scope may be a sessionId or a keySetId, depending on the specified keyType. - * When the keyType is MEDIA_DRM_KEY_TYPE_STREAMING or MEDIA_DRM_KEY_TYPE_OFFLINE, + * When the keyType is KEY_TYPE_STREAMING or KEY_TYPE_OFFLINE, * scope should be set to the sessionId the keys will be provided to. When the keyType - * is MEDIA_DRM_KEY_TYPE_RELEASE, scope should be set to the keySetId of the keys + * is KEY_TYPE_RELEASE, scope should be set to the keySetId of the keys * being released. Releasing keys from a device invalidates them for all sessions. * @param init container-specific data, its meaning is interpreted based on the * mime type provided in the mimeType parameter. It could contain, for example, * the content ID, key ID or other data obtained from the content metadata that is * required in generating the key request. init may be null when keyType is - * MEDIA_DRM_KEY_TYPE_RELEASE. + * KEY_TYPE_RELEASE. * @param mimeType identifies the mime type of the content * @param keyType specifes the type of the request. The request may be to acquire * keys for streaming or offline content, or to release previously acquired * keys, which are identified by a keySetId. - * @param optionalParameters are included in the key request message to * allow a client application to provide additional message parameters to the server. */ public native KeyRequest getKeyRequest(byte[] scope, byte[] init, String mimeType, int keyType, - HashMap optionalParameters) - throws MediaDrmException; + HashMap optionalParameters); + /** * A key response is received from the license server by the app, then it is * provided to the DRM engine plugin using provideKeyResponse. The byte array * returned is a keySetId that can be used to later restore the keys to a new - * session with the method {@link restoreKeys}, enabling offline key use. + * session with the method {@link #restoreKeys}, enabling offline key use. * * @param sessionId the session ID for the DRM session * @param response the byte array response from the server */ - public native byte[] provideKeyResponse(byte[] sessionId, byte[] response) - throws MediaDrmException; + public native byte[] provideKeyResponse(byte[] sessionId, byte[] response); /** * Restore persisted offline keys into a new session. keySetId identifies the - * keys to load, obtained from a prior call to {@link provideKeyResponse}. + * keys to load, obtained from a prior call to {@link #provideKeyResponse}. * * @param sessionId the session ID for the DRM session * @param keySetId identifies the saved key set to restore */ - public native void restoreKeys(byte[] sessionId, byte[] keySetId) - throws MediaDrmException; + public native void restoreKeys(byte[] sessionId, byte[] keySetId); /** * Remove the current keys from a session. * * @param sessionId the session ID for the DRM session */ - public native void removeKeys(byte[] sessionId) throws MediaDrmException; + public native void removeKeys(byte[] sessionId); /** * Request an informative description of the key status for the session. The status is @@ -296,25 +388,41 @@ public final class MediaDrm { * * @param sessionId the session ID for the DRM session */ - public native HashMap queryKeyStatus(byte[] sessionId) - throws MediaDrmException; + public native HashMap queryKeyStatus(byte[] sessionId); - public final class ProvisionRequest { - public ProvisionRequest() {} - public byte[] data; - public String defaultUrl; + /** + * Contains the opaque data an app uses to request a certificate from a provisioning + * server + */ + public final static class ProvisionRequest { + ProvisionRequest() {} + + /** + * Get the opaque message data + */ + public byte[] getData() { return mData; } + + /** + * Get the default URL to use when sending the provision request + * message to a server, if known. The app may prefer to use a different + * provisioning server URL obtained from other sources. + */ + public String getDefaultUrl() { return mDefaultUrl; } + + private byte[] mData; + private String mDefaultUrl; } /** * A provision request/response exchange occurs between the app and a provisioning * server to retrieve a device certificate. If provisionining is required, the - * MEDIA_DRM_EVENT_PROVISION_REQUIRED event will be sent to the event handler. + * EVENT_PROVISION_REQUIRED event will be sent to the event handler. * getProvisionRequest is used to obtain the opaque provision request byte array that * should be delivered to the provisioning server. The provision request byte array * is returned in ProvisionRequest.data. The recommended URL to deliver the provision * request to is returned in ProvisionRequest.defaultUrl. */ - public native ProvisionRequest getProvisionRequest() throws MediaDrmException; + public native ProvisionRequest getProvisionRequest(); /** * After a provision response is received by the app, it is provided to the DRM @@ -323,92 +431,91 @@ public final class MediaDrm { * @param response the opaque provisioning response byte array to provide to the * DRM engine plugin. */ - public native void provideProvisionResponse(byte[] response) - throws MediaDrmException; + public native void provideProvisionResponse(byte[] response); /** - * A means of enforcing the contractual requirement for a concurrent stream limit - * per subscriber across devices is provided via SecureStop. SecureStop is a means - * of securely monitoring the lifetime of sessions. Since playback on a device can - * be interrupted due to reboot, power failure, etc. a means of persisting the - * lifetime information on the device is needed. - * - * A signed version of the sessionID is written to persistent storage on the device - * when each MediaCrypto object is created. The sessionID is signed by the device - * private key to prevent tampering. - * + * A means of enforcing limits on the number of concurrent streams per subscriber + * across devices is provided via SecureStop. This is achieved by securely + * monitoring the lifetime of sessions. + *

+ * Information from the server related to the current playback session is written + * to persistent storage on the device when each MediaCrypto object is created. + *

* In the normal case, playback will be completed, the session destroyed and the - * Secure Stops will be queried. The App queries secure stops and forwards the + * Secure Stops will be queried. The app queries secure stops and forwards the * secure stop message to the server which verifies the signature and notifies the * server side database that the session destruction has been confirmed. The persisted * record on the client is only removed after positive confirmation that the server * received the message using releaseSecureStops(). */ - public native List getSecureStops() throws MediaDrmException; + public native List getSecureStops(); /** * Process the SecureStop server response message ssRelease. After authenticating - * the message, remove the SecureStops identiied in the response. + * the message, remove the SecureStops identified in the response. * * @param ssRelease the server response indicating which secure stops to release */ - public native void releaseSecureStops(byte[] ssRelease) - throws MediaDrmException; + public native void releaseSecureStops(byte[] ssRelease); /** - * Read a DRM engine plugin property value, given the property name string. There are - * several forms of property access functions, depending on the data type returned. - * + * String property name: identifies the maker of the DRM engine plugin + */ + public static final String PROPERTY_VENDOR = "vendor"; + + /** + * String property name: identifies the version of the DRM engine plugin + */ + public static final String PROPERTY_VERSION = "version"; + + /** + * String property name: describes the DRM engine plugin + */ + public static final String PROPERTY_DESCRIPTION = "description"; + + /** + * String property name: a comma-separated list of cipher and mac algorithms + * supported by CryptoSession. The list may be empty if the DRM engine + * plugin does not support CryptoSession operations. + */ + public static final String PROPERTY_ALGORITHM = "algorithm"; + + /** + * Read a DRM engine plugin String property value, given the property name string. + *

* Standard fields names are: - * vendor String - identifies the maker of the DRM engine plugin - * version String - identifies the version of the DRM engine plugin - * description String - describes the DRM engine plugin - * deviceUniqueId byte[] - The device unique identifier is established during device - * provisioning and provides a means of uniquely identifying - * each device - * algorithms String - a comma-separate list of cipher and mac algorithms supported - * by CryptoSession. The list may be empty if the DRM engine - * plugin does not support CryptoSession operations. + * {@link #PROPERTY_VENDOR}, {@link #PROPERTY_VERSION}, + * {@link #PROPERTY_DESCRIPTION}, {@link #PROPERTY_ALGORITHM} */ - public native String getPropertyString(String propertyName) - throws MediaDrmException; + public native String getPropertyString(String propertyName); - public native byte[] getPropertyByteArray(String propertyName) - throws MediaDrmException; /** - * Write a DRM engine plugin property value. There are several forms of - * property setting functions, depending on the data type being set. + * The device unique identifier is established during device provisioning and + * provides a means of uniquely identifying each device */ - public native void setPropertyString(String propertyName, String value) - throws MediaDrmException; - - public native void setPropertyByteArray(String propertyName, byte[] value) - throws MediaDrmException; + public static final String PROPERTY_DEVICE_UNIQUE_ID = "deviceUniqueId"; /** - * In addition to supporting decryption of DASH Common Encrypted Media, the - * MediaDrm APIs provide the ability to securely deliver session keys from - * an operator's session key server to a client device, based on the factory-installed - * root of trust, and provide the ability to do encrypt, decrypt, sign and verify - * with the session key on arbitrary user data. - * - * The CryptoSession class implements generic encrypt/decrypt/sign/verify methods - * based on the established session keys. These keys are exchanged using the - * getKeyRequest/provideKeyResponse methods. - * - * Applications of this capability could include securing various types of - * purchased or private content, such as applications, books and other media, - * photos or media delivery protocols. - * - * Operators can create session key servers that are functionally similar to a - * license key server, except that instead of receiving license key requests and - * providing encrypted content keys which are used specifically to decrypt A/V media - * content, the session key server receives session key requests and provides - * encrypted session keys which can be used for general purpose crypto operations. + * Read a DRM engine plugin byte array property value, given the property name string. + *

+ * Standard fields names are {@link #PROPERTY_DEVICE_UNIQUE_ID} */ + public native byte[] getPropertyByteArray(String propertyName); + + + /** + * Set a DRM engine plugin String property value. + */ + public native void setPropertyString(String propertyName, String value); + + /** + * Set a DRM engine plugin byte array property value. + */ + public native void setPropertyByteArray(String propertyName, byte[] value); + private static final native void setCipherAlgorithmNative(MediaDrm drm, byte[] sessionId, String algorithm); @@ -429,61 +536,112 @@ public final class MediaDrm { byte[] keyId, byte[] message, byte[] signature); + /** + * In addition to supporting decryption of DASH Common Encrypted Media, the + * MediaDrm APIs provide the ability to securely deliver session keys from + * an operator's session key server to a client device, based on the factory-installed + * root of trust, and then perform encrypt, decrypt, sign and verify operations + * with the session key on arbitrary user data. + *

+ * The CryptoSession class implements generic encrypt/decrypt/sign/verify methods + * based on the established session keys. These keys are exchanged using the + * getKeyRequest/provideKeyResponse methods. + *

+ * Applications of this capability could include securing various types of + * purchased or private content, such as applications, books and other media, + * photos or media delivery protocols. + *

+ * Operators can create session key servers that are functionally similar to a + * license key server, except that instead of receiving license key requests and + * providing encrypted content keys which are used specifically to decrypt A/V media + * content, the session key server receives session key requests and provides + * encrypted session keys which can be used for general purpose crypto operations. + *

+ * A CryptoSession is obtained using {@link #getCryptoSession} + */ public final class CryptoSession { private MediaDrm mDrm; private byte[] mSessionId; - /** - * Construct a CryptoSession which can be used to encrypt, decrypt, - * sign and verify messages or data using the session keys established - * for the session using methods {@link getKeyRequest} and - * {@link provideKeyResponse} using a session key server. - * - * @param sessionId the session ID for the session containing keys - * to be used for encrypt, decrypt, sign and/or verify - * - * @param cipherAlgorithm the algorithm to use for encryption and - * decryption ciphers. The algorithm string conforms to JCA Standard - * Names for Cipher Transforms and is case insensitive. For example - * "AES/CBC/PKCS5Padding". - * - * @param macAlgorithm the algorithm to use for sign and verify - * The algorithm string conforms to JCA Standard Names for Mac - * Algorithms and is case insensitive. For example "HmacSHA256". - * - * The list of supported algorithms for a DRM engine plugin can be obtained - * using the method {@link getPropertyString("algorithms")} - */ - - public CryptoSession(MediaDrm drm, byte[] sessionId, - String cipherAlgorithm, String macAlgorithm) - throws MediaDrmException { + CryptoSession(MediaDrm drm, byte[] sessionId, + String cipherAlgorithm, String macAlgorithm) + { mSessionId = sessionId; mDrm = drm; setCipherAlgorithmNative(drm, sessionId, cipherAlgorithm); setMacAlgorithmNative(drm, sessionId, macAlgorithm); } + /** + * Encrypt data using the CryptoSession's cipher algorithm + * + * @param keyid specifies which key to use + * @param input the data to encrypt + * @param iv the initialization vector to use for the cipher + */ public byte[] encrypt(byte[] keyid, byte[] input, byte[] iv) { return encryptNative(mDrm, mSessionId, keyid, input, iv); } + /** + * Decrypt data using the CryptoSessions's cipher algorithm + * + * @param keyid specifies which key to use + * @param input the data to encrypt + * @param iv the initialization vector to use for the cipher + */ public byte[] decrypt(byte[] keyid, byte[] input, byte[] iv) { return decryptNative(mDrm, mSessionId, keyid, input, iv); } + /** + * Sign data using the CryptoSessions's mac algorithm. + * + * @param keyid specifies which key to use + * @param message the data for which a signature is to be computed + */ public byte[] sign(byte[] keyid, byte[] message) { return signNative(mDrm, mSessionId, keyid, message); } + + /** + * Verify a signature using the CryptoSessions's mac algorithm. Return true + * if the signatures match, false if they do no. + * + * @param keyid specifies which key to use + * @param message the data to verify + * @param signature the reference signature which will be compared with the + * computed signature + */ public boolean verify(byte[] keyid, byte[] message, byte[] signature) { return verifyNative(mDrm, mSessionId, keyid, message, signature); } }; + /** + * Obtain a CryptoSession object which can be used to encrypt, decrypt, + * sign and verify messages or data using the session keys established + * for the session using methods {@link #getKeyRequest} and + * {@link #provideKeyResponse} using a session key server. + * + * @param sessionId the session ID for the session containing keys + * to be used for encrypt, decrypt, sign and/or verify + * @param cipherAlgorithm the algorithm to use for encryption and + * decryption ciphers. The algorithm string conforms to JCA Standard + * Names for Cipher Transforms and is case insensitive. For example + * "AES/CBC/NoPadding". + * @param macAlgorithm the algorithm to use for sign and verify + * The algorithm string conforms to JCA Standard Names for Mac + * Algorithms and is case insensitive. For example "HmacSHA256". + *

+ * The list of supported algorithms for a DRM engine plugin can be obtained + * using the method {@link #getPropertyString} with the property name + * "algorithms". + */ public CryptoSession getCryptoSession(byte[] sessionId, String cipherAlgorithm, String macAlgorithm) - throws MediaDrmException { + { return new CryptoSession(this, sessionId, cipherAlgorithm, macAlgorithm); } @@ -495,8 +653,7 @@ public final class MediaDrm { public native final void release(); private static native final void native_init(); - private native final void native_setup(Object mediadrm_this, byte[] uuid) - throws MediaDrmException; + private native final void native_setup(Object mediadrm_this, byte[] uuid); private native final void native_finalize(); diff --git a/media/java/android/media/MediaDrmException.java b/media/java/android/media/MediaDrmException.java index 6f81f9024537c..d6f5ff4ace8b6 100644 --- a/media/java/android/media/MediaDrmException.java +++ b/media/java/android/media/MediaDrmException.java @@ -19,8 +19,6 @@ package android.media; /** * Exception thrown if MediaDrm object could not be instantiated for * whatever reason. - * - * @hide -- don't expose yet */ public final class MediaDrmException extends Exception { public MediaDrmException(String detailMessage) { diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp index c32ba9d3fde7d..d9d466e75e6c4 100644 --- a/media/jni/android_media_MediaDrm.cpp +++ b/media/jni/android_media_MediaDrm.cpp @@ -458,22 +458,22 @@ static void android_media_MediaDrm_native_init(JNIEnv *env) { "(Ljava/lang/Object;IILjava/lang/Object;)V"); jfieldID field; - GET_STATIC_FIELD_ID(field, clazz, "MEDIA_DRM_EVENT_PROVISION_REQUIRED", "I"); + GET_STATIC_FIELD_ID(field, clazz, "EVENT_PROVISION_REQUIRED", "I"); gEventTypes.kEventProvisionRequired = env->GetStaticIntField(clazz, field); - GET_STATIC_FIELD_ID(field, clazz, "MEDIA_DRM_EVENT_KEY_REQUIRED", "I"); + GET_STATIC_FIELD_ID(field, clazz, "EVENT_KEY_REQUIRED", "I"); gEventTypes.kEventKeyRequired = env->GetStaticIntField(clazz, field); - GET_STATIC_FIELD_ID(field, clazz, "MEDIA_DRM_EVENT_KEY_EXPIRED", "I"); + GET_STATIC_FIELD_ID(field, clazz, "EVENT_KEY_EXPIRED", "I"); gEventTypes.kEventKeyExpired = env->GetStaticIntField(clazz, field); - GET_STATIC_FIELD_ID(field, clazz, "MEDIA_DRM_EVENT_VENDOR_DEFINED", "I"); + GET_STATIC_FIELD_ID(field, clazz, "EVENT_VENDOR_DEFINED", "I"); gEventTypes.kEventVendorDefined = env->GetStaticIntField(clazz, field); FIND_CLASS(clazz, "android/media/MediaDrm$KeyRequest"); - GET_FIELD_ID(gFields.keyRequest.data, clazz, "data", "[B"); - GET_FIELD_ID(gFields.keyRequest.defaultUrl, clazz, "defaultUrl", "Ljava/lang/String;"); + GET_FIELD_ID(gFields.keyRequest.data, clazz, "mData", "[B"); + GET_FIELD_ID(gFields.keyRequest.defaultUrl, clazz, "mDefaultUrl", "Ljava/lang/String;"); FIND_CLASS(clazz, "android/media/MediaDrm$ProvisionRequest"); - GET_FIELD_ID(gFields.provisionRequest.data, clazz, "data", "[B"); - GET_FIELD_ID(gFields.provisionRequest.defaultUrl, clazz, "defaultUrl", "Ljava/lang/String;"); + GET_FIELD_ID(gFields.provisionRequest.data, clazz, "mData", "[B"); + GET_FIELD_ID(gFields.provisionRequest.defaultUrl, clazz, "mDefaultUrl", "Ljava/lang/String;"); FIND_CLASS(clazz, "java/util/ArrayList"); GET_METHOD_ID(gFields.arraylist.init, clazz, "", "()V");