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