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}