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