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

Commit 96af957b authored by Kyle Zhang's avatar Kyle Zhang
Browse files

Fix several bugs from cts test through aidl clearkey

* handle error code in DrmHalAidl and CryptoHalAidl
* clearkey aidl getKeyRequest defaultUrl

Test: atest CtsMediaDrmTestCases
Bug: 206804036
Change-Id: I038c6d92df8b222ab69aa48c4b994c8c9516c711
parent 3eeeda39
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ using ::aidl::android::hardware::drm::Uuid;
using ::aidl::android::hardware::common::Ashmem;

using ::android::sp;
using ::android::DrmUtils::toStatusTAidl;
using ::android::DrmUtils::statusAidlToStatusT;
using ::android::hardware::hidl_array;
using ::android::hardware::hidl_handle;
using ::android::hardware::hidl_memory;
@@ -281,7 +281,7 @@ status_t CryptoHalAidl::setMediaDrmSession(const Vector<uint8_t>& sessionId) {
    }

    auto err = mPlugin->setMediaDrmSession(toStdVec(sessionId));
    return err.isOk() ? toStatusTAidl(err.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(err);
}

ssize_t CryptoHalAidl::decrypt(const uint8_t keyId[16], const uint8_t iv[16],
@@ -350,13 +350,12 @@ ssize_t CryptoHalAidl::decrypt(const uint8_t keyId[16], const uint8_t iv[16],
    std::vector<uint8_t> keyIdAidl(toStdVec(keyId, 16));
    std::vector<uint8_t> ivAidl(toStdVec(iv, 16));
    DecryptResult result;
    err = mPlugin->decrypt(secure, keyIdAidl, ivAidl, aMode, aPattern, stdSubSamples,
    ::ndk::ScopedAStatus statusAidl = mPlugin->decrypt(secure,
                           keyIdAidl, ivAidl, aMode, aPattern, stdSubSamples,
                           hidlSharedBufferToAidlSharedBuffer(hSource), offset,
                           hidlDestinationBufferToAidlDestinationBuffer(hDestination), &result)
                          .isOk()
                  ? OK
                  : DEAD_OBJECT;
                           hidlDestinationBufferToAidlDestinationBuffer(hDestination), &result);

    err = statusAidlToStatusT(statusAidl);
    *errorDetailMsg = toString8(result.detailedError);
    if (err != OK) {
        ALOGE("Failed on decrypt, error message:%s, bytes written:%d", result.detailedError.c_str(),
+40 −41
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@
#include <mediadrm/DrmSessionManager.h>
#include <mediadrm/DrmUtils.h>

using ::android::DrmUtils::toStatusTAidl;
using ::android::DrmUtils::statusAidlToStatusT;

using ::aidl::android::hardware::drm::DrmMetricNamedValue;
using ::aidl::android::hardware::drm::DrmMetricValue;
@@ -511,7 +511,7 @@ status_t DrmHalAidl::openSession(DrmPlugin::SecurityLevel level, Vector<uint8_t>

        ::ndk::ScopedAStatus status = mPlugin->openSession(aSecurityLevel, &aSessionId);
        if (status.isOk()) sessionId = toVector(aSessionId);
        err = status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
        err = statusAidlToStatusT(status);

        if (err == ERROR_DRM_RESOURCE_BUSY && retry) {
            mLock.unlock();
@@ -545,6 +545,7 @@ status_t DrmHalAidl::closeSession(Vector<uint8_t> const& sessionId) {

    std::vector<uint8_t> sessionIdAidl = toStdVec(sessionId);
    ::ndk::ScopedAStatus status = mPlugin->closeSession(sessionIdAidl);
    status_t response = statusAidlToStatusT(status);
    if (status.isOk()) {
        DrmSessionManager::Instance()->removeSession(sessionId);
        for (auto i = mOpenSessions.begin(); i != mOpenSessions.end(); i++) {
@@ -554,14 +555,11 @@ status_t DrmHalAidl::closeSession(Vector<uint8_t> const& sessionId) {
            }
        }

        status_t response = toStatusTAidl(status.getServiceSpecificError());
        mMetrics.SetSessionEnd(sessionId);
        mMetrics.mCloseSessionCounter.Increment(response);
        return response;
    }

    mMetrics.mCloseSessionCounter.Increment(DEAD_OBJECT);
    return DEAD_OBJECT;
    mMetrics.mCloseSessionCounter.Increment(response);
    return response;
}

status_t DrmHalAidl::getKeyRequest(Vector<uint8_t> const& sessionId,
@@ -603,7 +601,7 @@ status_t DrmHalAidl::getKeyRequest(Vector<uint8_t> const& sessionId,
        *keyRequestType = toKeyRequestType(keyRequest.requestType);
    }

    err = status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    err = statusAidlToStatusT(status);
    keyRequestTimer.SetAttribute(err);
    return err;
}
@@ -626,7 +624,7 @@ status_t DrmHalAidl::provideKeyResponse(Vector<uint8_t> const& sessionId,
            mPlugin->provideKeyResponse(sessionIdAidl, responseAidl, &keySetIdsAidl);

    if (status.isOk()) keySetId = toVector(keySetIdsAidl.keySetId);
    err = status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    err = statusAidlToStatusT(status);
    keyResponseTimer.SetAttribute(err);
    return err;
}
@@ -636,7 +634,7 @@ status_t DrmHalAidl::removeKeys(Vector<uint8_t> const& keySetId) {
    INIT_CHECK();

    ::ndk::ScopedAStatus status = mPlugin->removeKeys(toStdVec(keySetId));
    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::restoreKeys(Vector<uint8_t> const& sessionId,
@@ -649,7 +647,7 @@ status_t DrmHalAidl::restoreKeys(Vector<uint8_t> const& sessionId,
    KeySetId keySetIdsAidl;
    keySetIdsAidl.keySetId = toStdVec(keySetId);
    ::ndk::ScopedAStatus status = mPlugin->restoreKeys(toStdVec(sessionId), keySetIdsAidl);
    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::queryKeyStatus(Vector<uint8_t> const& sessionId,
@@ -664,7 +662,7 @@ status_t DrmHalAidl::queryKeyStatus(Vector<uint8_t> const& sessionId,

    infoMap = toKeyedVector(infoMapAidl);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::getProvisionRequest(String8 const& certType, String8 const& certAuthority,
@@ -681,7 +679,7 @@ status_t DrmHalAidl::getProvisionRequest(String8 const& certType, String8 const&
    request = toVector(requestAidl.request);
    defaultUrl = toString8(requestAidl.defaultUrl);

    err = status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    err = statusAidlToStatusT(status);
    mMetrics.mGetProvisionRequestCounter.Increment(err);
    return err;
}
@@ -698,7 +696,7 @@ status_t DrmHalAidl::provideProvisionResponse(Vector<uint8_t> const& response,

    certificate = toVector(result.certificate);
    wrappedKey = toVector(result.wrappedKey);
    err = status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    err = statusAidlToStatusT(status);
    mMetrics.mProvideProvisionResponseCounter.Increment(err);
    return err;
}
@@ -712,7 +710,7 @@ status_t DrmHalAidl::getSecureStops(List<Vector<uint8_t>>& secureStops) {

    secureStops = toSecureStops(result);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::getSecureStopIds(List<Vector<uint8_t>>& secureStopIds) {
@@ -724,7 +722,7 @@ status_t DrmHalAidl::getSecureStopIds(List<Vector<uint8_t>>& secureStopIds) {

    secureStopIds = toSecureStopIds(result);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::getSecureStop(Vector<uint8_t> const& ssid, Vector<uint8_t>& secureStop) {
@@ -739,7 +737,7 @@ status_t DrmHalAidl::getSecureStop(Vector<uint8_t> const& ssid, Vector<uint8_t>&

    secureStop = toVector(result.opaqueData);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::releaseSecureStops(Vector<uint8_t> const& ssRelease) {
@@ -750,7 +748,7 @@ status_t DrmHalAidl::releaseSecureStops(Vector<uint8_t> const& ssRelease) {
    ssId.opaqueData = toStdVec(ssRelease);
    ::ndk::ScopedAStatus status = mPlugin->releaseSecureStops(ssId);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::removeSecureStop(Vector<uint8_t> const& ssid) {
@@ -761,7 +759,7 @@ status_t DrmHalAidl::removeSecureStop(Vector<uint8_t> const& ssid) {
    SecureStopId ssidAidl;
    ssidAidl.secureStopId = toStdVec(ssid);
    ::ndk::ScopedAStatus status = mPlugin->removeSecureStop(ssidAidl);
    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::removeAllSecureStops() {
@@ -769,7 +767,7 @@ status_t DrmHalAidl::removeAllSecureStops() {
    INIT_CHECK();

    ::ndk::ScopedAStatus status = mPlugin->releaseAllSecureStops();
    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::getHdcpLevels(DrmPlugin::HdcpLevel* connected,
@@ -790,7 +788,7 @@ status_t DrmHalAidl::getHdcpLevels(DrmPlugin::HdcpLevel* connected,
    *connected = toHdcpLevel(lvlsAidl.connectedLevel);
    *max = toHdcpLevel(lvlsAidl.maxLevel);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::getNumberOfSessions(uint32_t* open, uint32_t* max) const {
@@ -810,7 +808,7 @@ status_t DrmHalAidl::getNumberOfSessions(uint32_t* open, uint32_t* max) const {
    *open = result.currentSessions;
    *max = result.maxSessions;

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::getSecurityLevel(Vector<uint8_t> const& sessionId,
@@ -829,7 +827,7 @@ status_t DrmHalAidl::getSecurityLevel(Vector<uint8_t> const& sessionId,

    *level = toSecurityLevel(result);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::getOfflineLicenseKeySetIds(List<Vector<uint8_t>>& keySetIds) const {
@@ -841,7 +839,7 @@ status_t DrmHalAidl::getOfflineLicenseKeySetIds(List<Vector<uint8_t>>& keySetIds

    keySetIds = toKeySetIds(result);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::removeOfflineLicense(Vector<uint8_t> const& keySetId) {
@@ -851,7 +849,7 @@ status_t DrmHalAidl::removeOfflineLicense(Vector<uint8_t> const& keySetId) {
    KeySetId keySetIdAidl;
    keySetIdAidl.keySetId = toStdVec(keySetId);
    ::ndk::ScopedAStatus status = mPlugin->removeOfflineLicense(keySetIdAidl);
    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::getOfflineLicenseState(Vector<uint8_t> const& keySetId,
@@ -869,7 +867,7 @@ status_t DrmHalAidl::getOfflineLicenseState(Vector<uint8_t> const& keySetId,

    *licenseState = toOfflineLicenseState(result);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::getPropertyString(String8 const& name, String8& value) const {
@@ -887,7 +885,7 @@ status_t DrmHalAidl::getPropertyStringInternal(String8 const& name, String8& val

    value = toString8(result);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::getPropertyByteArray(String8 const& name, Vector<uint8_t>& value) const {
@@ -907,7 +905,7 @@ status_t DrmHalAidl::getPropertyByteArrayInternal(String8 const& name,
    ::ndk::ScopedAStatus status = mPlugin->getPropertyByteArray(toStdString(name), &result);

    value = toVector(result);
    err = status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    err = statusAidlToStatusT(status);
    if (name == kPropertyDeviceUniqueId) {
        mMetrics.mGetDeviceUniqueIdCounter.Increment(err);
    }
@@ -919,7 +917,7 @@ status_t DrmHalAidl::setPropertyString(String8 const& name, String8 const& value
    INIT_CHECK();

    ::ndk::ScopedAStatus status = mPlugin->setPropertyString(toStdString(name), toStdString(value));
    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::setPropertyByteArray(String8 const& name, Vector<uint8_t> const& value) const {
@@ -927,7 +925,7 @@ status_t DrmHalAidl::setPropertyByteArray(String8 const& name, Vector<uint8_t> c
    INIT_CHECK();

    ::ndk::ScopedAStatus status = mPlugin->setPropertyByteArray(toStdString(name), toStdVec(value));
    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::getMetrics(const sp<IDrmMetricsConsumer>& consumer) {
@@ -963,7 +961,7 @@ status_t DrmHalAidl::getMetrics(const sp<IDrmMetricsConsumer>& consumer) {
        consumer->consumeHidlMetrics(vendor, pluginMetrics);
    }

    err = status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    err = statusAidlToStatusT(status);

    return err;
}
@@ -977,7 +975,7 @@ status_t DrmHalAidl::setCipherAlgorithm(Vector<uint8_t> const& sessionId,

    ::ndk::ScopedAStatus status =
            mPlugin->setCipherAlgorithm(toStdVec(sessionId), toStdString(algorithm));
    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::setMacAlgorithm(Vector<uint8_t> const& sessionId, String8 const& algorithm) {
@@ -988,7 +986,7 @@ status_t DrmHalAidl::setMacAlgorithm(Vector<uint8_t> const& sessionId, String8 c

    ::ndk::ScopedAStatus status =
            mPlugin->setMacAlgorithm(toStdVec(sessionId), toStdString(algorithm));
    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::encrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
@@ -1005,7 +1003,7 @@ status_t DrmHalAidl::encrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> c

    output = toVector(result);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::decrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
@@ -1022,7 +1020,7 @@ status_t DrmHalAidl::decrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> c

    output = toVector(result);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::sign(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
@@ -1038,7 +1036,7 @@ status_t DrmHalAidl::sign(Vector<uint8_t> const& sessionId, Vector<uint8_t> cons

    signature = toVector(result);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::verify(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
@@ -1052,7 +1050,7 @@ status_t DrmHalAidl::verify(Vector<uint8_t> const& sessionId, Vector<uint8_t> co
    ::ndk::ScopedAStatus status = mPlugin->verify(toStdVec(sessionId), toStdVec(keyId),
                                                  toStdVec(message), toStdVec(signature), &match);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::signRSA(Vector<uint8_t> const& sessionId, String8 const& algorithm,
@@ -1070,7 +1068,7 @@ status_t DrmHalAidl::signRSA(Vector<uint8_t> const& sessionId, String8 const& al

    signature = toVector(result);

    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::requiresSecureDecoder(const char* mime, bool* required) const {
@@ -1095,12 +1093,13 @@ status_t DrmHalAidl::requiresSecureDecoder(const char* mime, DrmPlugin::Security
    auto aLevel = toAidlSecurityLevel(securityLevel);
    std::string mimeAidl(mime);
    ::ndk::ScopedAStatus status = mPlugin->requiresSecureDecoder(mimeAidl, aLevel, required);

    status_t err = statusAidlToStatusT(status);
    if (!status.isOk()) {
        DrmUtils::LOG2BE("requiresSecureDecoder txn failed: %d", status.getServiceSpecificError());
        return DEAD_OBJECT;
    }

    return OK;
    return err;
}

status_t DrmHalAidl::setPlaybackId(Vector<uint8_t> const& sessionId, const char* playbackId) {
@@ -1108,7 +1107,7 @@ status_t DrmHalAidl::setPlaybackId(Vector<uint8_t> const& sessionId, const char*
    INIT_CHECK();
    std::string playbackIdAidl(playbackId);
    ::ndk::ScopedAStatus status = mPlugin->setPlaybackId(toStdVec(sessionId), playbackIdAidl);
    return status.isOk() ? toStatusTAidl(status.getServiceSpecificError()) : DEAD_OBJECT;
    return statusAidlToStatusT(status);
}

status_t DrmHalAidl::getLogMessages(Vector<drm::V1_4::LogMessage>& logs) const {
+3 −2
Original line number Diff line number Diff line
@@ -330,13 +330,14 @@ void DrmHalHidl::cleanup() {
std::vector<sp<IDrmFactory>> DrmHalHidl::makeDrmFactories() {
    static std::vector<sp<IDrmFactory>> factories(DrmUtils::MakeDrmFactories());
    if (factories.size() == 0) {
        // must be in passthrough mode, load the default passthrough service
        DrmUtils::LOG2BI("No hidl drm factories found");
        // could be in passthrough mode, load the default passthrough service
        auto passthrough = IDrmFactory::getService();
        if (passthrough != NULL) {
            DrmUtils::LOG2BI("makeDrmFactories: using default passthrough drm instance");
            factories.push_back(passthrough);
        } else {
            DrmUtils::LOG2BE("Failed to find any drm factories");
            DrmUtils::LOG2BE("Failed to find passthrough drm factories");
        }
    }
    return factories;
+4 −2
Original line number Diff line number Diff line
@@ -186,8 +186,10 @@ inline status_t toStatusT(const android::hardware::Return<T> &status) {
    return toStatusT_1_4(err);
}

inline status_t toStatusTAidl(int32_t serviceError) {
    auto status = static_cast<StatusAidl>(serviceError);
inline status_t statusAidlToStatusT(::ndk::ScopedAStatus &statusAidl) {
    if (statusAidl.isOk()) return OK;
    if (statusAidl.getExceptionCode() != EX_SERVICE_SPECIFIC) return DEAD_OBJECT;
    auto status = static_cast<StatusAidl>(statusAidl.getServiceSpecificError());
    switch (status) {
    case StatusAidl::OK:
        return OK;
+1 −1
Original line number Diff line number Diff line
@@ -175,7 +175,7 @@ void DrmPlugin::installSecureStop(const std::vector<uint8_t>& sessionId) {
    UNUSED(in_optionalParameters);

    KeyRequestType keyRequestType = KeyRequestType::UNKNOWN;
    std::string defaultUrl("");
    std::string defaultUrl("https://default.url");

    _aidl_return->request = {};
    _aidl_return->requestType = keyRequestType;