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 }