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 "softbus_aes_encrypt.h"
17 
18 #include <cstring>
19 #include <securec.h>
20 
21 #include "comm_log.h"
22 #include "softbus_adapter_crypto.h"
23 #include "softbus_adapter_mem.h"
24 #include "softbus_errcode.h"
25 
26 namespace OHOS {
SoftBusGenerateHmacHashFuzzTest(const uint8_t * data,size_t size)27 bool SoftBusGenerateHmacHashFuzzTest(const uint8_t *data, size_t size)
28 {
29     uint8_t hash[SHA256_MAC_LEN] = { 0 };
30     EncryptKey randomKey = { data, size };
31     SoftBusGenerateHmacHash(&randomKey, data, size, hash, SHA256_MAC_LEN);
32     return true;
33 }
34 
SoftBusAesCfbRootEncryptFuzzTest(const uint8_t * data,size_t size)35 bool SoftBusAesCfbRootEncryptFuzzTest(const uint8_t *data, size_t size)
36 {
37     AesOutputData encryptOutData = { 0 };
38     AesOutputData decryptOutData = { 0 };
39 
40     AesInputData encryptInData = { data, size };
41     EncryptKey randomKey = { data, size };
42     EncryptKey rootKey = { data, size };
43 
44     if (SoftBusAesCfbRootEncrypt(&encryptInData, &randomKey, &rootKey, ENCRYPT_MODE, &encryptOutData) != SOFTBUS_OK) {
45         COMM_LOGE(COMM_TEST, "SoftBus AesCfbRootEncrypt failed!");
46         return false;
47     }
48     if (SoftBusAesCfbRootEncrypt(
49         (const AesInputData *)&encryptOutData, &randomKey, &rootKey, DECRYPT_MODE, &decryptOutData) != SOFTBUS_OK) {
50         COMM_LOGE(COMM_TEST, "SoftBus AesCfbRootDecrypt failed!");
51         SoftBusFree(encryptOutData.data);
52         return false;
53     }
54     if (memcmp((const char *)decryptOutData.data, (const char *)encryptInData.data, decryptOutData.len) != 0) {
55         COMM_LOGE(COMM_TEST, "memcmp failed!");
56         SoftBusFree(encryptOutData.data);
57         SoftBusFree(decryptOutData.data);
58         return false;
59     }
60     SoftBusFree(encryptOutData.data);
61     SoftBusFree(decryptOutData.data);
62     return true;
63 }
64 
SoftBusAesGcmEncryptFuzzTest(const uint8_t * data,size_t size)65 bool SoftBusAesGcmEncryptFuzzTest(const uint8_t *data, size_t size)
66 {
67     AesOutputData encryptOutData = { 0 };
68     AesOutputData decryptOutData = { 0 };
69 
70     AesInputData encryptInData = { data, size };
71     AesCipherKey cipherKey = { (uint8_t *)data, size, (uint8_t *)data, size };
72 
73     if (SoftBusAesGcmEncrypt(&encryptInData, &cipherKey, ENCRYPT_MODE, &encryptOutData) != SOFTBUS_OK) {
74         COMM_LOGE(COMM_TEST, "SoftBus AesGcmEncrypt failed!");
75         return false;
76     }
77     if (SoftBusAesGcmEncrypt((const AesInputData *)&encryptOutData, &cipherKey, DECRYPT_MODE, &decryptOutData) !=
78         SOFTBUS_OK) {
79         COMM_LOGE(COMM_TEST, "SoftBus AesGcmDecrypt failed!");
80         SoftBusFree(encryptOutData.data);
81         return false;
82     }
83     if (memcmp((const char *)decryptOutData.data, (const char *)encryptInData.data, decryptOutData.len) != 0) {
84         COMM_LOGE(COMM_TEST, "memcmp failed!");
85         SoftBusFree(encryptOutData.data);
86         SoftBusFree(decryptOutData.data);
87         return false;
88     }
89     SoftBusFree(encryptOutData.data);
90     SoftBusFree(decryptOutData.data);
91     return true;
92 }
93 
SoftBusAesCfbEncryptFuzzTest(const uint8_t * data,size_t size)94 bool SoftBusAesCfbEncryptFuzzTest(const uint8_t *data, size_t size)
95 {
96     uint8_t randomSession[size];
97     uint8_t randomIv[size];
98     uint8_t randomSessionCopy[size];
99     uint8_t randomIvCopy[size];
100     AesOutputData encryptOutData = { 0 };
101     AesOutputData decryptOutData = { 0 };
102 
103     if (memcpy_s(randomSession, size, data, size) != EOK) {
104         COMM_LOGE(COMM_TEST, "randomSession memcpy_s failed!");
105         return false;
106     }
107     if (memcpy_s(randomIv, size, data, size) != EOK) {
108         COMM_LOGE(COMM_TEST, "randomIv memcpy_s failed!");
109         return false;
110     }
111     if (memcpy_s(randomSessionCopy, size, data, size) != EOK) {
112         COMM_LOGE(COMM_TEST, "randomSessionCopy memcpy_s failed!");
113         return false;
114     }
115     if (memcpy_s(randomIvCopy, size, data, size) != EOK) {
116         COMM_LOGE(COMM_TEST, "randomIvCopy memcpy_s failed!");
117         return false;
118     }
119 
120     AesInputData encryptInData = { data, size };
121     AesCipherKey cipherKey = { randomSession, size, randomIv, size };
122     AesCipherKey cipherKeyCopy = { randomSessionCopy, size, randomIvCopy, size };
123 
124     if (SoftBusAesCfbEncrypt(&encryptInData, &cipherKey, ENCRYPT_MODE, &encryptOutData) != SOFTBUS_OK) {
125         COMM_LOGE(COMM_TEST, "SoftBus AesCfbEncrypt failed!");
126         return false;
127     }
128     if (SoftBusAesCfbEncrypt((const AesInputData *)&encryptOutData, &cipherKeyCopy, DECRYPT_MODE, &decryptOutData) !=
129         SOFTBUS_OK) {
130         COMM_LOGE(COMM_TEST, "SoftBus AesCfbDecrypt failed!");
131         SoftBusFree(encryptOutData.data);
132         return false;
133     }
134     if (memcmp((const char *)decryptOutData.data, (const char *)encryptInData.data, decryptOutData.len) != 0) {
135         COMM_LOGE(COMM_TEST, "memcmp failed!");
136         SoftBusFree(encryptOutData.data);
137         SoftBusFree(decryptOutData.data);
138         return false;
139     }
140     SoftBusFree(encryptOutData.data);
141     SoftBusFree(decryptOutData.data);
142     return true;
143 }
144 
145 } // namespace OHOS
146 
147 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)148 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
149 {
150     if (data == nullptr || size == 0) {
151         return 0;
152     }
153 
154     OHOS::SoftBusGenerateHmacHashFuzzTest(data, size);
155     OHOS::SoftBusAesCfbRootEncryptFuzzTest(data, size);
156     OHOS::SoftBusAesGcmEncryptFuzzTest(data, size);
157     OHOS::SoftBusAesCfbEncryptFuzzTest(data, size);
158     return 0;
159 }