diff options
Diffstat (limited to 'media/libmediaplayerservice')
-rw-r--r-- | media/libmediaplayerservice/Crypto.cpp | 133 | ||||
-rw-r--r-- | media/libmediaplayerservice/Crypto.h | 44 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 8 |
3 files changed, 141 insertions, 44 deletions
diff --git a/media/libmediaplayerservice/Crypto.cpp b/media/libmediaplayerservice/Crypto.cpp index e02035f..4491f2b 100644 --- a/media/libmediaplayerservice/Crypto.cpp +++ b/media/libmediaplayerservice/Crypto.cpp @@ -20,46 +20,137 @@ #include "Crypto.h" +#include <media/hardware/CryptoAPI.h> +#include <media/stagefright/foundation/ADebug.h> +#include <media/stagefright/foundation/hexdump.h> #include <media/stagefright/MediaErrors.h> +#include <dlfcn.h> + namespace android { -Crypto::Crypto() { +Crypto::Crypto() + : mInitCheck(NO_INIT), + mLibHandle(NULL), + mPlugin(NULL) { + mInitCheck = init(); } Crypto::~Crypto() { + delete mPlugin; + mPlugin = NULL; + + delete mFactory; + mFactory = NULL; + + if (mLibHandle != NULL) { + dlclose(mLibHandle); + mLibHandle = NULL; + } } -status_t Crypto::initialize() { - return ERROR_UNSUPPORTED; +status_t Crypto::initCheck() const { + return mInitCheck; } -status_t Crypto::terminate() { - return ERROR_UNSUPPORTED; +status_t Crypto::init() { + mLibHandle = dlopen("libdrmdecrypt.so", RTLD_NOW); + + if (mLibHandle == NULL) { + return ERROR_UNSUPPORTED; + } + + typedef CryptoFactory *(*CreateCryptoFactoryFunc)(); + CreateCryptoFactoryFunc createCryptoFactory = + (CreateCryptoFactoryFunc)dlsym(mLibHandle, "createCryptoFactory"); + + if (createCryptoFactory == NULL + || ((mFactory = createCryptoFactory()) == NULL)) { + dlclose(mLibHandle); + mLibHandle = NULL; + + return ERROR_UNSUPPORTED; + } + + return OK; } -status_t Crypto::setEntitlementKey( - const void *key, size_t keyLength) { - return ERROR_UNSUPPORTED; +bool Crypto::isCryptoSchemeSupported(const uint8_t uuid[16]) const { + Mutex::Autolock autoLock(mLock); + + if (mInitCheck != OK) { + return false; + } + + return mFactory->isCryptoSchemeSupported(uuid); } -status_t Crypto::setEntitlementControlMessage( - const void *msg, size_t msgLength) { - return ERROR_UNSUPPORTED; +status_t Crypto::createPlugin( + const uint8_t uuid[16], const void *data, size_t size) { + Mutex::Autolock autoLock(mLock); + + if (mInitCheck != OK) { + return mInitCheck; + } + + if (mPlugin != NULL) { + return -EINVAL; + } + + return mFactory->createPlugin(uuid, data, size, &mPlugin); } -ssize_t Crypto::decryptVideo( - const void *iv, size_t ivLength, - const void *srcData, size_t srcDataSize, - void *dstData, size_t dstDataOffset) { - return ERROR_UNSUPPORTED; +status_t Crypto::destroyPlugin() { + Mutex::Autolock autoLock(mLock); + + if (mInitCheck != OK) { + return mInitCheck; + } + + if (mPlugin == NULL) { + return -EINVAL; + } + + delete mPlugin; + mPlugin = NULL; + + return OK; +} + +bool Crypto::requiresSecureDecoderComponent(const char *mime) const { + Mutex::Autolock autoLock(mLock); + + if (mInitCheck != OK) { + return mInitCheck; + } + + if (mPlugin == NULL) { + return -EINVAL; + } + + return mPlugin->requiresSecureDecoderComponent(mime); } -ssize_t Crypto::decryptAudio( - const void *iv, size_t ivLength, - const void *srcData, size_t srcDataSize, - void *dstData, size_t dstDataSize) { - return ERROR_UNSUPPORTED; +status_t Crypto::decrypt( + bool secure, + const uint8_t key[16], + const uint8_t iv[16], + CryptoPlugin::Mode mode, + const void *srcPtr, + const CryptoPlugin::SubSample *subSamples, size_t numSubSamples, + void *dstPtr) { + Mutex::Autolock autoLock(mLock); + + if (mInitCheck != OK) { + return mInitCheck; + } + + if (mPlugin == NULL) { + return -EINVAL; + } + + return mPlugin->decrypt( + secure, key, iv, mode, srcPtr, subSamples, numSubSamples, dstPtr); } } // namespace android diff --git a/media/libmediaplayerservice/Crypto.h b/media/libmediaplayerservice/Crypto.h index 9855496..74de2b5 100644 --- a/media/libmediaplayerservice/Crypto.h +++ b/media/libmediaplayerservice/Crypto.h @@ -23,32 +23,44 @@ namespace android { +struct CryptoFactory; +struct CryptoPlugin; + struct Crypto : public BnCrypto { Crypto(); + virtual ~Crypto(); - virtual status_t initialize(); - virtual status_t terminate(); + virtual status_t initCheck() const; - virtual status_t setEntitlementKey( - const void *key, size_t keyLength); + virtual bool isCryptoSchemeSupported(const uint8_t uuid[16]) const; - virtual status_t setEntitlementControlMessage( - const void *msg, size_t msgLength); + virtual status_t createPlugin( + const uint8_t uuid[16], const void *data, size_t size); - virtual ssize_t decryptVideo( - const void *iv, size_t ivLength, - const void *srcData, size_t srcDataSize, - void *dstData, size_t dstDataOffset); + virtual status_t destroyPlugin(); - virtual ssize_t decryptAudio( - const void *iv, size_t ivLength, - const void *srcData, size_t srcDataSize, - void *dstData, size_t dstDataSize); + virtual bool requiresSecureDecoderComponent( + const char *mime) const; -protected: - virtual ~Crypto(); + virtual status_t decrypt( + bool secure, + const uint8_t key[16], + const uint8_t iv[16], + CryptoPlugin::Mode mode, + const void *srcPtr, + const CryptoPlugin::SubSample *subSamples, size_t numSubSamples, + void *dstPtr); private: + mutable Mutex mLock; + + status_t mInitCheck; + void *mLibHandle; + CryptoFactory *mFactory; + CryptoPlugin *mPlugin; + + status_t init(); + DISALLOW_EVIL_CONSTRUCTORS(Crypto); }; diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index a977337..7c3fb0d 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -294,13 +294,7 @@ sp<IOMX> MediaPlayerService::getOMX() { } sp<ICrypto> MediaPlayerService::makeCrypto() { - Mutex::Autolock autoLock(mLock); - - if (mCrypto == NULL) { - mCrypto = new Crypto; - } - - return mCrypto; + return new Crypto; } status_t MediaPlayerService::AudioCache::dump(int fd, const Vector<String16>& args) const |