1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker
17*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "mediacas_aidl_hal_test"
18*4d7e907cSAndroid Build Coastguard Worker
19*4d7e907cSAndroid Build Coastguard Worker #include <aidl/Gtest.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <aidl/Vintf.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/cas/BnCasListener.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/cas/IMediaCasService.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/cas/Status.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_manager.h>
26*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_process.h>
27*4d7e907cSAndroid Build Coastguard Worker #include <binder/ParcelFileDescriptor.h>
28*4d7e907cSAndroid Build Coastguard Worker #include <cutils/ashmem.h>
29*4d7e907cSAndroid Build Coastguard Worker #include <utils/Condition.h>
30*4d7e907cSAndroid Build Coastguard Worker #include <utils/Mutex.h>
31*4d7e907cSAndroid Build Coastguard Worker
32*4d7e907cSAndroid Build Coastguard Worker #define CLEAR_KEY_SYSTEM_ID 0xF6D8
33*4d7e907cSAndroid Build Coastguard Worker #define INVALID_SYSTEM_ID 0
34*4d7e907cSAndroid Build Coastguard Worker #define WAIT_TIMEOUT 3000000000
35*4d7e907cSAndroid Build Coastguard Worker
36*4d7e907cSAndroid Build Coastguard Worker #define PROVISION_STR \
37*4d7e907cSAndroid Build Coastguard Worker "{ " \
38*4d7e907cSAndroid Build Coastguard Worker " \"id\": 21140844, " \
39*4d7e907cSAndroid Build Coastguard Worker " \"name\": \"Test Title\", " \
40*4d7e907cSAndroid Build Coastguard Worker " \"lowercase_organization_name\": \"Android\", " \
41*4d7e907cSAndroid Build Coastguard Worker " \"asset_key\": { " \
42*4d7e907cSAndroid Build Coastguard Worker " \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\" " \
43*4d7e907cSAndroid Build Coastguard Worker " }, " \
44*4d7e907cSAndroid Build Coastguard Worker " \"cas_type\": 1, " \
45*4d7e907cSAndroid Build Coastguard Worker " \"track_types\": [ ] " \
46*4d7e907cSAndroid Build Coastguard Worker "} "
47*4d7e907cSAndroid Build Coastguard Worker
48*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::common::Ashmem;
49*4d7e907cSAndroid Build Coastguard Worker using android::Mutex;
50*4d7e907cSAndroid Build Coastguard Worker using namespace aidl::android::hardware::cas;
51*4d7e907cSAndroid Build Coastguard Worker using namespace ndk;
52*4d7e907cSAndroid Build Coastguard Worker using namespace std;
53*4d7e907cSAndroid Build Coastguard Worker using namespace testing;
54*4d7e907cSAndroid Build Coastguard Worker
55*4d7e907cSAndroid Build Coastguard Worker const uint8_t kEcmBinaryBuffer[] = {
56*4d7e907cSAndroid Build Coastguard Worker 0x00, 0x00, 0x01, 0xf0, 0x00, 0x50, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, 0x00,
57*4d7e907cSAndroid Build Coastguard Worker 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x27, 0x10, 0x02, 0x00,
58*4d7e907cSAndroid Build Coastguard Worker 0x01, 0x77, 0x01, 0x42, 0x95, 0x6c, 0x0e, 0xe3, 0x91, 0xbc, 0xfd, 0x05, 0xb1, 0x60, 0x4f,
59*4d7e907cSAndroid Build Coastguard Worker 0x17, 0x82, 0xa4, 0x86, 0x9b, 0x23, 0x56, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
60*4d7e907cSAndroid Build Coastguard Worker 0x27, 0x10, 0x02, 0x00, 0x01, 0x77, 0x01, 0x42, 0x95, 0x6c, 0xd7, 0x43, 0x62, 0xf8, 0x1c,
61*4d7e907cSAndroid Build Coastguard Worker 0x62, 0x19, 0x05, 0xc7, 0x3a, 0x42, 0xcd, 0xfd, 0xd9, 0x13, 0x48,
62*4d7e907cSAndroid Build Coastguard Worker };
63*4d7e907cSAndroid Build Coastguard Worker
64*4d7e907cSAndroid Build Coastguard Worker const SubSample kSubSamples[] = {{162, 0}, {0, 184}, {0, 184}};
65*4d7e907cSAndroid Build Coastguard Worker
66*4d7e907cSAndroid Build Coastguard Worker const uint8_t kInBinaryBuffer[] = {
67*4d7e907cSAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x01, 0x09, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0xc0, 0x1e, 0xdb,
68*4d7e907cSAndroid Build Coastguard Worker 0x01, 0x40, 0x16, 0xec, 0x04, 0x40, 0x00, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x0f, 0x03,
69*4d7e907cSAndroid Build Coastguard Worker 0xc5, 0x8b, 0xb8, 0x00, 0x00, 0x00, 0x01, 0x68, 0xca, 0x8c, 0xb2, 0x00, 0x00, 0x01, 0x06,
70*4d7e907cSAndroid Build Coastguard Worker 0x05, 0xff, 0xff, 0x70, 0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8,
71*4d7e907cSAndroid Build Coastguard Worker 0x20, 0xd9, 0x23, 0xee, 0xef, 0x78, 0x32, 0x36, 0x34, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x72,
72*4d7e907cSAndroid Build Coastguard Worker 0x65, 0x20, 0x31, 0x34, 0x32, 0x20, 0x2d, 0x20, 0x48, 0x2e, 0x32, 0x36, 0x34, 0x2f, 0x4d,
73*4d7e907cSAndroid Build Coastguard Worker 0x50, 0x45, 0x47, 0x2d, 0x34, 0x20, 0x41, 0x56, 0x43, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x63,
74*4d7e907cSAndroid Build Coastguard Worker 0x20, 0x2d, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x32, 0x30, 0x30,
75*4d7e907cSAndroid Build Coastguard Worker 0x33, 0x2d, 0x32, 0x30, 0x31, 0x34, 0x20, 0x2d, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
76*4d7e907cSAndroid Build Coastguard Worker 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x6c, 0x61, 0x6e, 0x2e, 0x6f,
77*4d7e907cSAndroid Build Coastguard Worker 0x72, 0x67, 0x2f, 0x78, 0x32, 0x36, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x6e, 0x45, 0x21,
78*4d7e907cSAndroid Build Coastguard Worker 0x82, 0x38, 0xf0, 0x9d, 0x7d, 0x96, 0xe6, 0x94, 0xae, 0xe2, 0x87, 0x8f, 0x04, 0x49, 0xe5,
79*4d7e907cSAndroid Build Coastguard Worker 0xf6, 0x8c, 0x8b, 0x9a, 0x10, 0x18, 0xba, 0x94, 0xe9, 0x22, 0x31, 0x04, 0x7e, 0x60, 0x5b,
80*4d7e907cSAndroid Build Coastguard Worker 0xc4, 0x24, 0x00, 0x90, 0x62, 0x0d, 0xdc, 0x85, 0x74, 0x75, 0x78, 0xd0, 0x14, 0x08, 0xcb,
81*4d7e907cSAndroid Build Coastguard Worker 0x02, 0x1d, 0x7d, 0x9d, 0x34, 0xe8, 0x81, 0xb9, 0xf7, 0x09, 0x28, 0x79, 0x29, 0x8d, 0xe3,
82*4d7e907cSAndroid Build Coastguard Worker 0x14, 0xed, 0x5f, 0xca, 0xaf, 0xf4, 0x1c, 0x49, 0x15, 0xe1, 0x80, 0x29, 0x61, 0x76, 0x80,
83*4d7e907cSAndroid Build Coastguard Worker 0x43, 0xf8, 0x58, 0x53, 0x40, 0xd7, 0x31, 0x6d, 0x61, 0x81, 0x41, 0xe9, 0x77, 0x9f, 0x9c,
84*4d7e907cSAndroid Build Coastguard Worker 0xe1, 0x6d, 0xf2, 0xee, 0xd9, 0xc8, 0x67, 0xd2, 0x5f, 0x48, 0x73, 0xe3, 0x5c, 0xcd, 0xa7,
85*4d7e907cSAndroid Build Coastguard Worker 0x45, 0x58, 0xbb, 0xdd, 0x28, 0x1d, 0x68, 0xfc, 0xb4, 0xc6, 0xf6, 0x92, 0xf6, 0x30, 0x03,
86*4d7e907cSAndroid Build Coastguard Worker 0xaa, 0xe4, 0x32, 0xf6, 0x34, 0x51, 0x4b, 0x0f, 0x8c, 0xf9, 0xac, 0x98, 0x22, 0xfb, 0x49,
87*4d7e907cSAndroid Build Coastguard Worker 0xc8, 0xbf, 0xca, 0x8c, 0x80, 0x86, 0x5d, 0xd7, 0xa4, 0x52, 0xb1, 0xd9, 0xa6, 0x04, 0x4e,
88*4d7e907cSAndroid Build Coastguard Worker 0xb3, 0x2d, 0x1f, 0xb8, 0x35, 0xcc, 0x45, 0x6d, 0x9c, 0x20, 0xa7, 0xa4, 0x34, 0x59, 0x72,
89*4d7e907cSAndroid Build Coastguard Worker 0xe3, 0xae, 0xba, 0x49, 0xde, 0xd1, 0xaa, 0xee, 0x3d, 0x77, 0xfc, 0x5d, 0xc6, 0x1f, 0x9d,
90*4d7e907cSAndroid Build Coastguard Worker 0xac, 0xc2, 0x15, 0x66, 0xb8, 0xe1, 0x54, 0x4e, 0x74, 0x93, 0xdb, 0x9a, 0x24, 0x15, 0x6e,
91*4d7e907cSAndroid Build Coastguard Worker 0x20, 0xa3, 0x67, 0x3e, 0x5a, 0x24, 0x41, 0x5e, 0xb0, 0xe6, 0x35, 0x87, 0x1b, 0xc8, 0x7a,
92*4d7e907cSAndroid Build Coastguard Worker 0xf9, 0x77, 0x65, 0xe0, 0x01, 0xf2, 0x4c, 0xe4, 0x2b, 0xa9, 0x64, 0x96, 0x96, 0x0b, 0x46,
93*4d7e907cSAndroid Build Coastguard Worker 0xca, 0xea, 0x79, 0x0e, 0x78, 0xa3, 0x5f, 0x43, 0xfc, 0x47, 0x6a, 0x12, 0xfa, 0xc4, 0x33,
94*4d7e907cSAndroid Build Coastguard Worker 0x0e, 0x88, 0x1c, 0x19, 0x3a, 0x00, 0xc3, 0x4e, 0xb5, 0xd8, 0xfa, 0x8e, 0xf1, 0xbc, 0x3d,
95*4d7e907cSAndroid Build Coastguard Worker 0xb2, 0x7e, 0x50, 0x8d, 0x67, 0xc3, 0x6b, 0xed, 0xe2, 0xea, 0xa6, 0x1f, 0x25, 0x24, 0x7c,
96*4d7e907cSAndroid Build Coastguard Worker 0x94, 0x74, 0x50, 0x49, 0xe3, 0xc6, 0x58, 0x2e, 0xfd, 0x28, 0xb4, 0xc6, 0x73, 0xb1, 0x53,
97*4d7e907cSAndroid Build Coastguard Worker 0x74, 0x27, 0x94, 0x5c, 0xdf, 0x69, 0xb7, 0xa1, 0xd7, 0xf5, 0xd3, 0x8a, 0x2c, 0x2d, 0xb4,
98*4d7e907cSAndroid Build Coastguard Worker 0x5e, 0x8a, 0x16, 0x14, 0x54, 0x64, 0x6e, 0x00, 0x6b, 0x11, 0x59, 0x8a, 0x63, 0x38, 0x80,
99*4d7e907cSAndroid Build Coastguard Worker 0x76, 0xc3, 0xd5, 0x59, 0xf7, 0x3f, 0xd2, 0xfa, 0xa5, 0xca, 0x82, 0xff, 0x4a, 0x62, 0xf0,
100*4d7e907cSAndroid Build Coastguard Worker 0xe3, 0x42, 0xf9, 0x3b, 0x38, 0x27, 0x8a, 0x89, 0xaa, 0x50, 0x55, 0x4b, 0x29, 0xf1, 0x46,
101*4d7e907cSAndroid Build Coastguard Worker 0x7c, 0x75, 0xef, 0x65, 0xaf, 0x9b, 0x0d, 0x6d, 0xda, 0x25, 0x94, 0x14, 0xc1, 0x1b, 0xf0,
102*4d7e907cSAndroid Build Coastguard Worker 0xc5, 0x4c, 0x24, 0x0e, 0x65,
103*4d7e907cSAndroid Build Coastguard Worker };
104*4d7e907cSAndroid Build Coastguard Worker
105*4d7e907cSAndroid Build Coastguard Worker const uint8_t kOutRefBinaryBuffer[] = {
106*4d7e907cSAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x01, 0x09, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0xc0, 0x1e, 0xdb,
107*4d7e907cSAndroid Build Coastguard Worker 0x01, 0x40, 0x16, 0xec, 0x04, 0x40, 0x00, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x0f, 0x03,
108*4d7e907cSAndroid Build Coastguard Worker 0xc5, 0x8b, 0xb8, 0x00, 0x00, 0x00, 0x01, 0x68, 0xca, 0x8c, 0xb2, 0x00, 0x00, 0x01, 0x06,
109*4d7e907cSAndroid Build Coastguard Worker 0x05, 0xff, 0xff, 0x70, 0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8,
110*4d7e907cSAndroid Build Coastguard Worker 0x20, 0xd9, 0x23, 0xee, 0xef, 0x78, 0x32, 0x36, 0x34, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x72,
111*4d7e907cSAndroid Build Coastguard Worker 0x65, 0x20, 0x31, 0x34, 0x32, 0x20, 0x2d, 0x20, 0x48, 0x2e, 0x32, 0x36, 0x34, 0x2f, 0x4d,
112*4d7e907cSAndroid Build Coastguard Worker 0x50, 0x45, 0x47, 0x2d, 0x34, 0x20, 0x41, 0x56, 0x43, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x63,
113*4d7e907cSAndroid Build Coastguard Worker 0x20, 0x2d, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x32, 0x30, 0x30,
114*4d7e907cSAndroid Build Coastguard Worker 0x33, 0x2d, 0x32, 0x30, 0x31, 0x34, 0x20, 0x2d, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
115*4d7e907cSAndroid Build Coastguard Worker 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x6c, 0x61, 0x6e, 0x2e, 0x6f,
116*4d7e907cSAndroid Build Coastguard Worker 0x72, 0x67, 0x2f, 0x78, 0x32, 0x36, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x2d, 0x20,
117*4d7e907cSAndroid Build Coastguard Worker 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x20, 0x63, 0x61, 0x62, 0x61, 0x63, 0x3d,
118*4d7e907cSAndroid Build Coastguard Worker 0x30, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x32, 0x20, 0x64, 0x65, 0x62, 0x6c, 0x6f, 0x63, 0x6b,
119*4d7e907cSAndroid Build Coastguard Worker 0x3d, 0x31, 0x3a, 0x30, 0x3a, 0x30, 0x20, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x65, 0x3d,
120*4d7e907cSAndroid Build Coastguard Worker 0x30, 0x78, 0x31, 0x3a, 0x30, 0x78, 0x31, 0x31, 0x31, 0x20, 0x6d, 0x65, 0x3d, 0x68, 0x65,
121*4d7e907cSAndroid Build Coastguard Worker 0x78, 0x20, 0x73, 0x75, 0x62, 0x6d, 0x65, 0x3d, 0x37, 0x20, 0x70, 0x73, 0x79, 0x3d, 0x31,
122*4d7e907cSAndroid Build Coastguard Worker 0x20, 0x70, 0x73, 0x79, 0x5f, 0x72, 0x64, 0x3d, 0x31, 0x2e, 0x30, 0x30, 0x3a, 0x30, 0x2e,
123*4d7e907cSAndroid Build Coastguard Worker 0x30, 0x30, 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x66, 0x3d, 0x31, 0x20,
124*4d7e907cSAndroid Build Coastguard Worker 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x31, 0x36, 0x20, 0x63, 0x68, 0x72,
125*4d7e907cSAndroid Build Coastguard Worker 0x6f, 0x6d, 0x61, 0x5f, 0x6d, 0x65, 0x3d, 0x31, 0x20, 0x74, 0x72, 0x65, 0x6c, 0x6c, 0x69,
126*4d7e907cSAndroid Build Coastguard Worker 0x73, 0x3d, 0x31, 0x20, 0x38, 0x78, 0x38, 0x64, 0x63, 0x74, 0x3d, 0x30, 0x20, 0x63, 0x71,
127*4d7e907cSAndroid Build Coastguard Worker 0x6d, 0x3d, 0x30, 0x20, 0x64, 0x65, 0x61, 0x64, 0x7a, 0x6f, 0x6e, 0x65, 0x3d, 0x32, 0x31,
128*4d7e907cSAndroid Build Coastguard Worker 0x2c, 0x31, 0x31, 0x20, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x73, 0x6b, 0x69, 0x70, 0x3d,
129*4d7e907cSAndroid Build Coastguard Worker 0x31, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x5f, 0x71, 0x70, 0x5f, 0x6f, 0x66, 0x66,
130*4d7e907cSAndroid Build Coastguard Worker 0x73, 0x65, 0x74, 0x3d, 0x2d, 0x32, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3d,
131*4d7e907cSAndroid Build Coastguard Worker 0x36, 0x30, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x61, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x68,
132*4d7e907cSAndroid Build Coastguard Worker 0x72, 0x65, 0x61, 0x64, 0x73, 0x3d, 0x35, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x5f,
133*4d7e907cSAndroid Build Coastguard Worker 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3d, 0x30, 0x20, 0x6e, 0x72, 0x3d, 0x30, 0x20,
134*4d7e907cSAndroid Build Coastguard Worker 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x3d, 0x31, 0x20, 0x69, 0x6e, 0x74, 0x65,
135*4d7e907cSAndroid Build Coastguard Worker 0x72, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x3d, 0x30, 0x20, 0x62, 0x6c, 0x75, 0x72, 0x61, 0x79,
136*4d7e907cSAndroid Build Coastguard Worker 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x3d, 0x30, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74,
137*4d7e907cSAndroid Build Coastguard Worker 0x72, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x3d, 0x30, 0x20,
138*4d7e907cSAndroid Build Coastguard Worker 0x62, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x3d, 0x30, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68,
139*4d7e907cSAndroid Build Coastguard Worker 0x74, 0x70, 0x3d, 0x30, 0x20, 0x6b, 0x65, 0x79, 0x69, 0x6e, 0x74, 0x3d, 0x32, 0x35, 0x30,
140*4d7e907cSAndroid Build Coastguard Worker 0x20, 0x6b, 0x65, 0x79, 0x69, 0x6e, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x3d, 0x32, 0x35, 0x20,
141*4d7e907cSAndroid Build Coastguard Worker 0x73, 0x63, 0x65, 0x6e, 0x65,
142*4d7e907cSAndroid Build Coastguard Worker };
143*4d7e907cSAndroid Build Coastguard Worker
144*4d7e907cSAndroid Build Coastguard Worker class MediaCasListener : public BnCasListener {
145*4d7e907cSAndroid Build Coastguard Worker public:
onEvent(int32_t event,int32_t arg,const vector<uint8_t> & data)146*4d7e907cSAndroid Build Coastguard Worker virtual ScopedAStatus onEvent(int32_t event, int32_t arg,
147*4d7e907cSAndroid Build Coastguard Worker const vector<uint8_t>& data) override {
148*4d7e907cSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mMsgLock);
149*4d7e907cSAndroid Build Coastguard Worker mEvent = event;
150*4d7e907cSAndroid Build Coastguard Worker mEventArg = arg;
151*4d7e907cSAndroid Build Coastguard Worker mEventData = data;
152*4d7e907cSAndroid Build Coastguard Worker
153*4d7e907cSAndroid Build Coastguard Worker mEventReceived = true;
154*4d7e907cSAndroid Build Coastguard Worker mMsgCondition.signal();
155*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
156*4d7e907cSAndroid Build Coastguard Worker }
157*4d7e907cSAndroid Build Coastguard Worker
onSessionEvent(const vector<uint8_t> & sessionId,int32_t event,int32_t arg,const vector<uint8_t> & data)158*4d7e907cSAndroid Build Coastguard Worker virtual ScopedAStatus onSessionEvent(const vector<uint8_t>& sessionId, int32_t event,
159*4d7e907cSAndroid Build Coastguard Worker int32_t arg, const vector<uint8_t>& data) override {
160*4d7e907cSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mMsgLock);
161*4d7e907cSAndroid Build Coastguard Worker mSessionId = sessionId;
162*4d7e907cSAndroid Build Coastguard Worker mEvent = event;
163*4d7e907cSAndroid Build Coastguard Worker mEventArg = arg;
164*4d7e907cSAndroid Build Coastguard Worker mEventData = data;
165*4d7e907cSAndroid Build Coastguard Worker
166*4d7e907cSAndroid Build Coastguard Worker mEventReceived = true;
167*4d7e907cSAndroid Build Coastguard Worker mMsgCondition.signal();
168*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
169*4d7e907cSAndroid Build Coastguard Worker }
170*4d7e907cSAndroid Build Coastguard Worker
onStatusUpdate(StatusEvent event,int32_t arg)171*4d7e907cSAndroid Build Coastguard Worker virtual ScopedAStatus onStatusUpdate(StatusEvent event, int32_t arg) override {
172*4d7e907cSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mMsgLock);
173*4d7e907cSAndroid Build Coastguard Worker mStatusEvent = event;
174*4d7e907cSAndroid Build Coastguard Worker mEventArg = arg;
175*4d7e907cSAndroid Build Coastguard Worker
176*4d7e907cSAndroid Build Coastguard Worker mEventReceived = true;
177*4d7e907cSAndroid Build Coastguard Worker mMsgCondition.signal();
178*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
179*4d7e907cSAndroid Build Coastguard Worker }
180*4d7e907cSAndroid Build Coastguard Worker
181*4d7e907cSAndroid Build Coastguard Worker void testEventEcho(shared_ptr<ICas>& mediaCas, int32_t& event, int32_t& eventArg,
182*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t>& eventData);
183*4d7e907cSAndroid Build Coastguard Worker
184*4d7e907cSAndroid Build Coastguard Worker void testSessionEventEcho(shared_ptr<ICas>& mediaCas, const vector<uint8_t>& sessionId,
185*4d7e907cSAndroid Build Coastguard Worker int32_t& event, int32_t& eventArg, vector<uint8_t>& eventData);
186*4d7e907cSAndroid Build Coastguard Worker
187*4d7e907cSAndroid Build Coastguard Worker void testStatusUpdate(shared_ptr<ICas>& mediaCas, vector<uint8_t>* sessionId,
188*4d7e907cSAndroid Build Coastguard Worker SessionIntent intent, ScramblingMode mode);
189*4d7e907cSAndroid Build Coastguard Worker
190*4d7e907cSAndroid Build Coastguard Worker private:
191*4d7e907cSAndroid Build Coastguard Worker int32_t mEvent = -1;
192*4d7e907cSAndroid Build Coastguard Worker int32_t mEventArg = -1;
193*4d7e907cSAndroid Build Coastguard Worker StatusEvent mStatusEvent;
194*4d7e907cSAndroid Build Coastguard Worker bool mEventReceived = false;
195*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> mEventData;
196*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> mSessionId;
197*4d7e907cSAndroid Build Coastguard Worker Mutex mMsgLock;
198*4d7e907cSAndroid Build Coastguard Worker android::Condition mMsgCondition;
199*4d7e907cSAndroid Build Coastguard Worker };
200*4d7e907cSAndroid Build Coastguard Worker
testEventEcho(shared_ptr<ICas> & mediaCas,int32_t & event,int32_t & eventArg,vector<uint8_t> & eventData)201*4d7e907cSAndroid Build Coastguard Worker void MediaCasListener::testEventEcho(shared_ptr<ICas>& mediaCas, int32_t& event, int32_t& eventArg,
202*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t>& eventData) {
203*4d7e907cSAndroid Build Coastguard Worker mEventReceived = false;
204*4d7e907cSAndroid Build Coastguard Worker auto returnStatus = mediaCas->sendEvent(event, eventArg, eventData);
205*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(returnStatus.isOk());
206*4d7e907cSAndroid Build Coastguard Worker
207*4d7e907cSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mMsgLock);
208*4d7e907cSAndroid Build Coastguard Worker while (!mEventReceived) {
209*4d7e907cSAndroid Build Coastguard Worker if (-ETIMEDOUT == mMsgCondition.waitRelative(mMsgLock, WAIT_TIMEOUT)) {
210*4d7e907cSAndroid Build Coastguard Worker ADD_FAILURE() << "event not received within timeout";
211*4d7e907cSAndroid Build Coastguard Worker return;
212*4d7e907cSAndroid Build Coastguard Worker }
213*4d7e907cSAndroid Build Coastguard Worker }
214*4d7e907cSAndroid Build Coastguard Worker
215*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(mEvent, event);
216*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(mEventArg, eventArg);
217*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mEventData == eventData);
218*4d7e907cSAndroid Build Coastguard Worker }
219*4d7e907cSAndroid Build Coastguard Worker
testSessionEventEcho(shared_ptr<ICas> & mediaCas,const vector<uint8_t> & sessionId,int32_t & event,int32_t & eventArg,vector<uint8_t> & eventData)220*4d7e907cSAndroid Build Coastguard Worker void MediaCasListener::testSessionEventEcho(shared_ptr<ICas>& mediaCas,
221*4d7e907cSAndroid Build Coastguard Worker const vector<uint8_t>& sessionId, int32_t& event,
222*4d7e907cSAndroid Build Coastguard Worker int32_t& eventArg, vector<uint8_t>& eventData) {
223*4d7e907cSAndroid Build Coastguard Worker mEventReceived = false;
224*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mediaCas->sendSessionEvent(sessionId, event, eventArg, eventData).isOk());
225*4d7e907cSAndroid Build Coastguard Worker
226*4d7e907cSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mMsgLock);
227*4d7e907cSAndroid Build Coastguard Worker while (!mEventReceived) {
228*4d7e907cSAndroid Build Coastguard Worker if (-ETIMEDOUT == mMsgCondition.waitRelative(mMsgLock, WAIT_TIMEOUT)) {
229*4d7e907cSAndroid Build Coastguard Worker ADD_FAILURE() << "event not received within timeout";
230*4d7e907cSAndroid Build Coastguard Worker return;
231*4d7e907cSAndroid Build Coastguard Worker }
232*4d7e907cSAndroid Build Coastguard Worker }
233*4d7e907cSAndroid Build Coastguard Worker
234*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mSessionId == sessionId);
235*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(mEvent, event);
236*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(mEventArg, eventArg);
237*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mEventData == eventData);
238*4d7e907cSAndroid Build Coastguard Worker }
239*4d7e907cSAndroid Build Coastguard Worker
testStatusUpdate(shared_ptr<ICas> & mediaCas,vector<uint8_t> * sessionId,SessionIntent intent,ScramblingMode mode)240*4d7e907cSAndroid Build Coastguard Worker void MediaCasListener::testStatusUpdate(shared_ptr<ICas>& mediaCas, vector<uint8_t>* sessionId,
241*4d7e907cSAndroid Build Coastguard Worker SessionIntent intent, ScramblingMode mode) {
242*4d7e907cSAndroid Build Coastguard Worker mEventReceived = false;
243*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mediaCas->openSession(intent, mode, sessionId).isOk());
244*4d7e907cSAndroid Build Coastguard Worker
245*4d7e907cSAndroid Build Coastguard Worker Mutex::Autolock autoLock(mMsgLock);
246*4d7e907cSAndroid Build Coastguard Worker while (!mEventReceived) {
247*4d7e907cSAndroid Build Coastguard Worker if (-ETIMEDOUT == mMsgCondition.waitRelative(mMsgLock, WAIT_TIMEOUT)) {
248*4d7e907cSAndroid Build Coastguard Worker ADD_FAILURE() << "event not received within timeout";
249*4d7e907cSAndroid Build Coastguard Worker return;
250*4d7e907cSAndroid Build Coastguard Worker }
251*4d7e907cSAndroid Build Coastguard Worker }
252*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(mStatusEvent, static_cast<StatusEvent>(intent));
253*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(mEventArg, static_cast<int32_t>(mode));
254*4d7e907cSAndroid Build Coastguard Worker }
255*4d7e907cSAndroid Build Coastguard Worker
256*4d7e907cSAndroid Build Coastguard Worker class MediaCasAidlTest : public testing::TestWithParam<string> {
257*4d7e907cSAndroid Build Coastguard Worker public:
SetUp()258*4d7e907cSAndroid Build Coastguard Worker virtual void SetUp() override {
259*4d7e907cSAndroid Build Coastguard Worker if (AServiceManager_isDeclared(GetParam().c_str())) {
260*4d7e907cSAndroid Build Coastguard Worker SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str()));
261*4d7e907cSAndroid Build Coastguard Worker mService = IMediaCasService::fromBinder(binder);
262*4d7e907cSAndroid Build Coastguard Worker } else {
263*4d7e907cSAndroid Build Coastguard Worker mService = nullptr;
264*4d7e907cSAndroid Build Coastguard Worker }
265*4d7e907cSAndroid Build Coastguard Worker ASSERT_NE(mService, nullptr);
266*4d7e907cSAndroid Build Coastguard Worker }
267*4d7e907cSAndroid Build Coastguard Worker
268*4d7e907cSAndroid Build Coastguard Worker shared_ptr<IMediaCasService> mService = nullptr;
269*4d7e907cSAndroid Build Coastguard Worker
270*4d7e907cSAndroid Build Coastguard Worker protected:
description(const string & description)271*4d7e907cSAndroid Build Coastguard Worker static void description(const string& description) {
272*4d7e907cSAndroid Build Coastguard Worker RecordProperty("description", description);
273*4d7e907cSAndroid Build Coastguard Worker }
274*4d7e907cSAndroid Build Coastguard Worker
275*4d7e907cSAndroid Build Coastguard Worker shared_ptr<ICas> mMediaCas;
276*4d7e907cSAndroid Build Coastguard Worker shared_ptr<IDescrambler> mDescrambler;
277*4d7e907cSAndroid Build Coastguard Worker shared_ptr<MediaCasListener> mCasListener;
278*4d7e907cSAndroid Build Coastguard Worker typedef struct _OobInputTestParams {
279*4d7e907cSAndroid Build Coastguard Worker const SubSample* subSamples;
280*4d7e907cSAndroid Build Coastguard Worker int32_t numSubSamples;
281*4d7e907cSAndroid Build Coastguard Worker int64_t imemSizeActual;
282*4d7e907cSAndroid Build Coastguard Worker int64_t imemOffset;
283*4d7e907cSAndroid Build Coastguard Worker int64_t imemSize;
284*4d7e907cSAndroid Build Coastguard Worker int64_t srcOffset;
285*4d7e907cSAndroid Build Coastguard Worker int64_t dstOffset;
286*4d7e907cSAndroid Build Coastguard Worker } OobInputTestParams;
287*4d7e907cSAndroid Build Coastguard Worker
288*4d7e907cSAndroid Build Coastguard Worker AssertionResult createCasPlugin(int32_t caSystemId);
289*4d7e907cSAndroid Build Coastguard Worker AssertionResult openCasSessionDefault(vector<uint8_t>* sessionId);
290*4d7e907cSAndroid Build Coastguard Worker AssertionResult openCasSession(vector<uint8_t>* sessionId, SessionIntent intent,
291*4d7e907cSAndroid Build Coastguard Worker ScramblingMode mode);
292*4d7e907cSAndroid Build Coastguard Worker AssertionResult descrambleTestInputBuffer(const shared_ptr<IDescrambler>& descrambler,
293*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus& descrambleStatus, uint8_t*& inMemory);
294*4d7e907cSAndroid Build Coastguard Worker AssertionResult descrambleTestOobInput(const shared_ptr<IDescrambler>& descrambler,
295*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus& descrambleStatus,
296*4d7e907cSAndroid Build Coastguard Worker const OobInputTestParams& params);
297*4d7e907cSAndroid Build Coastguard Worker };
298*4d7e907cSAndroid Build Coastguard Worker
createCasPlugin(int32_t caSystemId)299*4d7e907cSAndroid Build Coastguard Worker AssertionResult MediaCasAidlTest::createCasPlugin(int32_t caSystemId) {
300*4d7e907cSAndroid Build Coastguard Worker bool isSystemIdSupported;
301*4d7e907cSAndroid Build Coastguard Worker auto status = mService->isSystemIdSupported(caSystemId, &isSystemIdSupported);
302*4d7e907cSAndroid Build Coastguard Worker bool skipDescrambler = false;
303*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk() || !isSystemIdSupported) {
304*4d7e907cSAndroid Build Coastguard Worker return AssertionFailure();
305*4d7e907cSAndroid Build Coastguard Worker }
306*4d7e907cSAndroid Build Coastguard Worker bool isDescramblerSupported;
307*4d7e907cSAndroid Build Coastguard Worker status = mService->isDescramblerSupported(caSystemId, &isDescramblerSupported);
308*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk() || !isDescramblerSupported) {
309*4d7e907cSAndroid Build Coastguard Worker ALOGI("Skip Descrambler test since it's not required in cas.");
310*4d7e907cSAndroid Build Coastguard Worker mDescrambler = nullptr;
311*4d7e907cSAndroid Build Coastguard Worker skipDescrambler = true;
312*4d7e907cSAndroid Build Coastguard Worker }
313*4d7e907cSAndroid Build Coastguard Worker
314*4d7e907cSAndroid Build Coastguard Worker mCasListener = SharedRefBase::make<MediaCasListener>();
315*4d7e907cSAndroid Build Coastguard Worker status = mService->createPlugin(caSystemId, mCasListener, &mMediaCas);
316*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk()) {
317*4d7e907cSAndroid Build Coastguard Worker return AssertionFailure();
318*4d7e907cSAndroid Build Coastguard Worker }
319*4d7e907cSAndroid Build Coastguard Worker if (mMediaCas == nullptr) {
320*4d7e907cSAndroid Build Coastguard Worker return AssertionFailure();
321*4d7e907cSAndroid Build Coastguard Worker }
322*4d7e907cSAndroid Build Coastguard Worker
323*4d7e907cSAndroid Build Coastguard Worker if (skipDescrambler) {
324*4d7e907cSAndroid Build Coastguard Worker return AssertionSuccess();
325*4d7e907cSAndroid Build Coastguard Worker }
326*4d7e907cSAndroid Build Coastguard Worker
327*4d7e907cSAndroid Build Coastguard Worker status = mService->createDescrambler(caSystemId, &mDescrambler);
328*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk()) {
329*4d7e907cSAndroid Build Coastguard Worker return AssertionFailure();
330*4d7e907cSAndroid Build Coastguard Worker }
331*4d7e907cSAndroid Build Coastguard Worker
332*4d7e907cSAndroid Build Coastguard Worker return AssertionResult(mDescrambler != nullptr);
333*4d7e907cSAndroid Build Coastguard Worker }
334*4d7e907cSAndroid Build Coastguard Worker
openCasSessionDefault(vector<uint8_t> * sessionId)335*4d7e907cSAndroid Build Coastguard Worker AssertionResult MediaCasAidlTest::openCasSessionDefault(vector<uint8_t>* sessionId) {
336*4d7e907cSAndroid Build Coastguard Worker return AssertionResult(mMediaCas->openSessionDefault(sessionId).isOk());
337*4d7e907cSAndroid Build Coastguard Worker }
338*4d7e907cSAndroid Build Coastguard Worker
openCasSession(vector<uint8_t> * sessionId,SessionIntent intent,ScramblingMode mode)339*4d7e907cSAndroid Build Coastguard Worker AssertionResult MediaCasAidlTest::openCasSession(vector<uint8_t>* sessionId, SessionIntent intent,
340*4d7e907cSAndroid Build Coastguard Worker ScramblingMode mode) {
341*4d7e907cSAndroid Build Coastguard Worker return AssertionResult(mMediaCas->openSession(intent, mode, sessionId).isOk());
342*4d7e907cSAndroid Build Coastguard Worker }
343*4d7e907cSAndroid Build Coastguard Worker
descrambleTestInputBuffer(const shared_ptr<IDescrambler> & descrambler,ScopedAStatus & descrambleStatus,uint8_t * & sharedMemory)344*4d7e907cSAndroid Build Coastguard Worker AssertionResult MediaCasAidlTest::descrambleTestInputBuffer(
345*4d7e907cSAndroid Build Coastguard Worker const shared_ptr<IDescrambler>& descrambler, ScopedAStatus& descrambleStatus,
346*4d7e907cSAndroid Build Coastguard Worker uint8_t*& sharedMemory) {
347*4d7e907cSAndroid Build Coastguard Worker vector<SubSample> subSample(kSubSamples,
348*4d7e907cSAndroid Build Coastguard Worker kSubSamples + (sizeof(kSubSamples) / sizeof(SubSample)));
349*4d7e907cSAndroid Build Coastguard Worker
350*4d7e907cSAndroid Build Coastguard Worker int size = sizeof(kInBinaryBuffer);
351*4d7e907cSAndroid Build Coastguard Worker auto fd = ashmem_create_region("vts-cas", size);
352*4d7e907cSAndroid Build Coastguard Worker if (fd < 0) {
353*4d7e907cSAndroid Build Coastguard Worker ALOGE("ashmem_create_region failed");
354*4d7e907cSAndroid Build Coastguard Worker return AssertionFailure();
355*4d7e907cSAndroid Build Coastguard Worker }
356*4d7e907cSAndroid Build Coastguard Worker
357*4d7e907cSAndroid Build Coastguard Worker sharedMemory =
358*4d7e907cSAndroid Build Coastguard Worker static_cast<uint8_t*>(mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
359*4d7e907cSAndroid Build Coastguard Worker if (sharedMemory == reinterpret_cast<uint8_t*>(MAP_FAILED)) {
360*4d7e907cSAndroid Build Coastguard Worker ALOGE("mmap failed");
361*4d7e907cSAndroid Build Coastguard Worker return AssertionFailure();
362*4d7e907cSAndroid Build Coastguard Worker }
363*4d7e907cSAndroid Build Coastguard Worker
364*4d7e907cSAndroid Build Coastguard Worker memcpy(sharedMemory, kInBinaryBuffer, size);
365*4d7e907cSAndroid Build Coastguard Worker
366*4d7e907cSAndroid Build Coastguard Worker auto dupFd = dup(fd);
367*4d7e907cSAndroid Build Coastguard Worker
368*4d7e907cSAndroid Build Coastguard Worker SharedBuffer srcBuffer = {.heapBase.fd = ScopedFileDescriptor(std::move(fd)),
369*4d7e907cSAndroid Build Coastguard Worker .heapBase.size = size,
370*4d7e907cSAndroid Build Coastguard Worker .offset = 0,
371*4d7e907cSAndroid Build Coastguard Worker .size = size};
372*4d7e907cSAndroid Build Coastguard Worker
373*4d7e907cSAndroid Build Coastguard Worker SharedBuffer dupBuffer = {.heapBase.fd = ScopedFileDescriptor(dupFd),
374*4d7e907cSAndroid Build Coastguard Worker .heapBase.size = size,
375*4d7e907cSAndroid Build Coastguard Worker .offset = 0,
376*4d7e907cSAndroid Build Coastguard Worker .size = size};
377*4d7e907cSAndroid Build Coastguard Worker
378*4d7e907cSAndroid Build Coastguard Worker DestinationBuffer dstBuffer;
379*4d7e907cSAndroid Build Coastguard Worker dstBuffer.set<DestinationBuffer::nonsecureMemory>(std::move(dupBuffer));
380*4d7e907cSAndroid Build Coastguard Worker
381*4d7e907cSAndroid Build Coastguard Worker int32_t outBytes;
382*4d7e907cSAndroid Build Coastguard Worker descrambleStatus = descrambler->descramble(ScramblingControl::EVENKEY /*2*/, subSample,
383*4d7e907cSAndroid Build Coastguard Worker srcBuffer, 0, dstBuffer, 0, &outBytes);
384*4d7e907cSAndroid Build Coastguard Worker if (!descrambleStatus.isOk()) {
385*4d7e907cSAndroid Build Coastguard Worker ALOGI("descramble failed, status=%d, outBytes=%u, error=%s", descrambleStatus.getStatus(),
386*4d7e907cSAndroid Build Coastguard Worker outBytes, descrambleStatus.getDescription().c_str());
387*4d7e907cSAndroid Build Coastguard Worker }
388*4d7e907cSAndroid Build Coastguard Worker return AssertionResult(descrambleStatus.isOk());
389*4d7e907cSAndroid Build Coastguard Worker }
390*4d7e907cSAndroid Build Coastguard Worker
descrambleTestOobInput(const shared_ptr<IDescrambler> & descrambler,ScopedAStatus & descrambleStatus,const OobInputTestParams & params)391*4d7e907cSAndroid Build Coastguard Worker AssertionResult MediaCasAidlTest::descrambleTestOobInput(
392*4d7e907cSAndroid Build Coastguard Worker const shared_ptr<IDescrambler>& descrambler, ScopedAStatus& descrambleStatus,
393*4d7e907cSAndroid Build Coastguard Worker const OobInputTestParams& params) {
394*4d7e907cSAndroid Build Coastguard Worker vector<SubSample> subSample(params.subSamples, params.subSamples + params.numSubSamples);
395*4d7e907cSAndroid Build Coastguard Worker
396*4d7e907cSAndroid Build Coastguard Worker auto fd = ashmem_create_region("vts-cas", params.imemSizeActual);
397*4d7e907cSAndroid Build Coastguard Worker if (fd < 0) {
398*4d7e907cSAndroid Build Coastguard Worker ALOGE("ashmem_create_region failed");
399*4d7e907cSAndroid Build Coastguard Worker return AssertionFailure();
400*4d7e907cSAndroid Build Coastguard Worker }
401*4d7e907cSAndroid Build Coastguard Worker
402*4d7e907cSAndroid Build Coastguard Worker auto dupFd = dup(fd);
403*4d7e907cSAndroid Build Coastguard Worker
404*4d7e907cSAndroid Build Coastguard Worker SharedBuffer srcBuffer = {.heapBase.fd = ScopedFileDescriptor(std::move(fd)),
405*4d7e907cSAndroid Build Coastguard Worker .heapBase.size = params.imemSizeActual,
406*4d7e907cSAndroid Build Coastguard Worker .offset = params.imemOffset,
407*4d7e907cSAndroid Build Coastguard Worker .size = params.imemSize};
408*4d7e907cSAndroid Build Coastguard Worker
409*4d7e907cSAndroid Build Coastguard Worker SharedBuffer dupBuffer = {.heapBase.fd = ScopedFileDescriptor(dupFd),
410*4d7e907cSAndroid Build Coastguard Worker .heapBase.size = params.imemSizeActual,
411*4d7e907cSAndroid Build Coastguard Worker .offset = params.imemOffset,
412*4d7e907cSAndroid Build Coastguard Worker .size = params.imemSize};
413*4d7e907cSAndroid Build Coastguard Worker
414*4d7e907cSAndroid Build Coastguard Worker DestinationBuffer dstBuffer;
415*4d7e907cSAndroid Build Coastguard Worker dstBuffer.set<DestinationBuffer::nonsecureMemory>(std::move(dupBuffer));
416*4d7e907cSAndroid Build Coastguard Worker
417*4d7e907cSAndroid Build Coastguard Worker int32_t outBytes;
418*4d7e907cSAndroid Build Coastguard Worker descrambleStatus =
419*4d7e907cSAndroid Build Coastguard Worker descrambler->descramble(ScramblingControl::EVENKEY /*2*/, subSample, srcBuffer,
420*4d7e907cSAndroid Build Coastguard Worker params.srcOffset, dstBuffer, params.dstOffset, &outBytes);
421*4d7e907cSAndroid Build Coastguard Worker if (!descrambleStatus.isOk()) {
422*4d7e907cSAndroid Build Coastguard Worker ALOGI("descramble failed, status=%d, outBytes=%u, error=%s", descrambleStatus.getStatus(),
423*4d7e907cSAndroid Build Coastguard Worker outBytes, descrambleStatus.getDescription().c_str());
424*4d7e907cSAndroid Build Coastguard Worker }
425*4d7e907cSAndroid Build Coastguard Worker return AssertionResult(descrambleStatus.isOk());
426*4d7e907cSAndroid Build Coastguard Worker }
427*4d7e907cSAndroid Build Coastguard Worker
TEST_P(MediaCasAidlTest,EnumeratePlugins)428*4d7e907cSAndroid Build Coastguard Worker TEST_P(MediaCasAidlTest, EnumeratePlugins) {
429*4d7e907cSAndroid Build Coastguard Worker description("Test enumerate plugins");
430*4d7e907cSAndroid Build Coastguard Worker
431*4d7e907cSAndroid Build Coastguard Worker vector<AidlCasPluginDescriptor> descriptors;
432*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mService->enumeratePlugins(&descriptors).isOk());
433*4d7e907cSAndroid Build Coastguard Worker
434*4d7e907cSAndroid Build Coastguard Worker if (descriptors.size() == 0) {
435*4d7e907cSAndroid Build Coastguard Worker ALOGW("[ WARN ] enumeratePlugins list empty");
436*4d7e907cSAndroid Build Coastguard Worker return;
437*4d7e907cSAndroid Build Coastguard Worker }
438*4d7e907cSAndroid Build Coastguard Worker
439*4d7e907cSAndroid Build Coastguard Worker for (size_t i = 0; i < descriptors.size(); i++) {
440*4d7e907cSAndroid Build Coastguard Worker int32_t caSystemId = descriptors[i].caSystemId;
441*4d7e907cSAndroid Build Coastguard Worker
442*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(createCasPlugin(caSystemId));
443*4d7e907cSAndroid Build Coastguard Worker }
444*4d7e907cSAndroid Build Coastguard Worker }
445*4d7e907cSAndroid Build Coastguard Worker
TEST_P(MediaCasAidlTest,TestInvalidSystemIdFails)446*4d7e907cSAndroid Build Coastguard Worker TEST_P(MediaCasAidlTest, TestInvalidSystemIdFails) {
447*4d7e907cSAndroid Build Coastguard Worker description("Test failure for invalid system ID");
448*4d7e907cSAndroid Build Coastguard Worker
449*4d7e907cSAndroid Build Coastguard Worker bool isSystemIdSupported;
450*4d7e907cSAndroid Build Coastguard Worker auto status = mService->isSystemIdSupported(INVALID_SYSTEM_ID, &isSystemIdSupported);
451*4d7e907cSAndroid Build Coastguard Worker
452*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(status.isOk());
453*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(isSystemIdSupported);
454*4d7e907cSAndroid Build Coastguard Worker
455*4d7e907cSAndroid Build Coastguard Worker bool isDescramblerSupported;
456*4d7e907cSAndroid Build Coastguard Worker status = mService->isDescramblerSupported(INVALID_SYSTEM_ID, &isDescramblerSupported);
457*4d7e907cSAndroid Build Coastguard Worker
458*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(status.isOk());
459*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(isDescramblerSupported);
460*4d7e907cSAndroid Build Coastguard Worker
461*4d7e907cSAndroid Build Coastguard Worker shared_ptr<ICas> mediaCas;
462*4d7e907cSAndroid Build Coastguard Worker shared_ptr<MediaCasListener> casListener = SharedRefBase::make<MediaCasListener>();
463*4d7e907cSAndroid Build Coastguard Worker status = mService->createPlugin(INVALID_SYSTEM_ID, casListener, &mediaCas);
464*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(status.isOk());
465*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(mediaCas, nullptr);
466*4d7e907cSAndroid Build Coastguard Worker
467*4d7e907cSAndroid Build Coastguard Worker shared_ptr<IDescrambler> descrambler;
468*4d7e907cSAndroid Build Coastguard Worker status = mService->createDescrambler(INVALID_SYSTEM_ID, &descrambler);
469*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(status.isOk());
470*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(descrambler, nullptr);
471*4d7e907cSAndroid Build Coastguard Worker }
472*4d7e907cSAndroid Build Coastguard Worker
TEST_P(MediaCasAidlTest,TestClearKeyPluginInstalled)473*4d7e907cSAndroid Build Coastguard Worker TEST_P(MediaCasAidlTest, TestClearKeyPluginInstalled) {
474*4d7e907cSAndroid Build Coastguard Worker description("Test if ClearKey plugin is installed");
475*4d7e907cSAndroid Build Coastguard Worker
476*4d7e907cSAndroid Build Coastguard Worker vector<AidlCasPluginDescriptor> descriptors;
477*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mService->enumeratePlugins(&descriptors).isOk());
478*4d7e907cSAndroid Build Coastguard Worker
479*4d7e907cSAndroid Build Coastguard Worker if (descriptors.size() == 0) {
480*4d7e907cSAndroid Build Coastguard Worker ALOGW("[ WARN ] enumeratePlugins list empty");
481*4d7e907cSAndroid Build Coastguard Worker }
482*4d7e907cSAndroid Build Coastguard Worker
483*4d7e907cSAndroid Build Coastguard Worker for (size_t i = 0; i < descriptors.size(); i++) {
484*4d7e907cSAndroid Build Coastguard Worker int32_t caSystemId = descriptors[i].caSystemId;
485*4d7e907cSAndroid Build Coastguard Worker if (CLEAR_KEY_SYSTEM_ID == caSystemId) {
486*4d7e907cSAndroid Build Coastguard Worker return;
487*4d7e907cSAndroid Build Coastguard Worker }
488*4d7e907cSAndroid Build Coastguard Worker }
489*4d7e907cSAndroid Build Coastguard Worker
490*4d7e907cSAndroid Build Coastguard Worker ADD_FAILURE() << "ClearKey plugin not installed";
491*4d7e907cSAndroid Build Coastguard Worker }
492*4d7e907cSAndroid Build Coastguard Worker
TEST_P(MediaCasAidlTest,TestClearKeyDefaultSessionClosedAfterRelease)493*4d7e907cSAndroid Build Coastguard Worker TEST_P(MediaCasAidlTest, TestClearKeyDefaultSessionClosedAfterRelease) {
494*4d7e907cSAndroid Build Coastguard Worker description("Test that all sessions are closed after a MediaCas object is released");
495*4d7e907cSAndroid Build Coastguard Worker
496*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID));
497*4d7e907cSAndroid Build Coastguard Worker
498*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->provision(PROVISION_STR).isOk());
499*4d7e907cSAndroid Build Coastguard Worker
500*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> sessionId;
501*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(openCasSessionDefault(&sessionId));
502*4d7e907cSAndroid Build Coastguard Worker
503*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> streamSessionId;
504*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(openCasSessionDefault(&streamSessionId));
505*4d7e907cSAndroid Build Coastguard Worker
506*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->release().isOk());
507*4d7e907cSAndroid Build Coastguard Worker
508*4d7e907cSAndroid Build Coastguard Worker if (mDescrambler != nullptr) {
509*4d7e907cSAndroid Build Coastguard Worker auto status = mDescrambler->setMediaCasSession(sessionId);
510*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(status.isOk());
511*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, status.getServiceSpecificError());
512*4d7e907cSAndroid Build Coastguard Worker
513*4d7e907cSAndroid Build Coastguard Worker status = mDescrambler->setMediaCasSession(streamSessionId);
514*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(status.isOk());
515*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, status.getServiceSpecificError());
516*4d7e907cSAndroid Build Coastguard Worker }
517*4d7e907cSAndroid Build Coastguard Worker }
518*4d7e907cSAndroid Build Coastguard Worker
TEST_P(MediaCasAidlTest,TestClearKeySessionClosedAfterRelease)519*4d7e907cSAndroid Build Coastguard Worker TEST_P(MediaCasAidlTest, TestClearKeySessionClosedAfterRelease) {
520*4d7e907cSAndroid Build Coastguard Worker description("Test that all sessions are closed after a MediaCas object is released");
521*4d7e907cSAndroid Build Coastguard Worker
522*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID));
523*4d7e907cSAndroid Build Coastguard Worker
524*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->provision(PROVISION_STR).isOk());
525*4d7e907cSAndroid Build Coastguard Worker
526*4d7e907cSAndroid Build Coastguard Worker SessionIntent intent = SessionIntent::LIVE;
527*4d7e907cSAndroid Build Coastguard Worker ScramblingMode mode = ScramblingMode::DVB_CSA1;
528*4d7e907cSAndroid Build Coastguard Worker
529*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> sessionId;
530*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(openCasSession(&sessionId, intent, mode));
531*4d7e907cSAndroid Build Coastguard Worker
532*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> streamSessionId;
533*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(openCasSession(&streamSessionId, intent, mode));
534*4d7e907cSAndroid Build Coastguard Worker
535*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->release().isOk());
536*4d7e907cSAndroid Build Coastguard Worker
537*4d7e907cSAndroid Build Coastguard Worker if (mDescrambler != nullptr) {
538*4d7e907cSAndroid Build Coastguard Worker auto status = mDescrambler->setMediaCasSession(sessionId);
539*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(status.isOk());
540*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, status.getServiceSpecificError());
541*4d7e907cSAndroid Build Coastguard Worker
542*4d7e907cSAndroid Build Coastguard Worker status = mDescrambler->setMediaCasSession(streamSessionId);
543*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(status.isOk());
544*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, status.getServiceSpecificError());
545*4d7e907cSAndroid Build Coastguard Worker }
546*4d7e907cSAndroid Build Coastguard Worker }
547*4d7e907cSAndroid Build Coastguard Worker
TEST_P(MediaCasAidlTest,TestClearKeyErrors)548*4d7e907cSAndroid Build Coastguard Worker TEST_P(MediaCasAidlTest, TestClearKeyErrors) {
549*4d7e907cSAndroid Build Coastguard Worker description("Test that invalid call sequences fail with expected error codes");
550*4d7e907cSAndroid Build Coastguard Worker
551*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID));
552*4d7e907cSAndroid Build Coastguard Worker
553*4d7e907cSAndroid Build Coastguard Worker /*
554*4d7e907cSAndroid Build Coastguard Worker * Test MediaCas error codes
555*4d7e907cSAndroid Build Coastguard Worker */
556*4d7e907cSAndroid Build Coastguard Worker // Provision should fail with an invalid asset string
557*4d7e907cSAndroid Build Coastguard Worker auto returnStatus = mMediaCas->provision("invalid asset string");
558*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(returnStatus.isOk());
559*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::ERROR_CAS_NO_LICENSE, returnStatus.getServiceSpecificError());
560*4d7e907cSAndroid Build Coastguard Worker
561*4d7e907cSAndroid Build Coastguard Worker SessionIntent intent = SessionIntent::LIVE;
562*4d7e907cSAndroid Build Coastguard Worker ScramblingMode mode = ScramblingMode::DVB_CSA1;
563*4d7e907cSAndroid Build Coastguard Worker
564*4d7e907cSAndroid Build Coastguard Worker // Open a session, then close it so that it should become invalid
565*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> invalidSessionId;
566*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(openCasSession(&invalidSessionId, intent, mode));
567*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->closeSession(invalidSessionId).isOk());
568*4d7e907cSAndroid Build Coastguard Worker
569*4d7e907cSAndroid Build Coastguard Worker // processEcm should fail with an invalid session id
570*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> ecm(kEcmBinaryBuffer, kEcmBinaryBuffer + sizeof(kEcmBinaryBuffer));
571*4d7e907cSAndroid Build Coastguard Worker returnStatus = mMediaCas->processEcm(invalidSessionId, ecm);
572*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(returnStatus.isOk());
573*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus.getServiceSpecificError());
574*4d7e907cSAndroid Build Coastguard Worker
575*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> sessionId;
576*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(openCasSession(&sessionId, intent, mode));
577*4d7e907cSAndroid Build Coastguard Worker
578*4d7e907cSAndroid Build Coastguard Worker // processEcm should fail without provisioning
579*4d7e907cSAndroid Build Coastguard Worker returnStatus = mMediaCas->processEcm(sessionId, ecm);
580*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(returnStatus.isOk());
581*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::ERROR_CAS_NOT_PROVISIONED, returnStatus.getServiceSpecificError());
582*4d7e907cSAndroid Build Coastguard Worker
583*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->provision(PROVISION_STR).isOk());
584*4d7e907cSAndroid Build Coastguard Worker
585*4d7e907cSAndroid Build Coastguard Worker // processEcm should fail with ecm with bad descriptor count
586*4d7e907cSAndroid Build Coastguard Worker ecm[17] = 0x03; // change the descriptor count field to 3 (invalid)
587*4d7e907cSAndroid Build Coastguard Worker returnStatus = mMediaCas->processEcm(sessionId, ecm);
588*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(returnStatus.isOk());
589*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::ERROR_CAS_UNKNOWN, returnStatus.getServiceSpecificError());
590*4d7e907cSAndroid Build Coastguard Worker
591*4d7e907cSAndroid Build Coastguard Worker // processEcm should fail with ecm buffer that's too short
592*4d7e907cSAndroid Build Coastguard Worker ecm.resize(8);
593*4d7e907cSAndroid Build Coastguard Worker returnStatus = mMediaCas->processEcm(sessionId, ecm);
594*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(returnStatus.isOk());
595*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::BAD_VALUE, returnStatus.getServiceSpecificError());
596*4d7e907cSAndroid Build Coastguard Worker
597*4d7e907cSAndroid Build Coastguard Worker if (mDescrambler != nullptr) {
598*4d7e907cSAndroid Build Coastguard Worker /*
599*4d7e907cSAndroid Build Coastguard Worker * Test MediaDescrambler error codes
600*4d7e907cSAndroid Build Coastguard Worker */
601*4d7e907cSAndroid Build Coastguard Worker // setMediaCasSession should fail with an invalid session id
602*4d7e907cSAndroid Build Coastguard Worker returnStatus = mDescrambler->setMediaCasSession(invalidSessionId);
603*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(returnStatus.isOk());
604*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus.getServiceSpecificError());
605*4d7e907cSAndroid Build Coastguard Worker
606*4d7e907cSAndroid Build Coastguard Worker // descramble should fail without a valid session
607*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus descrambleStatus = ScopedAStatus::ok();
608*4d7e907cSAndroid Build Coastguard Worker uint8_t* sharedBuffer = nullptr;
609*4d7e907cSAndroid Build Coastguard Worker
610*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(descrambleTestInputBuffer(mDescrambler, descrambleStatus, sharedBuffer));
611*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED,
612*4d7e907cSAndroid Build Coastguard Worker descrambleStatus.getServiceSpecificError());
613*4d7e907cSAndroid Build Coastguard Worker
614*4d7e907cSAndroid Build Coastguard Worker // Now set a valid session, should still fail because no valid ecm is processed
615*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mDescrambler->setMediaCasSession(sessionId).isOk());
616*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(descrambleTestInputBuffer(mDescrambler, descrambleStatus, sharedBuffer));
617*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::ERROR_CAS_DECRYPT, descrambleStatus.getServiceSpecificError());
618*4d7e907cSAndroid Build Coastguard Worker
619*4d7e907cSAndroid Build Coastguard Worker // Verify that requiresSecureDecoderComponent handles empty mime
620*4d7e907cSAndroid Build Coastguard Worker bool requiresSecureDecoderComponent = true;
621*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(
622*4d7e907cSAndroid Build Coastguard Worker mDescrambler->requiresSecureDecoderComponent("", &requiresSecureDecoderComponent)
623*4d7e907cSAndroid Build Coastguard Worker .isOk());
624*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(requiresSecureDecoderComponent);
625*4d7e907cSAndroid Build Coastguard Worker
626*4d7e907cSAndroid Build Coastguard Worker // Verify that requiresSecureDecoderComponent handles invalid mime
627*4d7e907cSAndroid Build Coastguard Worker requiresSecureDecoderComponent = true;
628*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(
629*4d7e907cSAndroid Build Coastguard Worker mDescrambler->requiresSecureDecoderComponent("bad", &requiresSecureDecoderComponent)
630*4d7e907cSAndroid Build Coastguard Worker .isOk());
631*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(requiresSecureDecoderComponent);
632*4d7e907cSAndroid Build Coastguard Worker }
633*4d7e907cSAndroid Build Coastguard Worker }
634*4d7e907cSAndroid Build Coastguard Worker
TEST_P(MediaCasAidlTest,TestClearKeyApisWithSession)635*4d7e907cSAndroid Build Coastguard Worker TEST_P(MediaCasAidlTest, TestClearKeyApisWithSession) {
636*4d7e907cSAndroid Build Coastguard Worker description("Test that valid call sequences with SessionEvent send and receive");
637*4d7e907cSAndroid Build Coastguard Worker
638*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID));
639*4d7e907cSAndroid Build Coastguard Worker
640*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->provision(PROVISION_STR).isOk());
641*4d7e907cSAndroid Build Coastguard Worker
642*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> pvtData;
643*4d7e907cSAndroid Build Coastguard Worker pvtData.resize(256);
644*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->setPrivateData(pvtData).isOk());
645*4d7e907cSAndroid Build Coastguard Worker
646*4d7e907cSAndroid Build Coastguard Worker SessionIntent intent = SessionIntent::LIVE;
647*4d7e907cSAndroid Build Coastguard Worker ScramblingMode mode = ScramblingMode::DVB_CSA1;
648*4d7e907cSAndroid Build Coastguard Worker
649*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> sessionId;
650*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(openCasSession(&sessionId, intent, mode));
651*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->setSessionPrivateData(sessionId, pvtData).isOk());
652*4d7e907cSAndroid Build Coastguard Worker
653*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> streamSessionId;
654*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(openCasSession(&streamSessionId, intent, mode));
655*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->setSessionPrivateData(streamSessionId, pvtData).isOk());
656*4d7e907cSAndroid Build Coastguard Worker
657*4d7e907cSAndroid Build Coastguard Worker if (mDescrambler != nullptr) {
658*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mDescrambler->setMediaCasSession(sessionId).isOk());
659*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mDescrambler->setMediaCasSession(streamSessionId).isOk());
660*4d7e907cSAndroid Build Coastguard Worker }
661*4d7e907cSAndroid Build Coastguard Worker
662*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> nullPtrVector(0);
663*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->refreshEntitlements(3, nullPtrVector).isOk());
664*4d7e907cSAndroid Build Coastguard Worker
665*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> refreshData{0, 1, 2, 3};
666*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->refreshEntitlements(10, refreshData).isOk());
667*4d7e907cSAndroid Build Coastguard Worker
668*4d7e907cSAndroid Build Coastguard Worker int32_t eventID = 1;
669*4d7e907cSAndroid Build Coastguard Worker int32_t eventArg = 2;
670*4d7e907cSAndroid Build Coastguard Worker mCasListener->testEventEcho(mMediaCas, eventID, eventArg, nullPtrVector);
671*4d7e907cSAndroid Build Coastguard Worker mCasListener->testSessionEventEcho(mMediaCas, sessionId, eventID, eventArg, nullPtrVector);
672*4d7e907cSAndroid Build Coastguard Worker
673*4d7e907cSAndroid Build Coastguard Worker eventID = 3;
674*4d7e907cSAndroid Build Coastguard Worker eventArg = 4;
675*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> eventData{'e', 'v', 'e', 'n', 't', 'd', 'a', 't', 'a'};
676*4d7e907cSAndroid Build Coastguard Worker mCasListener->testEventEcho(mMediaCas, eventID, eventArg, eventData);
677*4d7e907cSAndroid Build Coastguard Worker mCasListener->testSessionEventEcho(mMediaCas, sessionId, eventID, eventArg, eventData);
678*4d7e907cSAndroid Build Coastguard Worker
679*4d7e907cSAndroid Build Coastguard Worker mCasListener->testStatusUpdate(mMediaCas, &sessionId, intent, mode);
680*4d7e907cSAndroid Build Coastguard Worker
681*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> clearKeyEmmData{'c', 'l', 'e', 'a', 'r', 'k', 'e', 'y', 'e', 'm', 'm'};
682*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->processEmm(clearKeyEmmData).isOk());
683*4d7e907cSAndroid Build Coastguard Worker
684*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> ecm(kEcmBinaryBuffer, kEcmBinaryBuffer + sizeof(kEcmBinaryBuffer));
685*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->processEcm(sessionId, ecm).isOk());
686*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->processEcm(streamSessionId, ecm).isOk());
687*4d7e907cSAndroid Build Coastguard Worker
688*4d7e907cSAndroid Build Coastguard Worker if (mDescrambler != nullptr) {
689*4d7e907cSAndroid Build Coastguard Worker bool requiresSecureDecoderComponent = true;
690*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mDescrambler
691*4d7e907cSAndroid Build Coastguard Worker ->requiresSecureDecoderComponent("video/avc",
692*4d7e907cSAndroid Build Coastguard Worker &requiresSecureDecoderComponent)
693*4d7e907cSAndroid Build Coastguard Worker .isOk());
694*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(requiresSecureDecoderComponent);
695*4d7e907cSAndroid Build Coastguard Worker
696*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus descrambleStatus = ScopedAStatus::ok();
697*4d7e907cSAndroid Build Coastguard Worker uint8_t* sharedBuffer = nullptr;
698*4d7e907cSAndroid Build Coastguard Worker
699*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(descrambleTestInputBuffer(mDescrambler, descrambleStatus, sharedBuffer));
700*4d7e907cSAndroid Build Coastguard Worker
701*4d7e907cSAndroid Build Coastguard Worker int compareResult =
702*4d7e907cSAndroid Build Coastguard Worker memcmp(static_cast<const void*>(sharedBuffer),
703*4d7e907cSAndroid Build Coastguard Worker static_cast<const void*>(kOutRefBinaryBuffer), sizeof(kOutRefBinaryBuffer));
704*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(0, compareResult);
705*4d7e907cSAndroid Build Coastguard Worker
706*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mDescrambler->release().isOk());
707*4d7e907cSAndroid Build Coastguard Worker }
708*4d7e907cSAndroid Build Coastguard Worker
709*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->release().isOk());
710*4d7e907cSAndroid Build Coastguard Worker }
711*4d7e907cSAndroid Build Coastguard Worker
TEST_P(MediaCasAidlTest,TestClearKeyOobFails)712*4d7e907cSAndroid Build Coastguard Worker TEST_P(MediaCasAidlTest, TestClearKeyOobFails) {
713*4d7e907cSAndroid Build Coastguard Worker description("Test that oob descramble request fails with expected error");
714*4d7e907cSAndroid Build Coastguard Worker
715*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID));
716*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->provision(PROVISION_STR).isOk());
717*4d7e907cSAndroid Build Coastguard Worker
718*4d7e907cSAndroid Build Coastguard Worker SessionIntent intent = SessionIntent::LIVE;
719*4d7e907cSAndroid Build Coastguard Worker ScramblingMode mode = ScramblingMode::DVB_CSA1;
720*4d7e907cSAndroid Build Coastguard Worker
721*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> sessionId;
722*4d7e907cSAndroid Build Coastguard Worker ASSERT_TRUE(openCasSession(&sessionId, intent, mode));
723*4d7e907cSAndroid Build Coastguard Worker
724*4d7e907cSAndroid Build Coastguard Worker if (mDescrambler != nullptr) {
725*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mDescrambler->setMediaCasSession(sessionId).isOk());
726*4d7e907cSAndroid Build Coastguard Worker }
727*4d7e907cSAndroid Build Coastguard Worker
728*4d7e907cSAndroid Build Coastguard Worker vector<uint8_t> ecm(kEcmBinaryBuffer, kEcmBinaryBuffer + sizeof(kEcmBinaryBuffer));
729*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->processEcm(sessionId, ecm).isOk());
730*4d7e907cSAndroid Build Coastguard Worker
731*4d7e907cSAndroid Build Coastguard Worker if (mDescrambler != nullptr) {
732*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus descrambleStatus = ScopedAStatus::ok();
733*4d7e907cSAndroid Build Coastguard Worker
734*4d7e907cSAndroid Build Coastguard Worker // test invalid src buffer offset
735*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(
736*4d7e907cSAndroid Build Coastguard Worker descrambleTestOobInput(mDescrambler, descrambleStatus,
737*4d7e907cSAndroid Build Coastguard Worker {.subSamples = kSubSamples,
738*4d7e907cSAndroid Build Coastguard Worker .numSubSamples = sizeof(kSubSamples) / sizeof(SubSample),
739*4d7e907cSAndroid Build Coastguard Worker .imemSizeActual = sizeof(kInBinaryBuffer),
740*4d7e907cSAndroid Build Coastguard Worker .imemOffset = 0xcccccc,
741*4d7e907cSAndroid Build Coastguard Worker .imemSize = sizeof(kInBinaryBuffer),
742*4d7e907cSAndroid Build Coastguard Worker .srcOffset = 0,
743*4d7e907cSAndroid Build Coastguard Worker .dstOffset = 0}));
744*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::BAD_VALUE, descrambleStatus.getServiceSpecificError());
745*4d7e907cSAndroid Build Coastguard Worker
746*4d7e907cSAndroid Build Coastguard Worker // test invalid src buffer size
747*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(
748*4d7e907cSAndroid Build Coastguard Worker descrambleTestOobInput(mDescrambler, descrambleStatus,
749*4d7e907cSAndroid Build Coastguard Worker {.subSamples = kSubSamples,
750*4d7e907cSAndroid Build Coastguard Worker .numSubSamples = sizeof(kSubSamples) / sizeof(SubSample),
751*4d7e907cSAndroid Build Coastguard Worker .imemSizeActual = sizeof(kInBinaryBuffer),
752*4d7e907cSAndroid Build Coastguard Worker .imemOffset = 0,
753*4d7e907cSAndroid Build Coastguard Worker .imemSize = 0xcccccc,
754*4d7e907cSAndroid Build Coastguard Worker .srcOffset = 0,
755*4d7e907cSAndroid Build Coastguard Worker .dstOffset = 0}));
756*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::BAD_VALUE, descrambleStatus.getServiceSpecificError());
757*4d7e907cSAndroid Build Coastguard Worker
758*4d7e907cSAndroid Build Coastguard Worker // test invalid src buffer size
759*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(
760*4d7e907cSAndroid Build Coastguard Worker descrambleTestOobInput(mDescrambler, descrambleStatus,
761*4d7e907cSAndroid Build Coastguard Worker {.subSamples = kSubSamples,
762*4d7e907cSAndroid Build Coastguard Worker .numSubSamples = sizeof(kSubSamples) / sizeof(SubSample),
763*4d7e907cSAndroid Build Coastguard Worker .imemSizeActual = sizeof(kInBinaryBuffer),
764*4d7e907cSAndroid Build Coastguard Worker .imemOffset = 1,
765*4d7e907cSAndroid Build Coastguard Worker .imemSize = -1,
766*4d7e907cSAndroid Build Coastguard Worker .srcOffset = 0,
767*4d7e907cSAndroid Build Coastguard Worker .dstOffset = 0}));
768*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::BAD_VALUE, descrambleStatus.getServiceSpecificError());
769*4d7e907cSAndroid Build Coastguard Worker
770*4d7e907cSAndroid Build Coastguard Worker // test invalid srcOffset
771*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(
772*4d7e907cSAndroid Build Coastguard Worker descrambleTestOobInput(mDescrambler, descrambleStatus,
773*4d7e907cSAndroid Build Coastguard Worker {.subSamples = kSubSamples,
774*4d7e907cSAndroid Build Coastguard Worker .numSubSamples = sizeof(kSubSamples) / sizeof(SubSample),
775*4d7e907cSAndroid Build Coastguard Worker .imemSizeActual = sizeof(kInBinaryBuffer),
776*4d7e907cSAndroid Build Coastguard Worker .imemOffset = 0,
777*4d7e907cSAndroid Build Coastguard Worker .imemSize = sizeof(kInBinaryBuffer),
778*4d7e907cSAndroid Build Coastguard Worker .srcOffset = 0xcccccc,
779*4d7e907cSAndroid Build Coastguard Worker .dstOffset = 0}));
780*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::BAD_VALUE, descrambleStatus.getServiceSpecificError());
781*4d7e907cSAndroid Build Coastguard Worker
782*4d7e907cSAndroid Build Coastguard Worker // test invalid dstOffset
783*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(
784*4d7e907cSAndroid Build Coastguard Worker descrambleTestOobInput(mDescrambler, descrambleStatus,
785*4d7e907cSAndroid Build Coastguard Worker {.subSamples = kSubSamples,
786*4d7e907cSAndroid Build Coastguard Worker .numSubSamples = sizeof(kSubSamples) / sizeof(SubSample),
787*4d7e907cSAndroid Build Coastguard Worker .imemSizeActual = sizeof(kInBinaryBuffer),
788*4d7e907cSAndroid Build Coastguard Worker .imemOffset = 0,
789*4d7e907cSAndroid Build Coastguard Worker .imemSize = sizeof(kInBinaryBuffer),
790*4d7e907cSAndroid Build Coastguard Worker .srcOffset = 0,
791*4d7e907cSAndroid Build Coastguard Worker .dstOffset = 0xcccccc}));
792*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::BAD_VALUE, descrambleStatus.getServiceSpecificError());
793*4d7e907cSAndroid Build Coastguard Worker
794*4d7e907cSAndroid Build Coastguard Worker // test detection of oob subsample sizes
795*4d7e907cSAndroid Build Coastguard Worker const SubSample invalidSubSamples1[] = {{162, 0}, {0, 184}, {0, 0xdddddd}};
796*4d7e907cSAndroid Build Coastguard Worker
797*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(descrambleTestOobInput(
798*4d7e907cSAndroid Build Coastguard Worker mDescrambler, descrambleStatus,
799*4d7e907cSAndroid Build Coastguard Worker {.subSamples = invalidSubSamples1,
800*4d7e907cSAndroid Build Coastguard Worker .numSubSamples = sizeof(invalidSubSamples1) / sizeof(SubSample),
801*4d7e907cSAndroid Build Coastguard Worker .imemSizeActual = sizeof(kInBinaryBuffer),
802*4d7e907cSAndroid Build Coastguard Worker .imemOffset = 0,
803*4d7e907cSAndroid Build Coastguard Worker .imemSize = sizeof(kInBinaryBuffer),
804*4d7e907cSAndroid Build Coastguard Worker .srcOffset = 0,
805*4d7e907cSAndroid Build Coastguard Worker .dstOffset = 0}));
806*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::BAD_VALUE, descrambleStatus.getServiceSpecificError());
807*4d7e907cSAndroid Build Coastguard Worker
808*4d7e907cSAndroid Build Coastguard Worker // test detection of overflowing subsample sizes
809*4d7e907cSAndroid Build Coastguard Worker const SubSample invalidSubSamples2[] = {{162, 0}, {0, 184}, {2, -1}};
810*4d7e907cSAndroid Build Coastguard Worker
811*4d7e907cSAndroid Build Coastguard Worker ASSERT_FALSE(descrambleTestOobInput(
812*4d7e907cSAndroid Build Coastguard Worker mDescrambler, descrambleStatus,
813*4d7e907cSAndroid Build Coastguard Worker {.subSamples = invalidSubSamples2,
814*4d7e907cSAndroid Build Coastguard Worker .numSubSamples = sizeof(invalidSubSamples2) / sizeof(SubSample),
815*4d7e907cSAndroid Build Coastguard Worker .imemSizeActual = sizeof(kInBinaryBuffer),
816*4d7e907cSAndroid Build Coastguard Worker .imemOffset = 0,
817*4d7e907cSAndroid Build Coastguard Worker .imemSize = sizeof(kInBinaryBuffer),
818*4d7e907cSAndroid Build Coastguard Worker .srcOffset = 0,
819*4d7e907cSAndroid Build Coastguard Worker .dstOffset = 0}));
820*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(Status::BAD_VALUE, descrambleStatus.getServiceSpecificError());
821*4d7e907cSAndroid Build Coastguard Worker
822*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mDescrambler->release().isOk());
823*4d7e907cSAndroid Build Coastguard Worker }
824*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(mMediaCas->release().isOk());
825*4d7e907cSAndroid Build Coastguard Worker }
826*4d7e907cSAndroid Build Coastguard Worker
827*4d7e907cSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(MediaCasAidlTest);
828*4d7e907cSAndroid Build Coastguard Worker
829*4d7e907cSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
830*4d7e907cSAndroid Build Coastguard Worker PerInstance, MediaCasAidlTest,
831*4d7e907cSAndroid Build Coastguard Worker testing::ValuesIn(android::getAidlHalInstanceNames(IMediaCasService::descriptor)),
832*4d7e907cSAndroid Build Coastguard Worker android::PrintInstanceNameToString);
833*4d7e907cSAndroid Build Coastguard Worker
834*4d7e907cSAndroid Build Coastguard Worker // Start thread pool to receive callbacks from AIDL service.
main(int argc,char ** argv)835*4d7e907cSAndroid Build Coastguard Worker int main(int argc, char** argv) {
836*4d7e907cSAndroid Build Coastguard Worker InitGoogleTest(&argc, argv);
837*4d7e907cSAndroid Build Coastguard Worker ABinderProcess_setThreadPoolMaxThreadCount(1);
838*4d7e907cSAndroid Build Coastguard Worker ABinderProcess_startThreadPool();
839*4d7e907cSAndroid Build Coastguard Worker return RUN_ALL_TESTS();
840*4d7e907cSAndroid Build Coastguard Worker }
841