• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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