12f0d0f1aSopenharmony_ci/* 22f0d0f1aSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 32f0d0f1aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 42f0d0f1aSopenharmony_ci * you may not use this file except in compliance with the License. 52f0d0f1aSopenharmony_ci * You may obtain a copy of the License at 62f0d0f1aSopenharmony_ci * 72f0d0f1aSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 82f0d0f1aSopenharmony_ci * 92f0d0f1aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 102f0d0f1aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 112f0d0f1aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 122f0d0f1aSopenharmony_ci * See the License for the specific language governing permissions and 132f0d0f1aSopenharmony_ci * limitations under the License. 142f0d0f1aSopenharmony_ci */ 152f0d0f1aSopenharmony_ci 162f0d0f1aSopenharmony_ci#include "drm_dfx.h" 172f0d0f1aSopenharmony_ci#include "drm_dfx_utils.h" 182f0d0f1aSopenharmony_ci#include <unistd.h> 192f0d0f1aSopenharmony_ci#include "drm_log.h" 202f0d0f1aSopenharmony_ci#include "dump_usage.h" 212f0d0f1aSopenharmony_ci#include "nlohmann/json.hpp" 222f0d0f1aSopenharmony_ci#include "native_drm_err.h" 232f0d0f1aSopenharmony_ci#include "securec.h" 242f0d0f1aSopenharmony_ci#include "ipc_skeleton.h" 252f0d0f1aSopenharmony_ci#include "hitrace/tracechain.h" 262f0d0f1aSopenharmony_ci#include <cstdint> 272f0d0f1aSopenharmony_ci 282f0d0f1aSopenharmony_cinamespace OHOS { 292f0d0f1aSopenharmony_cinamespace DrmStandard { 302f0d0f1aSopenharmony_ciusing namespace OHOS::HiviewDFX; 312f0d0f1aSopenharmony_ciusing json = nlohmann::json; 322f0d0f1aSopenharmony_ciconstexpr uint32_t MIN_DECRYPTION_TIMES = 1000; 332f0d0f1aSopenharmony_ci 342f0d0f1aSopenharmony_ciDrmEvent& DrmEvent::GetInstance() 352f0d0f1aSopenharmony_ci{ 362f0d0f1aSopenharmony_ci static DrmEvent instance; 372f0d0f1aSopenharmony_ci return instance; 382f0d0f1aSopenharmony_ci} 392f0d0f1aSopenharmony_ci 402f0d0f1aSopenharmony_ciint32_t DrmEvent::WriteServiceEvent(std::string eventName, OHOS::HiviewDFX::HiSysEvent::EventType type, 412f0d0f1aSopenharmony_ci DrmServiveInfo &info) 422f0d0f1aSopenharmony_ci{ 432f0d0f1aSopenharmony_ci int32_t res = DRM_ERR_OK; 442f0d0f1aSopenharmony_ci res = HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MEDIA, eventName, type, 452f0d0f1aSopenharmony_ci "MODULE", info.module, 462f0d0f1aSopenharmony_ci "SERVICE_NAME", info.serviceName, 472f0d0f1aSopenharmony_ci "ACTION", info.action, 482f0d0f1aSopenharmony_ci "MEMORY", info.memoryUsage); 492f0d0f1aSopenharmony_ci if (res != DRM_ERR_OK) { 502f0d0f1aSopenharmony_ci DRM_ERR_LOG("EventWrite failed, res = %d", res); 512f0d0f1aSopenharmony_ci return res; 522f0d0f1aSopenharmony_ci } else { 532f0d0f1aSopenharmony_ci DRM_INFO_LOG("EventWrite success"); 542f0d0f1aSopenharmony_ci } 552f0d0f1aSopenharmony_ci return DRM_ERR_OK; 562f0d0f1aSopenharmony_ci} 572f0d0f1aSopenharmony_ci 582f0d0f1aSopenharmony_ciint32_t DrmEvent::WriteLicenseEvent(std::string eventName, OHOS::HiviewDFX::HiSysEvent::EventType type, 592f0d0f1aSopenharmony_ci DrmLicenseInfo &info) 602f0d0f1aSopenharmony_ci{ 612f0d0f1aSopenharmony_ci int32_t res = DRM_ERR_OK; 622f0d0f1aSopenharmony_ci res = HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MEDIA, eventName, type, 632f0d0f1aSopenharmony_ci "MODULE", info.module, 642f0d0f1aSopenharmony_ci "APP_NAME", info.appName, 652f0d0f1aSopenharmony_ci "INSTANCE_ID", info.instanceId, 662f0d0f1aSopenharmony_ci "DRM_NAME", info.drmName, 672f0d0f1aSopenharmony_ci "DRM_UUID", info.drmUuid, 682f0d0f1aSopenharmony_ci "CLIENT_VERSION", info.clientVersion, 692f0d0f1aSopenharmony_ci "LICENSE_TYPE", info.licenseType, 702f0d0f1aSopenharmony_ci "GENERATION_DURATION", info.generationDuration, 712f0d0f1aSopenharmony_ci "GENERATION_RESULT", info.generationResult, 722f0d0f1aSopenharmony_ci "PROCESS_DURATION", info.processDuration, 732f0d0f1aSopenharmony_ci "PROCESS_RESULT", info.processResult); 742f0d0f1aSopenharmony_ci if (res != DRM_ERR_OK) { 752f0d0f1aSopenharmony_ci DRM_ERR_LOG("EventWrite failed, res = %d", res); 762f0d0f1aSopenharmony_ci return res; 772f0d0f1aSopenharmony_ci } else { 782f0d0f1aSopenharmony_ci DRM_INFO_LOG("EventWrite success"); 792f0d0f1aSopenharmony_ci } 802f0d0f1aSopenharmony_ci return DRM_ERR_OK; 812f0d0f1aSopenharmony_ci} 822f0d0f1aSopenharmony_ci 832f0d0f1aSopenharmony_ciint32_t DrmEvent::WriteCertificateEvent(std::string eventName, OHOS::HiviewDFX::HiSysEvent::EventType type, 842f0d0f1aSopenharmony_ci DrmCertificateInfo &info) 852f0d0f1aSopenharmony_ci{ 862f0d0f1aSopenharmony_ci int32_t res = DRM_ERR_OK; 872f0d0f1aSopenharmony_ci res = HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MEDIA, eventName, type, 882f0d0f1aSopenharmony_ci "MODULE", info.module, 892f0d0f1aSopenharmony_ci "APP_NAME", info.appName, 902f0d0f1aSopenharmony_ci "INSTANCE_ID", info.instanceId, 912f0d0f1aSopenharmony_ci "DRM_NAME", info.drmName, 922f0d0f1aSopenharmony_ci "DRM_UUID", info.drmUuid, 932f0d0f1aSopenharmony_ci "CLIENT_VERSION", info.clientVersion, 942f0d0f1aSopenharmony_ci "GENERATION_DURATION", info.generationDuration, 952f0d0f1aSopenharmony_ci "GENERATION_RESULT", info.generationResult, 962f0d0f1aSopenharmony_ci "PROCESS_DURATION", info.processDuration, 972f0d0f1aSopenharmony_ci "PROCESS_RESULT", info.processResult, 982f0d0f1aSopenharmony_ci "CALL_SERVER_TIME", info.callServerTime, 992f0d0f1aSopenharmony_ci "SERVER_COST_DURATION", info.serverCostDuration, 1002f0d0f1aSopenharmony_ci "SERVER_RESULT", info.serverResult); 1012f0d0f1aSopenharmony_ci if (res != DRM_ERR_OK) { 1022f0d0f1aSopenharmony_ci DRM_ERR_LOG("EventWrite failed, res = %d", res); 1032f0d0f1aSopenharmony_ci return res; 1042f0d0f1aSopenharmony_ci } else { 1052f0d0f1aSopenharmony_ci DRM_INFO_LOG("EventWrite success"); 1062f0d0f1aSopenharmony_ci } 1072f0d0f1aSopenharmony_ci return DRM_ERR_OK; 1082f0d0f1aSopenharmony_ci} 1092f0d0f1aSopenharmony_ci 1102f0d0f1aSopenharmony_ciint32_t DrmEvent::WriteFaultEvent(std::string eventName, OHOS::HiviewDFX::HiSysEvent::EventType type, 1112f0d0f1aSopenharmony_ci DrmFaultInfo &info) 1122f0d0f1aSopenharmony_ci{ 1132f0d0f1aSopenharmony_ci int32_t res = DRM_ERR_OK; 1142f0d0f1aSopenharmony_ci res = HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MEDIA, eventName, type, 1152f0d0f1aSopenharmony_ci "MODULE", info.module, 1162f0d0f1aSopenharmony_ci "APP_NAME", info.appName, 1172f0d0f1aSopenharmony_ci "INSTANCE_ID", info.instanceId, 1182f0d0f1aSopenharmony_ci "ERROR_CODE", info.errorCode, 1192f0d0f1aSopenharmony_ci "ERROR_MESG", info.errorMesg, 1202f0d0f1aSopenharmony_ci "EXTRA_MESG", info.extraMesg); 1212f0d0f1aSopenharmony_ci if (res != DRM_ERR_OK) { 1222f0d0f1aSopenharmony_ci DRM_ERR_LOG("EventWrite failed, res = %d", res); 1232f0d0f1aSopenharmony_ci return res; 1242f0d0f1aSopenharmony_ci } else { 1252f0d0f1aSopenharmony_ci DRM_INFO_LOG("EventWrite success"); 1262f0d0f1aSopenharmony_ci } 1272f0d0f1aSopenharmony_ci return DRM_ERR_OK; 1282f0d0f1aSopenharmony_ci} 1292f0d0f1aSopenharmony_ci 1302f0d0f1aSopenharmony_ciint32_t DrmEvent::WriteDecryptionEvent(std::string eventName, OHOS::HiviewDFX::HiSysEvent::EventType type, 1312f0d0f1aSopenharmony_ci DrmDecryptionInfo &info) 1322f0d0f1aSopenharmony_ci{ 1332f0d0f1aSopenharmony_ci int32_t res = DRM_ERR_OK; 1342f0d0f1aSopenharmony_ci 1352f0d0f1aSopenharmony_ci res = HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MEDIA, eventName, type, 1362f0d0f1aSopenharmony_ci "MODULE", info.module, 1372f0d0f1aSopenharmony_ci "APP_NAME", info.appName, 1382f0d0f1aSopenharmony_ci "INSTANCE_ID", info.instanceId, 1392f0d0f1aSopenharmony_ci "ERROR_CODE", info.errorCode, 1402f0d0f1aSopenharmony_ci "ERROR_MESG", info.errorMesg, 1412f0d0f1aSopenharmony_ci "DECRYPT_ALGO", info.decryptAlgo, 1422f0d0f1aSopenharmony_ci "DECRYPT_KEYID", info.decryptKeyid, 1432f0d0f1aSopenharmony_ci "DECRYPT_IV", info.decryptIv); 1442f0d0f1aSopenharmony_ci if (res != DRM_ERR_OK) { 1452f0d0f1aSopenharmony_ci DRM_ERR_LOG("EventWrite failed, res = %d", res); 1462f0d0f1aSopenharmony_ci return res; 1472f0d0f1aSopenharmony_ci } else { 1482f0d0f1aSopenharmony_ci DRM_INFO_LOG("EventWrite success"); 1492f0d0f1aSopenharmony_ci } 1502f0d0f1aSopenharmony_ci return DRM_ERR_OK; 1512f0d0f1aSopenharmony_ci} 1522f0d0f1aSopenharmony_ci 1532f0d0f1aSopenharmony_ciint32_t ReportServiceBehaviorEvent(std::string serviceName, std::string action) 1542f0d0f1aSopenharmony_ci{ 1552f0d0f1aSopenharmony_ci DrmEvent event; 1562f0d0f1aSopenharmony_ci OHOS::HiviewDFX::DumpUsage dumpUse; 1572f0d0f1aSopenharmony_ci uint32_t memoryUsage = dumpUse.GetPss(getpid()); 1582f0d0f1aSopenharmony_ci struct DrmServiveInfo drmServiveInfo = { 1592f0d0f1aSopenharmony_ci "DRM_SERVICE", 1602f0d0f1aSopenharmony_ci 0, 1612f0d0f1aSopenharmony_ci serviceName, 1622f0d0f1aSopenharmony_ci action, 1632f0d0f1aSopenharmony_ci memoryUsage, 1642f0d0f1aSopenharmony_ci }; 1652f0d0f1aSopenharmony_ci return event.WriteServiceEvent("DRM_SERVICE_INFO", OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR, 1662f0d0f1aSopenharmony_ci drmServiveInfo); 1672f0d0f1aSopenharmony_ci} 1682f0d0f1aSopenharmony_ci 1692f0d0f1aSopenharmony_ciint32_t ReportLicenseBehaviorEvent(StatisticsInfo statisticsInfo, std::string licenseType, DownLoadInfo downLoadInfo) 1702f0d0f1aSopenharmony_ci{ 1712f0d0f1aSopenharmony_ci DrmEvent event; 1722f0d0f1aSopenharmony_ci struct DrmLicenseInfo drmLicenseInfo = { 1732f0d0f1aSopenharmony_ci "DRM_SERVICE", 1742f0d0f1aSopenharmony_ci 0, 1752f0d0f1aSopenharmony_ci GetClientBundleName(IPCSkeleton::GetCallingUid()), 1762f0d0f1aSopenharmony_ci std::to_string(HiTraceChain::GetId().GetChainId()), 1772f0d0f1aSopenharmony_ci statisticsInfo.pluginName, 1782f0d0f1aSopenharmony_ci statisticsInfo.pluginUuid, 1792f0d0f1aSopenharmony_ci statisticsInfo.versionName, 1802f0d0f1aSopenharmony_ci licenseType, 1812f0d0f1aSopenharmony_ci downLoadInfo.generationDuration, 1822f0d0f1aSopenharmony_ci downLoadInfo.generationResult, 1832f0d0f1aSopenharmony_ci downLoadInfo.processDuration, 1842f0d0f1aSopenharmony_ci downLoadInfo.processResult, 1852f0d0f1aSopenharmony_ci }; 1862f0d0f1aSopenharmony_ci return event.WriteLicenseEvent("DRM_LICENSE_DOWNLOAD_INFO", OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR, 1872f0d0f1aSopenharmony_ci drmLicenseInfo); 1882f0d0f1aSopenharmony_ci} 1892f0d0f1aSopenharmony_ci 1902f0d0f1aSopenharmony_ciint32_t ReportCertificateBehaviorEvent(StatisticsInfo statisticsInfo, DownLoadInfo downLoadInfo, 1912f0d0f1aSopenharmony_ci uint32_t callServerTime, uint32_t serverCostDuration, std::string serverResult) 1922f0d0f1aSopenharmony_ci{ 1932f0d0f1aSopenharmony_ci DrmEvent event; 1942f0d0f1aSopenharmony_ci struct DrmCertificateInfo drmCertificateInfo = { 1952f0d0f1aSopenharmony_ci "DRM_SERVICE", 1962f0d0f1aSopenharmony_ci 0, 1972f0d0f1aSopenharmony_ci GetClientBundleName(IPCSkeleton::GetCallingUid()), 1982f0d0f1aSopenharmony_ci std::to_string(HiTraceChain::GetId().GetChainId()), 1992f0d0f1aSopenharmony_ci statisticsInfo.pluginName, 2002f0d0f1aSopenharmony_ci statisticsInfo.pluginUuid, 2012f0d0f1aSopenharmony_ci statisticsInfo.versionName, 2022f0d0f1aSopenharmony_ci downLoadInfo.generationDuration, 2032f0d0f1aSopenharmony_ci downLoadInfo.generationResult, 2042f0d0f1aSopenharmony_ci downLoadInfo.processDuration, 2052f0d0f1aSopenharmony_ci downLoadInfo.processResult, 2062f0d0f1aSopenharmony_ci callServerTime, 2072f0d0f1aSopenharmony_ci serverCostDuration, 2082f0d0f1aSopenharmony_ci serverResult, 2092f0d0f1aSopenharmony_ci }; 2102f0d0f1aSopenharmony_ci return event.WriteCertificateEvent("DRM_CERTIFICATE_DOWNLOAD_INFO", 2112f0d0f1aSopenharmony_ci OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR, drmCertificateInfo); 2122f0d0f1aSopenharmony_ci} 2132f0d0f1aSopenharmony_ci 2142f0d0f1aSopenharmony_ciint32_t ReportFaultEvent(uint32_t errorCode, std::string errorMesg, std::string extraMesg) 2152f0d0f1aSopenharmony_ci{ 2162f0d0f1aSopenharmony_ci DrmEvent event; 2172f0d0f1aSopenharmony_ci struct DrmFaultInfo drmFaultInfo = { 2182f0d0f1aSopenharmony_ci "DRM_SERVICE", 2192f0d0f1aSopenharmony_ci GetClientBundleName(IPCSkeleton::GetCallingUid()), 2202f0d0f1aSopenharmony_ci std::to_string(HiTraceChain::GetId().GetChainId()), 2212f0d0f1aSopenharmony_ci errorCode, 2222f0d0f1aSopenharmony_ci errorMesg, 2232f0d0f1aSopenharmony_ci extraMesg, 2242f0d0f1aSopenharmony_ci }; 2252f0d0f1aSopenharmony_ci return event.WriteFaultEvent("DRM_COMMON_FAILURE", OHOS::HiviewDFX::HiSysEvent::EventType::FAULT, drmFaultInfo); 2262f0d0f1aSopenharmony_ci} 2272f0d0f1aSopenharmony_ci 2282f0d0f1aSopenharmony_ciint32_t ReportDecryptionFaultEvent(int32_t errorCode, std::string errorMesg, std::string decryptAlgo, 2292f0d0f1aSopenharmony_ci std::string decryptKeyid, std::string decryptIv) 2302f0d0f1aSopenharmony_ci{ 2312f0d0f1aSopenharmony_ci DrmEvent event; 2322f0d0f1aSopenharmony_ci struct DrmDecryptionInfo drmDecryptionInfo = { 2332f0d0f1aSopenharmony_ci "DRM_SERVICE", 2342f0d0f1aSopenharmony_ci GetClientBundleName(IPCSkeleton::GetCallingUid()), 2352f0d0f1aSopenharmony_ci std::to_string(HiTraceChain::GetId().GetChainId()), 2362f0d0f1aSopenharmony_ci errorCode, 2372f0d0f1aSopenharmony_ci errorMesg, 2382f0d0f1aSopenharmony_ci decryptAlgo, 2392f0d0f1aSopenharmony_ci decryptKeyid, 2402f0d0f1aSopenharmony_ci decryptIv, 2412f0d0f1aSopenharmony_ci }; 2422f0d0f1aSopenharmony_ci return event.WriteDecryptionEvent("DRM_DECRYPTION_FAILURE", OHOS::HiviewDFX::HiSysEvent::EventType::FAULT, 2432f0d0f1aSopenharmony_ci drmDecryptionInfo); 2442f0d0f1aSopenharmony_ci} 2452f0d0f1aSopenharmony_ci 2462f0d0f1aSopenharmony_ciDownLoadInfo InitDownLoadInfo(uint32_t generationDuration, std::string generationResult, uint32_t processDuration, 2472f0d0f1aSopenharmony_ci std::string processResult) 2482f0d0f1aSopenharmony_ci{ 2492f0d0f1aSopenharmony_ci struct DownLoadInfo downLoadInfo = { 2502f0d0f1aSopenharmony_ci generationDuration, 2512f0d0f1aSopenharmony_ci generationResult, 2522f0d0f1aSopenharmony_ci processDuration, 2532f0d0f1aSopenharmony_ci processResult, 2542f0d0f1aSopenharmony_ci }; 2552f0d0f1aSopenharmony_ci return downLoadInfo; 2562f0d0f1aSopenharmony_ci} 2572f0d0f1aSopenharmony_ci 2582f0d0f1aSopenharmony_civoid ReportDecryptionStatisticsEvent(uint64_t instanceId, std::string appName, 2592f0d0f1aSopenharmony_ci DecryptionStatistics &statistics) 2602f0d0f1aSopenharmony_ci{ 2612f0d0f1aSopenharmony_ci DRM_INFO_LOG("ReportDecryptionStatisticsEvent."); 2622f0d0f1aSopenharmony_ci 2632f0d0f1aSopenharmony_ci int32_t res = DRM_ERR_OK; 2642f0d0f1aSopenharmony_ci if (statistics.decryptTimes < MIN_DECRYPTION_TIMES) { 2652f0d0f1aSopenharmony_ci return; 2662f0d0f1aSopenharmony_ci } 2672f0d0f1aSopenharmony_ci uint32_t avgSize = statistics.decryptSumSize / statistics.decryptTimes; 2682f0d0f1aSopenharmony_ci uint32_t avgDuration = statistics.decryptSumDuration / statistics.decryptTimes; 2692f0d0f1aSopenharmony_ci 2702f0d0f1aSopenharmony_ci res = HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MEDIA, 2712f0d0f1aSopenharmony_ci "DRM_STATISTICS", 2722f0d0f1aSopenharmony_ci HiviewDFX::HiSysEvent::EventType::STATISTIC, 2732f0d0f1aSopenharmony_ci "APP_NAME", appName, 2742f0d0f1aSopenharmony_ci "INSTANCE_ID", instanceId, 2752f0d0f1aSopenharmony_ci "ERROR_CODE", statistics.errCode, 2762f0d0f1aSopenharmony_ci "ERROR_MESG", statistics.errMessage, 2772f0d0f1aSopenharmony_ci "DECRYPT_TIMES", statistics.decryptTimes, 2782f0d0f1aSopenharmony_ci "DECRYPT_AVG_SIZE", avgSize, 2792f0d0f1aSopenharmony_ci "DECRYPT_AVG_DURATION", avgDuration, 2802f0d0f1aSopenharmony_ci "DECRYPT_MAX_SIZE", statistics.decryptMaxSize, 2812f0d0f1aSopenharmony_ci "DECRYPT_MAX_DURATION", statistics.decryptMaxDuration); 2822f0d0f1aSopenharmony_ci if (res != DRM_ERR_OK) { 2832f0d0f1aSopenharmony_ci DRM_ERR_LOG("DRM_STATISTICS Event Write failed, res = %d", res); 2842f0d0f1aSopenharmony_ci } else { 2852f0d0f1aSopenharmony_ci DRM_INFO_LOG("DRM_STATISTICS Event Write success"); 2862f0d0f1aSopenharmony_ci } 2872f0d0f1aSopenharmony_ci DRM_INFO_LOG("ReportDecryptionStatisticsEvent done!"); 2882f0d0f1aSopenharmony_ci} 2892f0d0f1aSopenharmony_ci} // namespace DrmStandard 2902f0d0f1aSopenharmony_ci} // namespace OHOS