Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f21cdafd authored by Jeff Tinker's avatar Jeff Tinker
Browse files

Update shared memory access method in the crypto plugin hal

Required for functionality and performance

Test: gtests passing

bug:32815560
bug:34234561
Change-Id: I712bc4c332ff5721cf1369357d456b364d84967d
parent f2101feb
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -56,6 +56,15 @@ interface ICryptoPlugin {
     */
    setMediaDrmSession(vec<uint8_t> sessionId) generates(Status status);

    /**
     * Set a shared memory base for subsequent decrypt operations. The buffer
     * base is a hidl_memory which maps shared memory in the HAL module.
     * After the shared buffer base is established, the decrypt() method
     * receives SharedBuffer instances which specify the buffer address range
     * for decrypt source and destination addresses.
     */
    setSharedBufferBase(memory base);

    /**
     * Decrypt an array of subsamples from the source memory buffer to the
     * destination memory buffer.
@@ -91,6 +100,6 @@ interface ICryptoPlugin {
     */
    decrypt(bool secure, uint8_t[16] keyId, uint8_t[16] iv, Mode mode,
        Pattern pattern, vec<SubSample> subSamples,
            memory source, uint32_t offset, DestinationBuffer destination)
            SharedBuffer source, uint64_t offset, DestinationBuffer destination)
        generates(Status status, uint32_t bytesWritten, string detailedError);
};
+22 −18
Original line number Diff line number Diff line
@@ -17,15 +17,14 @@
#include "CryptoPlugin.h"
#include "TypeConvert.h"

#include <media/stagefright/foundation/AString.h>

#include <hidlmemory/mapping.h>
#include <android/hidl/memory/1.0/IMemory.h>
#include <hidlmemory/mapping.h>
#include <media/stagefright/foundation/AString.h>
#include <utils/Log.h>

using android::hardware::hidl_memory;
using android::hidl::memory::V1_0::IMemory;


namespace android {
namespace hardware {
namespace drm {
@@ -50,11 +49,16 @@ namespace implementation {
        return toStatus(mLegacyPlugin->setMediaDrmSession(toVector(sessionId)));
    }

    Return<void> CryptoPlugin::setSharedBufferBase(const hidl_memory& base) {
        mSharedBufferBase = mapMemory(base);
        return Void();
    }

    Return<void> CryptoPlugin::decrypt(bool secure,
            const hidl_array<uint8_t, 16>& keyId,
            const hidl_array<uint8_t, 16>& iv, Mode mode,
            const Pattern& pattern, const hidl_vec<SubSample>& subSamples,
            const hidl_memory& source, uint32_t offset,
            const SharedBuffer& source, uint32_t offset,
            const DestinationBuffer& destination,
            decrypt_cb _hidl_cb) {

@@ -89,19 +93,23 @@ namespace implementation {

        AString detailMessage;

        sp<IMemory> sharedSourceMemory = mapMemory(source);
        if (source.offset + offset + source.size > mSharedBufferBase->getSize()) {
            _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, 0, "invalid buffer size");
            return Void();
        }

        void *srcPtr = static_cast<void *>(sharedSourceMemory->getPointer());
        uint8_t *offsetSrc = static_cast<uint8_t *>(srcPtr) + offset;
        srcPtr = static_cast<void *>(offsetSrc);
        uint8_t *base = static_cast<uint8_t *>
                (static_cast<void *>(mSharedBufferBase->getPointer()));
        void *srcPtr = static_cast<void *>(base + source.offset + offset);

        sp<IMemory> sharedDestinationMemory;
        void *destPtr = NULL;

        if (destination.type == BufferType::SHARED_MEMORY) {
            sharedDestinationMemory = mapMemory(destination.nonsecureMemory);
            sharedDestinationMemory->update();
            destPtr = sharedDestinationMemory->getPointer();
            const SharedBuffer& destBuffer = destination.nonsecureMemory;
            if (destBuffer.offset + destBuffer.size > mSharedBufferBase->getSize()) {
                _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, 0, "invalid buffer size");
                return Void();
            }
            destPtr = static_cast<void *>(base + destination.nonsecureMemory.offset);
        } else if (destination.type == BufferType::NATIVE_HANDLE) {
            native_handle_t *handle = const_cast<native_handle_t *>(
                    destination.secureMemory.getNativeHandle());
@@ -111,10 +119,6 @@ namespace implementation {
                legacyMode, legacyPattern, srcPtr, legacySubSamples,
                subSamples.size(), destPtr, &detailMessage);

        if (destination.type == BufferType::SHARED_MEMORY) {
            sharedDestinationMemory->commit();
        }

        delete[] legacySubSamples;

        uint32_t status;
+7 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#define ANDROID_HARDWARE_DRM_CRYPTO_V1_0__CRYPTOPLUGIN_H

#include <media/hardware/CryptoAPI.h>
#include <android/hidl/memory/1.0/IMemory.h>
#include <android/hardware/drm/crypto/1.0/ICryptoPlugin.h>
#include <hidl/Status.h>

@@ -38,6 +39,7 @@ using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::hidl::memory::V1_0::IMemory;
using ::android::sp;

struct CryptoPlugin : public ICryptoPlugin {
@@ -56,14 +58,18 @@ struct CryptoPlugin : public ICryptoPlugin {
    Return<Status> setMediaDrmSession(const hidl_vec<uint8_t>& sessionId)
            override;

    Return<void> setSharedBufferBase(const ::android::hardware::hidl_memory& base)
            override;

    Return<void> decrypt(bool secure, const hidl_array<uint8_t, 16>& keyId,
            const hidl_array<uint8_t, 16>& iv, Mode mode, const Pattern& pattern,
            const hidl_vec<SubSample>& subSamples, const hidl_memory& source,
            const hidl_vec<SubSample>& subSamples, const SharedBuffer& source,
            uint32_t offset, const DestinationBuffer& destination,
            decrypt_cb _hidl_cb) override;

private:
    android::CryptoPlugin *mLegacyPlugin;
    sp<IMemory> mSharedBufferBase;

    CryptoPlugin() = delete;
    CryptoPlugin(const CryptoPlugin &) = delete;
+18 −1
Original line number Diff line number Diff line
@@ -114,6 +114,23 @@ enum BufferType : uint32_t {
    NATIVE_HANDLE = 1,
};

/**
 * A SharedBuffer describes a decrypt buffer which is defined by an offset and
 * a size.  The offset is relative to the shared memory base which is established
 * using setSharedMemoryBase().
 */
struct SharedBuffer {
    /**
     * The offset from the shared memory base
     */
    uint64_t offset;

    /**
     * The size of the shared buffer in bytes
     */
    uint64_t size;
};


/**
 * A decrypt destination buffer can be either normal user-space shared
@@ -131,7 +148,7 @@ struct DestinationBuffer {
     * If type == SHARED_MEMORY, the decrypted data must be written
     * to user-space non-secure shared memory.
     */
    memory nonsecureMemory;
    SharedBuffer nonsecureMemory;

    /**
     * If type == NATIVE_HANDLE, the decrypted data must be written