1 /*
2  * Copyright (c) 2023 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 "message_parcel_utils.h"
17 
18 #include "edm_log.h"
19 #include "securec.h"
20 
21 namespace OHOS {
22 namespace EDM {
23 #ifdef WIFI_EDM_ENABLE
WriteWifiDeviceConfig(Wifi::WifiDeviceConfig & config,MessageParcel & data,WifiPassword & pwd)24 void MessageParcelUtils::WriteWifiDeviceConfig(Wifi::WifiDeviceConfig &config, MessageParcel &data,
25     WifiPassword &pwd)
26 {
27     data.WriteInt32(config.networkId);
28     data.WriteInt32(config.status);
29     data.WriteString(config.bssid);
30     data.WriteString(config.ssid);
31     data.WriteInt32(config.band);
32     data.WriteInt32(config.channel);
33     data.WriteInt32(config.frequency);
34     data.WriteInt32(config.level);
35     data.WriteBool(config.isPasspoint);
36     data.WriteBool(config.isEphemeral);
37     WriteCString(data, pwd.preSharedKey);
38     data.WriteString(config.keyMgmt);
39     WriteCString(data, pwd.wepKey);
40     data.WriteInt32(config.wepTxKeyIndex);
41     data.WriteInt32(config.priority);
42     data.WriteBool(config.hiddenSSID);
43     data.WriteInt32(static_cast<int32_t>(config.wifiIpConfig.assignMethod));
44     WriteIpAddress(data, config.wifiIpConfig.staticIpAddress.ipAddress.address);
45     data.WriteInt32(config.wifiIpConfig.staticIpAddress.ipAddress.prefixLength);
46     data.WriteInt32(config.wifiIpConfig.staticIpAddress.ipAddress.flags);
47     data.WriteInt32(config.wifiIpConfig.staticIpAddress.ipAddress.scope);
48     WriteIpAddress(data, config.wifiIpConfig.staticIpAddress.gateway);
49     WriteIpAddress(data, config.wifiIpConfig.staticIpAddress.dnsServer1);
50     WriteIpAddress(data, config.wifiIpConfig.staticIpAddress.dnsServer2);
51     data.WriteString(config.wifiIpConfig.staticIpAddress.domains);
52     data.WriteString(config.wifiEapConfig.eap);
53     data.WriteString(config.wifiEapConfig.identity);
54     WriteCString(data, pwd.password);
55     data.WriteString(config.wifiEapConfig.clientCert);
56     data.WriteString(config.wifiEapConfig.privateKey);
57     data.WriteUInt8Vector(config.wifiEapConfig.certEntry);
58     data.WriteCString(config.wifiEapConfig.certPassword);
59     memset_s(config.wifiEapConfig.certPassword, sizeof(config.wifiEapConfig.certPassword), 0,
60         sizeof(config.wifiEapConfig.certPassword));
61     data.WriteInt32(static_cast<int32_t>(config.wifiEapConfig.phase2Method));
62     data.WriteInt32(static_cast<int32_t>(config.wifiProxyconfig.configureMethod));
63     data.WriteString(config.wifiProxyconfig.autoProxyConfig.pacWebAddress);
64     data.WriteString(config.wifiProxyconfig.manualProxyConfig.serverHostName);
65     data.WriteInt32(config.wifiProxyconfig.manualProxyConfig.serverPort);
66     data.WriteString(config.wifiProxyconfig.manualProxyConfig.exclusionObjectList);
67     data.WriteInt32(static_cast<int32_t>(config.wifiPrivacySetting));
68 }
69 
WriteIpAddress(MessageParcel & data,const Wifi::WifiIpAddress & address)70 void MessageParcelUtils::WriteIpAddress(MessageParcel &data, const Wifi::WifiIpAddress &address)
71 {
72     data.WriteInt32(address.family);
73     data.WriteUint32(address.addressIpv4);
74     size_t size = address.addressIpv6.size();
75     data.WriteUint32(size);
76     for (size_t i = 0; i < size; i++) {
77         data.WriteUint8(address.addressIpv6[i]);
78     }
79 }
80 
ReadWifiDeviceConfig(MessageParcel & data,Wifi::WifiDeviceConfig & config)81 void MessageParcelUtils::ReadWifiDeviceConfig(MessageParcel &data, Wifi::WifiDeviceConfig &config)
82 {
83     config.networkId = data.ReadInt32();
84     config.status = data.ReadInt32();
85     config.bssid = data.ReadString();
86     config.ssid = data.ReadString();
87     config.band = data.ReadInt32();
88     config.channel = data.ReadInt32();
89     config.frequency = data.ReadInt32();
90     config.level = data.ReadInt32();
91     config.isPasspoint = data.ReadBool();
92     config.isEphemeral = data.ReadBool();
93     std::string preSharedKey(ReadCString(data));
94     config.preSharedKey = preSharedKey;
95     EdmUtils::ClearString(preSharedKey);
96     config.keyMgmt = data.ReadString();
97     if (sizeof(config.wepKeys) / sizeof(std::string) > 0) {
98         std::string wepKey(ReadCString(data));
99         config.wepKeys[0] = wepKey;
100         EdmUtils::ClearString(wepKey);
101     }
102     config.wepTxKeyIndex = data.ReadInt32();
103     config.priority = data.ReadInt32();
104     config.hiddenSSID = data.ReadBool();
105     ProcessAssignIpMethod(data.ReadInt32(), config.wifiIpConfig);
106     ReadIpAddress(data, config.wifiIpConfig.staticIpAddress.ipAddress.address);
107     config.wifiIpConfig.staticIpAddress.ipAddress.prefixLength = data.ReadInt32();
108     config.wifiIpConfig.staticIpAddress.ipAddress.flags = data.ReadInt32();
109     config.wifiIpConfig.staticIpAddress.ipAddress.scope = data.ReadInt32();
110     ReadIpAddress(data, config.wifiIpConfig.staticIpAddress.gateway);
111     ReadIpAddress(data, config.wifiIpConfig.staticIpAddress.dnsServer1);
112     ReadIpAddress(data, config.wifiIpConfig.staticIpAddress.dnsServer2);
113     config.wifiIpConfig.staticIpAddress.domains = data.ReadString();
114     config.wifiEapConfig.eap = data.ReadString();
115     config.wifiEapConfig.identity = data.ReadString();
116     std::string password(ReadCString(data));
117     config.wifiEapConfig.password = password;
118     EdmUtils::ClearString(password);
119     config.wifiEapConfig.clientCert = data.ReadString();
120     config.wifiEapConfig.privateKey = data.ReadString();
121     data.ReadUInt8Vector(&config.wifiEapConfig.certEntry);
122     strncpy_s(config.wifiEapConfig.certPassword, sizeof(config.wifiEapConfig.certPassword), ReadCString(data),
123         sizeof(config.wifiEapConfig.certPassword) - 1);
124     ProcessPhase2Method(data.ReadInt32(), config.wifiEapConfig);
125     ProcessConfigureProxyMethod(data.ReadInt32(), config.wifiProxyconfig);
126     config.wifiProxyconfig.autoProxyConfig.pacWebAddress = data.ReadString();
127     config.wifiProxyconfig.manualProxyConfig.serverHostName = data.ReadString();
128     config.wifiProxyconfig.manualProxyConfig.serverPort = data.ReadInt32();
129     config.wifiProxyconfig.manualProxyConfig.exclusionObjectList = data.ReadString();
130     ProcessPrivacyConfig(data.ReadInt32(), config);
131 }
132 
ProcessAssignIpMethod(int32_t ipMethod,Wifi::WifiIpConfig & ipConfig)133 void MessageParcelUtils::ProcessAssignIpMethod(int32_t ipMethod, Wifi::WifiIpConfig &ipConfig)
134 {
135     switch (ipMethod) {
136         case static_cast<int32_t>(Wifi::AssignIpMethod::DHCP):
137             ipConfig.assignMethod = Wifi::AssignIpMethod::DHCP;
138             break;
139         case static_cast<int32_t>(Wifi::AssignIpMethod::STATIC):
140             ipConfig.assignMethod = Wifi::AssignIpMethod::STATIC;
141             break;
142         default:
143             ipConfig.assignMethod = Wifi::AssignIpMethod::UNASSIGNED;
144             break;
145     }
146 }
147 
ProcessPhase2Method(int32_t phase2,Wifi::WifiEapConfig & eapConfig)148 void MessageParcelUtils::ProcessPhase2Method(int32_t phase2, Wifi::WifiEapConfig &eapConfig)
149 {
150     switch (phase2) {
151         case static_cast<int32_t>(Wifi::Phase2Method::PAP):
152             eapConfig.phase2Method = Wifi::Phase2Method::PAP;
153             break;
154         case static_cast<int32_t>(Wifi::Phase2Method::MSCHAP):
155             eapConfig.phase2Method = Wifi::Phase2Method::MSCHAP;
156             break;
157         case static_cast<int32_t>(Wifi::Phase2Method::MSCHAPV2):
158             eapConfig.phase2Method = Wifi::Phase2Method::MSCHAPV2;
159             break;
160         case static_cast<int32_t>(Wifi::Phase2Method::GTC):
161             eapConfig.phase2Method = Wifi::Phase2Method::GTC;
162             break;
163         case static_cast<int32_t>(Wifi::Phase2Method::SIM):
164             eapConfig.phase2Method = Wifi::Phase2Method::SIM;
165             break;
166         case static_cast<int32_t>(Wifi::Phase2Method::AKA):
167             eapConfig.phase2Method = Wifi::Phase2Method::AKA;
168             break;
169         case static_cast<int32_t>(Wifi::Phase2Method::AKA_PRIME):
170             eapConfig.phase2Method = Wifi::Phase2Method::AKA_PRIME;
171             break;
172         default:
173             eapConfig.phase2Method = Wifi::Phase2Method::NONE;
174             break;
175     }
176 }
177 
ProcessConfigureProxyMethod(int32_t proxyMethod,Wifi::WifiProxyConfig & proxyConfig)178 void MessageParcelUtils::ProcessConfigureProxyMethod(int32_t proxyMethod, Wifi::WifiProxyConfig &proxyConfig)
179 {
180     switch (proxyMethod) {
181         case static_cast<int32_t>(Wifi::ConfigureProxyMethod::AUTOCONFIGUE):
182             proxyConfig.configureMethod = Wifi::ConfigureProxyMethod::AUTOCONFIGUE;
183             break;
184         case static_cast<int32_t>(Wifi::ConfigureProxyMethod::MANUALCONFIGUE):
185             proxyConfig.configureMethod = Wifi::ConfigureProxyMethod::MANUALCONFIGUE;
186             break;
187         default:
188             proxyConfig.configureMethod = Wifi::ConfigureProxyMethod::CLOSED;
189             break;
190     }
191 }
192 
ProcessPrivacyConfig(int32_t privacyConfig,Wifi::WifiDeviceConfig & config)193 void MessageParcelUtils::ProcessPrivacyConfig(int32_t privacyConfig, Wifi::WifiDeviceConfig &config)
194 {
195     if (privacyConfig == static_cast<int32_t>(Wifi::WifiPrivacyConfig::RANDOMMAC)) {
196         config.wifiPrivacySetting = Wifi::WifiPrivacyConfig::RANDOMMAC;
197     } else {
198         config.wifiPrivacySetting = Wifi::WifiPrivacyConfig::DEVICEMAC;
199     }
200 }
201 
ReadIpAddress(MessageParcel & data,Wifi::WifiIpAddress & address)202 void MessageParcelUtils::ReadIpAddress(MessageParcel &data, Wifi::WifiIpAddress &address)
203 {
204     constexpr int MAX_LIMIT_SIZE = 1024;
205     address.family = data.ReadInt32();
206     address.addressIpv4 = data.ReadUint32();
207     size_t size = data.ReadUint32();
208     if (size > MAX_LIMIT_SIZE) {
209         EDMLOGE("Read ip address parameter error: %{public}zu", size);
210         return;
211     }
212     for (size_t i = 0; i < size; i++) {
213         address.addressIpv6.push_back(data.ReadUint8());
214     }
215 }
216 
WriteCString(MessageParcel & data,char * cStr)217 void MessageParcelUtils::WriteCString(MessageParcel &data, char* cStr)
218 {
219     if (cStr != nullptr) {
220         data.WriteCString(cStr);
221     } else {
222         char temp[1]{'\0'};
223         data.WriteCString(temp);
224     }
225 }
226 
ReadCString(MessageParcel & data)227 const char* MessageParcelUtils::ReadCString(MessageParcel &data)
228 {
229     const char* value = data.ReadCString();
230     if (value == nullptr) {
231         const char* temp = "";
232         return temp;
233     }
234     return value;
235 }
236 #endif
237 
WriteInstallParam(const AppExecFwk::InstallParam & installParam,MessageParcel & data)238 void MessageParcelUtils::WriteInstallParam(const AppExecFwk::InstallParam &installParam, MessageParcel &data)
239 {
240     data.WriteInt32(installParam.userId);
241     data.WriteInt32(static_cast<int>(installParam.installFlag));
242 }
243 
WriteOperateDeviceParam(const OperateDeviceParam & param,MessageParcel & data)244 void MessageParcelUtils::WriteOperateDeviceParam(const OperateDeviceParam &param, MessageParcel &data)
245 {
246     data.WriteString(param.operate);
247     data.WriteString(param.addition);
248     data.WriteInt32(param.userId);
249 }
250 
ReadOperateDeviceParam(MessageParcel & data,OperateDeviceParam & param)251 void MessageParcelUtils::ReadOperateDeviceParam(MessageParcel &data, OperateDeviceParam &param)
252 {
253     param.operate = data.ReadString();
254     param.addition = data.ReadString();
255     param.userId = data.ReadInt32();
256 }
257 } // namespace EDM
258 } // namespace OHOS