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

Commit 07d3b6b5 authored by Jeff Tinker's avatar Jeff Tinker Committed by Android (Google) Code Review
Browse files

Merge "drm+crypto HAL default implementation"

parents 9f52a87e b075caa3
Loading
Loading
Loading
Loading
+0 −7
Original line number Diff line number Diff line
@@ -46,11 +46,4 @@ interface ICryptoFactory {
     */
    createPlugin(uint8_t[16] uuid, vec<uint8_t> initData)
        generates (Status status, ICryptoPlugin cryptoPlugin);

    /**
     * Destroy a previously created crypto plugin
     *
     * @return status the status of the call
     */
    destroyPlugin() generates(Status status);
};
+1 −1
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ interface ICryptoPlugin {
     *
     * @param sessionId the MediaDrm session ID to associate with this crypto
     * session
     * @return the status of the call, status must be
     * @return status the status of the call, status must be
     * ERROR_DRM_SESSION_NOT_OPENED if the session is not opened, or
     * ERROR_DRM_CANNOT_HANDLE if the operation is not supported by the drm
     * scheme.
+41 −0
Original line number Diff line number Diff line
# Copyright (C) 2016, The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := android.hardware.drm.crypto@1.0-impl
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_SRC_FILES := \
    CryptoFactory.cpp \
    CryptoPlugin.cpp \
    TypeConvert.cpp \

LOCAL_SHARED_LIBRARIES := \
    libhidlbase \
    libhidltransport \
    libhwbinder \
    libhidlmemory \
    libutils \
    liblog \
    libmediadrm \
    libstagefright_foundation \
    android.hardware.drm.crypto@1.0 \
    android.hidl.memory@1.0

LOCAL_C_INCLUDES := \
    frameworks/native/include \
    frameworks/av/include

include $(BUILD_SHARED_LIBRARY)
+74 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "CryptoFactory.h"
#include "CryptoPlugin.h"
#include "TypeConvert.h"
#include <utils/Log.h>

namespace android {
namespace hardware {
namespace drm {
namespace crypto {
namespace V1_0 {
namespace implementation {

    CryptoFactory::CryptoFactory() :
        loader("/vendor/lib/mediadrm", "createCryptoFactory", "crypto") {}

    // Methods from ::android::hardware::drm::crypto::V1_0::ICryptoFactory follow.
    Return<bool> CryptoFactory::isCryptoSchemeSupported(
            const hidl_array<uint8_t, 16>& uuid) {
        for (size_t i = 0; i < loader.factoryCount(); i++) {
            if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) {
                return true;
            }
        }
        return false;
    }

    Return<void> CryptoFactory::createPlugin(const hidl_array<uint8_t, 16>& uuid,
            const hidl_vec<uint8_t>& initData, createPlugin_cb _hidl_cb) {

        for (size_t i = 0; i < loader.factoryCount(); i++) {
            if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) {
                android::CryptoPlugin *legacyPlugin = NULL;
                status_t status = loader.getFactory(i)->createPlugin(uuid.data(),
                        initData.data(), initData.size(), &legacyPlugin);
                CryptoPlugin *newPlugin = NULL;
                if (legacyPlugin == NULL) {
                    ALOGE("Crypto legacy HAL: failed to create crypto plugin");
                } else {
                    newPlugin = new CryptoPlugin(legacyPlugin);
                }
                _hidl_cb(toStatus(status), newPlugin);
                return Void();
            }
        }
        _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, NULL);
        return Void();
    }

    ICryptoFactory* HIDL_FETCH_ICryptoFactory(const char /* *name */) {
        return new CryptoFactory();
    }

}  // namespace implementation
}  // namespace V1_0
}  // namespace crypto
}  // namespace drm
}  // namespace hardware
}  // namespace android
+70 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef ANDROID_HARDWARE_DRM_CRYPTO_V1_0__CRYPTOFACTORY_H
#define ANDROID_HARDWARE_DRM_CRYPTO_V1_0__CRYPTOFACTORY_H

#include <android/hardware/drm/crypto/1.0/ICryptoFactory.h>
#include <hidl/Status.h>
#include <media/hardware/CryptoAPI.h>
#include <media/PluginLoader.h>
#include <media/SharedLibrary.h>

namespace android {
namespace hardware {
namespace drm {
namespace crypto {
namespace V1_0 {
namespace implementation {

using ::android::hardware::drm::crypto::V1_0::ICryptoFactory;
using ::android::hardware::drm::crypto::V1_0::ICryptoPlugin;
using ::android::hardware::hidl_array;
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::sp;

struct CryptoFactory : public ICryptoFactory {
    CryptoFactory();
    virtual ~CryptoFactory() {}

    // Methods from ::android::hardware::drm::crypto::V1_0::ICryptoFactory follow.

    Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>& uuid)
            override;

    Return<void> createPlugin(const hidl_array<uint8_t, 16>& uuid,
            const hidl_vec<uint8_t>& initData, createPlugin_cb _hidl_cb)
            override;

private:
    android::PluginLoader<android::CryptoFactory> loader;

    CryptoFactory(const CryptoFactory &) = delete;
    void operator=(const CryptoFactory &) = delete;
};

extern "C" ICryptoFactory* HIDL_FETCH_ICryptoFactory(const char* name);

}  // namespace implementation
}  // namespace V1_0
}  // namespace crypto
}  // namespace drm
}  // namespace hardware
}  // namespace android

#endif  // ANDROID_HARDWARE_DRM_CRYPTO_V1_0__CRYPTOFACTORY_H
Loading