xref: /aosp_15_r20/frameworks/av/drm/libmediadrm/DrmMetricsLogger.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker // #define LOG_NDEBUG 0
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "DrmMetricsLogger"
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaMetrics.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AString.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/base64.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <mediadrm/DrmHal.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <mediadrm/DrmMetricsLogger.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <mediadrm/DrmUtils.h>
26*ec779b8eSAndroid Build Coastguard Worker 
27*ec779b8eSAndroid Build Coastguard Worker namespace android {
28*ec779b8eSAndroid Build Coastguard Worker 
29*ec779b8eSAndroid Build Coastguard Worker namespace {
30*ec779b8eSAndroid Build Coastguard Worker 
toStdVec(Vector<uint8_t> const & sessionId)31*ec779b8eSAndroid Build Coastguard Worker std::vector<uint8_t> toStdVec(Vector<uint8_t> const& sessionId) {
32*ec779b8eSAndroid Build Coastguard Worker     auto sessionKey = sessionId.array();
33*ec779b8eSAndroid Build Coastguard Worker     std::vector<uint8_t> vec(sessionKey, sessionKey + sessionId.size());
34*ec779b8eSAndroid Build Coastguard Worker     return vec;
35*ec779b8eSAndroid Build Coastguard Worker }
36*ec779b8eSAndroid Build Coastguard Worker 
37*ec779b8eSAndroid Build Coastguard Worker }  // namespace
38*ec779b8eSAndroid Build Coastguard Worker 
DrmMetricsLogger(IDrmFrontend frontend)39*ec779b8eSAndroid Build Coastguard Worker DrmMetricsLogger::DrmMetricsLogger(IDrmFrontend frontend)
40*ec779b8eSAndroid Build Coastguard Worker     : mImpl(sp<DrmHal>::make()), mUuid(), mObjNonce(), mFrontend(frontend) {}
41*ec779b8eSAndroid Build Coastguard Worker 
~DrmMetricsLogger()42*ec779b8eSAndroid Build Coastguard Worker DrmMetricsLogger::~DrmMetricsLogger() {}
43*ec779b8eSAndroid Build Coastguard Worker 
MediaErrorToEnum(status_t err)44*ec779b8eSAndroid Build Coastguard Worker int MediaErrorToEnum(status_t err) {
45*ec779b8eSAndroid Build Coastguard Worker #define ERROR_BAD_VALUE (BAD_VALUE)
46*ec779b8eSAndroid Build Coastguard Worker #define ERROR_DEAD_OBJECT (DEAD_OBJECT)
47*ec779b8eSAndroid Build Coastguard Worker #define STATUS_CASE(status) \
48*ec779b8eSAndroid Build Coastguard Worker     case ERROR_##status: \
49*ec779b8eSAndroid Build Coastguard Worker         return ENUM_##status
50*ec779b8eSAndroid Build Coastguard Worker 
51*ec779b8eSAndroid Build Coastguard Worker     switch (err) {
52*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_UNKNOWN);
53*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_NO_LICENSE);
54*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_LICENSE_EXPIRED);
55*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_RESOURCE_BUSY);
56*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_INSUFFICIENT_OUTPUT_PROTECTION);
57*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_SESSION_NOT_OPENED);
58*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_CANNOT_HANDLE);
59*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_INSUFFICIENT_SECURITY);
60*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_FRAME_TOO_LARGE);
61*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_SESSION_LOST_STATE);
62*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_CERTIFICATE_MALFORMED);
63*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_CERTIFICATE_MISSING);
64*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_CRYPTO_LIBRARY);
65*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_GENERIC_OEM);
66*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_GENERIC_PLUGIN);
67*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_INIT_DATA);
68*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_KEY_NOT_LOADED);
69*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_LICENSE_PARSE);
70*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_LICENSE_POLICY);
71*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_LICENSE_RELEASE);
72*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_LICENSE_REQUEST_REJECTED);
73*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_LICENSE_RESTORE);
74*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_LICENSE_STATE);
75*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_MEDIA_FRAMEWORK);
76*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_PROVISIONING_CERTIFICATE);
77*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_PROVISIONING_CONFIG);
78*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_PROVISIONING_PARSE);
79*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_PROVISIONING_REQUEST_REJECTED);
80*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_PROVISIONING_RETRY);
81*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_RESOURCE_CONTENTION);
82*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_SECURE_STOP_RELEASE);
83*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_STORAGE_READ);
84*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_STORAGE_WRITE);
85*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_ZERO_SUBSAMPLES);
86*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_INVALID_STATE);
87*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(BAD_VALUE);
88*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_NOT_PROVISIONED);
89*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_DEVICE_REVOKED);
90*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DRM_DECRYPT);
91*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(DEAD_OBJECT);
92*ec779b8eSAndroid Build Coastguard Worker #undef ERROR_BAD_VALUE
93*ec779b8eSAndroid Build Coastguard Worker #undef ERROR_DEAD_OBJECT
94*ec779b8eSAndroid Build Coastguard Worker #undef STATUS_CASE
95*ec779b8eSAndroid Build Coastguard Worker     }
96*ec779b8eSAndroid Build Coastguard Worker     return ENUM_DRM_UNKNOWN;
97*ec779b8eSAndroid Build Coastguard Worker }
98*ec779b8eSAndroid Build Coastguard Worker 
DrmPluginSecurityLevelToJavaSecurityLevel(DrmPlugin::SecurityLevel securityLevel)99*ec779b8eSAndroid Build Coastguard Worker int DrmPluginSecurityLevelToJavaSecurityLevel(DrmPlugin::SecurityLevel securityLevel) {
100*ec779b8eSAndroid Build Coastguard Worker #define STATUS_CASE(status) \
101*ec779b8eSAndroid Build Coastguard Worker     case DrmPlugin::k##status: \
102*ec779b8eSAndroid Build Coastguard Worker         return J##status
103*ec779b8eSAndroid Build Coastguard Worker 
104*ec779b8eSAndroid Build Coastguard Worker     switch (securityLevel) {
105*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(SecurityLevelUnknown);
106*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(SecurityLevelSwSecureCrypto);
107*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(SecurityLevelSwSecureDecode);
108*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(SecurityLevelHwSecureCrypto);
109*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(SecurityLevelHwSecureDecode);
110*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(SecurityLevelHwSecureAll);
111*ec779b8eSAndroid Build Coastguard Worker         STATUS_CASE(SecurityLevelMax);
112*ec779b8eSAndroid Build Coastguard Worker #undef STATUS_CASE
113*ec779b8eSAndroid Build Coastguard Worker     }
114*ec779b8eSAndroid Build Coastguard Worker     return static_cast<int>(securityLevel);
115*ec779b8eSAndroid Build Coastguard Worker }
116*ec779b8eSAndroid Build Coastguard Worker 
117*ec779b8eSAndroid Build Coastguard Worker 
initCheck() const118*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::initCheck() const {
119*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->initCheck();
120*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
121*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
122*ec779b8eSAndroid Build Coastguard Worker     }
123*ec779b8eSAndroid Build Coastguard Worker     return status;
124*ec779b8eSAndroid Build Coastguard Worker }
125*ec779b8eSAndroid Build Coastguard Worker 
isCryptoSchemeSupported(const uint8_t uuid[IDRM_UUID_SIZE],const String8 & mimeType,DrmPlugin::SecurityLevel securityLevel,bool * result)126*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::isCryptoSchemeSupported(const uint8_t uuid[IDRM_UUID_SIZE],
127*ec779b8eSAndroid Build Coastguard Worker                                                     const String8& mimeType,
128*ec779b8eSAndroid Build Coastguard Worker                                                     DrmPlugin::SecurityLevel securityLevel,
129*ec779b8eSAndroid Build Coastguard Worker                                                     bool* result) {
130*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->isCryptoSchemeSupported(uuid, mimeType, securityLevel, result);
131*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
132*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
133*ec779b8eSAndroid Build Coastguard Worker     }
134*ec779b8eSAndroid Build Coastguard Worker     return status;
135*ec779b8eSAndroid Build Coastguard Worker }
136*ec779b8eSAndroid Build Coastguard Worker 
createPlugin(const uint8_t uuid[IDRM_UUID_SIZE],const String8 & appPackageName)137*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::createPlugin(const uint8_t uuid[IDRM_UUID_SIZE],
138*ec779b8eSAndroid Build Coastguard Worker                                          const String8& appPackageName) {
139*ec779b8eSAndroid Build Coastguard Worker     std::memcpy(mUuid.data(), uuid, IDRM_UUID_SIZE);
140*ec779b8eSAndroid Build Coastguard Worker     mUuid[0] = betoh64(mUuid[0]);
141*ec779b8eSAndroid Build Coastguard Worker     mUuid[1] = betoh64(mUuid[1]);
142*ec779b8eSAndroid Build Coastguard Worker     if (kUuidSchemeMap.count(mUuid)) {
143*ec779b8eSAndroid Build Coastguard Worker         mScheme = kUuidSchemeMap.at(mUuid);
144*ec779b8eSAndroid Build Coastguard Worker     } else {
145*ec779b8eSAndroid Build Coastguard Worker         mScheme = "Other";
146*ec779b8eSAndroid Build Coastguard Worker     }
147*ec779b8eSAndroid Build Coastguard Worker     if (generateNonce(&mObjNonce, kNonceSize, __func__) != OK) {
148*ec779b8eSAndroid Build Coastguard Worker         return ERROR_DRM_RESOURCE_BUSY;
149*ec779b8eSAndroid Build Coastguard Worker     }
150*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->createPlugin(uuid, appPackageName);
151*ec779b8eSAndroid Build Coastguard Worker     if (status == OK) {
152*ec779b8eSAndroid Build Coastguard Worker         String8 version8;
153*ec779b8eSAndroid Build Coastguard Worker         if (getPropertyString(String8("version"), version8) == OK) {
154*ec779b8eSAndroid Build Coastguard Worker             mVersion = version8.c_str();
155*ec779b8eSAndroid Build Coastguard Worker         }
156*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmCreated();
157*ec779b8eSAndroid Build Coastguard Worker     } else {
158*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
159*ec779b8eSAndroid Build Coastguard Worker     }
160*ec779b8eSAndroid Build Coastguard Worker     return status;
161*ec779b8eSAndroid Build Coastguard Worker }
162*ec779b8eSAndroid Build Coastguard Worker 
destroyPlugin()163*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::destroyPlugin() {
164*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->destroyPlugin();
165*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
166*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
167*ec779b8eSAndroid Build Coastguard Worker     }
168*ec779b8eSAndroid Build Coastguard Worker     return status;
169*ec779b8eSAndroid Build Coastguard Worker }
170*ec779b8eSAndroid Build Coastguard Worker 
openSession(DrmPlugin::SecurityLevel securityLevel,Vector<uint8_t> & sessionId)171*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::openSession(DrmPlugin::SecurityLevel securityLevel,
172*ec779b8eSAndroid Build Coastguard Worker                                         Vector<uint8_t>& sessionId) {
173*ec779b8eSAndroid Build Coastguard Worker     SessionContext ctx{};
174*ec779b8eSAndroid Build Coastguard Worker     if (generateNonce(&ctx.mNonce, kNonceSize, __func__) != OK) {
175*ec779b8eSAndroid Build Coastguard Worker         return ERROR_DRM_RESOURCE_BUSY;
176*ec779b8eSAndroid Build Coastguard Worker     }
177*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->openSession(securityLevel, sessionId);
178*ec779b8eSAndroid Build Coastguard Worker     if (status == OK) {
179*ec779b8eSAndroid Build Coastguard Worker         std::vector<uint8_t> sessionKey = toStdVec(sessionId);
180*ec779b8eSAndroid Build Coastguard Worker         ctx.mTargetSecurityLevel = securityLevel;
181*ec779b8eSAndroid Build Coastguard Worker         if (getSecurityLevel(sessionId, &ctx.mActualSecurityLevel) != OK) {
182*ec779b8eSAndroid Build Coastguard Worker             ctx.mActualSecurityLevel = DrmPlugin::kSecurityLevelUnknown;
183*ec779b8eSAndroid Build Coastguard Worker         }
184*ec779b8eSAndroid Build Coastguard Worker         if (!mVersion.empty()) {
185*ec779b8eSAndroid Build Coastguard Worker             ctx.mVersion = mVersion;
186*ec779b8eSAndroid Build Coastguard Worker         }
187*ec779b8eSAndroid Build Coastguard Worker         {
188*ec779b8eSAndroid Build Coastguard Worker             const std::lock_guard<std::mutex> lock(mSessionMapMutex);
189*ec779b8eSAndroid Build Coastguard Worker             mSessionMap.insert({sessionKey, ctx});
190*ec779b8eSAndroid Build Coastguard Worker         }
191*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmSessionOpened(sessionKey);
192*ec779b8eSAndroid Build Coastguard Worker     } else {
193*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
194*ec779b8eSAndroid Build Coastguard Worker     }
195*ec779b8eSAndroid Build Coastguard Worker     return status;
196*ec779b8eSAndroid Build Coastguard Worker }
197*ec779b8eSAndroid Build Coastguard Worker 
closeSession(Vector<uint8_t> const & sessionId)198*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::closeSession(Vector<uint8_t> const& sessionId) {
199*ec779b8eSAndroid Build Coastguard Worker     std::vector<uint8_t> sid = toStdVec(sessionId);
200*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->closeSession(sessionId);
201*ec779b8eSAndroid Build Coastguard Worker     if (status == OK) {
202*ec779b8eSAndroid Build Coastguard Worker         const std::lock_guard<std::mutex> lock(mSessionMapMutex);
203*ec779b8eSAndroid Build Coastguard Worker         mSessionMap.erase(sid);
204*ec779b8eSAndroid Build Coastguard Worker     } else {
205*ec779b8eSAndroid Build Coastguard Worker         // TODO(b/275729711): reclaim sessions that failed to close
206*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__, sid);
207*ec779b8eSAndroid Build Coastguard Worker     }
208*ec779b8eSAndroid Build Coastguard Worker     return status;
209*ec779b8eSAndroid Build Coastguard Worker }
210*ec779b8eSAndroid Build Coastguard Worker 
getKeyRequest(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & initData,String8 const & mimeType,DrmPlugin::KeyType keyType,KeyedVector<String8,String8> const & optionalParameters,Vector<uint8_t> & request,String8 & defaultUrl,DrmPlugin::KeyRequestType * keyRequestType)211*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getKeyRequest(Vector<uint8_t> const& sessionId,
212*ec779b8eSAndroid Build Coastguard Worker                                           Vector<uint8_t> const& initData, String8 const& mimeType,
213*ec779b8eSAndroid Build Coastguard Worker                                           DrmPlugin::KeyType keyType,
214*ec779b8eSAndroid Build Coastguard Worker                                           KeyedVector<String8, String8> const& optionalParameters,
215*ec779b8eSAndroid Build Coastguard Worker                                           Vector<uint8_t>& request, String8& defaultUrl,
216*ec779b8eSAndroid Build Coastguard Worker                                           DrmPlugin::KeyRequestType* keyRequestType) {
217*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status =
218*ec779b8eSAndroid Build Coastguard Worker             mImpl->getKeyRequest(sessionId, initData, mimeType, keyType, optionalParameters,
219*ec779b8eSAndroid Build Coastguard Worker                                  request, defaultUrl, keyRequestType);
220*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
221*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
222*ec779b8eSAndroid Build Coastguard Worker     }
223*ec779b8eSAndroid Build Coastguard Worker     return status;
224*ec779b8eSAndroid Build Coastguard Worker }
225*ec779b8eSAndroid Build Coastguard Worker 
provideKeyResponse(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & response,Vector<uint8_t> & keySetId)226*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::provideKeyResponse(Vector<uint8_t> const& sessionId,
227*ec779b8eSAndroid Build Coastguard Worker                                                Vector<uint8_t> const& response,
228*ec779b8eSAndroid Build Coastguard Worker                                                Vector<uint8_t>& keySetId) {
229*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->provideKeyResponse(sessionId, response, keySetId);
230*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
231*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
232*ec779b8eSAndroid Build Coastguard Worker     }
233*ec779b8eSAndroid Build Coastguard Worker     return status;
234*ec779b8eSAndroid Build Coastguard Worker }
235*ec779b8eSAndroid Build Coastguard Worker 
removeKeys(Vector<uint8_t> const & keySetId)236*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::removeKeys(Vector<uint8_t> const& keySetId) {
237*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->removeKeys(keySetId);
238*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
239*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
240*ec779b8eSAndroid Build Coastguard Worker     }
241*ec779b8eSAndroid Build Coastguard Worker     return status;
242*ec779b8eSAndroid Build Coastguard Worker }
243*ec779b8eSAndroid Build Coastguard Worker 
restoreKeys(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keySetId)244*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::restoreKeys(Vector<uint8_t> const& sessionId,
245*ec779b8eSAndroid Build Coastguard Worker                                         Vector<uint8_t> const& keySetId) {
246*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->restoreKeys(sessionId, keySetId);
247*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
248*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
249*ec779b8eSAndroid Build Coastguard Worker     }
250*ec779b8eSAndroid Build Coastguard Worker     return status;
251*ec779b8eSAndroid Build Coastguard Worker }
252*ec779b8eSAndroid Build Coastguard Worker 
queryKeyStatus(Vector<uint8_t> const & sessionId,KeyedVector<String8,String8> & infoMap) const253*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::queryKeyStatus(Vector<uint8_t> const& sessionId,
254*ec779b8eSAndroid Build Coastguard Worker                                            KeyedVector<String8, String8>& infoMap) const {
255*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->queryKeyStatus(sessionId, infoMap);
256*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
257*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
258*ec779b8eSAndroid Build Coastguard Worker     }
259*ec779b8eSAndroid Build Coastguard Worker     return status;
260*ec779b8eSAndroid Build Coastguard Worker }
261*ec779b8eSAndroid Build Coastguard Worker 
getProvisionRequest(String8 const & certType,String8 const & certAuthority,Vector<uint8_t> & request,String8 & defaultUrl)262*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getProvisionRequest(String8 const& certType,
263*ec779b8eSAndroid Build Coastguard Worker                                                 String8 const& certAuthority,
264*ec779b8eSAndroid Build Coastguard Worker                                                 Vector<uint8_t>& request, String8& defaultUrl) {
265*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->getProvisionRequest(certType, certAuthority, request, defaultUrl);
266*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
267*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
268*ec779b8eSAndroid Build Coastguard Worker     }
269*ec779b8eSAndroid Build Coastguard Worker     return status;
270*ec779b8eSAndroid Build Coastguard Worker }
271*ec779b8eSAndroid Build Coastguard Worker 
provideProvisionResponse(Vector<uint8_t> const & response,Vector<uint8_t> & certificate,Vector<uint8_t> & wrappedKey)272*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::provideProvisionResponse(Vector<uint8_t> const& response,
273*ec779b8eSAndroid Build Coastguard Worker                                                      Vector<uint8_t>& certificate,
274*ec779b8eSAndroid Build Coastguard Worker                                                      Vector<uint8_t>& wrappedKey) {
275*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->provideProvisionResponse(response, certificate, wrappedKey);
276*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
277*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
278*ec779b8eSAndroid Build Coastguard Worker     }
279*ec779b8eSAndroid Build Coastguard Worker     return status;
280*ec779b8eSAndroid Build Coastguard Worker }
281*ec779b8eSAndroid Build Coastguard Worker 
getSecureStops(List<Vector<uint8_t>> & secureStops)282*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getSecureStops(List<Vector<uint8_t>>& secureStops) {
283*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->getSecureStops(secureStops);
284*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
285*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
286*ec779b8eSAndroid Build Coastguard Worker     }
287*ec779b8eSAndroid Build Coastguard Worker     return status;
288*ec779b8eSAndroid Build Coastguard Worker }
289*ec779b8eSAndroid Build Coastguard Worker 
getSecureStopIds(List<Vector<uint8_t>> & secureStopIds)290*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getSecureStopIds(List<Vector<uint8_t>>& secureStopIds) {
291*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->getSecureStopIds(secureStopIds);
292*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
293*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
294*ec779b8eSAndroid Build Coastguard Worker     }
295*ec779b8eSAndroid Build Coastguard Worker     return status;
296*ec779b8eSAndroid Build Coastguard Worker }
297*ec779b8eSAndroid Build Coastguard Worker 
getSecureStop(Vector<uint8_t> const & ssid,Vector<uint8_t> & secureStop)298*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getSecureStop(Vector<uint8_t> const& ssid,
299*ec779b8eSAndroid Build Coastguard Worker                                           Vector<uint8_t>& secureStop) {
300*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->getSecureStop(ssid, secureStop);
301*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
302*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
303*ec779b8eSAndroid Build Coastguard Worker     }
304*ec779b8eSAndroid Build Coastguard Worker     return status;
305*ec779b8eSAndroid Build Coastguard Worker }
306*ec779b8eSAndroid Build Coastguard Worker 
releaseSecureStops(Vector<uint8_t> const & ssRelease)307*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::releaseSecureStops(Vector<uint8_t> const& ssRelease) {
308*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->releaseSecureStops(ssRelease);
309*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
310*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
311*ec779b8eSAndroid Build Coastguard Worker     }
312*ec779b8eSAndroid Build Coastguard Worker     return status;
313*ec779b8eSAndroid Build Coastguard Worker }
314*ec779b8eSAndroid Build Coastguard Worker 
removeSecureStop(Vector<uint8_t> const & ssid)315*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::removeSecureStop(Vector<uint8_t> const& ssid) {
316*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->removeSecureStop(ssid);
317*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
318*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
319*ec779b8eSAndroid Build Coastguard Worker     }
320*ec779b8eSAndroid Build Coastguard Worker     return status;
321*ec779b8eSAndroid Build Coastguard Worker }
322*ec779b8eSAndroid Build Coastguard Worker 
removeAllSecureStops()323*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::removeAllSecureStops() {
324*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->removeAllSecureStops();
325*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
326*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
327*ec779b8eSAndroid Build Coastguard Worker     }
328*ec779b8eSAndroid Build Coastguard Worker     return status;
329*ec779b8eSAndroid Build Coastguard Worker }
330*ec779b8eSAndroid Build Coastguard Worker 
getHdcpLevels(DrmPlugin::HdcpLevel * connectedLevel,DrmPlugin::HdcpLevel * maxLevel) const331*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getHdcpLevels(DrmPlugin::HdcpLevel* connectedLevel,
332*ec779b8eSAndroid Build Coastguard Worker                                           DrmPlugin::HdcpLevel* maxLevel) const {
333*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->getHdcpLevels(connectedLevel, maxLevel);
334*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
335*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
336*ec779b8eSAndroid Build Coastguard Worker     }
337*ec779b8eSAndroid Build Coastguard Worker     return status;
338*ec779b8eSAndroid Build Coastguard Worker }
339*ec779b8eSAndroid Build Coastguard Worker 
getNumberOfSessions(uint32_t * currentSessions,uint32_t * maxSessions) const340*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getNumberOfSessions(uint32_t* currentSessions,
341*ec779b8eSAndroid Build Coastguard Worker                                                 uint32_t* maxSessions) const {
342*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->getNumberOfSessions(currentSessions, maxSessions);
343*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
344*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
345*ec779b8eSAndroid Build Coastguard Worker     }
346*ec779b8eSAndroid Build Coastguard Worker     return status;
347*ec779b8eSAndroid Build Coastguard Worker }
348*ec779b8eSAndroid Build Coastguard Worker 
getSecurityLevel(Vector<uint8_t> const & sessionId,DrmPlugin::SecurityLevel * level) const349*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getSecurityLevel(Vector<uint8_t> const& sessionId,
350*ec779b8eSAndroid Build Coastguard Worker                                              DrmPlugin::SecurityLevel* level) const {
351*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->getSecurityLevel(sessionId, level);
352*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
353*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
354*ec779b8eSAndroid Build Coastguard Worker     }
355*ec779b8eSAndroid Build Coastguard Worker     return status;
356*ec779b8eSAndroid Build Coastguard Worker }
357*ec779b8eSAndroid Build Coastguard Worker 
getOfflineLicenseKeySetIds(List<Vector<uint8_t>> & keySetIds) const358*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getOfflineLicenseKeySetIds(List<Vector<uint8_t>>& keySetIds) const {
359*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->getOfflineLicenseKeySetIds(keySetIds);
360*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
361*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
362*ec779b8eSAndroid Build Coastguard Worker     }
363*ec779b8eSAndroid Build Coastguard Worker     return status;
364*ec779b8eSAndroid Build Coastguard Worker }
365*ec779b8eSAndroid Build Coastguard Worker 
removeOfflineLicense(Vector<uint8_t> const & keySetId)366*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::removeOfflineLicense(Vector<uint8_t> const& keySetId) {
367*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->removeOfflineLicense(keySetId);
368*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
369*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
370*ec779b8eSAndroid Build Coastguard Worker     }
371*ec779b8eSAndroid Build Coastguard Worker     return status;
372*ec779b8eSAndroid Build Coastguard Worker }
373*ec779b8eSAndroid Build Coastguard Worker 
getOfflineLicenseState(Vector<uint8_t> const & keySetId,DrmPlugin::OfflineLicenseState * licenseState) const374*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getOfflineLicenseState(
375*ec779b8eSAndroid Build Coastguard Worker         Vector<uint8_t> const& keySetId, DrmPlugin::OfflineLicenseState* licenseState) const {
376*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->getOfflineLicenseState(keySetId, licenseState);
377*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
378*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
379*ec779b8eSAndroid Build Coastguard Worker     }
380*ec779b8eSAndroid Build Coastguard Worker     return status;
381*ec779b8eSAndroid Build Coastguard Worker }
382*ec779b8eSAndroid Build Coastguard Worker 
getPropertyString(String8 const & name,String8 & value) const383*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getPropertyString(String8 const& name, String8& value) const {
384*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->getPropertyString(name, value);
385*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
386*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
387*ec779b8eSAndroid Build Coastguard Worker     }
388*ec779b8eSAndroid Build Coastguard Worker     return status;
389*ec779b8eSAndroid Build Coastguard Worker }
390*ec779b8eSAndroid Build Coastguard Worker 
getPropertyByteArray(String8 const & name,Vector<uint8_t> & value) const391*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getPropertyByteArray(String8 const& name,
392*ec779b8eSAndroid Build Coastguard Worker                                                  Vector<uint8_t>& value) const {
393*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->getPropertyByteArray(name, value);
394*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
395*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
396*ec779b8eSAndroid Build Coastguard Worker     }
397*ec779b8eSAndroid Build Coastguard Worker     return status;
398*ec779b8eSAndroid Build Coastguard Worker }
399*ec779b8eSAndroid Build Coastguard Worker 
setPropertyString(String8 const & name,String8 const & value) const400*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::setPropertyString(String8 const& name, String8 const& value) const {
401*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->setPropertyString(name, value);
402*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
403*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
404*ec779b8eSAndroid Build Coastguard Worker     }
405*ec779b8eSAndroid Build Coastguard Worker     return status;
406*ec779b8eSAndroid Build Coastguard Worker }
407*ec779b8eSAndroid Build Coastguard Worker 
setPropertyByteArray(String8 const & name,Vector<uint8_t> const & value) const408*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::setPropertyByteArray(String8 const& name,
409*ec779b8eSAndroid Build Coastguard Worker                                                  Vector<uint8_t> const& value) const {
410*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->setPropertyByteArray(name, value);
411*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
412*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
413*ec779b8eSAndroid Build Coastguard Worker     }
414*ec779b8eSAndroid Build Coastguard Worker     return status;
415*ec779b8eSAndroid Build Coastguard Worker }
416*ec779b8eSAndroid Build Coastguard Worker 
getMetrics(const sp<IDrmMetricsConsumer> & consumer)417*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getMetrics(const sp<IDrmMetricsConsumer>& consumer) {
418*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->getMetrics(consumer);
419*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
420*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
421*ec779b8eSAndroid Build Coastguard Worker     }
422*ec779b8eSAndroid Build Coastguard Worker     return status;
423*ec779b8eSAndroid Build Coastguard Worker }
424*ec779b8eSAndroid Build Coastguard Worker 
setCipherAlgorithm(Vector<uint8_t> const & sessionId,String8 const & algorithm)425*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::setCipherAlgorithm(Vector<uint8_t> const& sessionId,
426*ec779b8eSAndroid Build Coastguard Worker                                                String8 const& algorithm) {
427*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->setCipherAlgorithm(sessionId, algorithm);
428*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
429*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
430*ec779b8eSAndroid Build Coastguard Worker     }
431*ec779b8eSAndroid Build Coastguard Worker     return status;
432*ec779b8eSAndroid Build Coastguard Worker }
433*ec779b8eSAndroid Build Coastguard Worker 
setMacAlgorithm(Vector<uint8_t> const & sessionId,String8 const & algorithm)434*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::setMacAlgorithm(Vector<uint8_t> const& sessionId,
435*ec779b8eSAndroid Build Coastguard Worker                                             String8 const& algorithm) {
436*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->setMacAlgorithm(sessionId, algorithm);
437*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
438*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
439*ec779b8eSAndroid Build Coastguard Worker     }
440*ec779b8eSAndroid Build Coastguard Worker     return status;
441*ec779b8eSAndroid Build Coastguard Worker }
442*ec779b8eSAndroid Build Coastguard Worker 
encrypt(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keyId,Vector<uint8_t> const & input,Vector<uint8_t> const & iv,Vector<uint8_t> & output)443*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::encrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
444*ec779b8eSAndroid Build Coastguard Worker                                     Vector<uint8_t> const& input, Vector<uint8_t> const& iv,
445*ec779b8eSAndroid Build Coastguard Worker                                     Vector<uint8_t>& output) {
446*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->encrypt(sessionId, keyId, input, iv, output);
447*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
448*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
449*ec779b8eSAndroid Build Coastguard Worker     }
450*ec779b8eSAndroid Build Coastguard Worker     return status;
451*ec779b8eSAndroid Build Coastguard Worker }
452*ec779b8eSAndroid Build Coastguard Worker 
decrypt(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keyId,Vector<uint8_t> const & input,Vector<uint8_t> const & iv,Vector<uint8_t> & output)453*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::decrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
454*ec779b8eSAndroid Build Coastguard Worker                                     Vector<uint8_t> const& input, Vector<uint8_t> const& iv,
455*ec779b8eSAndroid Build Coastguard Worker                                     Vector<uint8_t>& output) {
456*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->decrypt(sessionId, keyId, input, iv, output);
457*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
458*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
459*ec779b8eSAndroid Build Coastguard Worker     }
460*ec779b8eSAndroid Build Coastguard Worker     return status;
461*ec779b8eSAndroid Build Coastguard Worker }
462*ec779b8eSAndroid Build Coastguard Worker 
sign(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keyId,Vector<uint8_t> const & message,Vector<uint8_t> & signature)463*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::sign(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
464*ec779b8eSAndroid Build Coastguard Worker                                  Vector<uint8_t> const& message, Vector<uint8_t>& signature) {
465*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->sign(sessionId, keyId, message, signature);
466*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
467*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
468*ec779b8eSAndroid Build Coastguard Worker     }
469*ec779b8eSAndroid Build Coastguard Worker     return status;
470*ec779b8eSAndroid Build Coastguard Worker }
471*ec779b8eSAndroid Build Coastguard Worker 
verify(Vector<uint8_t> const & sessionId,Vector<uint8_t> const & keyId,Vector<uint8_t> const & message,Vector<uint8_t> const & signature,bool & match)472*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::verify(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
473*ec779b8eSAndroid Build Coastguard Worker                                    Vector<uint8_t> const& message, Vector<uint8_t> const& signature,
474*ec779b8eSAndroid Build Coastguard Worker                                    bool& match) {
475*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->verify(sessionId, keyId, message, signature, match);
476*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
477*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
478*ec779b8eSAndroid Build Coastguard Worker     }
479*ec779b8eSAndroid Build Coastguard Worker     return status;
480*ec779b8eSAndroid Build Coastguard Worker }
481*ec779b8eSAndroid Build Coastguard Worker 
signRSA(Vector<uint8_t> const & sessionId,String8 const & algorithm,Vector<uint8_t> const & message,Vector<uint8_t> const & wrappedKey,Vector<uint8_t> & signature)482*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::signRSA(Vector<uint8_t> const& sessionId, String8 const& algorithm,
483*ec779b8eSAndroid Build Coastguard Worker                                     Vector<uint8_t> const& message,
484*ec779b8eSAndroid Build Coastguard Worker                                     Vector<uint8_t> const& wrappedKey, Vector<uint8_t>& signature) {
485*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->signRSA(sessionId, algorithm, message, wrappedKey, signature);
486*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
487*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
488*ec779b8eSAndroid Build Coastguard Worker     }
489*ec779b8eSAndroid Build Coastguard Worker     return status;
490*ec779b8eSAndroid Build Coastguard Worker }
491*ec779b8eSAndroid Build Coastguard Worker 
setListener(const sp<IDrmClient> & listener)492*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::setListener(const sp<IDrmClient>& listener) {
493*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->setListener(listener);
494*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
495*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
496*ec779b8eSAndroid Build Coastguard Worker     }
497*ec779b8eSAndroid Build Coastguard Worker     return status;
498*ec779b8eSAndroid Build Coastguard Worker }
499*ec779b8eSAndroid Build Coastguard Worker 
requiresSecureDecoder(const char * mime,bool * required) const500*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::requiresSecureDecoder(const char* mime, bool* required) const {
501*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->requiresSecureDecoder(mime, required);
502*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
503*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
504*ec779b8eSAndroid Build Coastguard Worker     }
505*ec779b8eSAndroid Build Coastguard Worker     return status;
506*ec779b8eSAndroid Build Coastguard Worker }
507*ec779b8eSAndroid Build Coastguard Worker 
requiresSecureDecoder(const char * mime,DrmPlugin::SecurityLevel securityLevel,bool * required) const508*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::requiresSecureDecoder(const char* mime,
509*ec779b8eSAndroid Build Coastguard Worker                                                   DrmPlugin::SecurityLevel securityLevel,
510*ec779b8eSAndroid Build Coastguard Worker                                                   bool* required) const {
511*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->requiresSecureDecoder(mime, securityLevel, required);
512*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
513*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, "requiresSecureDecoderLevel");
514*ec779b8eSAndroid Build Coastguard Worker     }
515*ec779b8eSAndroid Build Coastguard Worker     return status;
516*ec779b8eSAndroid Build Coastguard Worker }
517*ec779b8eSAndroid Build Coastguard Worker 
setPlaybackId(Vector<uint8_t> const & sessionId,const char * playbackId)518*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::setPlaybackId(Vector<uint8_t> const& sessionId,
519*ec779b8eSAndroid Build Coastguard Worker                                           const char* playbackId) {
520*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->setPlaybackId(sessionId, playbackId);
521*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
522*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
523*ec779b8eSAndroid Build Coastguard Worker     }
524*ec779b8eSAndroid Build Coastguard Worker     return status;
525*ec779b8eSAndroid Build Coastguard Worker }
526*ec779b8eSAndroid Build Coastguard Worker 
getLogMessages(Vector<drm::V1_4::LogMessage> & logs) const527*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getLogMessages(Vector<drm::V1_4::LogMessage>& logs) const {
528*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->getLogMessages(logs);
529*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
530*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
531*ec779b8eSAndroid Build Coastguard Worker     }
532*ec779b8eSAndroid Build Coastguard Worker     return status;
533*ec779b8eSAndroid Build Coastguard Worker }
534*ec779b8eSAndroid Build Coastguard Worker 
getSupportedSchemes(std::vector<uint8_t> & schemes) const535*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::getSupportedSchemes(std::vector<uint8_t>& schemes) const {
536*ec779b8eSAndroid Build Coastguard Worker     DrmStatus status = mImpl->getSupportedSchemes(schemes);
537*ec779b8eSAndroid Build Coastguard Worker     if (status != OK) {
538*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(status, __func__);
539*ec779b8eSAndroid Build Coastguard Worker     }
540*ec779b8eSAndroid Build Coastguard Worker     return status;
541*ec779b8eSAndroid Build Coastguard Worker }
542*ec779b8eSAndroid Build Coastguard Worker 
reportMediaDrmCreated() const543*ec779b8eSAndroid Build Coastguard Worker void DrmMetricsLogger::reportMediaDrmCreated() const {
544*ec779b8eSAndroid Build Coastguard Worker     mediametrics_handle_t handle(mediametrics_create("mediadrm.created"));
545*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setCString(handle, "scheme", mScheme.c_str());
546*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setInt64(handle, "uuid_msb", mUuid[0]);
547*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setInt64(handle, "uuid_lsb", mUuid[1]);
548*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setInt32(handle, "frontend", mFrontend);
549*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setCString(handle, "object_nonce", mObjNonce.c_str());
550*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setCString(handle, "version", mVersion.c_str());
551*ec779b8eSAndroid Build Coastguard Worker     mediametrics_selfRecord(handle);
552*ec779b8eSAndroid Build Coastguard Worker     mediametrics_delete(handle);
553*ec779b8eSAndroid Build Coastguard Worker }
554*ec779b8eSAndroid Build Coastguard Worker 
reportMediaDrmSessionOpened(const std::vector<uint8_t> & sessionId) const555*ec779b8eSAndroid Build Coastguard Worker void DrmMetricsLogger::reportMediaDrmSessionOpened(const std::vector<uint8_t>& sessionId) const {
556*ec779b8eSAndroid Build Coastguard Worker     mediametrics_handle_t handle(mediametrics_create("mediadrm.session_opened"));
557*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setCString(handle, "scheme", mScheme.c_str());
558*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setInt64(handle, "uuid_msb", mUuid[0]);
559*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setInt64(handle, "uuid_lsb", mUuid[1]);
560*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setInt32(handle, "frontend", mFrontend);
561*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setCString(handle, "version", mVersion.c_str());
562*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setCString(handle, "object_nonce", mObjNonce.c_str());
563*ec779b8eSAndroid Build Coastguard Worker     const std::lock_guard<std::mutex> lock(mSessionMapMutex);
564*ec779b8eSAndroid Build Coastguard Worker     auto it = mSessionMap.find(sessionId);
565*ec779b8eSAndroid Build Coastguard Worker     if (it != mSessionMap.end()) {
566*ec779b8eSAndroid Build Coastguard Worker         mediametrics_setCString(handle, "session_nonce", it->second.mNonce.c_str());
567*ec779b8eSAndroid Build Coastguard Worker         mediametrics_setInt32(handle, "requested_security_level",
568*ec779b8eSAndroid Build Coastguard Worker                     DrmPluginSecurityLevelToJavaSecurityLevel(it->second.mTargetSecurityLevel));
569*ec779b8eSAndroid Build Coastguard Worker         mediametrics_setInt32(handle, "opened_security_level",
570*ec779b8eSAndroid Build Coastguard Worker                     DrmPluginSecurityLevelToJavaSecurityLevel(it->second.mActualSecurityLevel));
571*ec779b8eSAndroid Build Coastguard Worker     }
572*ec779b8eSAndroid Build Coastguard Worker     mediametrics_selfRecord(handle);
573*ec779b8eSAndroid Build Coastguard Worker     mediametrics_delete(handle);
574*ec779b8eSAndroid Build Coastguard Worker }
575*ec779b8eSAndroid Build Coastguard Worker 
reportMediaDrmErrored(const DrmStatus & error_code,const char * api,const std::vector<uint8_t> & sessionId) const576*ec779b8eSAndroid Build Coastguard Worker void DrmMetricsLogger::reportMediaDrmErrored(const DrmStatus& error_code, const char* api,
577*ec779b8eSAndroid Build Coastguard Worker                                              const std::vector<uint8_t>& sessionId) const {
578*ec779b8eSAndroid Build Coastguard Worker     mediametrics_handle_t handle(mediametrics_create("mediadrm.errored"));
579*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setCString(handle, "scheme", mScheme.c_str());
580*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setInt64(handle, "uuid_msb", mUuid[0]);
581*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setInt64(handle, "uuid_lsb", mUuid[1]);
582*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setInt32(handle, "frontend", mFrontend);
583*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setCString(handle, "version", mVersion.c_str());
584*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setCString(handle, "object_nonce", mObjNonce.c_str());
585*ec779b8eSAndroid Build Coastguard Worker     if (!sessionId.empty()) {
586*ec779b8eSAndroid Build Coastguard Worker         const std::lock_guard<std::mutex> lock(mSessionMapMutex);
587*ec779b8eSAndroid Build Coastguard Worker         auto it = mSessionMap.find(sessionId);
588*ec779b8eSAndroid Build Coastguard Worker         if (it != mSessionMap.end()) {
589*ec779b8eSAndroid Build Coastguard Worker             mediametrics_setCString(handle, "session_nonce", it->second.mNonce.c_str());
590*ec779b8eSAndroid Build Coastguard Worker             mediametrics_setInt32(handle, "security_level",
591*ec779b8eSAndroid Build Coastguard Worker                         DrmPluginSecurityLevelToJavaSecurityLevel(it->second.mActualSecurityLevel));
592*ec779b8eSAndroid Build Coastguard Worker         }
593*ec779b8eSAndroid Build Coastguard Worker     }
594*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setCString(handle, "api", api);
595*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setInt32(handle, "error_code", MediaErrorToEnum(error_code));
596*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setInt32(handle, "cdm_err", error_code.getCdmErr());
597*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setInt32(handle, "oem_err", error_code.getOemErr());
598*ec779b8eSAndroid Build Coastguard Worker     mediametrics_setInt32(handle, "error_context", error_code.getContext());
599*ec779b8eSAndroid Build Coastguard Worker     mediametrics_selfRecord(handle);
600*ec779b8eSAndroid Build Coastguard Worker     mediametrics_delete(handle);
601*ec779b8eSAndroid Build Coastguard Worker }
602*ec779b8eSAndroid Build Coastguard Worker 
generateNonce(std::string * out,size_t size,const char * api)603*ec779b8eSAndroid Build Coastguard Worker DrmStatus DrmMetricsLogger::generateNonce(std::string* out, size_t size, const char* api) {
604*ec779b8eSAndroid Build Coastguard Worker     std::vector<uint8_t> buf(size);
605*ec779b8eSAndroid Build Coastguard Worker     ssize_t bytes = getrandom(buf.data(), size, GRND_NONBLOCK);
606*ec779b8eSAndroid Build Coastguard Worker     if (bytes < size) {
607*ec779b8eSAndroid Build Coastguard Worker         ALOGE("getrandom failed: %d", errno);
608*ec779b8eSAndroid Build Coastguard Worker         reportMediaDrmErrored(ERROR_DRM_RESOURCE_BUSY, api);
609*ec779b8eSAndroid Build Coastguard Worker         return ERROR_DRM_RESOURCE_BUSY;
610*ec779b8eSAndroid Build Coastguard Worker     }
611*ec779b8eSAndroid Build Coastguard Worker     android::AString tmp;
612*ec779b8eSAndroid Build Coastguard Worker     encodeBase64(buf.data(), size, &tmp);
613*ec779b8eSAndroid Build Coastguard Worker     out->assign(tmp.c_str());
614*ec779b8eSAndroid Build Coastguard Worker     return OK;
615*ec779b8eSAndroid Build Coastguard Worker }
616*ec779b8eSAndroid Build Coastguard Worker 
617*ec779b8eSAndroid Build Coastguard Worker const std::map<std::array<int64_t, 2>, std::string> DrmMetricsLogger::kUuidSchemeMap {
618*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x6DD8B3C345F44A68, (int64_t)0xBF3A64168D01A4A6}, "ABV DRM (MoDRM)"},
619*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0xF239E769EFA34850, (int64_t)0x9C16A903C6932EFB},
620*ec779b8eSAndroid Build Coastguard Worker          "Adobe Primetime DRM version 4"},
621*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x616C746963617374, (int64_t)0x2D50726F74656374}, "Alticast"},
622*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x94CE86FB07FF4F43, (int64_t)0xADB893D2FA968CA2}, "Apple FairPlay"},
623*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x279FE473512C48FE, (int64_t)0xADE8D176FEE6B40F}, "Arris Titanium"},
624*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x3D5E6D359B9A41E8, (int64_t)0xB843DD3C6E72C42C}, "ChinaDRM"},
625*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x3EA8778F77424BF9, (int64_t)0xB18BE834B2ACBD47}, "Clear Key AES-128"},
626*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0xBE58615B19C44684, (int64_t)0x88B3C8C57E99E957}, "Clear Key SAMPLE-AES"},
627*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0xE2719D58A985B3C9, (int64_t)0x781AB030AF78D30E}, "Clear Key DASH-IF"},
628*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x644FE7B5260F4FAD, (int64_t)0x949A0762FFB054B4}, "CMLA (OMA DRM)"},
629*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x37C332587B994C7E, (int64_t)0xB15D19AF74482154}, "Commscope Titanium V3"},
630*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x45D481CB8FE049C0, (int64_t)0xADA9AB2D2455B2F2}, "CoreCrypt"},
631*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0xDCF4E3E362F15818, (int64_t)0x7BA60A6FE33FF3DD}, "DigiCAP SmartXess"},
632*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x35BF197B530E42D7, (int64_t)0x8B651B4BF415070F}, "DivX DRM Series 5"},
633*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x80A6BE7E14484C37, (int64_t)0x9E70D5AEBE04C8D2}, "Irdeto Content Protection"},
634*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x5E629AF538DA4063, (int64_t)0x897797FFBD9902D4},
635*ec779b8eSAndroid Build Coastguard Worker          "Marlin Adaptive Streaming Simple Profile V1.0"},
636*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x9A04F07998404286, (int64_t)0xAB92E65BE0885F95}, "Microsoft PlayReady"},
637*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x6A99532D869F5922, (int64_t)0x9A91113AB7B1E2F3}, "MobiTV DRM"},
638*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0xADB41C242DBF4A6D, (int64_t)0x958B4457C0D27B95}, "Nagra MediaAccess PRM 3.0"},
639*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x1F83E1E86EE94F0D, (int64_t)0xBA2F5EC4E3ED1A66}, "SecureMedia"},
640*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x992C46E6C4374899, (int64_t)0xB6A050FA91AD0E39}, "SecureMedia SteelKnot"},
641*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0xA68129D3575B4F1A, (int64_t)0x9CBA3223846CF7C3},
642*ec779b8eSAndroid Build Coastguard Worker          "Synamedia/Cisco/NDS VideoGuard DRM"},
643*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0xAA11967FCC014A4A, (int64_t)0x8E99C5D3DDDFEA2D}, "Unitend DRM (UDRM)"},
644*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x9A27DD82FDE24725, (int64_t)0x8CBC4234AA06EC09}, "Verimatrix VCAS"},
645*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0xB4413586C58CFFB0, (int64_t)0x94A5D4896C1AF6C3}, "Viaccess-Orca DRM (VODRM)"},
646*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x793B79569F944946, (int64_t)0xA94223E7EF7E44B4}, "VisionCrypt"},
647*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0x1077EFECC0B24D02, (int64_t)0xACE33C1E52E2FB4B}, "W3C Common PSSH box"},
648*ec779b8eSAndroid Build Coastguard Worker         {{(int64_t)0xEDEF8BA979D64ACE, (int64_t)0xA3C827DCD51D21ED}, "Widevine Content Protection"},
649*ec779b8eSAndroid Build Coastguard Worker };
650*ec779b8eSAndroid Build Coastguard Worker 
651*ec779b8eSAndroid Build Coastguard Worker }  // namespace android