1 /* 2 * Copyright (C) 2017 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 CRYPTO_HAL_H_ 18 19 #define CRYPTO_HAL_H_ 20 21 #include <android/hardware/drm/1.0/ICryptoFactory.h> 22 #include <android/hardware/drm/1.0/ICryptoPlugin.h> 23 #include <android/hardware/drm/1.1/ICryptoFactory.h> 24 25 #include <mediadrm/ICrypto.h> 26 #include <utils/KeyedVector.h> 27 #include <utils/threads.h> 28 29 namespace drm = ::android::hardware::drm; 30 using drm::V1_0::ICryptoFactory; 31 using drm::V1_0::ICryptoPlugin; 32 using drm::V1_0::SharedBuffer; 33 34 class IMemoryHeap; 35 36 namespace android { 37 38 struct CryptoHal : public BnCrypto { 39 CryptoHal(); 40 virtual ~CryptoHal(); 41 42 virtual status_t initCheck() const; 43 44 virtual bool isCryptoSchemeSupported(const uint8_t uuid[16]); 45 46 virtual status_t createPlugin( 47 const uint8_t uuid[16], const void *data, size_t size); 48 49 virtual status_t destroyPlugin(); 50 51 virtual bool requiresSecureDecoderComponent( 52 const char *mime) const; 53 54 virtual void notifyResolution(uint32_t width, uint32_t height); 55 56 virtual status_t setMediaDrmSession(const Vector<uint8_t> &sessionId); 57 58 virtual ssize_t decrypt(const uint8_t key[16], const uint8_t iv[16], 59 CryptoPlugin::Mode mode, const CryptoPlugin::Pattern &pattern, 60 const ICrypto::SourceBuffer &source, size_t offset, 61 const CryptoPlugin::SubSample *subSamples, size_t numSubSamples, 62 const ICrypto::DestinationBuffer &destination, 63 AString *errorDetailMsg); 64 setHeapCryptoHal65 virtual int32_t setHeap(const sp<IMemoryHeap>& heap) { 66 return setHeapBase(heap); 67 } unsetHeapCryptoHal68 virtual void unsetHeap(int32_t seqNum) { clearHeapBase(seqNum); } 69 70 private: 71 mutable Mutex mLock; 72 73 const Vector<sp<ICryptoFactory>> mFactories; 74 sp<ICryptoPlugin> mPlugin; 75 76 /** 77 * mInitCheck is: 78 * NO_INIT if a plugin hasn't been created yet 79 * ERROR_UNSUPPORTED if a plugin can't be created for the uuid 80 * OK after a plugin has been created and mPlugin is valid 81 */ 82 status_t mInitCheck; 83 84 struct HeapBase { HeapBaseCryptoHal::HeapBase85 HeapBase() : mBufferId(0), mSize(0) {} HeapBaseCryptoHal::HeapBase86 HeapBase(uint32_t bufferId, size_t size) : 87 mBufferId(bufferId), mSize(size) {} 88 getBufferIdCryptoHal::HeapBase89 uint32_t getBufferId() const {return mBufferId;} getSizeCryptoHal::HeapBase90 size_t getSize() const {return mSize;} 91 92 private: 93 uint32_t mBufferId; 94 size_t mSize; 95 }; 96 97 KeyedVector<int32_t, HeapBase> mHeapBases; 98 uint32_t mNextBufferId; 99 int32_t mHeapSeqNum; 100 101 Vector<sp<ICryptoFactory>> makeCryptoFactories(); 102 sp<ICryptoPlugin> makeCryptoPlugin(const sp<ICryptoFactory>& factory, 103 const uint8_t uuid[16], const void *initData, size_t size); 104 105 int32_t setHeapBase(const sp<IMemoryHeap>& heap); 106 void clearHeapBase(int32_t seqNum); 107 108 status_t toSharedBuffer(const sp<IMemory>& memory, int32_t seqNum, ::SharedBuffer* buffer); 109 110 DISALLOW_EVIL_CONSTRUCTORS(CryptoHal); 111 }; 112 113 } // namespace android 114 115 #endif // CRYPTO_HAL_H_ 116