1 /*
2 * Copyright (c) 2022 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_STORAGE_RAM_NUM_KEY, eventCfg.storageRamNums },
168 { EVENT_CFG_STORAGE_ROM_NUM_KEY, eventCfg.storageRomNums },
169 { EVENT_CFG_STORAGE_TIME_KEY, eventCfg.storageTime },
170 { EVENT_CFG_OWNER_KEY, eventCfg.owner },
171 { EVENT_CFG_SOURCE_KEY, eventCfg.source },
172 { EVENT_CFG_DB_TABLE_KEY, eventCfg.dbTable },
173 { EVENT_CFG_PROG_KEY, eventCfg.prog}
174 };
175 }
176
from_json(const json & jsonObj,EventCfg & eventCfg)177 void from_json(const json &jsonObj, EventCfg &eventCfg)
178 {
179 std::string eventId;
180 JsonCfg::Unmarshal(eventId, jsonObj, EVENT_CFG_EVENT_ID_KEY);
181 int64_t value = 0;
182 if (!SecurityGuardUtils::StrToI64Hex(eventId, value)) {
183 return;
184 }
185 eventCfg.eventId = value;
186 JsonCfg::Unmarshal(eventCfg.eventName, jsonObj, EVENT_CFG_EVENT_NAME_KEY);
187 JsonCfg::Unmarshal(eventCfg.version, jsonObj, EVENT_CFG_VERSION_KEY);
188 JsonCfg::Unmarshal(eventCfg.eventType, jsonObj, EVENT_CFG_EVENT_TYPE_KEY);
189 JsonCfg::Unmarshal(eventCfg.collectOnStart, jsonObj, EVENT_CFG_COLLECT_ON_START_KEY);
190 JsonCfg::Unmarshal(eventCfg.dataSensitivityLevel, jsonObj, EVENT_CFG_DATA_SENSITIVITY_LEVEL_KEY);
191 JsonCfg::Unmarshal(eventCfg.storageRamNums, jsonObj, EVENT_CFG_STORAGE_RAM_NUM_KEY);
192 JsonCfg::Unmarshal(eventCfg.storageRomNums, jsonObj, EVENT_CFG_STORAGE_ROM_NUM_KEY);
193 JsonCfg::Unmarshal(eventCfg.storageTime, jsonObj, EVENT_CFG_STORAGE_TIME_KEY);
194 JsonCfg::Unmarshal(eventCfg.owner, jsonObj, EVENT_CFG_OWNER_KEY);
195 JsonCfg::Unmarshal(eventCfg.source, jsonObj, EVENT_CFG_SOURCE_KEY);
196 JsonCfg::Unmarshal(eventCfg.dbTable, jsonObj, EVENT_CFG_DB_TABLE_KEY);
197 JsonCfg::Unmarshal(eventCfg.prog, jsonObj, EVENT_CFG_PROG_KEY);
198 }
199
to_json(json & jsonObj,const DataMgrCfgSt & dataMgrCfg)200 void to_json(json &jsonObj, const DataMgrCfgSt &dataMgrCfg)
201 {
202 jsonObj = json {
203 { DATA_MGR_DEVICE_RAM_KEY, dataMgrCfg.deviceRam },
204 { DATA_MGR_DEVICE_ROM_KEY, dataMgrCfg.deviceRom },
205 { DATA_MGR_EVENT_MAX_RAM_NUM_KEY, dataMgrCfg.eventMaxRamNum },
206 { DATA_MGR_EVENT_MAX_ROM_NUM_KEY, dataMgrCfg.eventMaxRomNum }
207 };
208 }
209
from_json(const json & jsonObj,DataMgrCfgSt & dataMgrCfg)210 void from_json(const json &jsonObj, DataMgrCfgSt &dataMgrCfg)
211 {
212 JsonCfg::Unmarshal(dataMgrCfg.deviceRam, jsonObj, DATA_MGR_DEVICE_RAM_KEY);
213 JsonCfg::Unmarshal(dataMgrCfg.deviceRom, jsonObj, DATA_MGR_DEVICE_ROM_KEY);
214 JsonCfg::Unmarshal(dataMgrCfg.eventMaxRamNum, jsonObj, DATA_MGR_EVENT_MAX_RAM_NUM_KEY);
215 JsonCfg::Unmarshal(dataMgrCfg.eventMaxRomNum, jsonObj, DATA_MGR_EVENT_MAX_ROM_NUM_KEY);
216 }
217
to_json(json & jsonObj,const SecEvent & eventDataSt)218 void to_json(json &jsonObj, const SecEvent &eventDataSt)
219 {
220 jsonObj = json {
221 { EVENT_DATA_EVENT_ID_KEY, eventDataSt.eventId },
222 { EVENT_DATA_VERSION_KEY, eventDataSt.version },
223 { EVENT_DATA_DATE_KEY, eventDataSt.date },
224 { EVENT_DATA_EVENT_CONTENT_KEY, eventDataSt.content },
225 { EVENT_CFG_USER_ID_KEY, eventDataSt.userId },
226 { EVENT_CFG_DEVICE_ID_KEY, eventDataSt.deviceId },
227 };
228 }
229
to_json(json & jsonObj,const EventContentSt & eventContentSt)230 void to_json(json &jsonObj, const EventContentSt &eventContentSt)
231 {
232 jsonObj = json {
233 { EVENT_CONTENT_STATUS_KEY, eventContentSt.status },
234 { EVENT_CONTENT_CRED_KEY, eventContentSt.cred },
235 { EVENT_CONTENT_EXTRA_KEY, eventContentSt.extra }
236 };
237 }
238
from_json(const json & jsonObj,EventContentSt & eventContentSt)239 void from_json(const json &jsonObj, EventContentSt &eventContentSt)
240 {
241 JsonCfg::Unmarshal(eventContentSt.status, jsonObj, EVENT_CONTENT_STATUS_KEY);
242 JsonCfg::Unmarshal(eventContentSt.cred, jsonObj, EVENT_CONTENT_CRED_KEY);
243 JsonCfg::Unmarshal(eventContentSt.extra, jsonObj, EVENT_CONTENT_EXTRA_KEY);
244 }
245 }