1e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/*
2e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Copyright (C) 2017 The Android Open Source Project
3e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
4e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Licensed under the Apache License, Version 2.0 (the "License");
5e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * you may not use this file except in compliance with the License.
6e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * You may obtain a copy of the License at
7e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
8e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *      http://www.apache.org/licenses/LICENSE-2.0
9e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
10e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Unless required by applicable law or agreed to in writing, software
11e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * distributed under the License is distributed on an "AS IS" BASIS,
12e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * See the License for the specific language governing permissions and
14e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * limitations under the License.
15e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */
16e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
17e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#ifndef CRYPTO_HAL_H_
18e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
19e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define CRYPTO_HAL_H_
20e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
21e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <android/hardware/drm/1.0/ICryptoFactory.h>
22e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <android/hardware/drm/1.0/ICryptoPlugin.h>
23abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker
24e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/ICrypto.h>
25e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/KeyedVector.h>
26e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/threads.h>
27e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
28abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerusing ::android::hardware::drm::V1_0::ICryptoFactory;
29abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerusing ::android::hardware::drm::V1_0::ICryptoPlugin;
30abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerusing ::android::hardware::drm::V1_0::SharedBuffer;
31e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
32e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass IMemoryHeap;
33e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
34e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace android {
35e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
36e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct CryptoHal : public BnCrypto {
37e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    CryptoHal();
38e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual ~CryptoHal();
39e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
40e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t initCheck() const;
41e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
42e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual bool isCryptoSchemeSupported(const uint8_t uuid[16]);
43e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
44e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t createPlugin(
45e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            const uint8_t uuid[16], const void *data, size_t size);
46e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
47e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t destroyPlugin();
48e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
49e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual bool requiresSecureDecoderComponent(
50e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            const char *mime) const;
51e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
52e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual void notifyResolution(uint32_t width, uint32_t height);
53e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
54e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual status_t setMediaDrmSession(const Vector<uint8_t> &sessionId);
55e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
56e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    virtual ssize_t decrypt(const uint8_t key[16], const uint8_t iv[16],
57e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            CryptoPlugin::Mode mode, const CryptoPlugin::Pattern &pattern,
586dcab2bafd847be84c2c2230bbd04af9c45c491eChong Zhang            const ICrypto::SourceBuffer &source, size_t offset,
59e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            const CryptoPlugin::SubSample *subSamples, size_t numSubSamples,
60e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            const ICrypto::DestinationBuffer &destination,
61e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            AString *errorDetailMsg);
62e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
636dcab2bafd847be84c2c2230bbd04af9c45c491eChong Zhang    virtual int32_t setHeap(const sp<IMemoryHeap>& heap) {
646dcab2bafd847be84c2c2230bbd04af9c45c491eChong Zhang        return setHeapBase(heap);
656dcab2bafd847be84c2c2230bbd04af9c45c491eChong Zhang    }
666dcab2bafd847be84c2c2230bbd04af9c45c491eChong Zhang    virtual void unsetHeap(int32_t seqNum) { clearHeapBase(seqNum); }
67d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang
68e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate:
69e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    mutable Mutex mLock;
70e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
71abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    const Vector<sp<ICryptoFactory>> mFactories;
72abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    sp<ICryptoPlugin> mPlugin;
73e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
74e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    /**
75e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     * mInitCheck is:
76e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *   NO_INIT if a plugin hasn't been created yet
77e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *   ERROR_UNSUPPORTED if a plugin can't be created for the uuid
78e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     *   OK after a plugin has been created and mPlugin is valid
79e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman     */
80e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    status_t mInitCheck;
81e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
826dcab2bafd847be84c2c2230bbd04af9c45c491eChong Zhang    KeyedVector<int32_t, uint32_t> mHeapBases;
83e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    uint32_t mNextBufferId;
846dcab2bafd847be84c2c2230bbd04af9c45c491eChong Zhang    int32_t mHeapSeqNum;
85e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
86abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    Vector<sp<ICryptoFactory>> makeCryptoFactories();
87abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    sp<ICryptoPlugin> makeCryptoPlugin(const sp<ICryptoFactory>& factory,
88abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            const uint8_t uuid[16], const void *initData, size_t size);
89e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
906dcab2bafd847be84c2c2230bbd04af9c45c491eChong Zhang    int32_t setHeapBase(const sp<IMemoryHeap>& heap);
916dcab2bafd847be84c2c2230bbd04af9c45c491eChong Zhang    void clearHeapBase(int32_t seqNum);
92e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
936dcab2bafd847be84c2c2230bbd04af9c45c491eChong Zhang    status_t toSharedBuffer(const sp<IMemory>& memory, int32_t seqNum, ::SharedBuffer* buffer);
94e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
95e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    DISALLOW_EVIL_CONSTRUCTORS(CryptoHal);
96e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman};
97e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
98e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}  // namespace android
99e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
100e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#endif  // CRYPTO_HAL_H_
101