1 /*
2  * Copyright (c) 2024 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 #include "hksvalidatecertchain_fuzzer.h"
16 
17 #include <securec.h>
18 #include <vector>
19 
20 #include "hks_api.h"
21 #include "hks_mem.h"
22 #include "hks_param.h"
23 #include "hks_type.h"
24 
25 #include "hks_fuzz_util.h"
26 
27 constexpr int CERT_SIZE = 4096;
28 constexpr int CERT_COUNT = 4;
29 
30 namespace OHOS {
31 namespace Security {
32 namespace Hks {
33 
DoSomethingInterestingWithMyAPI(uint8_t *data, size_t size)34 int DoSomethingInterestingWithMyAPI(uint8_t *data, size_t size)
35 {
36     if (data == nullptr) {
37         return -1;
38     }
39     std::vector<uint8_t> certRootBuffer(CERT_SIZE);
40     std::vector<uint8_t> certCaBuffer(CERT_SIZE);
41     std::vector<uint8_t> certDeviceBuffer(CERT_SIZE);
42     std::vector<uint8_t> certAppBuffer(CERT_SIZE);
43     struct HksBlob resultCerts[CERT_COUNT] = {
44         { CERT_SIZE, certRootBuffer.data() },
45         { CERT_SIZE, certCaBuffer.data() },
46         { CERT_SIZE, certDeviceBuffer.data() },
47         { CERT_SIZE, certAppBuffer.data() },
48     };
49     struct HksCertChain certChain = {
50         .certs = resultCerts,
51         .certsCount = CERT_COUNT
52     };
53     WrapParamSet psOut = ConstructHksParamSetFromFuzz(data, size);
54     [[maybe_unused]] int ret = HksValidateCertChain(&certChain, psOut.s);
55     return 0;
56 }
57 }}}
58 
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)59 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
60 {
61     std::vector<uint8_t> v(data, data + size);
62     return OHOS::Security::Hks::DoSomethingInterestingWithMyAPI(v.data(), v.size());
63 }
64