1f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman/* 2f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * Copyright (C) 2017 The Android Open Source Project 3f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * 4f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * Licensed under the Apache License, Version 2.0 (the "License"); 5f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * you may not use this file except in compliance with the License. 6f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * You may obtain a copy of the License at 7f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * 8f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * http://www.apache.org/licenses/LICENSE-2.0 9f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * 10f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * Unless required by applicable law or agreed to in writing, software 11f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * distributed under the License is distributed on an "AS IS" BASIS, 12f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * See the License for the specific language governing permissions and 14f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * limitations under the License. 15f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman */ 16f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 17f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#define LOG_TAG "mediacas_hidl_hal_test" 18f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 19f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <VtsHalHidlTargetTestBase.h> 20a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang#include <VtsHalHidlTargetTestEnvBase.h> 21f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <android-base/logging.h> 22f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <android/hardware/cas/1.0/ICas.h> 23f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <android/hardware/cas/1.0/ICasListener.h> 24f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <android/hardware/cas/1.0/IDescramblerBase.h> 25f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <android/hardware/cas/1.0/IMediaCasService.h> 260645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#include <android/hardware/cas/1.0/types.h> 270645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#include <android/hardware/cas/native/1.0/IDescrambler.h> 280645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#include <android/hardware/cas/native/1.0/types.h> 29704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang#include <binder/MemoryDealer.h> 30f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <hidl/HidlSupport.h> 31f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <hidl/HidlTransportSupport.h> 320645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#include <hidl/Status.h> 33d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang#include <hidlmemory/FrameworkUtils.h> 340645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#include <utils/Condition.h> 350645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#include <utils/Mutex.h> 36f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 37f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#define CLEAR_KEY_SYSTEM_ID 0xF6D8 38f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#define INVALID_SYSTEM_ID 0 390645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#define WAIT_TIMEOUT 3000000000 400645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 410645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#define PROVISION_STR \ 420645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman "{ " \ 430645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman " \"id\": 21140844, " \ 440645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman " \"name\": \"Test Title\", " \ 450645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman " \"lowercase_organization_name\": \"Android\", " \ 460645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman " \"asset_key\": { " \ 470645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman " \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\" " \ 480645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman " }, " \ 490645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman " \"cas_type\": 1, " \ 500645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman " \"track_types\": [ ] " \ 510645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman "} " 52f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 53f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::Condition; 54f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::hardware::cas::V1_0::ICas; 55f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::hardware::cas::V1_0::ICasListener; 56f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::hardware::cas::V1_0::IDescramblerBase; 57d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhangusing android::hardware::cas::V1_0::Status; 580645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanusing android::hardware::cas::native::V1_0::IDescrambler; 590645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanusing android::hardware::cas::native::V1_0::SubSample; 600645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanusing android::hardware::cas::native::V1_0::SharedBuffer; 610645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanusing android::hardware::cas::native::V1_0::DestinationBuffer; 620645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanusing android::hardware::cas::native::V1_0::BufferType; 630645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanusing android::hardware::cas::native::V1_0::ScramblingControl; 64f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::hardware::cas::V1_0::IMediaCasService; 65f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::hardware::cas::V1_0::HidlCasPluginDescriptor; 66d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhangusing android::hardware::fromHeap; 67f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::hardware::hidl_vec; 680645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanusing android::hardware::hidl_string; 69d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhangusing android::hardware::HidlMemory; 70f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::hardware::Return; 71d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhangusing android::hardware::Void; 72704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhangusing android::IMemory; 73704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhangusing android::IMemoryHeap; 74704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhangusing android::MemoryDealer; 75f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::Mutex; 76f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::sp; 77f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 78f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramannamespace { 79f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 800645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanconst uint8_t kEcmBinaryBuffer[] = { 810645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x00, 0x00, 0x01, 0xf0, 0x00, 0x50, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, 0x00, 820645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x27, 0x10, 0x02, 0x00, 830645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x01, 0x77, 0x01, 0x42, 0x95, 0x6c, 0x0e, 0xe3, 0x91, 0xbc, 0xfd, 0x05, 0xb1, 0x60, 0x4f, 840645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x17, 0x82, 0xa4, 0x86, 0x9b, 0x23, 0x56, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 850645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x27, 0x10, 0x02, 0x00, 0x01, 0x77, 0x01, 0x42, 0x95, 0x6c, 0xd7, 0x43, 0x62, 0xf8, 0x1c, 860645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x62, 0x19, 0x05, 0xc7, 0x3a, 0x42, 0xcd, 0xfd, 0xd9, 0x13, 0x48, 870645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman}; 880645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 890645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanconst SubSample kSubSamples[] = {{162, 0}, {0, 184}, {0, 184}}; 900645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 910645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanconst uint8_t kInBinaryBuffer[] = { 920645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x00, 0x00, 0x00, 0x01, 0x09, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0xc0, 0x1e, 0xdb, 0x01, 930645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x40, 0x16, 0xec, 0x04, 0x40, 0x00, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x0f, 0x03, 0xc5, 0x8b, 940645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0xb8, 0x00, 0x00, 0x00, 0x01, 0x68, 0xca, 0x8c, 0xb2, 0x00, 0x00, 0x01, 0x06, 0x05, 0xff, 0xff, 950645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x70, 0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee, 960645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0xef, 0x78, 0x32, 0x36, 0x34, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x31, 0x34, 0x32, 970645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x20, 0x2d, 0x20, 0x48, 0x2e, 0x32, 0x36, 0x34, 0x2f, 0x4d, 0x50, 0x45, 0x47, 0x2d, 0x34, 0x20, 980645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x41, 0x56, 0x43, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x20, 0x2d, 0x20, 0x43, 0x6f, 0x70, 0x79, 990645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x6c, 0x65, 0x66, 0x74, 0x20, 0x32, 0x30, 0x30, 0x33, 0x2d, 0x32, 0x30, 0x31, 0x34, 0x20, 0x2d, 1000645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x69, 0x64, 0x65, 1010645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x6f, 0x6c, 0x61, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x78, 0x32, 0x36, 0x34, 0x2e, 0x68, 0x74, 1020645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x6d, 0x6c, 0x6e, 0x45, 0x21, 0x82, 0x38, 0xf0, 0x9d, 0x7d, 0x96, 0xe6, 0x94, 0xae, 0xe2, 0x87, 1030645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x8f, 0x04, 0x49, 0xe5, 0xf6, 0x8c, 0x8b, 0x9a, 0x10, 0x18, 0xba, 0x94, 0xe9, 0x22, 0x31, 0x04, 1040645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x7e, 0x60, 0x5b, 0xc4, 0x24, 0x00, 0x90, 0x62, 0x0d, 0xdc, 0x85, 0x74, 0x75, 0x78, 0xd0, 0x14, 1050645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x08, 0xcb, 0x02, 0x1d, 0x7d, 0x9d, 0x34, 0xe8, 0x81, 0xb9, 0xf7, 0x09, 0x28, 0x79, 0x29, 0x8d, 1060645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0xe3, 0x14, 0xed, 0x5f, 0xca, 0xaf, 0xf4, 0x1c, 0x49, 0x15, 0xe1, 0x80, 0x29, 0x61, 0x76, 0x80, 1070645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x43, 0xf8, 0x58, 0x53, 0x40, 0xd7, 0x31, 0x6d, 0x61, 0x81, 0x41, 0xe9, 0x77, 0x9f, 0x9c, 0xe1, 1080645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x6d, 0xf2, 0xee, 0xd9, 0xc8, 0x67, 0xd2, 0x5f, 0x48, 0x73, 0xe3, 0x5c, 0xcd, 0xa7, 0x45, 0x58, 1090645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0xbb, 0xdd, 0x28, 0x1d, 0x68, 0xfc, 0xb4, 0xc6, 0xf6, 0x92, 0xf6, 0x30, 0x03, 0xaa, 0xe4, 0x32, 1100645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0xf6, 0x34, 0x51, 0x4b, 0x0f, 0x8c, 0xf9, 0xac, 0x98, 0x22, 0xfb, 0x49, 0xc8, 0xbf, 0xca, 0x8c, 1110645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x80, 0x86, 0x5d, 0xd7, 0xa4, 0x52, 0xb1, 0xd9, 0xa6, 0x04, 0x4e, 0xb3, 0x2d, 0x1f, 0xb8, 0x35, 1120645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0xcc, 0x45, 0x6d, 0x9c, 0x20, 0xa7, 0xa4, 0x34, 0x59, 0x72, 0xe3, 0xae, 0xba, 0x49, 0xde, 0xd1, 1130645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0xaa, 0xee, 0x3d, 0x77, 0xfc, 0x5d, 0xc6, 0x1f, 0x9d, 0xac, 0xc2, 0x15, 0x66, 0xb8, 0xe1, 0x54, 1140645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x4e, 0x74, 0x93, 0xdb, 0x9a, 0x24, 0x15, 0x6e, 0x20, 0xa3, 0x67, 0x3e, 0x5a, 0x24, 0x41, 0x5e, 1150645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0xb0, 0xe6, 0x35, 0x87, 0x1b, 0xc8, 0x7a, 0xf9, 0x77, 0x65, 0xe0, 0x01, 0xf2, 0x4c, 0xe4, 0x2b, 1160645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0xa9, 0x64, 0x96, 0x96, 0x0b, 0x46, 0xca, 0xea, 0x79, 0x0e, 0x78, 0xa3, 0x5f, 0x43, 0xfc, 0x47, 1170645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x6a, 0x12, 0xfa, 0xc4, 0x33, 0x0e, 0x88, 0x1c, 0x19, 0x3a, 0x00, 0xc3, 0x4e, 0xb5, 0xd8, 0xfa, 1180645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x8e, 0xf1, 0xbc, 0x3d, 0xb2, 0x7e, 0x50, 0x8d, 0x67, 0xc3, 0x6b, 0xed, 0xe2, 0xea, 0xa6, 0x1f, 1190645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x25, 0x24, 0x7c, 0x94, 0x74, 0x50, 0x49, 0xe3, 0xc6, 0x58, 0x2e, 0xfd, 0x28, 0xb4, 0xc6, 0x73, 1200645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0xb1, 0x53, 0x74, 0x27, 0x94, 0x5c, 0xdf, 0x69, 0xb7, 0xa1, 0xd7, 0xf5, 0xd3, 0x8a, 0x2c, 0x2d, 1210645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0xb4, 0x5e, 0x8a, 0x16, 0x14, 0x54, 0x64, 0x6e, 0x00, 0x6b, 0x11, 0x59, 0x8a, 0x63, 0x38, 0x80, 1220645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x76, 0xc3, 0xd5, 0x59, 0xf7, 0x3f, 0xd2, 0xfa, 0xa5, 0xca, 0x82, 0xff, 0x4a, 0x62, 0xf0, 0xe3, 1230645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x42, 0xf9, 0x3b, 0x38, 0x27, 0x8a, 0x89, 0xaa, 0x50, 0x55, 0x4b, 0x29, 0xf1, 0x46, 0x7c, 0x75, 1240645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0xef, 0x65, 0xaf, 0x9b, 0x0d, 0x6d, 0xda, 0x25, 0x94, 0x14, 0xc1, 0x1b, 0xf0, 0xc5, 0x4c, 0x24, 1250645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x0e, 0x65, 1260645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman}; 1270645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 1280645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanconst uint8_t kOutRefBinaryBuffer[] = { 1290645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x00, 0x00, 0x00, 0x01, 0x09, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0xc0, 0x1e, 0xdb, 0x01, 1300645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x40, 0x16, 0xec, 0x04, 0x40, 0x00, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x0f, 0x03, 0xc5, 0x8b, 1310645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0xb8, 0x00, 0x00, 0x00, 0x01, 0x68, 0xca, 0x8c, 0xb2, 0x00, 0x00, 0x01, 0x06, 0x05, 0xff, 0xff, 1320645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x70, 0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee, 1330645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0xef, 0x78, 0x32, 0x36, 0x34, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x31, 0x34, 0x32, 1340645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x20, 0x2d, 0x20, 0x48, 0x2e, 0x32, 0x36, 0x34, 0x2f, 0x4d, 0x50, 0x45, 0x47, 0x2d, 0x34, 0x20, 1350645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x41, 0x56, 0x43, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x20, 0x2d, 0x20, 0x43, 0x6f, 0x70, 0x79, 1360645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x6c, 0x65, 0x66, 0x74, 0x20, 0x32, 0x30, 0x30, 0x33, 0x2d, 0x32, 0x30, 0x31, 0x34, 0x20, 0x2d, 1370645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x69, 0x64, 0x65, 1380645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x6f, 0x6c, 0x61, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x78, 0x32, 0x36, 0x34, 0x2e, 0x68, 0x74, 1390645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x6d, 0x6c, 0x20, 0x2d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x20, 0x63, 0x61, 1400645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x62, 0x61, 0x63, 0x3d, 0x30, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x32, 0x20, 0x64, 0x65, 0x62, 0x6c, 1410645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x6f, 0x63, 0x6b, 0x3d, 0x31, 0x3a, 0x30, 0x3a, 0x30, 0x20, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 1420645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x65, 0x3d, 0x30, 0x78, 0x31, 0x3a, 0x30, 0x78, 0x31, 0x31, 0x31, 0x20, 0x6d, 0x65, 0x3d, 0x68, 1430645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x6d, 0x65, 0x3d, 0x37, 0x20, 0x70, 0x73, 0x79, 0x3d, 0x31, 1440645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x20, 0x70, 0x73, 0x79, 0x5f, 0x72, 0x64, 0x3d, 0x31, 0x2e, 0x30, 0x30, 0x3a, 0x30, 0x2e, 0x30, 1450645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x30, 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x66, 0x3d, 0x31, 0x20, 0x6d, 0x65, 1460645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x31, 0x36, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61, 1470645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x5f, 0x6d, 0x65, 0x3d, 0x31, 0x20, 0x74, 0x72, 0x65, 0x6c, 0x6c, 0x69, 0x73, 0x3d, 0x31, 0x20, 1480645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x38, 0x78, 0x38, 0x64, 0x63, 0x74, 0x3d, 0x30, 0x20, 0x63, 0x71, 0x6d, 0x3d, 0x30, 0x20, 0x64, 1490645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x65, 0x61, 0x64, 0x7a, 0x6f, 0x6e, 0x65, 0x3d, 0x32, 0x31, 0x2c, 0x31, 0x31, 0x20, 0x66, 0x61, 1500645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x73, 0x74, 0x5f, 0x70, 0x73, 0x6b, 0x69, 0x70, 0x3d, 0x31, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 1510645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x61, 0x5f, 0x71, 0x70, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x2d, 0x32, 0x20, 0x74, 1520645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3d, 0x36, 0x30, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x61, 0x68, 1530645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x65, 0x61, 0x64, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3d, 0x35, 0x20, 0x73, 0x6c, 1540645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x69, 0x63, 0x65, 0x64, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3d, 0x30, 0x20, 0x6e, 1550645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x72, 0x3d, 0x30, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x3d, 0x31, 0x20, 0x69, 1560645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x6e, 0x74, 0x65, 0x72, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x3d, 0x30, 0x20, 0x62, 0x6c, 0x75, 0x72, 1570645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x61, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x3d, 0x30, 0x20, 0x63, 0x6f, 0x6e, 0x73, 1580645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x74, 0x72, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x3d, 0x30, 0x20, 1590645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x62, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x3d, 0x30, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 1600645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x70, 0x3d, 0x30, 0x20, 0x6b, 0x65, 0x79, 0x69, 0x6e, 0x74, 0x3d, 0x32, 0x35, 0x30, 0x20, 0x6b, 1610645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x65, 0x79, 0x69, 0x6e, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x3d, 0x32, 0x35, 0x20, 0x73, 0x63, 0x65, 1620645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 0x6e, 0x65, 1630645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman}; 1640645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 1650645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanclass MediaCasListener : public ICasListener { 1660645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman public: 1670645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman virtual Return<void> onEvent(int32_t event, int32_t arg, 1680645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman const hidl_vec<uint8_t>& data) override { 1690645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman android::Mutex::Autolock autoLock(mMsgLock); 1700645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman mEvent = event; 1710645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman mEventArg = arg; 1720645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman mEventData = data; 1730645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 1740645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman mEventReceived = true; 1750645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman mMsgCondition.signal(); 1760645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman return Void(); 1770645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman } 1780645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 1790645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman void testEventEcho(sp<ICas>& mediaCas, int32_t& event, int32_t& eventArg, 1800645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidl_vec<uint8_t>& eventData); 1810645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 1820645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman private: 1830645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman int32_t mEvent = -1; 1840645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman int32_t mEventArg = -1; 1850645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman bool mEventReceived = false; 1860645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidl_vec<uint8_t> mEventData; 1870645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman android::Mutex mMsgLock; 1880645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman android::Condition mMsgCondition; 1890645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman}; 1900645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 1910645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanvoid MediaCasListener::testEventEcho(sp<ICas>& mediaCas, int32_t& event, int32_t& eventArg, 1920645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidl_vec<uint8_t>& eventData) { 1930645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman mEventReceived = false; 1940645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman auto returnStatus = mediaCas->sendEvent(event, eventArg, eventData); 1950645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 1960645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 1970645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 1980645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman android::Mutex::Autolock autoLock(mMsgLock); 1990645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman while (!mEventReceived) { 2000645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman if (-ETIMEDOUT == mMsgCondition.waitRelative(mMsgLock, WAIT_TIMEOUT)) { 2010645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(false) << "event not received within timeout"; 2020645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman return; 2030645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman } 2040645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman } 2050645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 2060645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(mEvent, event); 2070645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(mEventArg, eventArg); 2080645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(mEventData == eventData); 2090645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman} 2100645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 211a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang// Test environment for Cas HIDL HAL. 212a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhangclass CasHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase { 213a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang public: 214a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang // get the test environment singleton 215a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang static CasHidlEnvironment* Instance() { 216a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang static CasHidlEnvironment* instance = new CasHidlEnvironment; 217a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang return instance; 218a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang } 219a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang 220a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang virtual void registerTestServices() override { registerTestService<IMediaCasService>(); } 221a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang}; 222a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang 223f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanclass MediaCasHidlTest : public ::testing::VtsHalHidlTargetTestBase { 224f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman public: 225f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman virtual void SetUp() override { 226a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang mService = ::testing::VtsHalHidlTargetTestBase::getService<IMediaCasService>( 227a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang CasHidlEnvironment::Instance()->getServiceName<IMediaCasService>()); 228f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman ASSERT_NE(mService, nullptr); 229f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman } 230f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 231f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman sp<IMediaCasService> mService; 232f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 233f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman protected: 234f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman static void description(const std::string& description) { 235f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman RecordProperty("description", description); 236f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman } 2370645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 2380645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman sp<ICas> mMediaCas; 2390645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman sp<IDescramblerBase> mDescramblerBase; 2400645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman sp<MediaCasListener> mCasListener; 24195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang typedef struct _OobInputTestParams { 24295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang const SubSample* subSamples; 24395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang uint32_t numSubSamples; 24495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang size_t imemSizeActual; 24595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang uint64_t imemOffset; 24695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang uint64_t imemSize; 24795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang uint64_t srcOffset; 24895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang uint64_t dstOffset; 24995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang } OobInputTestParams; 2500645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 2510645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ::testing::AssertionResult createCasPlugin(int32_t caSystemId); 2520645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ::testing::AssertionResult openCasSession(std::vector<uint8_t>* sessionId); 25395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ::testing::AssertionResult descrambleTestInputBuffer( 25495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang const sp<IDescrambler>& descrambler, 25595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang Status* descrambleStatus, 25695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang sp<IMemory>* hidlInMemory); 25795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ::testing::AssertionResult descrambleTestOobInput( 25895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang const sp<IDescrambler>& descrambler, 25995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang Status* descrambleStatus, 26095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang const OobInputTestParams& params); 261f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman}; 262f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 2630645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman::testing::AssertionResult MediaCasHidlTest::createCasPlugin(int32_t caSystemId) { 2640645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman auto status = mService->isSystemIdSupported(caSystemId); 2650645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman if (!status.isOk() || !status) { 2660645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman return ::testing::AssertionFailure(); 2670645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman } 2680645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman status = mService->isDescramblerSupported(caSystemId); 2690645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman if (!status.isOk() || !status) { 2700645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman return ::testing::AssertionFailure(); 2710645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman } 272f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 2730645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman mCasListener = new MediaCasListener(); 2740645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman auto pluginStatus = mService->createPlugin(caSystemId, mCasListener); 2750645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman if (!pluginStatus.isOk()) { 2760645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman return ::testing::AssertionFailure(); 277f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman } 2780645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman mMediaCas = pluginStatus; 2790645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman if (mMediaCas == nullptr) { 2800645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman return ::testing::AssertionFailure(); 2810645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman } 2820645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 2830645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman auto descramblerStatus = mService->createDescrambler(caSystemId); 2840645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman if (!descramblerStatus.isOk()) { 2850645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman return ::testing::AssertionFailure(); 2860645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman } 2870645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman mDescramblerBase = descramblerStatus; 2880645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman return ::testing::AssertionResult(mDescramblerBase != nullptr); 2890645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman} 2900645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 2910645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman::testing::AssertionResult MediaCasHidlTest::openCasSession(std::vector<uint8_t>* sessionId) { 2920645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman Status sessionStatus; 2930645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman auto returnVoid = mMediaCas->openSession([&](Status status, const hidl_vec<uint8_t>& id) { 2940645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman sessionStatus = status; 2950645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman *sessionId = id; 2960645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman }); 2970645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman return ::testing::AssertionResult(returnVoid.isOk() && (Status::OK == sessionStatus)); 2980645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman} 2990645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 3000645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman::testing::AssertionResult MediaCasHidlTest::descrambleTestInputBuffer( 301704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang const sp<IDescrambler>& descrambler, Status* descrambleStatus, sp<IMemory>* inMemory) { 3020645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidl_vec<SubSample> hidlSubSamples; 3030645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidlSubSamples.setToExternal(const_cast<SubSample*>(kSubSamples), 3040645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman (sizeof(kSubSamples) / sizeof(SubSample)), false /*own*/); 305704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang 306704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang sp<MemoryDealer> dealer = new MemoryDealer(sizeof(kInBinaryBuffer), "vts-cas"); 307704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang if (nullptr == dealer.get()) { 308704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang ALOGE("couldn't get MemoryDealer!"); 3090645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman return ::testing::AssertionFailure(); 3100645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman } 3110645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 312704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang sp<IMemory> mem = dealer->allocate(sizeof(kInBinaryBuffer)); 313704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang if (nullptr == mem.get()) { 314704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang ALOGE("couldn't allocate IMemory!"); 3150645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman return ::testing::AssertionFailure(); 3160645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman } 317704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang *inMemory = mem; 318704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang 319d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang // build HidlMemory from memory heap 320704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang ssize_t offset; 321704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang size_t size; 322704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); 323704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang if (nullptr == heap.get()) { 324704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang ALOGE("couldn't get memory heap!"); 325704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang return ::testing::AssertionFailure(); 326704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang } 327704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang 328704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang uint8_t* ipBuffer = static_cast<uint8_t*>(static_cast<void*>(mem->pointer())); 3290645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman memcpy(ipBuffer, kInBinaryBuffer, sizeof(kInBinaryBuffer)); 3300645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 331d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang // hidlMemory is not to be passed out of scope! 332d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang sp<HidlMemory> hidlMemory = fromHeap(heap); 333d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang 3340645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman SharedBuffer srcBuffer = { 335d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang .heapBase = *hidlMemory, 336704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang .offset = (uint64_t) offset, 337704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang .size = (uint64_t) size 338704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang }; 3390645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 3400645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman DestinationBuffer dstBuffer; 3410645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman dstBuffer.type = BufferType::SHARED_MEMORY; 3420645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman dstBuffer.nonsecureMemory = srcBuffer; 3430645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 3440645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman uint32_t outBytes; 3450645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidl_string detailedError; 3460645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman auto returnVoid = descrambler->descramble( 3470645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ScramblingControl::EVENKEY /*2*/, hidlSubSamples, srcBuffer, 0, dstBuffer, 0, 3480645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman [&](Status status, uint32_t bytesWritten, const hidl_string& detailedErr) { 3490645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman *descrambleStatus = status; 3500645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman outBytes = bytesWritten; 3510645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman detailedError = detailedErr; 3520645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman }); 3530645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman if (!returnVoid.isOk() || *descrambleStatus != Status::OK) { 3540645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ALOGI("descramble failed, trans=%s, status=%d, outBytes=%u, error=%s", 3550645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnVoid.description().c_str(), *descrambleStatus, outBytes, detailedError.c_str()); 3560645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman } 3570645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman return ::testing::AssertionResult(returnVoid.isOk()); 3580645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman} 359f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 36095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang::testing::AssertionResult MediaCasHidlTest::descrambleTestOobInput( 36195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang const sp<IDescrambler>& descrambler, 36295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang Status* descrambleStatus, 36395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang const OobInputTestParams& params) { 36495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang hidl_vec<SubSample> hidlSubSamples; 36595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang hidlSubSamples.setToExternal( 36695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang const_cast<SubSample*>(params.subSamples), params.numSubSamples, false /*own*/); 36795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 36895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang sp<MemoryDealer> dealer = new MemoryDealer(params.imemSizeActual, "vts-cas"); 36995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang if (nullptr == dealer.get()) { 37095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ALOGE("couldn't get MemoryDealer!"); 37195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang return ::testing::AssertionFailure(); 37295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang } 37395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 37495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang sp<IMemory> mem = dealer->allocate(params.imemSizeActual); 37595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang if (nullptr == mem.get()) { 37695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ALOGE("couldn't allocate IMemory!"); 37795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang return ::testing::AssertionFailure(); 37895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang } 37995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 380d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang // build HidlMemory from memory heap 38195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ssize_t offset; 38295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang size_t size; 38395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); 38495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang if (nullptr == heap.get()) { 38595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ALOGE("couldn't get memory heap!"); 38695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang return ::testing::AssertionFailure(); 38795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang } 38895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 389d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang // hidlMemory is not to be passed out of scope! 390d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang sp<HidlMemory> hidlMemory = fromHeap(heap); 39195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 39295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang SharedBuffer srcBuffer = { 393d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang .heapBase = *hidlMemory, 39495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .offset = (uint64_t) offset + params.imemOffset, 39595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .size = (uint64_t) params.imemSize, 39695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang }; 39795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 39895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang DestinationBuffer dstBuffer; 39995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang dstBuffer.type = BufferType::SHARED_MEMORY; 40095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang dstBuffer.nonsecureMemory = srcBuffer; 40195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 40295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang uint32_t outBytes; 40395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang hidl_string detailedError; 40495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang auto returnVoid = descrambler->descramble( 40595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ScramblingControl::EVENKEY /*2*/, hidlSubSamples, 40695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang srcBuffer, 40795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang params.srcOffset, 40895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang dstBuffer, 40995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang params.dstOffset, 41095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang [&](Status status, uint32_t bytesWritten, const hidl_string& detailedErr) { 41195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang *descrambleStatus = status; 41295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang outBytes = bytesWritten; 41395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang detailedError = detailedErr; 41495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang }); 41595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang if (!returnVoid.isOk() || *descrambleStatus != Status::OK) { 41695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ALOGI("descramble failed, trans=%s, status=%d, outBytes=%u, error=%s", 41795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang returnVoid.description().c_str(), *descrambleStatus, outBytes, detailedError.c_str()); 41895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang } 41995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang return ::testing::AssertionResult(returnVoid.isOk()); 42095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang} 42195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 422f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh SivaramanTEST_F(MediaCasHidlTest, EnumeratePlugins) { 423f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman description("Test enumerate plugins"); 424f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman hidl_vec<HidlCasPluginDescriptor> descriptors; 425f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman EXPECT_TRUE(mService 426f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman ->enumeratePlugins([&descriptors]( 427f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman hidl_vec<HidlCasPluginDescriptor> const& desc) { descriptors = desc; }) 428f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman .isOk()); 429f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 430f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman if (descriptors.size() == 0) { 431f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman ALOGW("[ WARN ] enumeratePlugins list empty"); 432f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman return; 433f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman } 434f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 435f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman sp<MediaCasListener> casListener = new MediaCasListener(); 436f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman for (size_t i = 0; i < descriptors.size(); i++) { 437f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman int32_t caSystemId = descriptors[i].caSystemId; 438f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 4390645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ASSERT_TRUE(createCasPlugin(caSystemId)); 440f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman } 441f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman} 442f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 443f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh SivaramanTEST_F(MediaCasHidlTest, TestInvalidSystemIdFails) { 444f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman description("Test failure for invalid system ID"); 445f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman sp<MediaCasListener> casListener = new MediaCasListener(); 446f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 447f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman ASSERT_FALSE(mService->isSystemIdSupported(INVALID_SYSTEM_ID)); 448f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman ASSERT_FALSE(mService->isDescramblerSupported(INVALID_SYSTEM_ID)); 449f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 4500645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman auto pluginStatus = mService->createPlugin(INVALID_SYSTEM_ID, casListener); 4510645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ASSERT_TRUE(pluginStatus.isOk()); 4520645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman sp<ICas> mediaCas = pluginStatus; 453f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman EXPECT_EQ(mediaCas, nullptr); 454f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 4550645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman auto descramblerStatus = mService->createDescrambler(INVALID_SYSTEM_ID); 4560645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ASSERT_TRUE(descramblerStatus.isOk()); 4570645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman sp<IDescramblerBase> descramblerBase = descramblerStatus; 458f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman EXPECT_EQ(descramblerBase, nullptr); 459f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman} 460f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 461f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh SivaramanTEST_F(MediaCasHidlTest, TestClearKeyPluginInstalled) { 462f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman description("Test if ClearKey plugin is installed"); 463f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman hidl_vec<HidlCasPluginDescriptor> descriptors; 464f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman EXPECT_TRUE(mService 465f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman ->enumeratePlugins([&descriptors]( 4660645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidl_vec<HidlCasPluginDescriptor> const& desc) { descriptors = desc; }) 467f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman .isOk()); 468f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 469f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman if (descriptors.size() == 0) { 470f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman ALOGW("[ WARN ] enumeratePlugins list empty"); 471f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman } 472f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 473f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman for (size_t i = 0; i < descriptors.size(); i++) { 474f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman int32_t caSystemId = descriptors[i].caSystemId; 475f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman if (CLEAR_KEY_SYSTEM_ID == caSystemId) { 476f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman return; 477f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman } 478f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman } 479f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 480f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman ASSERT_TRUE(false) << "ClearKey plugin not installed"; 481f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman} 482f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 4830645aec1de74259ad37093d356f20c08497a9e6aSuresh SivaramanTEST_F(MediaCasHidlTest, TestClearKeyApis) { 4840645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman description("Test that valid call sequences succeed"); 4850645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 4860645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID)); 4870645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 4880645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman auto returnStatus = mMediaCas->provision(hidl_string(PROVISION_STR)); 4890645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 4900645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 4910645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 4920645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidl_vec<uint8_t> hidlPvtData; 4930645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidlPvtData.resize(256); 4940645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->setPrivateData(hidlPvtData); 4950645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 4960645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 4970645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 4980645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman std::vector<uint8_t> sessionId; 4990645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ASSERT_TRUE(openCasSession(&sessionId)); 5000645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->setSessionPrivateData(sessionId, hidlPvtData); 5010645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 5020645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 5030645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5040645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman std::vector<uint8_t> streamSessionId; 5050645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ASSERT_TRUE(openCasSession(&streamSessionId)); 5060645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->setSessionPrivateData(streamSessionId, hidlPvtData); 5070645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 5080645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 5090645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5100645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mDescramblerBase->setMediaCasSession(sessionId); 5110645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 5120645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 5130645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5140645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mDescramblerBase->setMediaCasSession(streamSessionId); 5150645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 5160645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 5170645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5180645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidl_vec<uint8_t> hidlNullPtr; 5190645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidlNullPtr.setToExternal(static_cast<uint8_t*>(nullptr), 0); 5200645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->refreshEntitlements(3, hidlNullPtr); 5210645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 5220645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 5230645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5240645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman uint8_t refreshData[] = {0, 1, 2, 3}; 5250645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidl_vec<uint8_t> hidlRefreshData; 5260645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidlRefreshData.setToExternal(static_cast<uint8_t*>(refreshData), sizeof(refreshData)); 5270645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->refreshEntitlements(10, hidlRefreshData); 5280645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 5290645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 5300645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5310645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman int32_t eventID = 1; 5320645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman int32_t eventArg = 2; 5330645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman mCasListener->testEventEcho(mMediaCas, eventID, eventArg, hidlNullPtr); 5340645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5350645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman eventID = 3; 5360645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman eventArg = 4; 5370645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman uint8_t eventData[] = {'e', 'v', 'e', 'n', 't', 'd', 'a', 't', 'a'}; 5380645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidl_vec<uint8_t> hidlEventData; 5390645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidlEventData.setToExternal(static_cast<uint8_t*>(eventData), sizeof(eventData)); 5400645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman mCasListener->testEventEcho(mMediaCas, eventID, eventArg, hidlEventData); 5410645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5420645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman uint8_t clearKeyEmmData[] = {'c', 'l', 'e', 'a', 'r', 'k', 'e', 'y', 'e', 'm', 'm'}; 5430645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidl_vec<uint8_t> hidlClearKeyEmm; 5440645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidlClearKeyEmm.setToExternal(static_cast<uint8_t*>(clearKeyEmmData), sizeof(clearKeyEmmData)); 5450645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->processEmm(hidlClearKeyEmm); 5460645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 5470645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 5480645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5490645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidl_vec<uint8_t> hidlEcm; 5500645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidlEcm.setToExternal(const_cast<uint8_t*>(kEcmBinaryBuffer), sizeof(kEcmBinaryBuffer)); 5510645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->processEcm(sessionId, hidlEcm); 5520645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 5530645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 5540645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->processEcm(streamSessionId, hidlEcm); 5550645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 5560645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 5570645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5586d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("video/avc")); 5596d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman 5600645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman sp<IDescrambler> descrambler; 5610645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman descrambler = IDescrambler::castFrom(mDescramblerBase); 5620645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ASSERT_NE(descrambler, nullptr); 5630645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5640645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman Status descrambleStatus = Status::OK; 565704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang sp<IMemory> dataMemory; 5660645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 567704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); 5680645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, descrambleStatus); 5690645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 570704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang ASSERT_NE(nullptr, dataMemory.get()); 571704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang uint8_t* opBuffer = static_cast<uint8_t*>(static_cast<void*>(dataMemory->pointer())); 5720645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5730645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman int compareResult = 5740645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman memcmp(static_cast<const void*>(opBuffer), static_cast<const void*>(kOutRefBinaryBuffer), 5750645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman sizeof(kOutRefBinaryBuffer)); 5760645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(0, compareResult); 5776d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman 5786d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman returnStatus = mDescramblerBase->release(); 5796d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 5806d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 5816d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman 5826d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman returnStatus = mMediaCas->release(); 5836d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 5846d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 5850645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman} 5860645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5870645aec1de74259ad37093d356f20c08497a9e6aSuresh SivaramanTEST_F(MediaCasHidlTest, TestClearKeySessionClosedAfterRelease) { 5880645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman description("Test that all sessions are closed after a MediaCas object is released"); 5890645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5900645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID)); 5910645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5920645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman auto returnStatus = mMediaCas->provision(hidl_string(PROVISION_STR)); 5930645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 5940645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 5950645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 5960645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman std::vector<uint8_t> sessionId; 5970645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ASSERT_TRUE(openCasSession(&sessionId)); 5980645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman std::vector<uint8_t> streamSessionId; 5990645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ASSERT_TRUE(openCasSession(&streamSessionId)); 6000645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6010645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->release(); 6020645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 6030645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 6040645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6050645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mDescramblerBase->setMediaCasSession(sessionId); 6060645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 6070645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus); 6080645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6090645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mDescramblerBase->setMediaCasSession(streamSessionId); 6100645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 6110645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus); 6120645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman} 6130645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6140645aec1de74259ad37093d356f20c08497a9e6aSuresh SivaramanTEST_F(MediaCasHidlTest, TestClearKeyErrors) { 6150645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman description("Test that invalid call sequences fail with expected error codes"); 6160645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6170645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID)); 6180645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6190645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman /* 6200645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman * Test MediaCas error codes 6210645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman */ 6220645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman // Provision should fail with an invalid asset string 6230645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman auto returnStatus = mMediaCas->provision(hidl_string("invalid asset string")); 6240645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 6250645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::ERROR_CAS_NO_LICENSE, returnStatus); 6260645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6270645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman // Open a session, then close it so that it should become invalid 6280645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman std::vector<uint8_t> invalidSessionId; 6290645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ASSERT_TRUE(openCasSession(&invalidSessionId)); 6300645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->closeSession(invalidSessionId); 6310645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 6320645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 6330645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6340645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman // processEcm should fail with an invalid session id 6350645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidl_vec<uint8_t> hidlEcm; 6360645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidlEcm.setToExternal(const_cast<uint8_t*>(kEcmBinaryBuffer), sizeof(kEcmBinaryBuffer)); 6370645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->processEcm(invalidSessionId, hidlEcm); 6380645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 6390645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus); 6400645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6410645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman std::vector<uint8_t> sessionId; 6420645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ASSERT_TRUE(openCasSession(&sessionId)); 6430645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6440645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman // processEcm should fail without provisioning 6450645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidlEcm.setToExternal(const_cast<uint8_t*>(kEcmBinaryBuffer), sizeof(kEcmBinaryBuffer)); 6460645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->processEcm(sessionId, hidlEcm); 6470645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 6480645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::ERROR_CAS_NOT_PROVISIONED, returnStatus); 6490645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6500645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->provision(hidl_string(PROVISION_STR)); 6510645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 6520645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 6530645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6540645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman // processEcm should fail with ecm buffer that's too short 6550645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidlEcm.setToExternal(const_cast<uint8_t*>(kEcmBinaryBuffer), 8); 6560645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->processEcm(sessionId, hidlEcm); 6570645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 6580645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::BAD_VALUE, returnStatus); 6590645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6600645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman // processEcm should fail with ecm with bad descriptor count 6610645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman uint8_t badDescriptor[sizeof(kEcmBinaryBuffer)]; 6620645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman memcpy(badDescriptor, kEcmBinaryBuffer, sizeof(kEcmBinaryBuffer)); 6630645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman badDescriptor[17] = 0x03; // change the descriptor count field to 3 (invalid) 6640645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman hidlEcm.setToExternal(static_cast<uint8_t*>(badDescriptor), sizeof(badDescriptor)); 6650645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mMediaCas->processEcm(sessionId, hidlEcm); 6660645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 6670645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::ERROR_CAS_UNKNOWN, returnStatus); 6680645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6690645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman /* 6700645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman * Test MediaDescrambler error codes 6710645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman */ 6720645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman // setMediaCasSession should fail with an invalid session id 6730645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mDescramblerBase->setMediaCasSession(invalidSessionId); 6740645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 6750645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus); 6760645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6770645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman // descramble should fail without a valid session 6780645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman sp<IDescrambler> descrambler; 6790645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman descrambler = IDescrambler::castFrom(mDescramblerBase); 6800645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman ASSERT_NE(descrambler, nullptr); 6810645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6820645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman Status descrambleStatus = Status::OK; 683704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang sp<IMemory> dataMemory; 6840645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 685704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); 6860645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED, descrambleStatus); 6870645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 6880645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman // Now set a valid session, should still fail because no valid ecm is processed 6890645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman returnStatus = mDescramblerBase->setMediaCasSession(sessionId); 6900645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_TRUE(returnStatus.isOk()); 6910645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::OK, returnStatus); 6920645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 693704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory)); 6940645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman EXPECT_EQ(Status::ERROR_CAS_DECRYPT, descrambleStatus); 6956d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman 6966d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman // Verify that requiresSecureDecoderComponent handles empty mime 6976d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("")); 6986d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman 6996d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman // Verify that requiresSecureDecoderComponent handles invalid mime 7006d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("bad")); 7010645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman} 7020645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman 70395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong ZhangTEST_F(MediaCasHidlTest, TestClearKeyOobFails) { 70495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang description("Test that oob descramble request fails with expected error"); 70595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 70695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID)); 70795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 70895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang auto returnStatus = mMediaCas->provision(hidl_string(PROVISION_STR)); 70995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_TRUE(returnStatus.isOk()); 71095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_EQ(Status::OK, returnStatus); 71195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 71295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang std::vector<uint8_t> sessionId; 71395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ASSERT_TRUE(openCasSession(&sessionId)); 71495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 71595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang returnStatus = mDescramblerBase->setMediaCasSession(sessionId); 71695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_TRUE(returnStatus.isOk()); 71795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_EQ(Status::OK, returnStatus); 71895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 71995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang hidl_vec<uint8_t> hidlEcm; 72095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang hidlEcm.setToExternal(const_cast<uint8_t*>(kEcmBinaryBuffer), sizeof(kEcmBinaryBuffer)); 72195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang returnStatus = mMediaCas->processEcm(sessionId, hidlEcm); 72295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_TRUE(returnStatus.isOk()); 72395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_EQ(Status::OK, returnStatus); 72495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 72595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang sp<IDescrambler> descrambler = IDescrambler::castFrom(mDescramblerBase); 72695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ASSERT_NE(nullptr, descrambler.get()); 72795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 72895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang Status descrambleStatus = Status::OK; 72995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 73095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang // test invalid src buffer offset 73195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ASSERT_TRUE(descrambleTestOobInput( 73295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang descrambler, 73395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang &descrambleStatus, 73495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang { 73595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .subSamples = kSubSamples, 73695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .numSubSamples = sizeof(kSubSamples)/sizeof(SubSample), 73795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemSizeActual = sizeof(kInBinaryBuffer), 73895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemOffset = 0xcccccc, 73995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemSize = sizeof(kInBinaryBuffer), 74095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .srcOffset = 0, 74195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .dstOffset = 0 74295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang })); 74395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); 74495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 74595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang // test invalid src buffer size 74695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ASSERT_TRUE(descrambleTestOobInput( 74795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang descrambler, 74895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang &descrambleStatus, 74995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang { 75095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .subSamples = kSubSamples, 75195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .numSubSamples = sizeof(kSubSamples)/sizeof(SubSample), 75295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemSizeActual = sizeof(kInBinaryBuffer), 75395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemOffset = 0, 75495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemSize = 0xcccccc, 75595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .srcOffset = 0, 75695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .dstOffset = 0 75795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang })); 75895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); 75995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 76095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang // test invalid src buffer size 76195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ASSERT_TRUE(descrambleTestOobInput( 76295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang descrambler, 76395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang &descrambleStatus, 76495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang { 76595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .subSamples = kSubSamples, 76695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .numSubSamples = sizeof(kSubSamples)/sizeof(SubSample), 76795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemSizeActual = sizeof(kInBinaryBuffer), 76895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemOffset = 1, 76995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemSize = (uint64_t)-1, 77095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .srcOffset = 0, 77195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .dstOffset = 0 77295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang })); 77395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); 77495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 77595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang // test invalid srcOffset 77695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ASSERT_TRUE(descrambleTestOobInput( 77795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang descrambler, 77895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang &descrambleStatus, 77995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang { 78095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .subSamples = kSubSamples, 78195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .numSubSamples = sizeof(kSubSamples)/sizeof(SubSample), 78295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemSizeActual = sizeof(kInBinaryBuffer), 78395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemOffset = 0, 78495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemSize = sizeof(kInBinaryBuffer), 78595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .srcOffset = 0xcccccc, 78695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .dstOffset = 0 78795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang })); 78895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); 78995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 79095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang // test invalid dstOffset 79195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ASSERT_TRUE(descrambleTestOobInput( 79295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang descrambler, 79395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang &descrambleStatus, 79495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang { 79595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .subSamples = kSubSamples, 79695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .numSubSamples = sizeof(kSubSamples)/sizeof(SubSample), 79795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemSizeActual = sizeof(kInBinaryBuffer), 79895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemOffset = 0, 79995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemSize = sizeof(kInBinaryBuffer), 80095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .srcOffset = 0, 80195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .dstOffset = 0xcccccc 80295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang })); 80395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); 80495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 80595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang // test detection of oob subsample sizes 80695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang const SubSample invalidSubSamples1[] = 80795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang {{162, 0}, {0, 184}, {0, 0xdddddd}}; 80895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 80995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ASSERT_TRUE(descrambleTestOobInput( 81095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang descrambler, 81195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang &descrambleStatus, 81295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang { 81395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .subSamples = invalidSubSamples1, 81495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .numSubSamples = sizeof(invalidSubSamples1)/sizeof(SubSample), 81595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemSizeActual = sizeof(kInBinaryBuffer), 81695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemOffset = 0, 81795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemSize = sizeof(kInBinaryBuffer), 81895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .srcOffset = 0, 81995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .dstOffset = 0 82095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang })); 82195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); 82295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 82395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang // test detection of overflowing subsample sizes 82495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang const SubSample invalidSubSamples2[] = 82595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang {{162, 0}, {0, 184}, {2, (uint32_t)-1}}; 82695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 82795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang ASSERT_TRUE(descrambleTestOobInput( 82895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang descrambler, 82995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang &descrambleStatus, 83095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang { 83195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .subSamples = invalidSubSamples2, 83295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .numSubSamples = sizeof(invalidSubSamples2)/sizeof(SubSample), 83395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemSizeActual = sizeof(kInBinaryBuffer), 83495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemOffset = 0, 83595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .imemSize = sizeof(kInBinaryBuffer), 83695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .srcOffset = 0, 83795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang .dstOffset = 0 83895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang })); 83995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_EQ(Status::BAD_VALUE, descrambleStatus); 84095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 84195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang returnStatus = mDescramblerBase->release(); 84295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_TRUE(returnStatus.isOk()); 84395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_EQ(Status::OK, returnStatus); 84495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 84595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang returnStatus = mMediaCas->release(); 84695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_TRUE(returnStatus.isOk()); 84795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang EXPECT_EQ(Status::OK, returnStatus); 84895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang} 84995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang 850f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman} // anonymous namespace 851f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman 852f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanint main(int argc, char** argv) { 853a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang ::testing::AddGlobalTestEnvironment(CasHidlEnvironment::Instance()); 854f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman ::testing::InitGoogleTest(&argc, argv); 855a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang CasHidlEnvironment::Instance()->init(&argc, argv); 856f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman int status = RUN_ALL_TESTS(); 857f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman LOG(INFO) << "Test result = " << status; 858f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman return status; 859f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman} 860