blob: de6d097b74125df916754434a2013aa6571e304b [file] [log] [blame]
Sohail Nagaraj17d54db2022-12-29 10:00:59 +05301/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// #define LOG_NDEBUG 0
18#define LOG_TAG "DrmMetricsLogger"
19
20#include <media/MediaMetrics.h>
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +053021#include <media/stagefright/foundation/AString.h>
22#include <media/stagefright/foundation/base64.h>
Sohail Nagaraj17d54db2022-12-29 10:00:59 +053023#include <mediadrm/DrmHal.h>
24#include <mediadrm/DrmMetricsLogger.h>
25#include <mediadrm/DrmUtils.h>
26
27namespace android {
28
29namespace {
30
31std::vector<uint8_t> toStdVec(Vector<uint8_t> const& sessionId) {
32 auto sessionKey = sessionId.array();
33 std::vector<uint8_t> vec(sessionKey, sessionKey + sessionId.size());
34 return vec;
35}
Robert Shih37c16992023-01-30 19:58:35 +000036
Sohail Nagaraj17d54db2022-12-29 10:00:59 +053037} // namespace
38
39DrmMetricsLogger::DrmMetricsLogger(IDrmFrontend frontend)
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +053040 : mImpl(sp<DrmHal>::make()), mUuid(), mObjNonce(), mFrontend(frontend) {}
Sohail Nagaraj17d54db2022-12-29 10:00:59 +053041
42DrmMetricsLogger::~DrmMetricsLogger() {}
43
44DrmStatus DrmMetricsLogger::initCheck() const {
45 DrmStatus status = mImpl->initCheck();
46 if (status != OK) {
47 reportMediaDrmErrored(status, __func__);
48 }
49 return status;
50}
51
Robert Shih37c16992023-01-30 19:58:35 +000052DrmStatus DrmMetricsLogger::isCryptoSchemeSupported(const uint8_t uuid[IDRM_UUID_SIZE],
53 const String8& mimeType,
Sohail Nagaraj17d54db2022-12-29 10:00:59 +053054 DrmPlugin::SecurityLevel securityLevel,
55 bool* result) {
56 DrmStatus status = mImpl->isCryptoSchemeSupported(uuid, mimeType, securityLevel, result);
57 if (status != OK) {
58 reportMediaDrmErrored(status, __func__);
59 }
60 return status;
61}
62
Robert Shih37c16992023-01-30 19:58:35 +000063DrmStatus DrmMetricsLogger::createPlugin(const uint8_t uuid[IDRM_UUID_SIZE],
64 const String8& appPackageName) {
65 std::memcpy(mUuid.data(), uuid, IDRM_UUID_SIZE);
Robert Shih7d5afd52023-02-22 07:45:36 +000066 mUuid[0] = betoh64(mUuid[0]);
67 mUuid[1] = betoh64(mUuid[1]);
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +053068 if (kUuidSchemeMap.count(mUuid)) {
69 mScheme = kUuidSchemeMap.at(mUuid);
70 } else {
71 mScheme = "Other";
Sohail Nagaraj17d54db2022-12-29 10:00:59 +053072 }
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +053073 if (generateNonce(&mObjNonce, kNonceSize, __func__) != OK) {
74 return ERROR_DRM_RESOURCE_BUSY;
75 }
76 DrmStatus status = mImpl->createPlugin(uuid, appPackageName);
77 if (status == OK) {
78 reportMediaDrmCreated();
79 } else {
80 reportMediaDrmErrored(status, __func__);
81 }
82 return status;
Sohail Nagaraj17d54db2022-12-29 10:00:59 +053083}
84
85DrmStatus DrmMetricsLogger::destroyPlugin() {
86 DrmStatus status = mImpl->destroyPlugin();
87 if (status != OK) {
88 reportMediaDrmErrored(status, __func__);
89 }
90 return status;
91}
92
93DrmStatus DrmMetricsLogger::openSession(DrmPlugin::SecurityLevel securityLevel,
94 Vector<uint8_t>& sessionId) {
95 SessionContext ctx{};
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +053096 if (generateNonce(&ctx.mNonce, kNonceSize, __func__) != OK) {
97 return ERROR_DRM_RESOURCE_BUSY;
Sohail Nagaraj17d54db2022-12-29 10:00:59 +053098 }
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +053099 DrmStatus status = mImpl->openSession(securityLevel, sessionId);
100 if (status == OK) {
101 std::vector<uint8_t> sessionKey = toStdVec(sessionId);
102 ctx.mTargetSecurityLevel = securityLevel;
103 if (getSecurityLevel(sessionId, &ctx.mActualSecurityLevel) != OK) {
104 ctx.mActualSecurityLevel = DrmPlugin::kSecurityLevelUnknown;
105 }
106 {
107 const std::lock_guard<std::mutex> lock(mSessionMapMutex);
108 mSessionMap.insert({sessionKey, ctx});
109 }
110 reportMediaDrmSessionOpened(sessionKey);
111 } else {
112 reportMediaDrmErrored(status, __func__);
113 }
114 return status;
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530115}
116
117DrmStatus DrmMetricsLogger::closeSession(Vector<uint8_t> const& sessionId) {
118 std::vector<uint8_t> sid = toStdVec(sessionId);
119 {
120 const std::lock_guard<std::mutex> lock(mSessionMapMutex);
121 mSessionMap.erase(sid);
122 }
123 DrmStatus status = mImpl->closeSession(sessionId);
124 if (status != OK) {
125 reportMediaDrmErrored(status, __func__, sid);
126 }
127 return status;
128}
129
130DrmStatus DrmMetricsLogger::getKeyRequest(Vector<uint8_t> const& sessionId,
131 Vector<uint8_t> const& initData, String8 const& mimeType,
132 DrmPlugin::KeyType keyType,
133 KeyedVector<String8, String8> const& optionalParameters,
134 Vector<uint8_t>& request, String8& defaultUrl,
135 DrmPlugin::KeyRequestType* keyRequestType) {
136 DrmStatus status =
137 mImpl->getKeyRequest(sessionId, initData, mimeType, keyType, optionalParameters,
138 request, defaultUrl, keyRequestType);
139 if (status != OK) {
140 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
141 }
142 return status;
143}
144
145DrmStatus DrmMetricsLogger::provideKeyResponse(Vector<uint8_t> const& sessionId,
146 Vector<uint8_t> const& response,
147 Vector<uint8_t>& keySetId) {
148 DrmStatus status = mImpl->provideKeyResponse(sessionId, response, keySetId);
149 if (status != OK) {
150 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
151 }
152 return status;
153}
154
155DrmStatus DrmMetricsLogger::removeKeys(Vector<uint8_t> const& keySetId) {
156 DrmStatus status = mImpl->removeKeys(keySetId);
157 if (status != OK) {
158 reportMediaDrmErrored(status, __func__);
159 }
160 return status;
161}
162
163DrmStatus DrmMetricsLogger::restoreKeys(Vector<uint8_t> const& sessionId,
164 Vector<uint8_t> const& keySetId) {
165 DrmStatus status = mImpl->restoreKeys(sessionId, keySetId);
166 if (status != OK) {
167 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
168 }
169 return status;
170}
171
172DrmStatus DrmMetricsLogger::queryKeyStatus(Vector<uint8_t> const& sessionId,
173 KeyedVector<String8, String8>& infoMap) const {
174 DrmStatus status = mImpl->queryKeyStatus(sessionId, infoMap);
175 if (status != OK) {
176 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
177 }
178 return status;
179}
180
181DrmStatus DrmMetricsLogger::getProvisionRequest(String8 const& certType,
182 String8 const& certAuthority,
183 Vector<uint8_t>& request, String8& defaultUrl) {
184 DrmStatus status = mImpl->getProvisionRequest(certType, certAuthority, request, defaultUrl);
185 if (status != OK) {
186 reportMediaDrmErrored(status, __func__);
187 }
188 return status;
189}
190
191DrmStatus DrmMetricsLogger::provideProvisionResponse(Vector<uint8_t> const& response,
192 Vector<uint8_t>& certificate,
193 Vector<uint8_t>& wrappedKey) {
194 DrmStatus status = mImpl->provideProvisionResponse(response, certificate, wrappedKey);
195 if (status != OK) {
196 reportMediaDrmErrored(status, __func__);
197 }
198 return status;
199}
200
201DrmStatus DrmMetricsLogger::getSecureStops(List<Vector<uint8_t>>& secureStops) {
202 DrmStatus status = mImpl->getSecureStops(secureStops);
203 if (status != OK) {
204 reportMediaDrmErrored(status, __func__);
205 }
206 return status;
207}
208
209DrmStatus DrmMetricsLogger::getSecureStopIds(List<Vector<uint8_t>>& secureStopIds) {
210 DrmStatus status = mImpl->getSecureStopIds(secureStopIds);
211 if (status != OK) {
212 reportMediaDrmErrored(status, __func__);
213 }
214 return status;
215}
216
217DrmStatus DrmMetricsLogger::getSecureStop(Vector<uint8_t> const& ssid,
218 Vector<uint8_t>& secureStop) {
219 DrmStatus status = mImpl->getSecureStop(ssid, secureStop);
220 if (status != OK) {
221 reportMediaDrmErrored(status, __func__);
222 }
223 return status;
224}
225
226DrmStatus DrmMetricsLogger::releaseSecureStops(Vector<uint8_t> const& ssRelease) {
227 DrmStatus status = mImpl->releaseSecureStops(ssRelease);
228 if (status != OK) {
229 reportMediaDrmErrored(status, __func__);
230 }
231 return status;
232}
233
234DrmStatus DrmMetricsLogger::removeSecureStop(Vector<uint8_t> const& ssid) {
235 DrmStatus status = mImpl->removeSecureStop(ssid);
236 if (status != OK) {
237 reportMediaDrmErrored(status, __func__);
238 }
239 return status;
240}
241
242DrmStatus DrmMetricsLogger::removeAllSecureStops() {
243 DrmStatus status = mImpl->removeAllSecureStops();
244 if (status != OK) {
245 reportMediaDrmErrored(status, __func__);
246 }
247 return status;
248}
249
250DrmStatus DrmMetricsLogger::getHdcpLevels(DrmPlugin::HdcpLevel* connectedLevel,
251 DrmPlugin::HdcpLevel* maxLevel) const {
252 DrmStatus status = mImpl->getHdcpLevels(connectedLevel, maxLevel);
253 if (status != OK) {
254 reportMediaDrmErrored(status, __func__);
255 }
256 return status;
257}
258
259DrmStatus DrmMetricsLogger::getNumberOfSessions(uint32_t* currentSessions,
260 uint32_t* maxSessions) const {
261 DrmStatus status = mImpl->getNumberOfSessions(currentSessions, maxSessions);
262 if (status != OK) {
263 reportMediaDrmErrored(status, __func__);
264 }
265 return status;
266}
267
268DrmStatus DrmMetricsLogger::getSecurityLevel(Vector<uint8_t> const& sessionId,
269 DrmPlugin::SecurityLevel* level) const {
270 DrmStatus status = mImpl->getSecurityLevel(sessionId, level);
271 if (status != OK) {
272 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
273 }
274 return status;
275}
276
277DrmStatus DrmMetricsLogger::getOfflineLicenseKeySetIds(List<Vector<uint8_t>>& keySetIds) const {
278 DrmStatus status = mImpl->getOfflineLicenseKeySetIds(keySetIds);
279 if (status != OK) {
280 reportMediaDrmErrored(status, __func__);
281 }
282 return status;
283}
284
285DrmStatus DrmMetricsLogger::removeOfflineLicense(Vector<uint8_t> const& keySetId) {
286 DrmStatus status = mImpl->removeOfflineLicense(keySetId);
287 if (status != OK) {
288 reportMediaDrmErrored(status, __func__);
289 }
290 return status;
291}
292
293DrmStatus DrmMetricsLogger::getOfflineLicenseState(
294 Vector<uint8_t> const& keySetId, DrmPlugin::OfflineLicenseState* licenseState) const {
295 DrmStatus status = mImpl->getOfflineLicenseState(keySetId, licenseState);
296 if (status != OK) {
297 reportMediaDrmErrored(status, __func__);
298 }
299 return status;
300}
301
302DrmStatus DrmMetricsLogger::getPropertyString(String8 const& name, String8& value) const {
303 DrmStatus status = mImpl->getPropertyString(name, value);
304 if (status != OK) {
305 reportMediaDrmErrored(status, __func__);
306 }
307 return status;
308}
309
310DrmStatus DrmMetricsLogger::getPropertyByteArray(String8 const& name,
311 Vector<uint8_t>& value) const {
312 DrmStatus status = mImpl->getPropertyByteArray(name, value);
313 if (status != OK) {
314 reportMediaDrmErrored(status, __func__);
315 }
316 return status;
317}
318
319DrmStatus DrmMetricsLogger::setPropertyString(String8 const& name, String8 const& value) const {
320 DrmStatus status = mImpl->setPropertyString(name, value);
321 if (status != OK) {
322 reportMediaDrmErrored(status, __func__);
323 }
324 return status;
325}
326
327DrmStatus DrmMetricsLogger::setPropertyByteArray(String8 const& name,
328 Vector<uint8_t> const& value) const {
329 DrmStatus status = mImpl->setPropertyByteArray(name, value);
330 if (status != OK) {
331 reportMediaDrmErrored(status, __func__);
332 }
333 return status;
334}
335
336DrmStatus DrmMetricsLogger::getMetrics(const sp<IDrmMetricsConsumer>& consumer) {
337 DrmStatus status = mImpl->getMetrics(consumer);
338 if (status != OK) {
339 reportMediaDrmErrored(status, __func__);
340 }
341 return status;
342}
343
344DrmStatus DrmMetricsLogger::setCipherAlgorithm(Vector<uint8_t> const& sessionId,
345 String8 const& algorithm) {
346 DrmStatus status = mImpl->setCipherAlgorithm(sessionId, algorithm);
347 if (status != OK) {
348 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
349 }
350 return status;
351}
352
353DrmStatus DrmMetricsLogger::setMacAlgorithm(Vector<uint8_t> const& sessionId,
354 String8 const& algorithm) {
355 DrmStatus status = mImpl->setMacAlgorithm(sessionId, algorithm);
356 if (status != OK) {
357 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
358 }
359 return status;
360}
361
362DrmStatus DrmMetricsLogger::encrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
363 Vector<uint8_t> const& input, Vector<uint8_t> const& iv,
364 Vector<uint8_t>& output) {
365 DrmStatus status = mImpl->encrypt(sessionId, keyId, input, iv, output);
366 if (status != OK) {
367 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
368 }
369 return status;
370}
371
372DrmStatus DrmMetricsLogger::decrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
373 Vector<uint8_t> const& input, Vector<uint8_t> const& iv,
374 Vector<uint8_t>& output) {
375 DrmStatus status = mImpl->decrypt(sessionId, keyId, input, iv, output);
376 if (status != OK) {
377 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
378 }
379 return status;
380}
381
382DrmStatus DrmMetricsLogger::sign(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
383 Vector<uint8_t> const& message, Vector<uint8_t>& signature) {
384 DrmStatus status = mImpl->sign(sessionId, keyId, message, signature);
385 if (status != OK) {
386 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
387 }
388 return status;
389}
390
391DrmStatus DrmMetricsLogger::verify(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
392 Vector<uint8_t> const& message, Vector<uint8_t> const& signature,
393 bool& match) {
394 DrmStatus status = mImpl->verify(sessionId, keyId, message, signature, match);
395 if (status != OK) {
396 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
397 }
398 return status;
399}
400
401DrmStatus DrmMetricsLogger::signRSA(Vector<uint8_t> const& sessionId, String8 const& algorithm,
402 Vector<uint8_t> const& message,
403 Vector<uint8_t> const& wrappedKey, Vector<uint8_t>& signature) {
404 DrmStatus status = mImpl->signRSA(sessionId, algorithm, message, wrappedKey, signature);
405 if (status != OK) {
406 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
407 }
408 return status;
409}
410
411DrmStatus DrmMetricsLogger::setListener(const sp<IDrmClient>& listener) {
412 DrmStatus status = mImpl->setListener(listener);
413 if (status != OK) {
414 reportMediaDrmErrored(status, __func__);
415 }
416 return status;
417}
418
419DrmStatus DrmMetricsLogger::requiresSecureDecoder(const char* mime, bool* required) const {
420 DrmStatus status = mImpl->requiresSecureDecoder(mime, required);
421 if (status != OK) {
422 reportMediaDrmErrored(status, __func__);
423 }
424 return status;
425}
426
427DrmStatus DrmMetricsLogger::requiresSecureDecoder(const char* mime,
428 DrmPlugin::SecurityLevel securityLevel,
429 bool* required) const {
430 DrmStatus status = mImpl->requiresSecureDecoder(mime, securityLevel, required);
431 if (status != OK) {
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530432 reportMediaDrmErrored(status, "requiresSecureDecoderLevel");
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530433 }
434 return status;
435}
436
437DrmStatus DrmMetricsLogger::setPlaybackId(Vector<uint8_t> const& sessionId,
438 const char* playbackId) {
439 DrmStatus status = mImpl->setPlaybackId(sessionId, playbackId);
440 if (status != OK) {
441 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
442 }
443 return status;
444}
445
446DrmStatus DrmMetricsLogger::getLogMessages(Vector<drm::V1_4::LogMessage>& logs) const {
447 DrmStatus status = mImpl->getLogMessages(logs);
448 if (status != OK) {
449 reportMediaDrmErrored(status, __func__);
450 }
451 return status;
452}
453
454DrmStatus DrmMetricsLogger::getSupportedSchemes(std::vector<uint8_t>& schemes) const {
455 DrmStatus status = mImpl->getSupportedSchemes(schemes);
456 if (status != OK) {
457 reportMediaDrmErrored(status, __func__);
458 }
459 return status;
460}
461
462void DrmMetricsLogger::reportMediaDrmCreated() const {
463 mediametrics_handle_t handle(mediametrics_create("mediadrm.created"));
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530464 mediametrics_setCString(handle, "scheme", mScheme.c_str());
Robert Shih7d5afd52023-02-22 07:45:36 +0000465 mediametrics_setInt64(handle, "uuid_msb", mUuid[0]);
466 mediametrics_setInt64(handle, "uuid_lsb", mUuid[1]);
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530467 mediametrics_setInt32(handle, "frontend", mFrontend);
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530468 mediametrics_setCString(handle, "object_nonce", mObjNonce.c_str());
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530469 mediametrics_selfRecord(handle);
470 mediametrics_delete(handle);
471}
472
Sohail Nagarajdef1b732023-01-12 21:22:12 +0530473void DrmMetricsLogger::reportMediaDrmSessionOpened(const std::vector<uint8_t>& sessionId) const {
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530474 mediametrics_handle_t handle(mediametrics_create("mediadrm.session_opened"));
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530475 mediametrics_setCString(handle, "scheme", mScheme.c_str());
Robert Shih7d5afd52023-02-22 07:45:36 +0000476 mediametrics_setInt64(handle, "uuid_msb", mUuid[0]);
477 mediametrics_setInt64(handle, "uuid_lsb", mUuid[1]);
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530478 mediametrics_setInt32(handle, "frontend", mFrontend);
479 mediametrics_setCString(handle, "object_nonce", mObjNonce.c_str());
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530480 const std::lock_guard<std::mutex> lock(mSessionMapMutex);
481 auto it = mSessionMap.find(sessionId);
482 if (it != mSessionMap.end()) {
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530483 mediametrics_setCString(handle, "session_nonce", it->second.mNonce.c_str());
484 mediametrics_setInt64(handle, "requested_seucrity_level", it->second.mTargetSecurityLevel);
485 mediametrics_setInt64(handle, "opened_seucrity_level", it->second.mActualSecurityLevel);
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530486 }
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530487 mediametrics_selfRecord(handle);
488 mediametrics_delete(handle);
489}
490
Sohail Nagarajdef1b732023-01-12 21:22:12 +0530491void DrmMetricsLogger::reportMediaDrmErrored(const DrmStatus& error_code, const char* api,
492 const std::vector<uint8_t>& sessionId) const {
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530493 mediametrics_handle_t handle(mediametrics_create("mediadrm.errored"));
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530494 mediametrics_setCString(handle, "scheme", mScheme.c_str());
Robert Shih7d5afd52023-02-22 07:45:36 +0000495 mediametrics_setInt64(handle, "uuid_msb", mUuid[0]);
496 mediametrics_setInt64(handle, "uuid_lsb", mUuid[1]);
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530497 mediametrics_setInt32(handle, "frontend", mFrontend);
498 mediametrics_setCString(handle, "object_nonce", mObjNonce.c_str());
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530499 if (!sessionId.empty()) {
500 const std::lock_guard<std::mutex> lock(mSessionMapMutex);
501 auto it = mSessionMap.find(sessionId);
502 if (it != mSessionMap.end()) {
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530503 mediametrics_setCString(handle, "session_nonce", it->second.mNonce.c_str());
504 mediametrics_setInt64(handle, "seucrity_level", it->second.mActualSecurityLevel);
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530505 }
506 }
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530507 mediametrics_setCString(handle, "api", api);
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530508 mediametrics_setInt32(handle, "error_code", error_code);
Sohail Nagarajdef1b732023-01-12 21:22:12 +0530509 mediametrics_setInt32(handle, "cdm_err", error_code.getCdmErr());
510 mediametrics_setInt32(handle, "oem_err", error_code.getOemErr());
511 mediametrics_setInt32(handle, "error_context", error_code.getContext());
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530512 mediametrics_selfRecord(handle);
513 mediametrics_delete(handle);
514}
515
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530516DrmStatus DrmMetricsLogger::generateNonce(std::string* out, size_t size, const char* api) {
517 std::vector<uint8_t> buf(size);
518 ssize_t bytes = getrandom(buf.data(), size, GRND_NONBLOCK);
519 if (bytes < size) {
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530520 ALOGE("getrandom failed: %d", errno);
521 reportMediaDrmErrored(ERROR_DRM_RESOURCE_BUSY, api);
522 return ERROR_DRM_RESOURCE_BUSY;
523 }
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530524 android::AString tmp;
525 encodeBase64(buf.data(), size, &tmp);
526 out->assign(tmp.c_str());
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530527 return OK;
528}
529
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530530const std::map<std::array<int64_t, 2>, std::string> DrmMetricsLogger::kUuidSchemeMap {
531 {{(int64_t)0x6DD8B3C345F44A68, (int64_t)0xBF3A64168D01A4A6}, "ABV DRM (MoDRM)"},
532 {{(int64_t)0xF239E769EFA34850, (int64_t)0x9C16A903C6932EFB},
533 "Adobe Primetime DRM version 4"},
534 {{(int64_t)0x616C746963617374, (int64_t)0x2D50726F74656374}, "Alticast"},
535 {{(int64_t)0x94CE86FB07FF4F43, (int64_t)0xADB893D2FA968CA2}, "Apple FairPlay"},
536 {{(int64_t)0x279FE473512C48FE, (int64_t)0xADE8D176FEE6B40F}, "Arris Titanium"},
537 {{(int64_t)0x3D5E6D359B9A41E8, (int64_t)0xB843DD3C6E72C42C}, "ChinaDRM"},
538 {{(int64_t)0x3EA8778F77424BF9, (int64_t)0xB18BE834B2ACBD47}, "Clear Key AES-128"},
539 {{(int64_t)0xBE58615B19C44684, (int64_t)0x88B3C8C57E99E957}, "Clear Key SAMPLE-AES"},
540 {{(int64_t)0xE2719D58A985B3C9, (int64_t)0x781AB030AF78D30E}, "Clear Key DASH-IF"},
541 {{(int64_t)0x644FE7B5260F4FAD, (int64_t)0x949A0762FFB054B4}, "CMLA (OMA DRM)"},
542 {{(int64_t)0x37C332587B994C7E, (int64_t)0xB15D19AF74482154}, "Commscope Titanium V3"},
543 {{(int64_t)0x45D481CB8FE049C0, (int64_t)0xADA9AB2D2455B2F2}, "CoreCrypt"},
544 {{(int64_t)0xDCF4E3E362F15818, (int64_t)0x7BA60A6FE33FF3DD}, "DigiCAP SmartXess"},
545 {{(int64_t)0x35BF197B530E42D7, (int64_t)0x8B651B4BF415070F}, "DivX DRM Series 5"},
546 {{(int64_t)0x80A6BE7E14484C37, (int64_t)0x9E70D5AEBE04C8D2}, "Irdeto Content Protection"},
547 {{(int64_t)0x5E629AF538DA4063, (int64_t)0x897797FFBD9902D4},
548 "Marlin Adaptive Streaming Simple Profile V1.0"},
549 {{(int64_t)0x9A04F07998404286, (int64_t)0xAB92E65BE0885F95}, "Microsoft PlayReady"},
550 {{(int64_t)0x6A99532D869F5922, (int64_t)0x9A91113AB7B1E2F3}, "MobiTV DRM"},
551 {{(int64_t)0xADB41C242DBF4A6D, (int64_t)0x958B4457C0D27B95}, "Nagra MediaAccess PRM 3.0"},
552 {{(int64_t)0x1F83E1E86EE94F0D, (int64_t)0xBA2F5EC4E3ED1A66}, "SecureMedia"},
553 {{(int64_t)0x992C46E6C4374899, (int64_t)0xB6A050FA91AD0E39}, "SecureMedia SteelKnot"},
554 {{(int64_t)0xA68129D3575B4F1A, (int64_t)0x9CBA3223846CF7C3},
555 "Synamedia/Cisco/NDS VideoGuard DRM"},
556 {{(int64_t)0xAA11967FCC014A4A, (int64_t)0x8E99C5D3DDDFEA2D}, "Unitend DRM (UDRM)"},
557 {{(int64_t)0x9A27DD82FDE24725, (int64_t)0x8CBC4234AA06EC09}, "Verimatrix VCAS"},
558 {{(int64_t)0xB4413586C58CFFB0, (int64_t)0x94A5D4896C1AF6C3}, "Viaccess-Orca DRM (VODRM)"},
559 {{(int64_t)0x793B79569F944946, (int64_t)0xA94223E7EF7E44B4}, "VisionCrypt"},
560 {{(int64_t)0x1077EFECC0B24D02, (int64_t)0xACE33C1E52E2FB4B}, "W3C Common PSSH box"},
561 {{(int64_t)0xEDEF8BA979D64ACE, (int64_t)0xA3C827DCD51D21ED}, "Widevine Content Protection"},
562};
563
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530564} // namespace android