1*7eba2f3bSAndroid Build Coastguard Worker #include "fuzz.h"
2*7eba2f3bSAndroid Build Coastguard Worker
3*7eba2f3bSAndroid Build Coastguard Worker #define MODULE_NAME "nfc_ce_fuzzer"
4*7eba2f3bSAndroid Build Coastguard Worker
5*7eba2f3bSAndroid Build Coastguard Worker const char fuzzer_name[] = MODULE_NAME;
6*7eba2f3bSAndroid Build Coastguard Worker
7*7eba2f3bSAndroid Build Coastguard Worker extern void Type3_FixPackets(uint8_t SubType, std::vector<bytes_t>& Packets);
8*7eba2f3bSAndroid Build Coastguard Worker extern void Type4_FixPackets(uint8_t SubType, std::vector<bytes_t>& Packets);
9*7eba2f3bSAndroid Build Coastguard Worker
10*7eba2f3bSAndroid Build Coastguard Worker extern void Type3_Fuzz(uint8_t SubType, const std::vector<bytes_t>& Packets);
11*7eba2f3bSAndroid Build Coastguard Worker extern void Type4_Fuzz(uint8_t SubType, const std::vector<bytes_t>& Packets);
12*7eba2f3bSAndroid Build Coastguard Worker
Fuzz_FixPackets(std::vector<bytes_t> & Packets,uint Seed)13*7eba2f3bSAndroid Build Coastguard Worker void Fuzz_FixPackets(std::vector<bytes_t>& Packets, uint Seed) {
14*7eba2f3bSAndroid Build Coastguard Worker if (Packets.size() < 2) {
15*7eba2f3bSAndroid Build Coastguard Worker // At least two packets, first one is the control packet
16*7eba2f3bSAndroid Build Coastguard Worker Packets.resize(2);
17*7eba2f3bSAndroid Build Coastguard Worker }
18*7eba2f3bSAndroid Build Coastguard Worker
19*7eba2f3bSAndroid Build Coastguard Worker auto& ctrl = Packets[0];
20*7eba2f3bSAndroid Build Coastguard Worker if (ctrl.size() != 2) {
21*7eba2f3bSAndroid Build Coastguard Worker ctrl.resize(2);
22*7eba2f3bSAndroid Build Coastguard Worker ctrl[0] = (Seed >> 16) & 0xFF;
23*7eba2f3bSAndroid Build Coastguard Worker ctrl[1] = (Seed >> 24) & 0xFF;
24*7eba2f3bSAndroid Build Coastguard Worker }
25*7eba2f3bSAndroid Build Coastguard Worker
26*7eba2f3bSAndroid Build Coastguard Worker uint8_t FuzzType = ctrl[0] % Fuzz_TypeMax;
27*7eba2f3bSAndroid Build Coastguard Worker uint8_t FuzzSubType = ctrl[1];
28*7eba2f3bSAndroid Build Coastguard Worker
29*7eba2f3bSAndroid Build Coastguard Worker switch (FuzzType) {
30*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Type3:
31*7eba2f3bSAndroid Build Coastguard Worker Type3_FixPackets(FuzzSubType, Packets);
32*7eba2f3bSAndroid Build Coastguard Worker break;
33*7eba2f3bSAndroid Build Coastguard Worker
34*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Type4:
35*7eba2f3bSAndroid Build Coastguard Worker Type4_FixPackets(FuzzSubType, Packets);
36*7eba2f3bSAndroid Build Coastguard Worker break;
37*7eba2f3bSAndroid Build Coastguard Worker
38*7eba2f3bSAndroid Build Coastguard Worker default:
39*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG("Unknown fuzz type %hhu", FuzzType);
40*7eba2f3bSAndroid Build Coastguard Worker break;
41*7eba2f3bSAndroid Build Coastguard Worker }
42*7eba2f3bSAndroid Build Coastguard Worker }
43*7eba2f3bSAndroid Build Coastguard Worker
Fuzz_RunPackets(const std::vector<bytes_t> & Packets)44*7eba2f3bSAndroid Build Coastguard Worker void Fuzz_RunPackets(const std::vector<bytes_t>& Packets) {
45*7eba2f3bSAndroid Build Coastguard Worker if (Packets.size() < 2) {
46*7eba2f3bSAndroid Build Coastguard Worker return;
47*7eba2f3bSAndroid Build Coastguard Worker }
48*7eba2f3bSAndroid Build Coastguard Worker
49*7eba2f3bSAndroid Build Coastguard Worker auto& ctrl = Packets[0];
50*7eba2f3bSAndroid Build Coastguard Worker if (ctrl.size() < 2) {
51*7eba2f3bSAndroid Build Coastguard Worker return;
52*7eba2f3bSAndroid Build Coastguard Worker }
53*7eba2f3bSAndroid Build Coastguard Worker
54*7eba2f3bSAndroid Build Coastguard Worker uint8_t FuzzType = ctrl[0] % Fuzz_TypeMax;
55*7eba2f3bSAndroid Build Coastguard Worker uint8_t FuzzSubType = ctrl[1];
56*7eba2f3bSAndroid Build Coastguard Worker
57*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG("Fuzzing Type%u tag", (uint)(FuzzType + 1));
58*7eba2f3bSAndroid Build Coastguard Worker
59*7eba2f3bSAndroid Build Coastguard Worker switch (FuzzType) {
60*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Type3:
61*7eba2f3bSAndroid Build Coastguard Worker Type3_Fuzz(FuzzSubType, Packets);
62*7eba2f3bSAndroid Build Coastguard Worker break;
63*7eba2f3bSAndroid Build Coastguard Worker
64*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Type4:
65*7eba2f3bSAndroid Build Coastguard Worker Type4_Fuzz(FuzzSubType, Packets);
66*7eba2f3bSAndroid Build Coastguard Worker break;
67*7eba2f3bSAndroid Build Coastguard Worker
68*7eba2f3bSAndroid Build Coastguard Worker default:
69*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG("Unknown fuzz type: %hhu", FuzzType);
70*7eba2f3bSAndroid Build Coastguard Worker break;
71*7eba2f3bSAndroid Build Coastguard Worker }
72*7eba2f3bSAndroid Build Coastguard Worker }
73