1060ff233Sopenharmony_ci/*
2060ff233Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3060ff233Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4060ff233Sopenharmony_ci * you may not use this file except in compliance with the License.
5060ff233Sopenharmony_ci * You may obtain a copy of the License at
6060ff233Sopenharmony_ci *
7060ff233Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8060ff233Sopenharmony_ci *
9060ff233Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10060ff233Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11060ff233Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12060ff233Sopenharmony_ci * See the License for the specific language governing permissions and
13060ff233Sopenharmony_ci * limitations under the License.
14060ff233Sopenharmony_ci */
15060ff233Sopenharmony_ci
16060ff233Sopenharmony_ci#include "softbus_aes_encrypt.h"
17060ff233Sopenharmony_ci
18060ff233Sopenharmony_ci#include <cstring>
19060ff233Sopenharmony_ci#include <securec.h>
20060ff233Sopenharmony_ci
21060ff233Sopenharmony_ci#include "comm_log.h"
22060ff233Sopenharmony_ci#include "softbus_adapter_crypto.h"
23060ff233Sopenharmony_ci#include "softbus_adapter_mem.h"
24060ff233Sopenharmony_ci#include "softbus_errcode.h"
25060ff233Sopenharmony_ci
26060ff233Sopenharmony_cinamespace OHOS {
27060ff233Sopenharmony_cibool SoftBusGenerateHmacHashFuzzTest(const uint8_t *data, size_t size)
28060ff233Sopenharmony_ci{
29060ff233Sopenharmony_ci    uint8_t hash[SHA256_MAC_LEN] = { 0 };
30060ff233Sopenharmony_ci    EncryptKey randomKey = { data, size };
31060ff233Sopenharmony_ci    SoftBusGenerateHmacHash(&randomKey, data, size, hash, SHA256_MAC_LEN);
32060ff233Sopenharmony_ci    return true;
33060ff233Sopenharmony_ci}
34060ff233Sopenharmony_ci
35060ff233Sopenharmony_cibool SoftBusAesCfbRootEncryptFuzzTest(const uint8_t *data, size_t size)
36060ff233Sopenharmony_ci{
37060ff233Sopenharmony_ci    AesOutputData encryptOutData = { 0 };
38060ff233Sopenharmony_ci    AesOutputData decryptOutData = { 0 };
39060ff233Sopenharmony_ci
40060ff233Sopenharmony_ci    AesInputData encryptInData = { data, size };
41060ff233Sopenharmony_ci    EncryptKey randomKey = { data, size };
42060ff233Sopenharmony_ci    EncryptKey rootKey = { data, size };
43060ff233Sopenharmony_ci
44060ff233Sopenharmony_ci    if (SoftBusAesCfbRootEncrypt(&encryptInData, &randomKey, &rootKey, ENCRYPT_MODE, &encryptOutData) != SOFTBUS_OK) {
45060ff233Sopenharmony_ci        COMM_LOGE(COMM_TEST, "SoftBus AesCfbRootEncrypt failed!");
46060ff233Sopenharmony_ci        return false;
47060ff233Sopenharmony_ci    }
48060ff233Sopenharmony_ci    if (SoftBusAesCfbRootEncrypt(
49060ff233Sopenharmony_ci        (const AesInputData *)&encryptOutData, &randomKey, &rootKey, DECRYPT_MODE, &decryptOutData) != SOFTBUS_OK) {
50060ff233Sopenharmony_ci        COMM_LOGE(COMM_TEST, "SoftBus AesCfbRootDecrypt failed!");
51060ff233Sopenharmony_ci        SoftBusFree(encryptOutData.data);
52060ff233Sopenharmony_ci        return false;
53060ff233Sopenharmony_ci    }
54060ff233Sopenharmony_ci    if (memcmp((const char *)decryptOutData.data, (const char *)encryptInData.data, decryptOutData.len) != 0) {
55060ff233Sopenharmony_ci        COMM_LOGE(COMM_TEST, "memcmp failed!");
56060ff233Sopenharmony_ci        SoftBusFree(encryptOutData.data);
57060ff233Sopenharmony_ci        SoftBusFree(decryptOutData.data);
58060ff233Sopenharmony_ci        return false;
59060ff233Sopenharmony_ci    }
60060ff233Sopenharmony_ci    SoftBusFree(encryptOutData.data);
61060ff233Sopenharmony_ci    SoftBusFree(decryptOutData.data);
62060ff233Sopenharmony_ci    return true;
63060ff233Sopenharmony_ci}
64060ff233Sopenharmony_ci
65060ff233Sopenharmony_cibool SoftBusAesGcmEncryptFuzzTest(const uint8_t *data, size_t size)
66060ff233Sopenharmony_ci{
67060ff233Sopenharmony_ci    AesOutputData encryptOutData = { 0 };
68060ff233Sopenharmony_ci    AesOutputData decryptOutData = { 0 };
69060ff233Sopenharmony_ci
70060ff233Sopenharmony_ci    AesInputData encryptInData = { data, size };
71060ff233Sopenharmony_ci    AesCipherKey cipherKey = { (uint8_t *)data, size, (uint8_t *)data, size };
72060ff233Sopenharmony_ci
73060ff233Sopenharmony_ci    if (SoftBusAesGcmEncrypt(&encryptInData, &cipherKey, ENCRYPT_MODE, &encryptOutData) != SOFTBUS_OK) {
74060ff233Sopenharmony_ci        COMM_LOGE(COMM_TEST, "SoftBus AesGcmEncrypt failed!");
75060ff233Sopenharmony_ci        return false;
76060ff233Sopenharmony_ci    }
77060ff233Sopenharmony_ci    if (SoftBusAesGcmEncrypt((const AesInputData *)&encryptOutData, &cipherKey, DECRYPT_MODE, &decryptOutData) !=
78060ff233Sopenharmony_ci        SOFTBUS_OK) {
79060ff233Sopenharmony_ci        COMM_LOGE(COMM_TEST, "SoftBus AesGcmDecrypt failed!");
80060ff233Sopenharmony_ci        SoftBusFree(encryptOutData.data);
81060ff233Sopenharmony_ci        return false;
82060ff233Sopenharmony_ci    }
83060ff233Sopenharmony_ci    if (memcmp((const char *)decryptOutData.data, (const char *)encryptInData.data, decryptOutData.len) != 0) {
84060ff233Sopenharmony_ci        COMM_LOGE(COMM_TEST, "memcmp failed!");
85060ff233Sopenharmony_ci        SoftBusFree(encryptOutData.data);
86060ff233Sopenharmony_ci        SoftBusFree(decryptOutData.data);
87060ff233Sopenharmony_ci        return false;
88060ff233Sopenharmony_ci    }
89060ff233Sopenharmony_ci    SoftBusFree(encryptOutData.data);
90060ff233Sopenharmony_ci    SoftBusFree(decryptOutData.data);
91060ff233Sopenharmony_ci    return true;
92060ff233Sopenharmony_ci}
93060ff233Sopenharmony_ci
94060ff233Sopenharmony_cibool SoftBusAesCfbEncryptFuzzTest(const uint8_t *data, size_t size)
95060ff233Sopenharmony_ci{
96060ff233Sopenharmony_ci    uint8_t randomSession[size];
97060ff233Sopenharmony_ci    uint8_t randomIv[size];
98060ff233Sopenharmony_ci    uint8_t randomSessionCopy[size];
99060ff233Sopenharmony_ci    uint8_t randomIvCopy[size];
100060ff233Sopenharmony_ci    AesOutputData encryptOutData = { 0 };
101060ff233Sopenharmony_ci    AesOutputData decryptOutData = { 0 };
102060ff233Sopenharmony_ci
103060ff233Sopenharmony_ci    if (memcpy_s(randomSession, size, data, size) != EOK) {
104060ff233Sopenharmony_ci        COMM_LOGE(COMM_TEST, "randomSession memcpy_s failed!");
105060ff233Sopenharmony_ci        return false;
106060ff233Sopenharmony_ci    }
107060ff233Sopenharmony_ci    if (memcpy_s(randomIv, size, data, size) != EOK) {
108060ff233Sopenharmony_ci        COMM_LOGE(COMM_TEST, "randomIv memcpy_s failed!");
109060ff233Sopenharmony_ci        return false;
110060ff233Sopenharmony_ci    }
111060ff233Sopenharmony_ci    if (memcpy_s(randomSessionCopy, size, data, size) != EOK) {
112060ff233Sopenharmony_ci        COMM_LOGE(COMM_TEST, "randomSessionCopy memcpy_s failed!");
113060ff233Sopenharmony_ci        return false;
114060ff233Sopenharmony_ci    }
115060ff233Sopenharmony_ci    if (memcpy_s(randomIvCopy, size, data, size) != EOK) {
116060ff233Sopenharmony_ci        COMM_LOGE(COMM_TEST, "randomIvCopy memcpy_s failed!");
117060ff233Sopenharmony_ci        return false;
118060ff233Sopenharmony_ci    }
119060ff233Sopenharmony_ci
120060ff233Sopenharmony_ci    AesInputData encryptInData = { data, size };
121060ff233Sopenharmony_ci    AesCipherKey cipherKey = { randomSession, size, randomIv, size };
122060ff233Sopenharmony_ci    AesCipherKey cipherKeyCopy = { randomSessionCopy, size, randomIvCopy, size };
123060ff233Sopenharmony_ci
124060ff233Sopenharmony_ci    if (SoftBusAesCfbEncrypt(&encryptInData, &cipherKey, ENCRYPT_MODE, &encryptOutData) != SOFTBUS_OK) {
125060ff233Sopenharmony_ci        COMM_LOGE(COMM_TEST, "SoftBus AesCfbEncrypt failed!");
126060ff233Sopenharmony_ci        return false;
127060ff233Sopenharmony_ci    }
128060ff233Sopenharmony_ci    if (SoftBusAesCfbEncrypt((const AesInputData *)&encryptOutData, &cipherKeyCopy, DECRYPT_MODE, &decryptOutData) !=
129060ff233Sopenharmony_ci        SOFTBUS_OK) {
130060ff233Sopenharmony_ci        COMM_LOGE(COMM_TEST, "SoftBus AesCfbDecrypt failed!");
131060ff233Sopenharmony_ci        SoftBusFree(encryptOutData.data);
132060ff233Sopenharmony_ci        return false;
133060ff233Sopenharmony_ci    }
134060ff233Sopenharmony_ci    if (memcmp((const char *)decryptOutData.data, (const char *)encryptInData.data, decryptOutData.len) != 0) {
135060ff233Sopenharmony_ci        COMM_LOGE(COMM_TEST, "memcmp failed!");
136060ff233Sopenharmony_ci        SoftBusFree(encryptOutData.data);
137060ff233Sopenharmony_ci        SoftBusFree(decryptOutData.data);
138060ff233Sopenharmony_ci        return false;
139060ff233Sopenharmony_ci    }
140060ff233Sopenharmony_ci    SoftBusFree(encryptOutData.data);
141060ff233Sopenharmony_ci    SoftBusFree(decryptOutData.data);
142060ff233Sopenharmony_ci    return true;
143060ff233Sopenharmony_ci}
144060ff233Sopenharmony_ci
145060ff233Sopenharmony_ci} // namespace OHOS
146060ff233Sopenharmony_ci
147060ff233Sopenharmony_ci/* Fuzzer entry point */
148060ff233Sopenharmony_ciextern "C" int32_t LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
149060ff233Sopenharmony_ci{
150060ff233Sopenharmony_ci    if (data == nullptr || size == 0) {
151060ff233Sopenharmony_ci        return 0;
152060ff233Sopenharmony_ci    }
153060ff233Sopenharmony_ci
154060ff233Sopenharmony_ci    OHOS::SoftBusGenerateHmacHashFuzzTest(data, size);
155060ff233Sopenharmony_ci    OHOS::SoftBusAesCfbRootEncryptFuzzTest(data, size);
156060ff233Sopenharmony_ci    OHOS::SoftBusAesGcmEncryptFuzzTest(data, size);
157060ff233Sopenharmony_ci    OHOS::SoftBusAesCfbEncryptFuzzTest(data, size);
158060ff233Sopenharmony_ci    return 0;
159060ff233Sopenharmony_ci}