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