1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "model_cfg_marshalling.h"
17
18 #include "json_cfg.h"
19 #include "model_analysis_define.h"
20 #include "security_guard_utils.h"
21
22 namespace OHOS::Security::SecurityGuard {
23 using nlohmann::json;
24
from_json(const nlohmann::json & jsonObj,AppDetectionCfg & config)25 void from_json(const nlohmann::json &jsonObj, AppDetectionCfg &config)
26 {
27 if (jsonObj.find("detectionCategory") == jsonObj.end()) {
28 return;
29 }
30
31 if (!jsonObj.at("detectionCategory").is_string()) {
32 return;
33 }
34
35 config.detectionCategory = jsonObj.at("detectionCategory").get<std::string>();
36 }
37
from_json(const nlohmann::json & jsonObj,Field & field)38 void from_json(const nlohmann::json &jsonObj, Field &field)
39 {
40 if (jsonObj.find("fieldName") == jsonObj.end() || jsonObj.find("fieldType") == jsonObj.end() ||
41 jsonObj.find("value") == jsonObj.end()) {
42 return;
43 }
44
45 if (!jsonObj.at("fieldName").is_string() || !jsonObj.at("fieldType").is_string() ||
46 !jsonObj.at("value").is_string()) {
47 return;
48 }
49
50 field.fieldName = jsonObj.at("fieldName").get<std::string>();
51 field.fieldType = jsonObj.at("fieldType").get<std::string>();
52 field.value = jsonObj.at("value").get<std::string>();
53 }
54
from_json(const nlohmann::json & jsonObj,Rule & rule)55 void from_json(const nlohmann::json &jsonObj, Rule &rule)
56 {
57 if (jsonObj.find("eventId") == jsonObj.end() || jsonObj.find("fields") == jsonObj.end() ||
58 jsonObj.find("fieldsRelation") == jsonObj.end()) {
59 return;
60 }
61
62 if (!jsonObj.at("eventId").is_number() || !jsonObj.at("fields").is_array() ||
63 !jsonObj.at("fieldsRelation").is_string()) {
64 return;
65 }
66
67 rule.eventId = jsonObj.at("eventId").get<int64_t>();
68 rule.fields = jsonObj.at("fields").get<std::vector<Field>>();
69 rule.fieldsRelation = jsonObj.at("fieldsRelation").get<std::string>();
70 }
71
from_json(const nlohmann::json & jsonObj,BuildInDetectionCfg & config)72 void from_json(const nlohmann::json &jsonObj, BuildInDetectionCfg &config)
73 {
74 if (jsonObj.find("rules") == jsonObj.end() || jsonObj.find("rulesRelation") == jsonObj.end() ||
75 jsonObj.find("trueResult") == jsonObj.end() || jsonObj.find("falseResult") == jsonObj.end()) {
76 return;
77 }
78
79 if (!jsonObj.at("rules").is_array() || !jsonObj.at("rulesRelation").is_string() ||
80 !jsonObj.at("trueResult").is_string() || !jsonObj.at("falseResult").is_string()) {
81 return;
82 }
83
84 config.rules = jsonObj.at("rules").get<std::vector<Rule>>();
85 config.rulesRelation = jsonObj.at("rulesRelation").get<std::string>();
86 config.trueResult = jsonObj.at("trueResult").get<std::string>();
87 config.falseResult = jsonObj.at("falseResult").get<std::string>();
88 }
89
to_json(json & jsonObj,const ModelCfg & modelCfg)90 void to_json(json &jsonObj, const ModelCfg &modelCfg)
91 {
92 std::vector<std::string> preLoads;
93 std::transform(modelCfg.preload.begin(), modelCfg.preload.end(),
94 std::back_inserter(preLoads), [] (int64_t eventId) {
95 return std::to_string(eventId);
96 });
97
98 std::vector<std::string> eventList;
99 std::transform(modelCfg.eventList.begin(), modelCfg.eventList.end(),
100 std::back_inserter(eventList), [] (int64_t eventId) {
101 return std::to_string(eventId);
102 });
103
104 jsonObj = json {
105 { MODEL_CFG_MODEL_ID_KEY, std::to_string(modelCfg.modelId) },
106 { MODEL_CFG_PATH_KEY, modelCfg.path },
107 { MODEL_CFG_FORMAT_KEY, modelCfg.format },
108 { MODEL_CFG_START_MODE_KEY, modelCfg.startMode },
109 { MODEL_CFG_PRELOAD_KEY, preLoads },
110 { MODEL_CFG_EVENT_LIST_KEY, eventList },
111 { MODEL_CFG_PERMISSIONS_KEY, modelCfg.permissions },
112 { MODEL_CFG_DB_TABLE_KEY, modelCfg.dbTable },
113 { MODEL_CFG_RUNNING_CNTL_KEY, modelCfg.runningCntl },
114 { MODEL_CFG_CALLER_KEY, modelCfg.caller }
115 };
116 }
117
from_json(const json & jsonObj,ModelCfg & modelCfg)118 void from_json(const json &jsonObj, ModelCfg &modelCfg)
119 {
120 std::string modelId;
121 JsonCfg::Unmarshal(modelId, jsonObj, MODEL_CFG_MODEL_ID_KEY);
122 uint32_t value = 0;
123 if (!SecurityGuardUtils::StrToU32(modelId, value)) {
124 return;
125 }
126 modelCfg.modelId = value;
127 JsonCfg::Unmarshal(modelCfg.path, jsonObj, MODEL_CFG_PATH_KEY);
128 JsonCfg::Unmarshal(modelCfg.format, jsonObj, MODEL_CFG_FORMAT_KEY);
129 JsonCfg::Unmarshal(modelCfg.startMode, jsonObj, MODEL_CFG_START_MODE_KEY);
130
131 std::vector<std::string> preLoads;
132 JsonCfg::Unmarshal(preLoads, jsonObj, MODEL_CFG_PRELOAD_KEY);
133 for (const std::string& eventId : preLoads) {
134 int64_t tmp = 0;
135 if (eventId == "" || !SecurityGuardUtils::StrToI64(eventId, tmp)) {
136 continue;
137 }
138 modelCfg.preload.emplace_back(tmp);
139 }
140
141 std::vector<std::string> eventList;
142 JsonCfg::Unmarshal(eventList, jsonObj, MODEL_CFG_EVENT_LIST_KEY);
143 for (const std::string& eventId : eventList) {
144 int64_t tmp = 0;
145 if (eventId == "" || !SecurityGuardUtils::StrToI64(eventId, tmp)) {
146 continue;
147 }
148 modelCfg.eventList.emplace_back(tmp);
149 }
150 JsonCfg::Unmarshal(modelCfg.permissions, jsonObj, MODEL_CFG_PERMISSIONS_KEY);
151 JsonCfg::Unmarshal(modelCfg.dbTable, jsonObj, MODEL_CFG_DB_TABLE_KEY);
152 JsonCfg::Unmarshal(modelCfg.runningCntl, jsonObj, MODEL_CFG_RUNNING_CNTL_KEY);
153 JsonCfg::Unmarshal(modelCfg.caller, jsonObj, MODEL_CFG_CALLER_KEY);
154 JsonCfg::Unmarshal(modelCfg.type, jsonObj, MODEL_CFG_TYPE_KEY);
155 JsonCfg::Unmarshal(modelCfg.config, jsonObj, MODEL_CFG_BUILD_IN_CFG_KEY);
156 JsonCfg::Unmarshal(modelCfg.appDetectionConfig, jsonObj, MODEL_CFG_APP_DETECTION_CFG_KEY);
157 }
158
to_json(json & jsonObj,const EventCfg & eventCfg)159 void to_json(json &jsonObj, const EventCfg &eventCfg)
160 {
161 jsonObj = json {
162 { EVENT_CFG_EVENT_ID_KEY, std::to_string(eventCfg.eventId) },
163 { EVENT_CFG_EVENT_NAME_KEY, eventCfg.eventName },
164 { EVENT_CFG_VERSION_KEY, eventCfg.version },
165 { EVENT_CFG_EVENT_TYPE_KEY, eventCfg.eventType },
166 { EVENT_CFG_DATA_SENSITIVITY_LEVEL_KEY, eventCfg.dataSensitivityLevel },
167 { EVENT_CFG_DISCARD_EVENT_WHITELIST_KEY, eventCfg.discardEventWhiteList },
168 { EVENT_CFG_STORAGE_RAM_NUM_KEY, eventCfg.storageRamNums },
169 { EVENT_CFG_STORAGE_ROM_NUM_KEY, eventCfg.storageRomNums },
170 { EVENT_CFG_STORAGE_TIME_KEY, eventCfg.storageTime },
171 { EVENT_CFG_OWNER_KEY, eventCfg.owner },
172 { EVENT_CFG_SOURCE_KEY, eventCfg.source },
173 { EVENT_CFG_DB_TABLE_KEY, eventCfg.dbTable },
174 { EVENT_CFG_PROG_KEY, eventCfg.prog},
175 { EVENT_CFG_BATCH_UPLOAD_KEY, eventCfg.isBatchUpload }
176 };
177 }
178
from_json(const json & jsonObj,EventCfg & eventCfg)179 void from_json(const json &jsonObj, EventCfg &eventCfg)
180 {
181 std::string eventId;
182 JsonCfg::Unmarshal(eventId, jsonObj, EVENT_CFG_EVENT_ID_KEY);
183 int64_t value = 0;
184 if (!SecurityGuardUtils::StrToI64Hex(eventId, value)) {
185 return;
186 }
187 eventCfg.eventId = value;
188 value = 0;
189 eventId = {};
190 JsonCfg::Unmarshal(eventId, jsonObj, EVENT_CFG_OLD_EVENT_ID_KEY);
191 if (!SecurityGuardUtils::StrToI64Hex(eventId, value)) {
192 value = 0;
193 }
194 eventCfg.oldEventId = value;
195 JsonCfg::Unmarshal(eventCfg.eventName, jsonObj, EVENT_CFG_EVENT_NAME_KEY);
196 JsonCfg::Unmarshal(eventCfg.version, jsonObj, EVENT_CFG_VERSION_KEY);
197 JsonCfg::Unmarshal(eventCfg.eventType, jsonObj, EVENT_CFG_EVENT_TYPE_KEY);
198 JsonCfg::Unmarshal(eventCfg.collectOnStart, jsonObj, EVENT_CFG_COLLECT_ON_START_KEY);
199 JsonCfg::Unmarshal(eventCfg.dataSensitivityLevel, jsonObj, EVENT_CFG_DATA_SENSITIVITY_LEVEL_KEY);
200 JsonCfg::Unmarshal(eventCfg.discardEventWhiteList, jsonObj, EVENT_CFG_DISCARD_EVENT_WHITELIST_KEY);
201 JsonCfg::Unmarshal(eventCfg.storageRamNums, jsonObj, EVENT_CFG_STORAGE_RAM_NUM_KEY);
202 JsonCfg::Unmarshal(eventCfg.storageRomNums, jsonObj, EVENT_CFG_STORAGE_ROM_NUM_KEY);
203 JsonCfg::Unmarshal(eventCfg.storageTime, jsonObj, EVENT_CFG_STORAGE_TIME_KEY);
204 JsonCfg::Unmarshal(eventCfg.owner, jsonObj, EVENT_CFG_OWNER_KEY);
205 JsonCfg::Unmarshal(eventCfg.source, jsonObj, EVENT_CFG_SOURCE_KEY);
206 JsonCfg::Unmarshal(eventCfg.dbTable, jsonObj, EVENT_CFG_DB_TABLE_KEY);
207 JsonCfg::Unmarshal(eventCfg.prog, jsonObj, EVENT_CFG_PROG_KEY);
208 JsonCfg::Unmarshal(eventCfg.isBatchUpload, jsonObj, EVENT_CFG_BATCH_UPLOAD_KEY);
209 }
210
to_json(json & jsonObj,const DataMgrCfgSt & dataMgrCfg)211 void to_json(json &jsonObj, const DataMgrCfgSt &dataMgrCfg)
212 {
213 jsonObj = json {
214 { DATA_MGR_DEVICE_RAM_KEY, dataMgrCfg.deviceRam },
215 { DATA_MGR_DEVICE_ROM_KEY, dataMgrCfg.deviceRom },
216 { DATA_MGR_EVENT_MAX_RAM_NUM_KEY, dataMgrCfg.eventMaxRamNum },
217 { DATA_MGR_EVENT_MAX_ROM_NUM_KEY, dataMgrCfg.eventMaxRomNum }
218 };
219 }
220
from_json(const json & jsonObj,DataMgrCfgSt & dataMgrCfg)221 void from_json(const json &jsonObj, DataMgrCfgSt &dataMgrCfg)
222 {
223 JsonCfg::Unmarshal(dataMgrCfg.deviceRam, jsonObj, DATA_MGR_DEVICE_RAM_KEY);
224 JsonCfg::Unmarshal(dataMgrCfg.deviceRom, jsonObj, DATA_MGR_DEVICE_ROM_KEY);
225 JsonCfg::Unmarshal(dataMgrCfg.eventMaxRamNum, jsonObj, DATA_MGR_EVENT_MAX_RAM_NUM_KEY);
226 JsonCfg::Unmarshal(dataMgrCfg.eventMaxRomNum, jsonObj, DATA_MGR_EVENT_MAX_ROM_NUM_KEY);
227 }
228
to_json(json & jsonObj,const SecEvent & eventDataSt)229 void to_json(json &jsonObj, const SecEvent &eventDataSt)
230 {
231 jsonObj = json {
232 { EVENT_DATA_EVENT_ID_KEY, eventDataSt.eventId },
233 { EVENT_DATA_VERSION_KEY, eventDataSt.version },
234 { EVENT_DATA_DATE_KEY, eventDataSt.date },
235 { EVENT_DATA_EVENT_CONTENT_KEY, eventDataSt.content },
236 { EVENT_CFG_USER_ID_KEY, eventDataSt.userId },
237 { EVENT_CFG_DEVICE_ID_KEY, eventDataSt.deviceId },
238 };
239 }
240
to_json(json & jsonObj,const EventContentSt & eventContentSt)241 void to_json(json &jsonObj, const EventContentSt &eventContentSt)
242 {
243 jsonObj = json {
244 { EVENT_CONTENT_STATUS_KEY, eventContentSt.status },
245 { EVENT_CONTENT_CRED_KEY, eventContentSt.cred },
246 { EVENT_CONTENT_EXTRA_KEY, eventContentSt.extra }
247 };
248 }
249
from_json(const json & jsonObj,EventContentSt & eventContentSt)250 void from_json(const json &jsonObj, EventContentSt &eventContentSt)
251 {
252 (void)JsonCfg::Unmarshal(eventContentSt.status, jsonObj, EVENT_CONTENT_STATUS_KEY);
253 (void)JsonCfg::Unmarshal(eventContentSt.cred, jsonObj, EVENT_CONTENT_CRED_KEY);
254 (void)JsonCfg::Unmarshal(eventContentSt.extra, jsonObj, EVENT_CONTENT_EXTRA_KEY);
255 }
256 }