xref: /aosp_15_r20/system/security/keystore/tests/fuzzer/keystoreApplicationId_fuzzer.cpp (revision e1997b9af69e3155ead6e072d106a0077849ffba)
1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "keystoreCommon.h"
18 #include <android/security/keystore/KeyAttestationApplicationId.h>
19 
20 using ::android::security::keystore::KeyAttestationApplicationId;
21 
22 constexpr size_t kPackageVectorSizeMin = 1;
23 constexpr size_t kPackageVectorSizeMax = 10;
24 
25 class KeystoreApplicationId {
26   public:
27     void process(const uint8_t* data, size_t size);
~KeystoreApplicationId()28     ~KeystoreApplicationId() {}
29 
30   private:
31     void invokeApplicationId();
32     std::unique_ptr<FuzzedDataProvider> mFdp;
33 };
34 
invokeApplicationId()35 void KeystoreApplicationId::invokeApplicationId() {
36     KeyAttestationApplicationId applicationId;
37     bool shouldUsePackageInfoVector = mFdp->ConsumeBool();
38     if (shouldUsePackageInfoVector) {
39         ::std::vector<KeyAttestationPackageInfo> packageInfoVector;
40         int32_t packageVectorSize =
41             mFdp->ConsumeIntegralInRange<int32_t>(kPackageVectorSizeMin, kPackageVectorSizeMax);
42         for (int32_t packageSize = 0; packageSize < packageVectorSize; ++packageSize) {
43             auto packageInfoData = initPackageInfoData(mFdp.get());
44             auto pInfo = KeyAttestationPackageInfo();
45             pInfo.packageName = String16((packageInfoData.packageName).c_str());
46             pInfo.versionCode = packageInfoData.versionCode;
47             std::move(packageInfoData.sharedSignaturesVector->begin(),
48                       packageInfoData.sharedSignaturesVector->end(),
49                       std::back_inserter(pInfo.signatures));
50 
51             packageInfoVector.push_back(std::move(pInfo));
52         }
53 
54         std::move(packageInfoVector.begin(), packageInfoVector.end(),
55                   std::back_inserter(applicationId.packageInfos));
56     } else {
57         auto packageInfoData = initPackageInfoData(mFdp.get());
58         auto pInfo = KeyAttestationPackageInfo();
59         pInfo.packageName = String16((packageInfoData.packageName).c_str());
60         pInfo.versionCode = packageInfoData.versionCode;
61         std::move(packageInfoData.sharedSignaturesVector->begin(),
62                   packageInfoData.sharedSignaturesVector->end(),
63                   std::back_inserter(pInfo.signatures));
64         applicationId.packageInfos.push_back(std::move(pInfo));
65     }
66     invokeReadWriteParcel(&applicationId);
67 }
68 
process(const uint8_t * data,size_t size)69 void KeystoreApplicationId::process(const uint8_t* data, size_t size) {
70     mFdp = std::make_unique<FuzzedDataProvider>(data, size);
71     invokeApplicationId();
72 }
73 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)74 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
75     KeystoreApplicationId keystoreApplicationId;
76     keystoreApplicationId.process(data, size);
77     return 0;
78 }
79