xref: /aosp_15_r20/system/keymaster/fuzzer/k4_AndroidKeymaster4Device_fuzzer.cpp (revision 789431f29546679ab5188a97751fb38e3018d44d)
1*789431f2SAndroid Build Coastguard Worker /*
2*789431f2SAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
3*789431f2SAndroid Build Coastguard Worker  *
4*789431f2SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*789431f2SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*789431f2SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
7*789431f2SAndroid Build Coastguard Worker  *
8*789431f2SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
9*789431f2SAndroid Build Coastguard Worker  *
10*789431f2SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*789431f2SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*789431f2SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*789431f2SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*789431f2SAndroid Build Coastguard Worker  * limitations under the License.
15*789431f2SAndroid Build Coastguard Worker  *
16*789431f2SAndroid Build Coastguard Worker  */
17*789431f2SAndroid Build Coastguard Worker 
18*789431f2SAndroid Build Coastguard Worker #include <AndroidKeymaster4Device.h>
19*789431f2SAndroid Build Coastguard Worker #include <android/hardware/keymaster/4.0/IKeymasterDevice.h>
20*789431f2SAndroid Build Coastguard Worker #include <fuzzer/FuzzedDataProvider.h>
21*789431f2SAndroid Build Coastguard Worker #include <keymasterV4_0/authorization_set.h>
22*789431f2SAndroid Build Coastguard Worker 
23*789431f2SAndroid Build Coastguard Worker namespace keymaster::V4_0::ng::fuzzer {
24*789431f2SAndroid Build Coastguard Worker 
25*789431f2SAndroid Build Coastguard Worker using ::android::hardware::hidl_string;
26*789431f2SAndroid Build Coastguard Worker using ::android::hardware::keymaster::V4_0::AuthorizationSet;
27*789431f2SAndroid Build Coastguard Worker using ::android::hardware::keymaster::V4_0::AuthorizationSetBuilder;
28*789431f2SAndroid Build Coastguard Worker using ::android::hardware::keymaster::V4_0::Digest;
29*789431f2SAndroid Build Coastguard Worker using ::android::hardware::keymaster::V4_0::KeyFormat;
30*789431f2SAndroid Build Coastguard Worker using ::android::hardware::keymaster::V4_0::KeyPurpose;
31*789431f2SAndroid Build Coastguard Worker using ::android::hardware::keymaster::V4_0::PaddingMode;
32*789431f2SAndroid Build Coastguard Worker 
33*789431f2SAndroid Build Coastguard Worker constexpr SecurityLevel kSecurityLevel[] = {
34*789431f2SAndroid Build Coastguard Worker     SecurityLevel::SOFTWARE,
35*789431f2SAndroid Build Coastguard Worker     SecurityLevel::TRUSTED_ENVIRONMENT,
36*789431f2SAndroid Build Coastguard Worker     SecurityLevel::STRONGBOX,
37*789431f2SAndroid Build Coastguard Worker };
38*789431f2SAndroid Build Coastguard Worker 
39*789431f2SAndroid Build Coastguard Worker constexpr PaddingMode kPaddingMode[] = {
40*789431f2SAndroid Build Coastguard Worker     PaddingMode::NONE,
41*789431f2SAndroid Build Coastguard Worker     PaddingMode::RSA_OAEP,
42*789431f2SAndroid Build Coastguard Worker     PaddingMode::RSA_PSS,
43*789431f2SAndroid Build Coastguard Worker     PaddingMode::RSA_PKCS1_1_5_ENCRYPT,
44*789431f2SAndroid Build Coastguard Worker     PaddingMode::RSA_PKCS1_1_5_SIGN,
45*789431f2SAndroid Build Coastguard Worker     PaddingMode::PKCS7,
46*789431f2SAndroid Build Coastguard Worker };
47*789431f2SAndroid Build Coastguard Worker 
48*789431f2SAndroid Build Coastguard Worker constexpr Digest kDigest[] = {
49*789431f2SAndroid Build Coastguard Worker     Digest::NONE,      Digest::MD5,       Digest::SHA1,      Digest::SHA_2_224,
50*789431f2SAndroid Build Coastguard Worker     Digest::SHA_2_256, Digest::SHA_2_384, Digest::SHA_2_512,
51*789431f2SAndroid Build Coastguard Worker };
52*789431f2SAndroid Build Coastguard Worker 
53*789431f2SAndroid Build Coastguard Worker constexpr KeyFormat kKeyFormat[] = {
54*789431f2SAndroid Build Coastguard Worker     KeyFormat::X509,
55*789431f2SAndroid Build Coastguard Worker     KeyFormat::PKCS8,
56*789431f2SAndroid Build Coastguard Worker     KeyFormat::RAW,
57*789431f2SAndroid Build Coastguard Worker };
58*789431f2SAndroid Build Coastguard Worker 
59*789431f2SAndroid Build Coastguard Worker constexpr KeyPurpose kKeyPurpose[] = {
60*789431f2SAndroid Build Coastguard Worker     KeyPurpose::ENCRYPT, KeyPurpose::DECRYPT,  KeyPurpose::SIGN,
61*789431f2SAndroid Build Coastguard Worker     KeyPurpose::VERIFY,  KeyPurpose::WRAP_KEY,
62*789431f2SAndroid Build Coastguard Worker };
63*789431f2SAndroid Build Coastguard Worker 
64*789431f2SAndroid Build Coastguard Worker constexpr uint32_t kRSAKeySize[] = {1024, 2048, 3072, 4096};
65*789431f2SAndroid Build Coastguard Worker constexpr uint32_t kECCKeySize[] = {224, 256, 384, 521};
66*789431f2SAndroid Build Coastguard Worker constexpr size_t kMinBytes = 0;
67*789431f2SAndroid Build Coastguard Worker constexpr size_t kMaxBytes = 100;
68*789431f2SAndroid Build Coastguard Worker 
69*789431f2SAndroid Build Coastguard Worker class KeyMaster4DeviceFuzzer {
70*789431f2SAndroid Build Coastguard Worker   public:
71*789431f2SAndroid Build Coastguard Worker     bool init(const uint8_t* data, size_t size);
72*789431f2SAndroid Build Coastguard Worker     void process();
73*789431f2SAndroid Build Coastguard Worker 
74*789431f2SAndroid Build Coastguard Worker   private:
75*789431f2SAndroid Build Coastguard Worker     AuthorizationSet getAuthorizationSet();
76*789431f2SAndroid Build Coastguard Worker     sp<IKeymasterDevice> mKeymaster = nullptr;
77*789431f2SAndroid Build Coastguard Worker     std::unique_ptr<FuzzedDataProvider> mFdp = nullptr;
78*789431f2SAndroid Build Coastguard Worker };
79*789431f2SAndroid Build Coastguard Worker 
getAuthorizationSet()80*789431f2SAndroid Build Coastguard Worker AuthorizationSet KeyMaster4DeviceFuzzer::getAuthorizationSet() {
81*789431f2SAndroid Build Coastguard Worker     auto keyMasterFunction = mFdp->PickValueInArray<
82*789431f2SAndroid Build Coastguard Worker         const std::function<android::hardware::keymaster::V4_0::AuthorizationSet()>>({
83*789431f2SAndroid Build Coastguard Worker         [&]() {
84*789431f2SAndroid Build Coastguard Worker             return AuthorizationSetBuilder()
85*789431f2SAndroid Build Coastguard Worker                 .RsaSigningKey(mFdp->PickValueInArray(kRSAKeySize),
86*789431f2SAndroid Build Coastguard Worker                                mFdp->ConsumeIntegral<uint32_t>())
87*789431f2SAndroid Build Coastguard Worker                 .Digest(mFdp->PickValueInArray(kDigest))
88*789431f2SAndroid Build Coastguard Worker                 .Padding(mFdp->PickValueInArray(kPaddingMode));
89*789431f2SAndroid Build Coastguard Worker         },
90*789431f2SAndroid Build Coastguard Worker         [&]() {
91*789431f2SAndroid Build Coastguard Worker             return AuthorizationSetBuilder()
92*789431f2SAndroid Build Coastguard Worker                 .EcdsaKey(mFdp->PickValueInArray(kECCKeySize))
93*789431f2SAndroid Build Coastguard Worker                 .Digest(mFdp->PickValueInArray(kDigest))
94*789431f2SAndroid Build Coastguard Worker                 .Padding(mFdp->PickValueInArray(kPaddingMode));
95*789431f2SAndroid Build Coastguard Worker         },
96*789431f2SAndroid Build Coastguard Worker         [&]() {
97*789431f2SAndroid Build Coastguard Worker             return AuthorizationSetBuilder()
98*789431f2SAndroid Build Coastguard Worker                 .AesKey(mFdp->PickValueInArray(kECCKeySize))
99*789431f2SAndroid Build Coastguard Worker                 .Digest(mFdp->PickValueInArray(kDigest))
100*789431f2SAndroid Build Coastguard Worker                 .Padding(mFdp->PickValueInArray(kPaddingMode));
101*789431f2SAndroid Build Coastguard Worker         },
102*789431f2SAndroid Build Coastguard Worker         [&]() {
103*789431f2SAndroid Build Coastguard Worker             return AuthorizationSetBuilder()
104*789431f2SAndroid Build Coastguard Worker                 .TripleDesKey(mFdp->PickValueInArray(kRSAKeySize))
105*789431f2SAndroid Build Coastguard Worker                 .Digest(mFdp->PickValueInArray(kDigest))
106*789431f2SAndroid Build Coastguard Worker                 .Padding(mFdp->PickValueInArray(kPaddingMode));
107*789431f2SAndroid Build Coastguard Worker         },
108*789431f2SAndroid Build Coastguard Worker         [&]() {
109*789431f2SAndroid Build Coastguard Worker             return AuthorizationSetBuilder()
110*789431f2SAndroid Build Coastguard Worker                 .HmacKey(mFdp->PickValueInArray(kRSAKeySize))
111*789431f2SAndroid Build Coastguard Worker                 .Digest(mFdp->PickValueInArray(kDigest))
112*789431f2SAndroid Build Coastguard Worker                 .Padding(mFdp->PickValueInArray(kPaddingMode));
113*789431f2SAndroid Build Coastguard Worker         },
114*789431f2SAndroid Build Coastguard Worker         [&]() {
115*789431f2SAndroid Build Coastguard Worker             return AuthorizationSetBuilder()
116*789431f2SAndroid Build Coastguard Worker                 .RsaEncryptionKey(mFdp->PickValueInArray(kRSAKeySize),
117*789431f2SAndroid Build Coastguard Worker                                   mFdp->ConsumeIntegral<uint64_t>())
118*789431f2SAndroid Build Coastguard Worker                 .Digest(mFdp->PickValueInArray(kDigest))
119*789431f2SAndroid Build Coastguard Worker                 .Padding(mFdp->PickValueInArray(kPaddingMode));
120*789431f2SAndroid Build Coastguard Worker         },
121*789431f2SAndroid Build Coastguard Worker         [&]() {
122*789431f2SAndroid Build Coastguard Worker             return AuthorizationSetBuilder()
123*789431f2SAndroid Build Coastguard Worker                 .EcdsaSigningKey(mFdp->PickValueInArray(kRSAKeySize))
124*789431f2SAndroid Build Coastguard Worker                 .Digest(mFdp->PickValueInArray(kDigest))
125*789431f2SAndroid Build Coastguard Worker                 .Padding(mFdp->PickValueInArray(kPaddingMode));
126*789431f2SAndroid Build Coastguard Worker         },
127*789431f2SAndroid Build Coastguard Worker         [&]() {
128*789431f2SAndroid Build Coastguard Worker             return AuthorizationSetBuilder()
129*789431f2SAndroid Build Coastguard Worker                 .AesEncryptionKey(mFdp->PickValueInArray(kECCKeySize))
130*789431f2SAndroid Build Coastguard Worker                 .Digest(mFdp->PickValueInArray(kDigest))
131*789431f2SAndroid Build Coastguard Worker                 .Padding(mFdp->PickValueInArray(kPaddingMode));
132*789431f2SAndroid Build Coastguard Worker         },
133*789431f2SAndroid Build Coastguard Worker         [&]() {
134*789431f2SAndroid Build Coastguard Worker             return AuthorizationSetBuilder()
135*789431f2SAndroid Build Coastguard Worker                 .TripleDesEncryptionKey(mFdp->PickValueInArray(kRSAKeySize))
136*789431f2SAndroid Build Coastguard Worker                 .Digest(mFdp->PickValueInArray(kDigest))
137*789431f2SAndroid Build Coastguard Worker                 .Padding(mFdp->PickValueInArray(kPaddingMode));
138*789431f2SAndroid Build Coastguard Worker         },
139*789431f2SAndroid Build Coastguard Worker         [&]() {
140*789431f2SAndroid Build Coastguard Worker             return AuthorizationSetBuilder()
141*789431f2SAndroid Build Coastguard Worker                 .RsaKey(mFdp->PickValueInArray(kRSAKeySize), mFdp->ConsumeIntegral<uint64_t>())
142*789431f2SAndroid Build Coastguard Worker                 .Digest(mFdp->PickValueInArray(kDigest))
143*789431f2SAndroid Build Coastguard Worker                 .Padding(mFdp->PickValueInArray(kPaddingMode));
144*789431f2SAndroid Build Coastguard Worker         },
145*789431f2SAndroid Build Coastguard Worker     });
146*789431f2SAndroid Build Coastguard Worker     return keyMasterFunction();
147*789431f2SAndroid Build Coastguard Worker }
148*789431f2SAndroid Build Coastguard Worker 
init(const uint8_t * data,size_t size)149*789431f2SAndroid Build Coastguard Worker bool KeyMaster4DeviceFuzzer::init(const uint8_t* data, size_t size) {
150*789431f2SAndroid Build Coastguard Worker     mFdp = std::make_unique<FuzzedDataProvider>(data, size);
151*789431f2SAndroid Build Coastguard Worker     mKeymaster = CreateKeymasterDevice(mFdp->PickValueInArray(kSecurityLevel));
152*789431f2SAndroid Build Coastguard Worker     if (!mKeymaster) {
153*789431f2SAndroid Build Coastguard Worker         return false;
154*789431f2SAndroid Build Coastguard Worker     }
155*789431f2SAndroid Build Coastguard Worker     return true;
156*789431f2SAndroid Build Coastguard Worker }
157*789431f2SAndroid Build Coastguard Worker 
process()158*789431f2SAndroid Build Coastguard Worker void KeyMaster4DeviceFuzzer::process() {
159*789431f2SAndroid Build Coastguard Worker     std::vector<uint8_t> dataVec =
160*789431f2SAndroid Build Coastguard Worker         mFdp->ConsumeBytes<uint8_t>(mFdp->ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes));
161*789431f2SAndroid Build Coastguard Worker     mKeymaster->addRngEntropy(dataVec);
162*789431f2SAndroid Build Coastguard Worker 
163*789431f2SAndroid Build Coastguard Worker     hidl_vec<uint8_t> keyBlob = {};
164*789431f2SAndroid Build Coastguard Worker     mKeymaster->generateKey(getAuthorizationSet().hidl_data(),
165*789431f2SAndroid Build Coastguard Worker                             [&]([[maybe_unused]] ErrorCode hidlError,
166*789431f2SAndroid Build Coastguard Worker                                 const hidl_vec<uint8_t>& hidlKeyBlob,
167*789431f2SAndroid Build Coastguard Worker                                 [[maybe_unused]] const KeyCharacteristics& hidlKeyCharacteristics) {
168*789431f2SAndroid Build Coastguard Worker                                 keyBlob = hidlKeyBlob;
169*789431f2SAndroid Build Coastguard Worker                             });
170*789431f2SAndroid Build Coastguard Worker 
171*789431f2SAndroid Build Coastguard Worker     mKeymaster->attestKey(
172*789431f2SAndroid Build Coastguard Worker         keyBlob, getAuthorizationSet().hidl_data(),
173*789431f2SAndroid Build Coastguard Worker         [&]([[maybe_unused]] ErrorCode hidlError,
174*789431f2SAndroid Build Coastguard Worker             [[maybe_unused]] const hidl_vec<hidl_vec<uint8_t>>& hidlCertificateChain) {});
175*789431f2SAndroid Build Coastguard Worker 
176*789431f2SAndroid Build Coastguard Worker     mKeymaster->upgradeKey(keyBlob, hidl_vec<KeyParameter>(),
177*789431f2SAndroid Build Coastguard Worker                            [&]([[maybe_unused]] ErrorCode error,
178*789431f2SAndroid Build Coastguard Worker                                [[maybe_unused]] const hidl_vec<uint8_t>& upgraded_blob) {});
179*789431f2SAndroid Build Coastguard Worker 
180*789431f2SAndroid Build Coastguard Worker     std::vector<uint8_t> clientId =
181*789431f2SAndroid Build Coastguard Worker         mFdp->ConsumeBytes<uint8_t>(mFdp->ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes));
182*789431f2SAndroid Build Coastguard Worker     std::vector<uint8_t> appData =
183*789431f2SAndroid Build Coastguard Worker         mFdp->ConsumeBytes<uint8_t>(mFdp->ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes));
184*789431f2SAndroid Build Coastguard Worker     mKeymaster->getKeyCharacteristics(
185*789431f2SAndroid Build Coastguard Worker         keyBlob, clientId, appData,
186*789431f2SAndroid Build Coastguard Worker         [&]([[maybe_unused]] ErrorCode hidlError,
187*789431f2SAndroid Build Coastguard Worker             [[maybe_unused]] const KeyCharacteristics& hidlKeyCharacteristics) {});
188*789431f2SAndroid Build Coastguard Worker 
189*789431f2SAndroid Build Coastguard Worker     KeyFormat keyFormat = mFdp->PickValueInArray(kKeyFormat);
190*789431f2SAndroid Build Coastguard Worker     std::vector<uint8_t> keyData;
191*789431f2SAndroid Build Coastguard Worker     keyData =
192*789431f2SAndroid Build Coastguard Worker         mFdp->ConsumeBytes<uint8_t>(mFdp->ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes));
193*789431f2SAndroid Build Coastguard Worker     mKeymaster->importKey(
194*789431f2SAndroid Build Coastguard Worker         getAuthorizationSet().hidl_data(), keyFormat, keyData,
195*789431f2SAndroid Build Coastguard Worker         [&]([[maybe_unused]] ErrorCode hidlError,
196*789431f2SAndroid Build Coastguard Worker             [[maybe_unused]] const hidl_vec<uint8_t>& hidlKeyBlob,
197*789431f2SAndroid Build Coastguard Worker             [[maybe_unused]] const KeyCharacteristics& hidlKeyCharacteristics) {});
198*789431f2SAndroid Build Coastguard Worker 
199*789431f2SAndroid Build Coastguard Worker     std::vector<uint8_t> wrappedKey, wrappingKey, maskingKey;
200*789431f2SAndroid Build Coastguard Worker     wrappedKey =
201*789431f2SAndroid Build Coastguard Worker         mFdp->ConsumeBytes<uint8_t>(mFdp->ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes));
202*789431f2SAndroid Build Coastguard Worker     wrappingKey =
203*789431f2SAndroid Build Coastguard Worker         mFdp->ConsumeBytes<uint8_t>(mFdp->ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes));
204*789431f2SAndroid Build Coastguard Worker     maskingKey =
205*789431f2SAndroid Build Coastguard Worker         mFdp->ConsumeBytes<uint8_t>(mFdp->ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes));
206*789431f2SAndroid Build Coastguard Worker     uint64_t passwordSid = mFdp->ConsumeIntegral<uint64_t>();
207*789431f2SAndroid Build Coastguard Worker     uint64_t biometricSid = mFdp->ConsumeIntegral<uint64_t>();
208*789431f2SAndroid Build Coastguard Worker     mKeymaster->importWrappedKey(
209*789431f2SAndroid Build Coastguard Worker         wrappedKey, wrappingKey, maskingKey, getAuthorizationSet().hidl_data(), passwordSid,
210*789431f2SAndroid Build Coastguard Worker         biometricSid,
211*789431f2SAndroid Build Coastguard Worker         [&]([[maybe_unused]] ErrorCode hidlError,
212*789431f2SAndroid Build Coastguard Worker             [[maybe_unused]] const hidl_vec<uint8_t>& hidlKeyBlob,
213*789431f2SAndroid Build Coastguard Worker             [[maybe_unused]] const KeyCharacteristics& hidlKeyCharacteristics) {});
214*789431f2SAndroid Build Coastguard Worker 
215*789431f2SAndroid Build Coastguard Worker     std::vector<uint8_t> keyBlobExportKey =
216*789431f2SAndroid Build Coastguard Worker         mFdp->ConsumeBytes<uint8_t>(mFdp->ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes));
217*789431f2SAndroid Build Coastguard Worker     mKeymaster->exportKey(keyFormat, keyBlobExportKey, clientId, appData,
218*789431f2SAndroid Build Coastguard Worker                           [&]([[maybe_unused]] ErrorCode hidlErrorCode,
219*789431f2SAndroid Build Coastguard Worker                               [[maybe_unused]] const hidl_vec<uint8_t>& hidlKeyMaterial) {});
220*789431f2SAndroid Build Coastguard Worker 
221*789431f2SAndroid Build Coastguard Worker     KeyPurpose keyPurpose = mFdp->PickValueInArray(kKeyPurpose);
222*789431f2SAndroid Build Coastguard Worker     mKeymaster->begin(keyPurpose, keyBlob, getAuthorizationSet().hidl_data(), HardwareAuthToken(),
223*789431f2SAndroid Build Coastguard Worker                       [&]([[maybe_unused]] ErrorCode hidlError,
224*789431f2SAndroid Build Coastguard Worker                           [[maybe_unused]] const hidl_vec<KeyParameter>& hidlOutParams,
225*789431f2SAndroid Build Coastguard Worker                           [[maybe_unused]] uint64_t hidlOpHandle) {});
226*789431f2SAndroid Build Coastguard Worker 
227*789431f2SAndroid Build Coastguard Worker     uint64_t operationHandle = mFdp->ConsumeIntegral<uint64_t>();
228*789431f2SAndroid Build Coastguard Worker     std::vector<uint8_t> input =
229*789431f2SAndroid Build Coastguard Worker         mFdp->ConsumeBytes<uint8_t>(mFdp->ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes));
230*789431f2SAndroid Build Coastguard Worker     mKeymaster->update(operationHandle, getAuthorizationSet().hidl_data(), input,
231*789431f2SAndroid Build Coastguard Worker                        HardwareAuthToken(), VerificationToken(),
232*789431f2SAndroid Build Coastguard Worker                        [&]([[maybe_unused]] ErrorCode hidlError,
233*789431f2SAndroid Build Coastguard Worker                            [[maybe_unused]] uint32_t hidlInputConsumed,
234*789431f2SAndroid Build Coastguard Worker                            [[maybe_unused]] const hidl_vec<KeyParameter>& hidlOutParams,
235*789431f2SAndroid Build Coastguard Worker                            [[maybe_unused]] const hidl_vec<uint8_t>& hidlOutput) {});
236*789431f2SAndroid Build Coastguard Worker 
237*789431f2SAndroid Build Coastguard Worker     std::vector<uint8_t> signature =
238*789431f2SAndroid Build Coastguard Worker         mFdp->ConsumeBytes<uint8_t>(mFdp->ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes));
239*789431f2SAndroid Build Coastguard Worker     mKeymaster->finish(operationHandle, getAuthorizationSet().hidl_data(), input, signature,
240*789431f2SAndroid Build Coastguard Worker                        HardwareAuthToken(), VerificationToken(),
241*789431f2SAndroid Build Coastguard Worker                        [&]([[maybe_unused]] ErrorCode hidlError,
242*789431f2SAndroid Build Coastguard Worker                            [[maybe_unused]] const hidl_vec<KeyParameter>& hidlOutParams,
243*789431f2SAndroid Build Coastguard Worker                            [[maybe_unused]] const hidl_vec<uint8_t>& hidlOutput) {});
244*789431f2SAndroid Build Coastguard Worker 
245*789431f2SAndroid Build Coastguard Worker     mKeymaster->deleteKey(keyBlob);
246*789431f2SAndroid Build Coastguard Worker     mKeymaster->deleteAllKeys();
247*789431f2SAndroid Build Coastguard Worker     mKeymaster->abort(mFdp->ConsumeIntegral<uint64_t>());
248*789431f2SAndroid Build Coastguard Worker }
249*789431f2SAndroid Build Coastguard Worker 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)250*789431f2SAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
251*789431f2SAndroid Build Coastguard Worker     KeyMaster4DeviceFuzzer km4DeviceFuzzer;
252*789431f2SAndroid Build Coastguard Worker     if (km4DeviceFuzzer.init(data, size)) {
253*789431f2SAndroid Build Coastguard Worker         km4DeviceFuzzer.process();
254*789431f2SAndroid Build Coastguard Worker     }
255*789431f2SAndroid Build Coastguard Worker     return 0;
256*789431f2SAndroid Build Coastguard Worker }
257*789431f2SAndroid Build Coastguard Worker }  // namespace keymaster::V4_0::ng::fuzzer
258