diff --git a/drm/aidl/aidl_api/android.hardware.drm/current/android/hardware/drm/CryptoSchemes.aidl b/drm/aidl/aidl_api/android.hardware.drm/current/android/hardware/drm/CryptoSchemes.aidl index ea736cf373..1d3c293eca 100644 --- a/drm/aidl/aidl_api/android.hardware.drm/current/android/hardware/drm/CryptoSchemes.aidl +++ b/drm/aidl/aidl_api/android.hardware.drm/current/android/hardware/drm/CryptoSchemes.aidl @@ -35,7 +35,5 @@ package android.hardware.drm; @VintfStability parcelable CryptoSchemes { List uuids; - android.hardware.drm.SecurityLevel minLevel; - android.hardware.drm.SecurityLevel maxLevel; - List mimeTypes; + List mimeTypes; } diff --git a/drm/aidl/aidl_api/android.hardware.drm/current/android/hardware/drm/SupportedContentType.aidl b/drm/aidl/aidl_api/android.hardware.drm/current/android/hardware/drm/SupportedContentType.aidl new file mode 100644 index 0000000000..6ef5db860a --- /dev/null +++ b/drm/aidl/aidl_api/android.hardware.drm/current/android/hardware/drm/SupportedContentType.aidl @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2022 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.drm; +@VintfStability +parcelable SupportedContentType { + String mime; + android.hardware.drm.SecurityLevel minLevel; + android.hardware.drm.SecurityLevel maxLevel; +} diff --git a/drm/aidl/android/hardware/drm/CryptoSchemes.aidl b/drm/aidl/android/hardware/drm/CryptoSchemes.aidl index b4b34ec17e..1f251d8a75 100644 --- a/drm/aidl/android/hardware/drm/CryptoSchemes.aidl +++ b/drm/aidl/android/hardware/drm/CryptoSchemes.aidl @@ -16,7 +16,7 @@ package android.hardware.drm; -import android.hardware.drm.SecurityLevel; +import android.hardware.drm.SupportedContentType; import android.hardware.drm.Uuid; @VintfStability @@ -28,18 +28,8 @@ parcelable CryptoSchemes { List uuids; /** - * Minimum supported security level (inclusive) + * Supported mime types, and supported SecurityLevels for each mime */ - SecurityLevel minLevel; - - /** - * Maximum supported security level (inclusive) - */ - SecurityLevel maxLevel; - - /** - * Supported mime types - */ - List mimeTypes; + List mimeTypes; } diff --git a/drm/aidl/android/hardware/drm/SupportedContentType.aidl b/drm/aidl/android/hardware/drm/SupportedContentType.aidl new file mode 100644 index 0000000000..f4fabad554 --- /dev/null +++ b/drm/aidl/android/hardware/drm/SupportedContentType.aidl @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2022 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. + */ + +package android.hardware.drm; + +import android.hardware.drm.SecurityLevel; + +@VintfStability +parcelable SupportedContentType { + /** Supported mime type. E.g. cenc, video/mp4, etc */ + String mime; + + /** Minimum supported security level (inclusive) */ + SecurityLevel minLevel; + + /** Maximum supported security level (inclusive) */ + SecurityLevel maxLevel; +} diff --git a/drm/aidl/vts/drm_hal_common.cpp b/drm/aidl/vts/drm_hal_common.cpp index 9b315f4f55..de7dc288ec 100644 --- a/drm/aidl/vts/drm_hal_common.cpp +++ b/drm/aidl/vts/drm_hal_common.cpp @@ -256,7 +256,7 @@ std::vector DrmHalTest::getUUID() { std::vector DrmHalTest::getVendorUUID() { if (vendorModule == nullptr) { ALOGW("vendor module for %s not found", GetParamService().c_str()); - return {}; + return std::vector(16); } return vendorModule->getUUID(); } @@ -268,17 +268,22 @@ bool DrmHalTest::isCryptoSchemeSupported(Uuid uuid, SecurityLevel level, std::st if (!ret.isOk() || !std::count(schemes.uuids.begin(), schemes.uuids.end(), uuid)) { return false; } - if (level > schemes.maxLevel || level < schemes.minLevel) { - if (level != SecurityLevel::DEFAULT && level != SecurityLevel::UNKNOWN) { - return false; + if (mime.empty()) { + EXPECT_THAT(level, AnyOf(Eq(SecurityLevel::DEFAULT), Eq(SecurityLevel::UNKNOWN))); + return true; + } + for (auto ct : schemes.mimeTypes) { + if (ct.mime != mime) { + continue; + } + if (level == SecurityLevel::DEFAULT || level == SecurityLevel::UNKNOWN) { + return true; + } + if (level <= ct.maxLevel && level >= ct.minLevel) { + return true; } } - if (!mime.empty()) { - if (!std::count(schemes.mimeTypes.begin(), schemes.mimeTypes.end(), mime)) { - return false; - } - } - return true; + return false; } void DrmHalTest::provision() { diff --git a/drm/aidl/vts/drm_hal_test.cpp b/drm/aidl/vts/drm_hal_test.cpp index 266ea395e2..14b3acfc7f 100644 --- a/drm/aidl/vts/drm_hal_test.cpp +++ b/drm/aidl/vts/drm_hal_test.cpp @@ -99,6 +99,19 @@ TEST_P(DrmHalTest, BadMimeNotSupported) { EXPECT_FALSE(result); } +/** + * getSupportedCryptoSchemes confidence check + */ +TEST_P(DrmHalTest, SupportedCryptoSchemes) { + aidl::android::hardware::drm::CryptoSchemes schemes{}; + auto result = drmFactory->getSupportedCryptoSchemes(&schemes); + EXPECT_FALSE(schemes.uuids.empty()); + for(auto ct : schemes.mimeTypes) { + EXPECT_LE(ct.minLevel, ct.maxLevel); + } + EXPECT_OK(result); +} + /** * DrmPlugin tests */ diff --git a/drm/aidl/vts/include/drm_hal_common.h b/drm/aidl/vts/include/drm_hal_common.h index 2c7e514291..d493bed05a 100644 --- a/drm/aidl/vts/include/drm_hal_common.h +++ b/drm/aidl/vts/include/drm_hal_common.h @@ -59,6 +59,9 @@ namespace hardware { namespace drm { namespace vts { +using ::testing::AnyOf; +using ::testing::Eq; + ::aidl::android::hardware::drm::Status DrmErr(const ::ndk::ScopedAStatus& ret); std::string HalBaseName(const std::string& fullname); std::string HalFullName(const std::string& iface, const std::string& basename);