xref: /aosp_15_r20/system/security/keystore/tests/fuzzer/keystoreCommon.h (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 #ifndef KEYSTORECOMMON_H
17 #define KEYSTORECOMMON_H
18 
19 #include <android/security/keystore/KeyAttestationPackageInfo.h>
20 #include <android/security/keystore/Signature.h>
21 #include <binder/Parcel.h>
22 #include <binder/Parcelable.h>
23 #include <vector>
24 
25 #include "fuzzer/FuzzedDataProvider.h"
26 
27 using namespace android;
28 using namespace std;
29 using ::android::security::keystore::KeyAttestationPackageInfo;
30 using ::android::security::keystore::Signature;
31 
32 constexpr size_t kSignatureSizeMin = 1;
33 constexpr size_t kSignatureSizeMax = 1000;
34 constexpr size_t kRandomStringLength = 256;
35 constexpr size_t kSignatureVectorSizeMin = 1;
36 constexpr size_t kSignatureVectorSizeMax = 1000;
37 
38 struct PackageInfoData {
39     string packageName;
40     int64_t versionCode;
41     std::shared_ptr<std::vector<Signature>> sharedSignaturesVector;
42 };
43 
invokeReadWriteParcel(Parcelable * obj)44 inline void invokeReadWriteParcel(Parcelable* obj) {
45     Parcel parcel;
46     obj->writeToParcel(&parcel);
47     parcel.setDataPosition(0);
48     obj->readFromParcel(&parcel);
49 }
50 
initSignatureData(FuzzedDataProvider * fdp)51 inline vector<uint8_t> initSignatureData(FuzzedDataProvider* fdp) {
52     size_t signatureSize = fdp->ConsumeIntegralInRange(kSignatureSizeMin, kSignatureSizeMax);
53     vector<uint8_t> signatureData = fdp->ConsumeBytes<uint8_t>(signatureSize);
54     return signatureData;
55 }
56 
initPackageInfoData(FuzzedDataProvider * fdp)57 inline PackageInfoData initPackageInfoData(FuzzedDataProvider* fdp) {
58     PackageInfoData packageInfoData;
59     packageInfoData.packageName = fdp->ConsumeRandomLengthString(kRandomStringLength);
60     packageInfoData.versionCode = fdp->ConsumeIntegral<int64_t>();
61     size_t signatureVectorSize =
62         fdp->ConsumeIntegralInRange(kSignatureVectorSizeMin, kSignatureVectorSizeMax);
63     std::vector<Signature> signatureVector;
64     for (size_t size = 0; size < signatureVectorSize; ++size) {
65         bool shouldUseParameterizedConstructor = fdp->ConsumeBool();
66         if (shouldUseParameterizedConstructor) {
67             vector<uint8_t> signatureData = initSignatureData(fdp);
68             auto sign = Signature();
69             sign.data = signatureData;
70             signatureVector.push_back(std::move(sign));
71         } else {
72             signatureVector.push_back(Signature());
73         }
74     }
75     packageInfoData.sharedSignaturesVector =
76         make_shared<std::vector<Signature>>(std::move(signatureVector));
77     return packageInfoData;
78 }
79 #endif  // KEYSTORECOMMON_H
80