1*7eba2f3bSAndroid Build Coastguard Worker #include "fuzz.h"
2*7eba2f3bSAndroid Build Coastguard Worker
3*7eba2f3bSAndroid Build Coastguard Worker #define MODULE_NAME "nfc_rw_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 Type1_FixPackets(uint8_t SubType, std::vector<bytes_t>& Packets);
8*7eba2f3bSAndroid Build Coastguard Worker extern void Type2_FixPackets(uint8_t SubType, std::vector<bytes_t>& Packets);
9*7eba2f3bSAndroid Build Coastguard Worker extern void Type3_FixPackets(uint8_t SubType, std::vector<bytes_t>& Packets);
10*7eba2f3bSAndroid Build Coastguard Worker extern void Type4_FixPackets(uint8_t SubType, std::vector<bytes_t>& Packets);
11*7eba2f3bSAndroid Build Coastguard Worker extern void Type5_FixPackets(uint8_t SubType, std::vector<bytes_t>& Packets);
12*7eba2f3bSAndroid Build Coastguard Worker extern void Mfc_FixPackets(uint8_t SubType, std::vector<bytes_t>& Packets);
13*7eba2f3bSAndroid Build Coastguard Worker
14*7eba2f3bSAndroid Build Coastguard Worker extern void Type1_Fuzz(uint8_t SubType, const std::vector<bytes_t>& Packets);
15*7eba2f3bSAndroid Build Coastguard Worker extern void Type2_Fuzz(uint8_t SubType, const std::vector<bytes_t>& Packets);
16*7eba2f3bSAndroid Build Coastguard Worker extern void Type3_Fuzz(uint8_t SubType, const std::vector<bytes_t>& Packets);
17*7eba2f3bSAndroid Build Coastguard Worker extern void Type4_Fuzz(uint8_t SubType, const std::vector<bytes_t>& Packets);
18*7eba2f3bSAndroid Build Coastguard Worker extern void Type5_Fuzz(uint8_t SubType, const std::vector<bytes_t>& Packets);
19*7eba2f3bSAndroid Build Coastguard Worker extern void Mfc_Fuzz(uint8_t SubType, const std::vector<bytes_t>& Packets);
20*7eba2f3bSAndroid Build Coastguard Worker
Fuzz_FixPackets(std::vector<bytes_t> & Packets,uint Seed)21*7eba2f3bSAndroid Build Coastguard Worker void Fuzz_FixPackets(std::vector<bytes_t>& Packets, uint Seed) {
22*7eba2f3bSAndroid Build Coastguard Worker if (Packets.size() < 2) {
23*7eba2f3bSAndroid Build Coastguard Worker // At least two packets, first one is the control packet
24*7eba2f3bSAndroid Build Coastguard Worker Packets.resize(2);
25*7eba2f3bSAndroid Build Coastguard Worker }
26*7eba2f3bSAndroid Build Coastguard Worker
27*7eba2f3bSAndroid Build Coastguard Worker auto& ctrl = Packets[0];
28*7eba2f3bSAndroid Build Coastguard Worker if (ctrl.size() != 2) {
29*7eba2f3bSAndroid Build Coastguard Worker ctrl.resize(2);
30*7eba2f3bSAndroid Build Coastguard Worker ctrl[0] = (Seed >> 16) & 0xFF;
31*7eba2f3bSAndroid Build Coastguard Worker ctrl[1] = (Seed >> 24) & 0xFF;
32*7eba2f3bSAndroid Build Coastguard Worker }
33*7eba2f3bSAndroid Build Coastguard Worker
34*7eba2f3bSAndroid Build Coastguard Worker uint8_t FuzzType = ctrl[0] % Fuzz_TypeMax;
35*7eba2f3bSAndroid Build Coastguard Worker uint8_t FuzzSubType = ctrl[1];
36*7eba2f3bSAndroid Build Coastguard Worker
37*7eba2f3bSAndroid Build Coastguard Worker switch (FuzzType) {
38*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Type1:
39*7eba2f3bSAndroid Build Coastguard Worker Type1_FixPackets(FuzzSubType, Packets);
40*7eba2f3bSAndroid Build Coastguard Worker break;
41*7eba2f3bSAndroid Build Coastguard Worker
42*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Type2:
43*7eba2f3bSAndroid Build Coastguard Worker Type2_FixPackets(FuzzSubType, Packets);
44*7eba2f3bSAndroid Build Coastguard Worker break;
45*7eba2f3bSAndroid Build Coastguard Worker
46*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Type3:
47*7eba2f3bSAndroid Build Coastguard Worker Type3_FixPackets(FuzzSubType, Packets);
48*7eba2f3bSAndroid Build Coastguard Worker break;
49*7eba2f3bSAndroid Build Coastguard Worker
50*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Type4:
51*7eba2f3bSAndroid Build Coastguard Worker Type4_FixPackets(FuzzSubType, Packets);
52*7eba2f3bSAndroid Build Coastguard Worker break;
53*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Type5:
54*7eba2f3bSAndroid Build Coastguard Worker Type5_FixPackets(FuzzSubType, Packets);
55*7eba2f3bSAndroid Build Coastguard Worker break;
56*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Mfc:
57*7eba2f3bSAndroid Build Coastguard Worker Mfc_FixPackets(FuzzSubType, Packets);
58*7eba2f3bSAndroid Build Coastguard Worker break;
59*7eba2f3bSAndroid Build Coastguard Worker
60*7eba2f3bSAndroid Build Coastguard Worker default:
61*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG("Unknown fuzz type %hhu", FuzzType);
62*7eba2f3bSAndroid Build Coastguard Worker break;
63*7eba2f3bSAndroid Build Coastguard Worker }
64*7eba2f3bSAndroid Build Coastguard Worker }
65*7eba2f3bSAndroid Build Coastguard Worker
Fuzz_RunPackets(const std::vector<bytes_t> & Packets)66*7eba2f3bSAndroid Build Coastguard Worker void Fuzz_RunPackets(const std::vector<bytes_t>& Packets) {
67*7eba2f3bSAndroid Build Coastguard Worker if (Packets.size() < 2) {
68*7eba2f3bSAndroid Build Coastguard Worker return;
69*7eba2f3bSAndroid Build Coastguard Worker }
70*7eba2f3bSAndroid Build Coastguard Worker
71*7eba2f3bSAndroid Build Coastguard Worker auto& ctrl = Packets[0];
72*7eba2f3bSAndroid Build Coastguard Worker if (ctrl.size() < 2) {
73*7eba2f3bSAndroid Build Coastguard Worker return;
74*7eba2f3bSAndroid Build Coastguard Worker }
75*7eba2f3bSAndroid Build Coastguard Worker
76*7eba2f3bSAndroid Build Coastguard Worker uint8_t FuzzType = ctrl[0] % Fuzz_TypeMax;
77*7eba2f3bSAndroid Build Coastguard Worker uint8_t FuzzSubType = ctrl[1];
78*7eba2f3bSAndroid Build Coastguard Worker
79*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG("Fuzzing Type%u tag", (uint)(FuzzType + 1));
80*7eba2f3bSAndroid Build Coastguard Worker
81*7eba2f3bSAndroid Build Coastguard Worker switch (FuzzType) {
82*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Type1:
83*7eba2f3bSAndroid Build Coastguard Worker Type1_Fuzz(FuzzSubType, Packets);
84*7eba2f3bSAndroid Build Coastguard Worker break;
85*7eba2f3bSAndroid Build Coastguard Worker
86*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Type2:
87*7eba2f3bSAndroid Build Coastguard Worker Type2_Fuzz(FuzzSubType, Packets);
88*7eba2f3bSAndroid Build Coastguard Worker break;
89*7eba2f3bSAndroid Build Coastguard Worker
90*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Type3:
91*7eba2f3bSAndroid Build Coastguard Worker Type3_Fuzz(FuzzSubType, Packets);
92*7eba2f3bSAndroid Build Coastguard Worker break;
93*7eba2f3bSAndroid Build Coastguard Worker
94*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Type4:
95*7eba2f3bSAndroid Build Coastguard Worker Type4_Fuzz(FuzzSubType, Packets);
96*7eba2f3bSAndroid Build Coastguard Worker break;
97*7eba2f3bSAndroid Build Coastguard Worker
98*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Type5:
99*7eba2f3bSAndroid Build Coastguard Worker Type5_Fuzz(FuzzSubType, Packets);
100*7eba2f3bSAndroid Build Coastguard Worker break;
101*7eba2f3bSAndroid Build Coastguard Worker
102*7eba2f3bSAndroid Build Coastguard Worker case Fuzz_Mfc:
103*7eba2f3bSAndroid Build Coastguard Worker Mfc_Fuzz(FuzzSubType, Packets);
104*7eba2f3bSAndroid Build Coastguard Worker break;
105*7eba2f3bSAndroid Build Coastguard Worker
106*7eba2f3bSAndroid Build Coastguard Worker default:
107*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG("Unknown fuzz type: %hhu", FuzzType);
108*7eba2f3bSAndroid Build Coastguard Worker break;
109*7eba2f3bSAndroid Build Coastguard Worker }
110*7eba2f3bSAndroid Build Coastguard Worker }
111