blob: f7653ffe0beef1ce953be691e0190e3c3f137d6b [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}
36} // namespace
37
38DrmMetricsLogger::DrmMetricsLogger(IDrmFrontend frontend)
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +053039 : mImpl(sp<DrmHal>::make()), mUuid(), mObjNonce(), mFrontend(frontend) {}
Sohail Nagaraj17d54db2022-12-29 10:00:59 +053040
41DrmMetricsLogger::~DrmMetricsLogger() {}
42
43DrmStatus DrmMetricsLogger::initCheck() const {
44 DrmStatus status = mImpl->initCheck();
45 if (status != OK) {
46 reportMediaDrmErrored(status, __func__);
47 }
48 return status;
49}
50
51DrmStatus DrmMetricsLogger::isCryptoSchemeSupported(const uint8_t uuid[16], const String8& mimeType,
52 DrmPlugin::SecurityLevel securityLevel,
53 bool* result) {
54 DrmStatus status = mImpl->isCryptoSchemeSupported(uuid, mimeType, securityLevel, result);
55 if (status != OK) {
56 reportMediaDrmErrored(status, __func__);
57 }
58 return status;
59}
60
61DrmStatus DrmMetricsLogger::createPlugin(const uint8_t uuid[16], const String8& appPackageName) {
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +053062 std::memcpy(mUuid.data(), uuid, mUuid.size());
63 if (kUuidSchemeMap.count(mUuid)) {
64 mScheme = kUuidSchemeMap.at(mUuid);
65 } else {
66 mScheme = "Other";
Sohail Nagaraj17d54db2022-12-29 10:00:59 +053067 }
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +053068 if (generateNonce(&mObjNonce, kNonceSize, __func__) != OK) {
69 return ERROR_DRM_RESOURCE_BUSY;
70 }
71 DrmStatus status = mImpl->createPlugin(uuid, appPackageName);
72 if (status == OK) {
73 reportMediaDrmCreated();
74 } else {
75 reportMediaDrmErrored(status, __func__);
76 }
77 return status;
Sohail Nagaraj17d54db2022-12-29 10:00:59 +053078}
79
80DrmStatus DrmMetricsLogger::destroyPlugin() {
81 DrmStatus status = mImpl->destroyPlugin();
82 if (status != OK) {
83 reportMediaDrmErrored(status, __func__);
84 }
85 return status;
86}
87
88DrmStatus DrmMetricsLogger::openSession(DrmPlugin::SecurityLevel securityLevel,
89 Vector<uint8_t>& sessionId) {
90 SessionContext ctx{};
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +053091 if (generateNonce(&ctx.mNonce, kNonceSize, __func__) != OK) {
92 return ERROR_DRM_RESOURCE_BUSY;
Sohail Nagaraj17d54db2022-12-29 10:00:59 +053093 }
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +053094 DrmStatus status = mImpl->openSession(securityLevel, sessionId);
95 if (status == OK) {
96 std::vector<uint8_t> sessionKey = toStdVec(sessionId);
97 ctx.mTargetSecurityLevel = securityLevel;
98 if (getSecurityLevel(sessionId, &ctx.mActualSecurityLevel) != OK) {
99 ctx.mActualSecurityLevel = DrmPlugin::kSecurityLevelUnknown;
100 }
101 {
102 const std::lock_guard<std::mutex> lock(mSessionMapMutex);
103 mSessionMap.insert({sessionKey, ctx});
104 }
105 reportMediaDrmSessionOpened(sessionKey);
106 } else {
107 reportMediaDrmErrored(status, __func__);
108 }
109 return status;
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530110}
111
112DrmStatus DrmMetricsLogger::closeSession(Vector<uint8_t> const& sessionId) {
113 std::vector<uint8_t> sid = toStdVec(sessionId);
114 {
115 const std::lock_guard<std::mutex> lock(mSessionMapMutex);
116 mSessionMap.erase(sid);
117 }
118 DrmStatus status = mImpl->closeSession(sessionId);
119 if (status != OK) {
120 reportMediaDrmErrored(status, __func__, sid);
121 }
122 return status;
123}
124
125DrmStatus DrmMetricsLogger::getKeyRequest(Vector<uint8_t> const& sessionId,
126 Vector<uint8_t> const& initData, String8 const& mimeType,
127 DrmPlugin::KeyType keyType,
128 KeyedVector<String8, String8> const& optionalParameters,
129 Vector<uint8_t>& request, String8& defaultUrl,
130 DrmPlugin::KeyRequestType* keyRequestType) {
131 DrmStatus status =
132 mImpl->getKeyRequest(sessionId, initData, mimeType, keyType, optionalParameters,
133 request, defaultUrl, keyRequestType);
134 if (status != OK) {
135 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
136 }
137 return status;
138}
139
140DrmStatus DrmMetricsLogger::provideKeyResponse(Vector<uint8_t> const& sessionId,
141 Vector<uint8_t> const& response,
142 Vector<uint8_t>& keySetId) {
143 DrmStatus status = mImpl->provideKeyResponse(sessionId, response, keySetId);
144 if (status != OK) {
145 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
146 }
147 return status;
148}
149
150DrmStatus DrmMetricsLogger::removeKeys(Vector<uint8_t> const& keySetId) {
151 DrmStatus status = mImpl->removeKeys(keySetId);
152 if (status != OK) {
153 reportMediaDrmErrored(status, __func__);
154 }
155 return status;
156}
157
158DrmStatus DrmMetricsLogger::restoreKeys(Vector<uint8_t> const& sessionId,
159 Vector<uint8_t> const& keySetId) {
160 DrmStatus status = mImpl->restoreKeys(sessionId, keySetId);
161 if (status != OK) {
162 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
163 }
164 return status;
165}
166
167DrmStatus DrmMetricsLogger::queryKeyStatus(Vector<uint8_t> const& sessionId,
168 KeyedVector<String8, String8>& infoMap) const {
169 DrmStatus status = mImpl->queryKeyStatus(sessionId, infoMap);
170 if (status != OK) {
171 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
172 }
173 return status;
174}
175
176DrmStatus DrmMetricsLogger::getProvisionRequest(String8 const& certType,
177 String8 const& certAuthority,
178 Vector<uint8_t>& request, String8& defaultUrl) {
179 DrmStatus status = mImpl->getProvisionRequest(certType, certAuthority, request, defaultUrl);
180 if (status != OK) {
181 reportMediaDrmErrored(status, __func__);
182 }
183 return status;
184}
185
186DrmStatus DrmMetricsLogger::provideProvisionResponse(Vector<uint8_t> const& response,
187 Vector<uint8_t>& certificate,
188 Vector<uint8_t>& wrappedKey) {
189 DrmStatus status = mImpl->provideProvisionResponse(response, certificate, wrappedKey);
190 if (status != OK) {
191 reportMediaDrmErrored(status, __func__);
192 }
193 return status;
194}
195
196DrmStatus DrmMetricsLogger::getSecureStops(List<Vector<uint8_t>>& secureStops) {
197 DrmStatus status = mImpl->getSecureStops(secureStops);
198 if (status != OK) {
199 reportMediaDrmErrored(status, __func__);
200 }
201 return status;
202}
203
204DrmStatus DrmMetricsLogger::getSecureStopIds(List<Vector<uint8_t>>& secureStopIds) {
205 DrmStatus status = mImpl->getSecureStopIds(secureStopIds);
206 if (status != OK) {
207 reportMediaDrmErrored(status, __func__);
208 }
209 return status;
210}
211
212DrmStatus DrmMetricsLogger::getSecureStop(Vector<uint8_t> const& ssid,
213 Vector<uint8_t>& secureStop) {
214 DrmStatus status = mImpl->getSecureStop(ssid, secureStop);
215 if (status != OK) {
216 reportMediaDrmErrored(status, __func__);
217 }
218 return status;
219}
220
221DrmStatus DrmMetricsLogger::releaseSecureStops(Vector<uint8_t> const& ssRelease) {
222 DrmStatus status = mImpl->releaseSecureStops(ssRelease);
223 if (status != OK) {
224 reportMediaDrmErrored(status, __func__);
225 }
226 return status;
227}
228
229DrmStatus DrmMetricsLogger::removeSecureStop(Vector<uint8_t> const& ssid) {
230 DrmStatus status = mImpl->removeSecureStop(ssid);
231 if (status != OK) {
232 reportMediaDrmErrored(status, __func__);
233 }
234 return status;
235}
236
237DrmStatus DrmMetricsLogger::removeAllSecureStops() {
238 DrmStatus status = mImpl->removeAllSecureStops();
239 if (status != OK) {
240 reportMediaDrmErrored(status, __func__);
241 }
242 return status;
243}
244
245DrmStatus DrmMetricsLogger::getHdcpLevels(DrmPlugin::HdcpLevel* connectedLevel,
246 DrmPlugin::HdcpLevel* maxLevel) const {
247 DrmStatus status = mImpl->getHdcpLevels(connectedLevel, maxLevel);
248 if (status != OK) {
249 reportMediaDrmErrored(status, __func__);
250 }
251 return status;
252}
253
254DrmStatus DrmMetricsLogger::getNumberOfSessions(uint32_t* currentSessions,
255 uint32_t* maxSessions) const {
256 DrmStatus status = mImpl->getNumberOfSessions(currentSessions, maxSessions);
257 if (status != OK) {
258 reportMediaDrmErrored(status, __func__);
259 }
260 return status;
261}
262
263DrmStatus DrmMetricsLogger::getSecurityLevel(Vector<uint8_t> const& sessionId,
264 DrmPlugin::SecurityLevel* level) const {
265 DrmStatus status = mImpl->getSecurityLevel(sessionId, level);
266 if (status != OK) {
267 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
268 }
269 return status;
270}
271
272DrmStatus DrmMetricsLogger::getOfflineLicenseKeySetIds(List<Vector<uint8_t>>& keySetIds) const {
273 DrmStatus status = mImpl->getOfflineLicenseKeySetIds(keySetIds);
274 if (status != OK) {
275 reportMediaDrmErrored(status, __func__);
276 }
277 return status;
278}
279
280DrmStatus DrmMetricsLogger::removeOfflineLicense(Vector<uint8_t> const& keySetId) {
281 DrmStatus status = mImpl->removeOfflineLicense(keySetId);
282 if (status != OK) {
283 reportMediaDrmErrored(status, __func__);
284 }
285 return status;
286}
287
288DrmStatus DrmMetricsLogger::getOfflineLicenseState(
289 Vector<uint8_t> const& keySetId, DrmPlugin::OfflineLicenseState* licenseState) const {
290 DrmStatus status = mImpl->getOfflineLicenseState(keySetId, licenseState);
291 if (status != OK) {
292 reportMediaDrmErrored(status, __func__);
293 }
294 return status;
295}
296
297DrmStatus DrmMetricsLogger::getPropertyString(String8 const& name, String8& value) const {
298 DrmStatus status = mImpl->getPropertyString(name, value);
299 if (status != OK) {
300 reportMediaDrmErrored(status, __func__);
301 }
302 return status;
303}
304
305DrmStatus DrmMetricsLogger::getPropertyByteArray(String8 const& name,
306 Vector<uint8_t>& value) const {
307 DrmStatus status = mImpl->getPropertyByteArray(name, value);
308 if (status != OK) {
309 reportMediaDrmErrored(status, __func__);
310 }
311 return status;
312}
313
314DrmStatus DrmMetricsLogger::setPropertyString(String8 const& name, String8 const& value) const {
315 DrmStatus status = mImpl->setPropertyString(name, value);
316 if (status != OK) {
317 reportMediaDrmErrored(status, __func__);
318 }
319 return status;
320}
321
322DrmStatus DrmMetricsLogger::setPropertyByteArray(String8 const& name,
323 Vector<uint8_t> const& value) const {
324 DrmStatus status = mImpl->setPropertyByteArray(name, value);
325 if (status != OK) {
326 reportMediaDrmErrored(status, __func__);
327 }
328 return status;
329}
330
331DrmStatus DrmMetricsLogger::getMetrics(const sp<IDrmMetricsConsumer>& consumer) {
332 DrmStatus status = mImpl->getMetrics(consumer);
333 if (status != OK) {
334 reportMediaDrmErrored(status, __func__);
335 }
336 return status;
337}
338
339DrmStatus DrmMetricsLogger::setCipherAlgorithm(Vector<uint8_t> const& sessionId,
340 String8 const& algorithm) {
341 DrmStatus status = mImpl->setCipherAlgorithm(sessionId, algorithm);
342 if (status != OK) {
343 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
344 }
345 return status;
346}
347
348DrmStatus DrmMetricsLogger::setMacAlgorithm(Vector<uint8_t> const& sessionId,
349 String8 const& algorithm) {
350 DrmStatus status = mImpl->setMacAlgorithm(sessionId, algorithm);
351 if (status != OK) {
352 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
353 }
354 return status;
355}
356
357DrmStatus DrmMetricsLogger::encrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
358 Vector<uint8_t> const& input, Vector<uint8_t> const& iv,
359 Vector<uint8_t>& output) {
360 DrmStatus status = mImpl->encrypt(sessionId, keyId, input, iv, output);
361 if (status != OK) {
362 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
363 }
364 return status;
365}
366
367DrmStatus DrmMetricsLogger::decrypt(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
368 Vector<uint8_t> const& input, Vector<uint8_t> const& iv,
369 Vector<uint8_t>& output) {
370 DrmStatus status = mImpl->decrypt(sessionId, keyId, input, iv, output);
371 if (status != OK) {
372 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
373 }
374 return status;
375}
376
377DrmStatus DrmMetricsLogger::sign(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
378 Vector<uint8_t> const& message, Vector<uint8_t>& signature) {
379 DrmStatus status = mImpl->sign(sessionId, keyId, message, signature);
380 if (status != OK) {
381 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
382 }
383 return status;
384}
385
386DrmStatus DrmMetricsLogger::verify(Vector<uint8_t> const& sessionId, Vector<uint8_t> const& keyId,
387 Vector<uint8_t> const& message, Vector<uint8_t> const& signature,
388 bool& match) {
389 DrmStatus status = mImpl->verify(sessionId, keyId, message, signature, match);
390 if (status != OK) {
391 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
392 }
393 return status;
394}
395
396DrmStatus DrmMetricsLogger::signRSA(Vector<uint8_t> const& sessionId, String8 const& algorithm,
397 Vector<uint8_t> const& message,
398 Vector<uint8_t> const& wrappedKey, Vector<uint8_t>& signature) {
399 DrmStatus status = mImpl->signRSA(sessionId, algorithm, message, wrappedKey, signature);
400 if (status != OK) {
401 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
402 }
403 return status;
404}
405
406DrmStatus DrmMetricsLogger::setListener(const sp<IDrmClient>& listener) {
407 DrmStatus status = mImpl->setListener(listener);
408 if (status != OK) {
409 reportMediaDrmErrored(status, __func__);
410 }
411 return status;
412}
413
414DrmStatus DrmMetricsLogger::requiresSecureDecoder(const char* mime, bool* required) const {
415 DrmStatus status = mImpl->requiresSecureDecoder(mime, required);
416 if (status != OK) {
417 reportMediaDrmErrored(status, __func__);
418 }
419 return status;
420}
421
422DrmStatus DrmMetricsLogger::requiresSecureDecoder(const char* mime,
423 DrmPlugin::SecurityLevel securityLevel,
424 bool* required) const {
425 DrmStatus status = mImpl->requiresSecureDecoder(mime, securityLevel, required);
426 if (status != OK) {
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530427 reportMediaDrmErrored(status, "requiresSecureDecoderLevel");
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530428 }
429 return status;
430}
431
432DrmStatus DrmMetricsLogger::setPlaybackId(Vector<uint8_t> const& sessionId,
433 const char* playbackId) {
434 DrmStatus status = mImpl->setPlaybackId(sessionId, playbackId);
435 if (status != OK) {
436 reportMediaDrmErrored(status, __func__, toStdVec(sessionId));
437 }
438 return status;
439}
440
441DrmStatus DrmMetricsLogger::getLogMessages(Vector<drm::V1_4::LogMessage>& logs) const {
442 DrmStatus status = mImpl->getLogMessages(logs);
443 if (status != OK) {
444 reportMediaDrmErrored(status, __func__);
445 }
446 return status;
447}
448
449DrmStatus DrmMetricsLogger::getSupportedSchemes(std::vector<uint8_t>& schemes) const {
450 DrmStatus status = mImpl->getSupportedSchemes(schemes);
451 if (status != OK) {
452 reportMediaDrmErrored(status, __func__);
453 }
454 return status;
455}
456
457void DrmMetricsLogger::reportMediaDrmCreated() const {
458 mediametrics_handle_t handle(mediametrics_create("mediadrm.created"));
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530459 mediametrics_setCString(handle, "scheme", mScheme.c_str());
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530460 mediametrics_setInt64(handle, "uuid_msb", be64toh(mUuid[0]));
461 mediametrics_setInt64(handle, "uuid_lsb", be64toh(mUuid[1]));
462 mediametrics_setInt32(handle, "frontend", mFrontend);
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530463 mediametrics_setCString(handle, "object_nonce", mObjNonce.c_str());
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530464 mediametrics_selfRecord(handle);
465 mediametrics_delete(handle);
466}
467
Sohail Nagarajdef1b732023-01-12 21:22:12 +0530468void DrmMetricsLogger::reportMediaDrmSessionOpened(const std::vector<uint8_t>& sessionId) const {
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530469 mediametrics_handle_t handle(mediametrics_create("mediadrm.session_opened"));
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530470 mediametrics_setCString(handle, "scheme", mScheme.c_str());
471 mediametrics_setInt64(handle, "uuid_msb", be64toh(mUuid[0]));
472 mediametrics_setInt64(handle, "uuid_lsb", be64toh(mUuid[1]));
473 mediametrics_setInt32(handle, "frontend", mFrontend);
474 mediametrics_setCString(handle, "object_nonce", mObjNonce.c_str());
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530475 const std::lock_guard<std::mutex> lock(mSessionMapMutex);
476 auto it = mSessionMap.find(sessionId);
477 if (it != mSessionMap.end()) {
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530478 mediametrics_setCString(handle, "session_nonce", it->second.mNonce.c_str());
479 mediametrics_setInt64(handle, "requested_seucrity_level", it->second.mTargetSecurityLevel);
480 mediametrics_setInt64(handle, "opened_seucrity_level", it->second.mActualSecurityLevel);
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530481 }
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530482 mediametrics_selfRecord(handle);
483 mediametrics_delete(handle);
484}
485
Sohail Nagarajdef1b732023-01-12 21:22:12 +0530486void DrmMetricsLogger::reportMediaDrmErrored(const DrmStatus& error_code, const char* api,
487 const std::vector<uint8_t>& sessionId) const {
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530488 mediametrics_handle_t handle(mediametrics_create("mediadrm.errored"));
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530489 mediametrics_setCString(handle, "scheme", mScheme.c_str());
490 mediametrics_setInt64(handle, "uuid_msb", be64toh(mUuid[0]));
491 mediametrics_setInt64(handle, "uuid_lsb", be64toh(mUuid[1]));
492 mediametrics_setInt32(handle, "frontend", mFrontend);
493 mediametrics_setCString(handle, "object_nonce", mObjNonce.c_str());
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530494 if (!sessionId.empty()) {
495 const std::lock_guard<std::mutex> lock(mSessionMapMutex);
496 auto it = mSessionMap.find(sessionId);
497 if (it != mSessionMap.end()) {
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530498 mediametrics_setCString(handle, "session_nonce", it->second.mNonce.c_str());
499 mediametrics_setInt64(handle, "seucrity_level", it->second.mActualSecurityLevel);
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530500 }
501 }
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530502 mediametrics_setCString(handle, "api", api);
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530503 mediametrics_setInt32(handle, "error_code", error_code);
Sohail Nagarajdef1b732023-01-12 21:22:12 +0530504 mediametrics_setInt32(handle, "cdm_err", error_code.getCdmErr());
505 mediametrics_setInt32(handle, "oem_err", error_code.getOemErr());
506 mediametrics_setInt32(handle, "error_context", error_code.getContext());
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530507 mediametrics_selfRecord(handle);
508 mediametrics_delete(handle);
509}
510
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530511DrmStatus DrmMetricsLogger::generateNonce(std::string* out, size_t size, const char* api) {
512 std::vector<uint8_t> buf(size);
513 ssize_t bytes = getrandom(buf.data(), size, GRND_NONBLOCK);
514 if (bytes < size) {
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530515 ALOGE("getrandom failed: %d", errno);
516 reportMediaDrmErrored(ERROR_DRM_RESOURCE_BUSY, api);
517 return ERROR_DRM_RESOURCE_BUSY;
518 }
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530519 android::AString tmp;
520 encodeBase64(buf.data(), size, &tmp);
521 out->assign(tmp.c_str());
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530522 return OK;
523}
524
Sohail Nagaraj2ae39ca2023-01-19 18:12:07 +0530525const std::map<std::array<int64_t, 2>, std::string> DrmMetricsLogger::kUuidSchemeMap {
526 {{(int64_t)0x6DD8B3C345F44A68, (int64_t)0xBF3A64168D01A4A6}, "ABV DRM (MoDRM)"},
527 {{(int64_t)0xF239E769EFA34850, (int64_t)0x9C16A903C6932EFB},
528 "Adobe Primetime DRM version 4"},
529 {{(int64_t)0x616C746963617374, (int64_t)0x2D50726F74656374}, "Alticast"},
530 {{(int64_t)0x94CE86FB07FF4F43, (int64_t)0xADB893D2FA968CA2}, "Apple FairPlay"},
531 {{(int64_t)0x279FE473512C48FE, (int64_t)0xADE8D176FEE6B40F}, "Arris Titanium"},
532 {{(int64_t)0x3D5E6D359B9A41E8, (int64_t)0xB843DD3C6E72C42C}, "ChinaDRM"},
533 {{(int64_t)0x3EA8778F77424BF9, (int64_t)0xB18BE834B2ACBD47}, "Clear Key AES-128"},
534 {{(int64_t)0xBE58615B19C44684, (int64_t)0x88B3C8C57E99E957}, "Clear Key SAMPLE-AES"},
535 {{(int64_t)0xE2719D58A985B3C9, (int64_t)0x781AB030AF78D30E}, "Clear Key DASH-IF"},
536 {{(int64_t)0x644FE7B5260F4FAD, (int64_t)0x949A0762FFB054B4}, "CMLA (OMA DRM)"},
537 {{(int64_t)0x37C332587B994C7E, (int64_t)0xB15D19AF74482154}, "Commscope Titanium V3"},
538 {{(int64_t)0x45D481CB8FE049C0, (int64_t)0xADA9AB2D2455B2F2}, "CoreCrypt"},
539 {{(int64_t)0xDCF4E3E362F15818, (int64_t)0x7BA60A6FE33FF3DD}, "DigiCAP SmartXess"},
540 {{(int64_t)0x35BF197B530E42D7, (int64_t)0x8B651B4BF415070F}, "DivX DRM Series 5"},
541 {{(int64_t)0x80A6BE7E14484C37, (int64_t)0x9E70D5AEBE04C8D2}, "Irdeto Content Protection"},
542 {{(int64_t)0x5E629AF538DA4063, (int64_t)0x897797FFBD9902D4},
543 "Marlin Adaptive Streaming Simple Profile V1.0"},
544 {{(int64_t)0x9A04F07998404286, (int64_t)0xAB92E65BE0885F95}, "Microsoft PlayReady"},
545 {{(int64_t)0x6A99532D869F5922, (int64_t)0x9A91113AB7B1E2F3}, "MobiTV DRM"},
546 {{(int64_t)0xADB41C242DBF4A6D, (int64_t)0x958B4457C0D27B95}, "Nagra MediaAccess PRM 3.0"},
547 {{(int64_t)0x1F83E1E86EE94F0D, (int64_t)0xBA2F5EC4E3ED1A66}, "SecureMedia"},
548 {{(int64_t)0x992C46E6C4374899, (int64_t)0xB6A050FA91AD0E39}, "SecureMedia SteelKnot"},
549 {{(int64_t)0xA68129D3575B4F1A, (int64_t)0x9CBA3223846CF7C3},
550 "Synamedia/Cisco/NDS VideoGuard DRM"},
551 {{(int64_t)0xAA11967FCC014A4A, (int64_t)0x8E99C5D3DDDFEA2D}, "Unitend DRM (UDRM)"},
552 {{(int64_t)0x9A27DD82FDE24725, (int64_t)0x8CBC4234AA06EC09}, "Verimatrix VCAS"},
553 {{(int64_t)0xB4413586C58CFFB0, (int64_t)0x94A5D4896C1AF6C3}, "Viaccess-Orca DRM (VODRM)"},
554 {{(int64_t)0x793B79569F944946, (int64_t)0xA94223E7EF7E44B4}, "VisionCrypt"},
555 {{(int64_t)0x1077EFECC0B24D02, (int64_t)0xACE33C1E52E2FB4B}, "W3C Common PSSH box"},
556 {{(int64_t)0xEDEF8BA979D64ACE, (int64_t)0xA3C827DCD51D21ED}, "Widevine Content Protection"},
557};
558
Sohail Nagaraj17d54db2022-12-29 10:00:59 +0530559} // namespace android