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 "vcard_fuzzer.h"
17
18 #include <cstddef>
19 #include <cstdint>
20
21 #define private public
22 #define protected public
23 #include <fstream>
24 #include <sstream>
25
26 #include "addcoreservicetoken_fuzzer.h"
27 #include "datashare_helper.h"
28 #include "datashare_predicates.h"
29 #include "event_runner.h"
30 #include "iservice_registry.h"
31 #include "system_ability_definition.h"
32 #include "telephony_errors.h"
33 #include "telephony_log_wrapper.h"
34 #include "vcard_constructor.h"
35 #include "vcard_manager.h"
36 #include "vcard_utils.h"
37
38 using namespace OHOS::Telephony;
39 namespace OHOS {
40 constexpr const char *FILE_NAME = "example.vcf";
41 constexpr int32_t TYPE_NUM = 3;
42
WriteTestData(const std::string & testStr)43 void WriteTestData(const std::string &testStr)
44 {
45 std::ofstream file;
46 file.open(FILE_NAME, std::ios::out);
47 if (file.is_open()) {
48 std::stringstream ss(testStr);
49 std::string line;
50
51 while (std::getline(ss, line)) {
52 file << line << std::endl;
53 }
54 }
55 file.close();
56 }
57
DecodeVcard(const uint8_t * data,size_t size)58 void DecodeVcard(const uint8_t *data, size_t size)
59 {
60 std::string inputString = R"(
61 BEGIN:VCARD
62 VERSION:2.0
63 N;CHARSET=UTF-8:刘;小;;;
64 EMAIL;TYPE=WORK:test@example.com
65 EMAIL;TYPE=HOME:home@example.com
66 EMAIL;TYPE=INTERNET:email@example.com
67 EMAIL;TYPE=PREF:preferred@example.com
68 EMAIL;TYPE=X-CUSTOM:custom@example.com
69 EMAIL;INTERNET:"llll"
70 <test@example.com>
71 END:VCARD
72 )";
73 WriteTestData(inputString);
74 int32_t errorCode = static_cast<int32_t>(*data % TYPE_NUM);
75 VCardManager::GetInstance().Decode(FILE_NAME, errorCode);
76 }
77
DecodeVcardNull01(const uint8_t * data,size_t size)78 void DecodeVcardNull01(const uint8_t *data, size_t size)
79 {
80 std::string inputString = R"(
81 BEGIN:VCARD
82 VERSION:3.0
83 PRODID:-//Apple Inc.//iPhone OS 18.5//EN
84 N:;Ella2;;;
85 FN:Ella2
86 TEL;VOICE:397472181
87 UID:F6FBE71F6A8347B8828EA5075CA58B36
88 END:VCARD
89
90 BEGIN:VCARD
91 VERSION:3.0
92 PRODID:-//Apple Inc.//iPhone OS 18.5//EN
93 N:;Ivey7;;;
94 FN:Ivey7
95 TEL:2028717726
96 TEL;VOICE:198290471
97 TEL:1966159148
98 TEL:406591947
99 UID:BB41F8F492B5432AA679C1F9DA5713CF
100 END:VCARD
101
102 )";
103 WriteTestData(inputString);
104 int32_t errorCode = static_cast<int32_t>(*data % TYPE_NUM);
105 VCardManager::GetInstance().Decode(FILE_NAME, errorCode);
106 }
107
DecodeVcardNull02(const uint8_t * data,size_t size)108 void DecodeVcardNull02(const uint8_t *data, size_t size)
109 {
110 std::string inputString = R"(
111
112 )";
113 WriteTestData(inputString);
114 int32_t errorCode = static_cast<int32_t>(*data % TYPE_NUM);
115 VCardManager::GetInstance().Decode(FILE_NAME, errorCode);
116 }
117
DecodeVcardData(const uint8_t * data,size_t size)118 void DecodeVcardData(const uint8_t *data, size_t size)
119 {
120 std::string fuzzdata(reinterpret_cast<const char *>(data), size);
121 std::string inputString = R"(
122 BEGIN:VCARD
123 VERSION:2.0
124 N;CHARSET=UTF-8:刘;小;;;
125 EMAIL;TYPE=WORK:test@example.com
126 EMAIL;TYPE=HOME:home@example.com
127 EMAIL;TYPE=INTERNET:email@example.com
128 EMAIL;TYPE=PREF:preferred@example.com
129 EMAIL;TYPE=X-CUSTOM:custom@example.com
130 EMAIL;INTERNET:"llll"
131 <test@example.com>
132 END:VCARD
133 )" + fuzzdata;
134 WriteTestData(inputString);
135 int32_t errorCode = static_cast<int32_t>(*data % TYPE_NUM);
136 VCardManager::GetInstance().Decode(FILE_NAME, errorCode);
137 }
138
DecodeVcardRelation(const uint8_t * data,size_t size)139 void DecodeVcardRelation(const uint8_t *data, size_t size)
140 {
141 std::string inputString =
142 "BEGIN:VCARD\r\nVERSION:2.1\r\nX_OHOS_CUSTOM;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:relation;="
143 "E6=B5=8B=E8=AF=95;=E6=B5=8B=E8=AF=95=69=64;=E6=B5=8B=E8=AF=95=6E=61=6D=65\r\nX_OHOS_CUSTOM:"
144 "relation;realationName;labelId;labelName\r\nEND:VCARD\r\n";
145 WriteTestData(inputString);
146 int32_t errorCode = static_cast<int32_t>(*data % TYPE_NUM);
147 VCardManager::GetInstance().Decode(FILE_NAME, errorCode);
148 }
149
DecodeVcardRelationData(const uint8_t * data,size_t size)150 void DecodeVcardRelationData(const uint8_t *data, size_t size)
151 {
152 std::string fuzzdata(reinterpret_cast<const char *>(data), size);
153 std::string inputString =
154 "BEGIN:VCARD\r\nVERSION:2.1\r\nX_OHOS_CUSTOM;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:relation;="
155 "E6=B5=8B=E8=AF=95;=E6=B5=8B=E8=AF=95=69=64;=E6=B5=8B=E8=AF=95=6E=61=6D=65\r\nX_OHOS_CUSTOM:"
156 "relation;realationName;labelId;labelName\r\nEND:VCARD\r\n" +
157 fuzzdata;
158 WriteTestData(inputString);
159 int32_t errorCode = static_cast<int32_t>(*data % TYPE_NUM);
160 VCardManager::GetInstance().Decode(FILE_NAME, errorCode);
161 }
162
ContructName(const uint8_t * data,size_t size)163 void ContructName(const uint8_t *data, size_t size)
164 {
165 auto nameData = std::make_shared<VCardNameData>();
166 std::string displayName(reinterpret_cast<const char *>(data), size);
167 nameData->displayName_ = displayName;
168 nameData->family_ = "测试F";
169 nameData->given_ = "wowowo";
170 nameData->middle_ = "测试M";
171 nameData->suffix_ = "wowowoSu";
172 nameData->prefix_ = "测试P";
173 nameData->phoneticFamily_ = "测试FP";
174 nameData->phoneticGiven_ = "测试GV";
175 nameData->phoneticMiddle_ = "wowowowMI";
176 auto contact = std::make_shared<VCardContact>();
177 contact->names_.push_back(nameData);
178 auto constructor = std::make_shared<VCardConstructor>();
179 auto value = constructor->ContactVCard(contact);
180 }
181
ContructNameData(const uint8_t * data,size_t size)182 void ContructNameData(const uint8_t *data, size_t size)
183 {
184 if (data == nullptr || size == 0) {
185 return;
186 }
187 auto nameData = std::make_shared<VCardNameData>();
188 std::string displayName(reinterpret_cast<const char *>(data), size);
189 nameData->displayName_ = displayName;
190 std::string family(reinterpret_cast<const char *>(data), size);
191 nameData->family_ = family;
192 std::string given(reinterpret_cast<const char *>(data), size);
193 nameData->given_ = given;
194 std::string middle(reinterpret_cast<const char *>(data), size);
195 nameData->middle_ = middle;
196 std::string suffix(reinterpret_cast<const char *>(data), size);
197 nameData->suffix_ = suffix;
198 std::string prefix(reinterpret_cast<const char *>(data), size);
199 nameData->prefix_ = prefix;
200 std::string phoneticFamily(reinterpret_cast<const char *>(data), size);
201 nameData->phoneticFamily_ = phoneticFamily;
202 std::string phoneticGiven(reinterpret_cast<const char *>(data), size);
203 nameData->phoneticGiven_ = phoneticGiven;
204 std::string phoneticMiddle(reinterpret_cast<const char *>(data), size);
205 nameData->phoneticMiddle_ = phoneticMiddle;
206 auto contact = std::make_shared<VCardContact>();
207 contact->names_.push_back(nameData);
208 auto constructor = std::make_shared<VCardConstructor>();
209 auto value = constructor->ContactVCard(contact);
210 }
211
ContructRelation(const uint8_t * data,size_t size)212 void ContructRelation(const uint8_t *data, size_t size)
213 {
214 auto data1 = std::make_shared<VCardRelationData>();
215 std::string test(reinterpret_cast<const char *>(data), size);
216 data1->relationName_ = test;
217 data1->labelId_ = "测试id";
218 data1->labelName_ = "测试name";
219 auto data2 = std::make_shared<VCardRelationData>();
220 data2->relationName_ = "realationName";
221 data2->labelId_ = "labelId";
222 data2->labelName_ = "labelName";
223 auto contact = std::make_shared<VCardContact>();
224 contact->relations_.push_back(data1);
225 contact->relations_.push_back(data2);
226 auto constructor = std::make_shared<VCardConstructor>();
227 auto value = constructor->ContactVCard(contact);
228 }
229
ContructRelationData(const uint8_t * data,size_t size)230 void ContructRelationData(const uint8_t *data, size_t size)
231 {
232 auto data1 = std::make_shared<VCardRelationData>();
233 std::string test(reinterpret_cast<const char *>(data), size);
234 data1->relationName_ = test;
235 std::string testId(reinterpret_cast<const char *>(data), size);
236 data1->labelId_ = testId;
237 std::string testName(reinterpret_cast<const char *>(data), size);
238 data1->labelName_ = testName;
239 auto data2 = std::make_shared<VCardRelationData>();
240 std::string realationName(reinterpret_cast<const char *>(data), size);
241 data2->relationName_ = realationName;
242 std::string labelId(reinterpret_cast<const char *>(data), size);
243 data2->labelId_ = labelId;
244 std::string labelName(reinterpret_cast<const char *>(data), size);
245 data2->labelName_ = labelName;
246 auto contact = std::make_shared<VCardContact>();
247 contact->relations_.push_back(data1);
248 contact->relations_.push_back(data2);
249 auto constructor = std::make_shared<VCardConstructor>();
250 auto value = constructor->ContactVCard(contact);
251 }
252
DecodeVcardRelationV30(const uint8_t * data,size_t size)253 void DecodeVcardRelationV30(const uint8_t *data, size_t size)
254 {
255 std::string inputString = "BEGIN:VCARD\r\nVERSION:3.0\r\nN:\r\nFN:\r\nTEL;TYPE=HOME:1202020\r\nTEL;TYPE=WORK,FAX:"
256 "49305484\r\nTEL;TYPE=X-Work:503330303030\r\nEND:VCARD\r\n";
257 WriteTestData(inputString);
258 int32_t errorCode = static_cast<int32_t>(*data % TYPE_NUM);
259 VCardManager::GetInstance().Decode(FILE_NAME, errorCode);
260 }
261
DecodeVcardRelationDataV30(const uint8_t * data,size_t size)262 void DecodeVcardRelationDataV30(const uint8_t *data, size_t size)
263 {
264 std::string fuzzdata(reinterpret_cast<const char *>(data), size);
265 std::string inputString = "BEGIN:VCARD\r\nVERSION:3.0\r\nN:\r\nFN:\r\nTEL;TYPE=HOME:1202020\r\nTEL;TYPE=WORK,FAX:"
266 "49305484\r\nTEL;TYPE=X-Work:503330303030\r\nEND:VCARD\r\n" +
267 fuzzdata;
268 WriteTestData(inputString);
269 int32_t errorCode = static_cast<int32_t>(*data % TYPE_NUM);
270 VCardManager::GetInstance().Decode(FILE_NAME, errorCode);
271 }
272
DecodeVcardRelationV40(const uint8_t * data,size_t size)273 void DecodeVcardRelationV40(const uint8_t *data, size_t size)
274 {
275 std::string inputString =
276 "BEGIN:VCARD\r\nVERSION:4.0\r\nN:test1;;;;\r\nFN:test1\r\nEND:VCARD\r\nBEGIN:VCARD\r\nVERSION:4.0\r\nN:test2;;;"
277 ";\r\nFN:test2\r\nEND:VCARD\r\nBEGIN:VCARD\r\nVERSION:4.0\r\nN:test3;;;;\r\nFN:test3\r\nEND:VCARD\r\n";
278 WriteTestData(inputString);
279 int32_t errorCode = static_cast<int32_t>(*data % TYPE_NUM);
280 VCardManager::GetInstance().Decode(FILE_NAME, errorCode);
281 }
282
DecodeVcardRelationDataV40(const uint8_t * data,size_t size)283 void DecodeVcardRelationDataV40(const uint8_t *data, size_t size)
284 {
285 std::string fuzzdata(reinterpret_cast<const char *>(data), size);
286 std::string inputString =
287 "BEGIN:VCARD\r\nVERSION:4.0\r\nN:test1;;;;\r\nFN:test1\r\nEND:VCARD\r\nBEGIN:VCARD\r\nVERSION:4.0\r\nN:test2;;;"
288 ";\r\nFN:test2\r\nEND:VCARD\r\nBEGIN:VCARD\r\nVERSION:4.0\r\nN:test3;;;;\r\nFN:test3\r\nEND:VCARD\r\n" +
289 fuzzdata;
290 WriteTestData(inputString);
291 int32_t errorCode = static_cast<int32_t>(*data % TYPE_NUM);
292 VCardManager::GetInstance().Decode(FILE_NAME, errorCode);
293 }
294
Import(const uint8_t * data,size_t size)295 void Import(const uint8_t *data, size_t size)
296 {
297 std::string fuzzdata(reinterpret_cast<const char *>(data), size);
298 int32_t accountId = static_cast<int32_t>(*data);
299 VCardManager::GetInstance().Import(fuzzdata, accountId);
300 }
301
ImportLock(const uint8_t * data,size_t size)302 void ImportLock(const uint8_t *data, size_t size)
303 {
304 std::string fuzzdata(reinterpret_cast<const char *>(data), size);
305 int32_t accountId = static_cast<int32_t>(*data);
306 VCardManager::GetInstance().ImportLock(fuzzdata, nullptr, accountId);
307 }
308
Export(const uint8_t * data,size_t size)309 void Export(const uint8_t *data, size_t size)
310 {
311 std::string fuzzdata(reinterpret_cast<const char *>(data), size);
312 DataShare::DataSharePredicates predicates;
313 predicates.Between(Contact::ID, "0", "10");
314 int32_t cardType = static_cast<int32_t>(*data % TYPE_NUM);
315 VCardManager::GetInstance().Export(fuzzdata, predicates, cardType);
316 }
317
ExportLock(const uint8_t * data,size_t size)318 void ExportLock(const uint8_t *data, size_t size)
319 {
320 std::string fuzzdata(reinterpret_cast<const char *>(data), size);
321 DataShare::DataSharePredicates predicates;
322 predicates.Between(Contact::ID, "0", "10");
323 int32_t cardType = static_cast<int32_t>(*data % TYPE_NUM);
324 VCardManager::GetInstance().ExportLock(fuzzdata, nullptr, predicates, cardType);
325 }
326
ExportToStr(const uint8_t * data,size_t size)327 void ExportToStr(const uint8_t *data, size_t size)
328 {
329 std::string fuzzdata(reinterpret_cast<const char *>(data), size);
330 DataShare::DataSharePredicates predicates;
331 predicates.Between(Contact::ID, "0", "10");
332 int32_t cardType = static_cast<int32_t>(*data % TYPE_NUM);
333 VCardManager::GetInstance().ExportToStr(fuzzdata, predicates, cardType);
334 VCardManager::GetInstance().SetDataHelper(nullptr);
335 }
336
VCardUtilsTest(const uint8_t * data,size_t size)337 void VCardUtilsTest(const uint8_t *data, size_t size)
338 {
339 std::string fuzzdata(reinterpret_cast<const char *>(data), size);
340 int32_t intPara = static_cast<int32_t>(*data);
341 char argument = static_cast<char>(*data);
342 std::string fileData(reinterpret_cast<const char *>(data), size);
343 std::string numberStr = std::to_string(intPara);
344 std::vector<std::string> records;
345 records.push_back(fileData);
346 VCardUtils::EqualsIgnoreCase(fuzzdata, fuzzdata);
347 VCardUtils::Trim(fuzzdata);
348 VCardUtils::ToUpper(fuzzdata);
349 VCardUtils::StartWith(fuzzdata, fuzzdata);
350 VCardUtils::EndWith(fuzzdata, fuzzdata);
351 VCardUtils::EncodeBase64(fuzzdata);
352 VCardUtils::DecodeBase64(fuzzdata);
353 VCardUtils::CreateFileName();
354 VCardUtils::SaveFile(fuzzdata, fuzzdata);
355 VCardUtils::IsPrintableAscii(fuzzdata);
356 VCardUtils::GetTypeFromImLabelId(numberStr);
357 VCardUtils::GetTypeFromPhoneLabelId(numberStr);
358 VCardUtils::GetImageType(fuzzdata);
359 VCardUtils::IsNum(fuzzdata);
360 VCardUtils::ConstructListFromValue(fuzzdata, fuzzdata);
361 VCardUtils::VcardtypeToInt(fuzzdata);
362 VCardUtils::FormatNumber(fuzzdata);
363 VCardUtils::GetPhoneNumberFormat(intPara);
364 VCardUtils::GetLabelIdFromImType(fuzzdata);
365 VCardUtils::HandleTypeAndLabel(intPara, fuzzdata, fuzzdata, fuzzdata);
366 VCardUtils::IsPrintableAscii(fuzzdata);
367 VCardUtils::IsPrintableAscii(argument);
368 VCardUtils::IsPrintableAscii(records);
369 VCardUtils::IsWrapPrintableAscii(records);
370 VCardUtils::TrimListToString(records);
371 VCardUtils::IsAllEmpty(records);
372 VCardUtils::HandleCh(argument, fuzzdata);
373 }
374
DoSomethingInterestingWithMyAPI(const uint8_t * data,size_t size)375 void DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size)
376 {
377 DecodeVcard(data, size);
378 DecodeVcardData(data, size);
379 DecodeVcardRelation(data, size);
380 DecodeVcardRelationData(data, size);
381 ContructName(data, size);
382 ContructNameData(data, size);
383 ContructRelation(data, size);
384 ContructRelationData(data, size);
385 DecodeVcardRelationV30(data, size);
386 DecodeVcardRelationDataV30(data, size);
387 DecodeVcardRelationV40(data, size);
388 DecodeVcardRelationDataV40(data, size);
389 Import(data, size);
390 ImportLock(data, size);
391 Export(data, size);
392 ExportLock(data, size);
393 ExportToStr(data, size);
394 VCardUtilsTest(data, size);
395 return;
396 }
397 } // namespace OHOS
398
399 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)400 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
401 {
402 /* Run your code on data */
403 OHOS::DoSomethingInterestingWithMyAPI(data, size);
404 return 0;
405 }
406