blob: ea85ac8c1bb506a1ee0419ceec692cdb8c2498b4 [file] [log] [blame]
/*
* Copyright (C) 2021 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.
*/
#pragma once
#include <aidl/android/hardware/drm/BnDrmPlugin.h>
#include <aidl/android/hardware/drm/IDrmPluginListener.h>
#include <aidl/android/hardware/drm/Status.h>
#include <stdio.h>
#include <map>
#include <utils/List.h>
#include "DeviceFiles.h"
#include "SessionLibrary.h"
namespace aidl {
namespace android {
namespace hardware {
namespace drm {
namespace clearkey {
using namespace clearkeydrm;
using ::aidl::android::hardware::drm::KeyType;
using ::aidl::android::hardware::drm::Status;
struct DrmPlugin : public BnDrmPlugin {
public:
explicit DrmPlugin(SessionLibrary* sessionLibrary);
virtual ~DrmPlugin() { mFileHandle.DeleteAllLicenses(); }
::ndk::ScopedAStatus closeSession(const std::vector<uint8_t>& in_sessionId) override;
::ndk::ScopedAStatus decrypt(const std::vector<uint8_t>& in_sessionId,
const std::vector<uint8_t>& in_keyId,
const std::vector<uint8_t>& in_input,
const std::vector<uint8_t>& in_iv,
std::vector<uint8_t>* _aidl_return) override;
::ndk::ScopedAStatus encrypt(const std::vector<uint8_t>& in_sessionId,
const std::vector<uint8_t>& in_keyId,
const std::vector<uint8_t>& in_input,
const std::vector<uint8_t>& in_iv,
std::vector<uint8_t>* _aidl_return) override;
::ndk::ScopedAStatus getHdcpLevels(
::aidl::android::hardware::drm::HdcpLevels* _aidl_return) override;
::ndk::ScopedAStatus getKeyRequest(
const std::vector<uint8_t>& in_scope, const std::vector<uint8_t>& in_initData,
const std::string& in_mimeType, ::aidl::android::hardware::drm::KeyType in_keyType,
const std::vector<::aidl::android::hardware::drm::KeyValue>& in_optionalParameters,
::aidl::android::hardware::drm::KeyRequest* _aidl_return) override;
::ndk::ScopedAStatus getLogMessages(
std::vector<::aidl::android::hardware::drm::LogMessage>* _aidl_return) override;
::ndk::ScopedAStatus getMetrics(
std::vector<::aidl::android::hardware::drm::DrmMetricGroup>* _aidl_return) override;
::ndk::ScopedAStatus getNumberOfSessions(
::aidl::android::hardware::drm::NumberOfSessions* _aidl_return) override;
::ndk::ScopedAStatus getOfflineLicenseKeySetIds(
std::vector<::aidl::android::hardware::drm::KeySetId>* _aidl_return) override;
::ndk::ScopedAStatus getOfflineLicenseState(
const ::aidl::android::hardware::drm::KeySetId& in_keySetId,
::aidl::android::hardware::drm::OfflineLicenseState* _aidl_return) override;
::ndk::ScopedAStatus getPropertyByteArray(const std::string& in_propertyName,
std::vector<uint8_t>* _aidl_return) override;
::ndk::ScopedAStatus getPropertyString(const std::string& in_propertyName,
std::string* _aidl_return) override;
::ndk::ScopedAStatus getProvisionRequest(
const std::string& in_certificateType, const std::string& in_certificateAuthority,
::aidl::android::hardware::drm::ProvisionRequest* _aidl_return) override;
::ndk::ScopedAStatus getSecureStop(
const ::aidl::android::hardware::drm::SecureStopId& in_secureStopId,
::aidl::android::hardware::drm::SecureStop* _aidl_return) override;
::ndk::ScopedAStatus getSecureStopIds(
std::vector<::aidl::android::hardware::drm::SecureStopId>* _aidl_return) override;
::ndk::ScopedAStatus getSecureStops(
std::vector<::aidl::android::hardware::drm::SecureStop>* _aidl_return) override;
::ndk::ScopedAStatus getSecurityLevel(
const std::vector<uint8_t>& in_sessionId,
::aidl::android::hardware::drm::SecurityLevel* _aidl_return) override;
::ndk::ScopedAStatus openSession(::aidl::android::hardware::drm::SecurityLevel in_securityLevel,
std::vector<uint8_t>* _aidl_return) override;
::ndk::ScopedAStatus provideKeyResponse(
const std::vector<uint8_t>& in_scope, const std::vector<uint8_t>& in_response,
::aidl::android::hardware::drm::KeySetId* _aidl_return) override;
::ndk::ScopedAStatus provideProvisionResponse(
const std::vector<uint8_t>& in_response,
::aidl::android::hardware::drm::ProvideProvisionResponseResult* _aidl_return) override;
::ndk::ScopedAStatus queryKeyStatus(
const std::vector<uint8_t>& in_sessionId,
std::vector<::aidl::android::hardware::drm::KeyValue>* _aidl_return) override;
::ndk::ScopedAStatus releaseAllSecureStops() override;
::ndk::ScopedAStatus releaseSecureStop(
const ::aidl::android::hardware::drm::SecureStopId& in_secureStopId) override;
::ndk::ScopedAStatus releaseSecureStops(
const ::aidl::android::hardware::drm::OpaqueData& in_ssRelease) override;
::ndk::ScopedAStatus removeAllSecureStops() override;
::ndk::ScopedAStatus removeKeys(const std::vector<uint8_t>& in_sessionId) override;
::ndk::ScopedAStatus removeOfflineLicense(
const ::aidl::android::hardware::drm::KeySetId& in_keySetId) override;
::ndk::ScopedAStatus removeSecureStop(
const ::aidl::android::hardware::drm::SecureStopId& in_secureStopId) override;
::ndk::ScopedAStatus requiresSecureDecoder(
const std::string& in_mime, ::aidl::android::hardware::drm::SecurityLevel in_level,
bool* _aidl_return) override;
::ndk::ScopedAStatus restoreKeys(
const std::vector<uint8_t>& in_sessionId,
const ::aidl::android::hardware::drm::KeySetId& in_keySetId) override;
::ndk::ScopedAStatus setCipherAlgorithm(const std::vector<uint8_t>& in_sessionId,
const std::string& in_algorithm) override;
::ndk::ScopedAStatus setListener(
// const ::android::sp<::aidl::android::hardware::drm::IDrmPluginListener>&
// in_listener)
const std::shared_ptr<IDrmPluginListener>& in_listener) override;
::ndk::ScopedAStatus setMacAlgorithm(const std::vector<uint8_t>& in_sessionId,
const std::string& in_algorithm) override;
::ndk::ScopedAStatus setPlaybackId(const std::vector<uint8_t>& in_sessionId,
const std::string& in_playbackId) override;
::ndk::ScopedAStatus setPropertyByteArray(const std::string& in_propertyName,
const std::vector<uint8_t>& in_value) override;
::ndk::ScopedAStatus setPropertyString(const std::string& in_propertyName,
const std::string& in_value) override;
::ndk::ScopedAStatus sign(const std::vector<uint8_t>& in_sessionId,
const std::vector<uint8_t>& in_keyId,
const std::vector<uint8_t>& in_message,
std::vector<uint8_t>* _aidl_return) override;
::ndk::ScopedAStatus signRSA(const std::vector<uint8_t>& in_sessionId,
const std::string& in_algorithm,
const std::vector<uint8_t>& in_message,
const std::vector<uint8_t>& in_wrappedkey,
std::vector<uint8_t>* _aidl_return) override;
::ndk::ScopedAStatus verify(const std::vector<uint8_t>& in_sessionId,
const std::vector<uint8_t>& in_keyId,
const std::vector<uint8_t>& in_message,
const std::vector<uint8_t>& in_signature,
bool* _aidl_return) override;
private:
void initProperties();
int32_t getIntProperty(const std::string& prop, int32_t defaultVal = 0) const;
int32_t getOemError() const;
int32_t getErrorContext() const;
void installSecureStop(const std::vector<uint8_t>& sessionId);
bool makeKeySetId(std::string* keySetId);
void setPlayPolicy();
void sendEvent(::aidl::android::hardware::drm::EventType in_eventType,
const std::vector<uint8_t>& in_sessionId,
const std::vector<uint8_t>& in_data);
void sendExpirationUpdate(const std::vector<uint8_t>& in_sessionId,
int64_t in_expiryTimeInMS);
void sendKeysChange(
const std::vector<uint8_t>& in_sessionId,
const std::vector<::aidl::android::hardware::drm::KeyStatus>& in_keyStatusList,
bool in_hasNewUsableKey);
void sendSessionLostState(const std::vector<uint8_t>& in_sessionId);
Status setSecurityLevel(const std::vector<uint8_t>& sessionId, SecurityLevel level);
Status getKeyRequestCommon(const std::vector<uint8_t>& scope,
const std::vector<uint8_t>& initData, const std::string& mimeType,
KeyType keyType, const std::vector<KeyValue>& optionalParameters,
std::vector<uint8_t>* request, KeyRequestType* getKeyRequestType,
std::string* defaultUrl);
struct ClearkeySecureStop {
std::vector<uint8_t> id;
std::vector<uint8_t> data;
};
std::map<std::vector<uint8_t>, ClearkeySecureStop> mSecureStops;
std::vector<KeyValue> mPlayPolicy;
std::map<std::string, std::string> mStringProperties;
std::map<std::string, std::vector<uint8_t>> mByteArrayProperties;
std::map<std::string, std::vector<uint8_t>> mReleaseKeysMap;
std::map<std::vector<uint8_t>, std::string> mPlaybackId;
std::map<std::vector<uint8_t>, SecurityLevel> mSecurityLevel;
::std::shared_ptr<IDrmPluginListener> mListener;
SessionLibrary* mSessionLibrary;
int64_t mOpenSessionOkCount;
int64_t mCloseSessionOkCount;
int64_t mCloseSessionNotOpenedCount;
uint32_t mNextSecureStopId;
::android::Mutex mPlayPolicyLock;
// set by property to mock error scenarios
Status mMockError;
void processMockError(const ::android::sp<Session>& session) {
session->setMockError(static_cast<CdmResponseType>(mMockError));
mMockError = Status::OK;
}
DeviceFiles mFileHandle;
::android::Mutex mSecureStopLock;
CLEARKEY_DISALLOW_COPY_AND_ASSIGN_AND_NEW(DrmPlugin);
};
} // namespace clearkey
} // namespace drm
} // namespace hardware
} // namespace android
} // namespace aidl