1*60b67249SAndroid Build Coastguard Worker // Copyright 2021 Google LLC
2*60b67249SAndroid Build Coastguard Worker //
3*60b67249SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*60b67249SAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*60b67249SAndroid Build Coastguard Worker // the License at
6*60b67249SAndroid Build Coastguard Worker //
7*60b67249SAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*60b67249SAndroid Build Coastguard Worker //
9*60b67249SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*60b67249SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*60b67249SAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*60b67249SAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*60b67249SAndroid Build Coastguard Worker // the License.
14*60b67249SAndroid Build Coastguard Worker
15*60b67249SAndroid Build Coastguard Worker #ifndef DICE_FUZZ_UTILS_H_
16*60b67249SAndroid Build Coastguard Worker #define DICE_FUZZ_UTILS_H_
17*60b67249SAndroid Build Coastguard Worker
18*60b67249SAndroid Build Coastguard Worker #include <cstdint>
19*60b67249SAndroid Build Coastguard Worker #include <vector>
20*60b67249SAndroid Build Coastguard Worker
21*60b67249SAndroid Build Coastguard Worker #include "dice/dice.h"
22*60b67249SAndroid Build Coastguard Worker #include "fuzzer/FuzzedDataProvider.h"
23*60b67249SAndroid Build Coastguard Worker
24*60b67249SAndroid Build Coastguard Worker namespace dice {
25*60b67249SAndroid Build Coastguard Worker namespace fuzz {
26*60b67249SAndroid Build Coastguard Worker
ConsumeRandomLengthStringAsBytesFrom(FuzzedDataProvider & fdp)27*60b67249SAndroid Build Coastguard Worker static inline std::vector<uint8_t> ConsumeRandomLengthStringAsBytesFrom(
28*60b67249SAndroid Build Coastguard Worker FuzzedDataProvider& fdp) {
29*60b67249SAndroid Build Coastguard Worker auto s = fdp.ConsumeRandomLengthString();
30*60b67249SAndroid Build Coastguard Worker return std::vector<uint8_t>(s.begin(), s.end());
31*60b67249SAndroid Build Coastguard Worker }
32*60b67249SAndroid Build Coastguard Worker
33*60b67249SAndroid Build Coastguard Worker struct FuzzedInputValues {
ConsumeFromFuzzedInputValues34*60b67249SAndroid Build Coastguard Worker static FuzzedInputValues ConsumeFrom(FuzzedDataProvider& fdp) {
35*60b67249SAndroid Build Coastguard Worker FuzzedInputValues fiv = {};
36*60b67249SAndroid Build Coastguard Worker DiceInputValues& input_values = fiv.input_values_;
37*60b67249SAndroid Build Coastguard Worker
38*60b67249SAndroid Build Coastguard Worker fdp.ConsumeData(&input_values.code_hash, DICE_HASH_SIZE);
39*60b67249SAndroid Build Coastguard Worker
40*60b67249SAndroid Build Coastguard Worker fiv.code_descriptor_ = ConsumeRandomLengthStringAsBytesFrom(fdp);
41*60b67249SAndroid Build Coastguard Worker input_values.code_descriptor = fiv.code_descriptor_.data();
42*60b67249SAndroid Build Coastguard Worker input_values.code_descriptor_size = fiv.code_descriptor_.size();
43*60b67249SAndroid Build Coastguard Worker
44*60b67249SAndroid Build Coastguard Worker input_values.config_type = (DiceConfigType)fdp.ConsumeIntegralInRange(0, 1);
45*60b67249SAndroid Build Coastguard Worker
46*60b67249SAndroid Build Coastguard Worker fdp.ConsumeData(&input_values.config_value, DICE_INLINE_CONFIG_SIZE);
47*60b67249SAndroid Build Coastguard Worker
48*60b67249SAndroid Build Coastguard Worker fiv.config_descriptor_ = ConsumeRandomLengthStringAsBytesFrom(fdp);
49*60b67249SAndroid Build Coastguard Worker input_values.config_descriptor = fiv.config_descriptor_.data();
50*60b67249SAndroid Build Coastguard Worker input_values.config_descriptor_size = fiv.config_descriptor_.size();
51*60b67249SAndroid Build Coastguard Worker
52*60b67249SAndroid Build Coastguard Worker fdp.ConsumeData(&input_values.authority_hash, DICE_HASH_SIZE);
53*60b67249SAndroid Build Coastguard Worker
54*60b67249SAndroid Build Coastguard Worker fiv.authority_descriptor_ = ConsumeRandomLengthStringAsBytesFrom(fdp);
55*60b67249SAndroid Build Coastguard Worker input_values.authority_descriptor = fiv.authority_descriptor_.data();
56*60b67249SAndroid Build Coastguard Worker input_values.authority_descriptor_size = fiv.authority_descriptor_.size();
57*60b67249SAndroid Build Coastguard Worker
58*60b67249SAndroid Build Coastguard Worker input_values.mode = (DiceMode)fdp.ConsumeIntegralInRange(0, 3);
59*60b67249SAndroid Build Coastguard Worker
60*60b67249SAndroid Build Coastguard Worker fdp.ConsumeData(&input_values.hidden, DICE_HIDDEN_SIZE);
61*60b67249SAndroid Build Coastguard Worker
62*60b67249SAndroid Build Coastguard Worker return fiv;
63*60b67249SAndroid Build Coastguard Worker }
64*60b67249SAndroid Build Coastguard Worker
65*60b67249SAndroid Build Coastguard Worker operator const DiceInputValues*() const { return &input_values_; }
66*60b67249SAndroid Build Coastguard Worker
67*60b67249SAndroid Build Coastguard Worker std::vector<uint8_t> code_descriptor_;
68*60b67249SAndroid Build Coastguard Worker std::vector<uint8_t> config_descriptor_;
69*60b67249SAndroid Build Coastguard Worker std::vector<uint8_t> authority_descriptor_;
70*60b67249SAndroid Build Coastguard Worker
71*60b67249SAndroid Build Coastguard Worker DiceInputValues input_values_;
72*60b67249SAndroid Build Coastguard Worker };
73*60b67249SAndroid Build Coastguard Worker
74*60b67249SAndroid Build Coastguard Worker } // namespace fuzz
75*60b67249SAndroid Build Coastguard Worker } // namespace dice
76*60b67249SAndroid Build Coastguard Worker
77*60b67249SAndroid Build Coastguard Worker #endif // DICE_FUZZ_UTILS_H_
78