1*7eba2f3bSAndroid Build Coastguard Worker #include "fuzz.h"
2*7eba2f3bSAndroid Build Coastguard Worker
3*7eba2f3bSAndroid Build Coastguard Worker #define MODULE_NAME "Type1 Read/Write"
4*7eba2f3bSAndroid Build Coastguard Worker
5*7eba2f3bSAndroid Build Coastguard Worker enum {
6*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_PRESENCE_CHECK,
7*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_RID,
8*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_READ_ALL,
9*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_READ,
10*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_WRITE_ERASE,
11*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_WRITE_NO_ERASE,
12*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_READ_SEG,
13*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_READ_8,
14*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_WRITE_ERASE_8,
15*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_WRITE_NO_ERASE_8,
16*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_FORMAT_NDEF,
17*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_LOCATE_TLV,
18*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_READ_NDEF,
19*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_WRITE_NDEF,
20*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_SET_READONLY,
21*7eba2f3bSAndroid Build Coastguard Worker
22*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_MAX
23*7eba2f3bSAndroid Build Coastguard Worker };
24*7eba2f3bSAndroid Build Coastguard Worker
rw_cback(tRW_EVENT event,tRW_DATA * p_rw_data)25*7eba2f3bSAndroid Build Coastguard Worker static void rw_cback(tRW_EVENT event, tRW_DATA* p_rw_data) {
26*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG(MODULE_NAME ": rw_cback: event=0x%02x, p_rw_data=%p", event,
27*7eba2f3bSAndroid Build Coastguard Worker p_rw_data);
28*7eba2f3bSAndroid Build Coastguard Worker
29*7eba2f3bSAndroid Build Coastguard Worker if (event == RW_T1T_RAW_FRAME_EVT || event == RW_T1T_RID_EVT ||
30*7eba2f3bSAndroid Build Coastguard Worker event == RW_T1T_RALL_CPLT_EVT || event == RW_T1T_READ_CPLT_EVT ||
31*7eba2f3bSAndroid Build Coastguard Worker event == RW_T1T_RSEG_CPLT_EVT || event == RW_T1T_READ8_CPLT_EVT) {
32*7eba2f3bSAndroid Build Coastguard Worker if (p_rw_data->data.p_data) {
33*7eba2f3bSAndroid Build Coastguard Worker GKI_freebuf(p_rw_data->data.p_data);
34*7eba2f3bSAndroid Build Coastguard Worker p_rw_data->data.p_data = nullptr;
35*7eba2f3bSAndroid Build Coastguard Worker }
36*7eba2f3bSAndroid Build Coastguard Worker }
37*7eba2f3bSAndroid Build Coastguard Worker }
38*7eba2f3bSAndroid Build Coastguard Worker
39*7eba2f3bSAndroid Build Coastguard Worker #define TEST_NFCID_VALUE \
40*7eba2f3bSAndroid Build Coastguard Worker { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 }
41*7eba2f3bSAndroid Build Coastguard Worker
Init(Fuzz_Context &)42*7eba2f3bSAndroid Build Coastguard Worker static bool Init(Fuzz_Context& /*ctx*/) {
43*7eba2f3bSAndroid Build Coastguard Worker tNFC_ACTIVATE_DEVT activate_params = {
44*7eba2f3bSAndroid Build Coastguard Worker .protocol = NFC_PROTOCOL_T1T,
45*7eba2f3bSAndroid Build Coastguard Worker .rf_tech_param = {.mode = NFC_DISCOVERY_TYPE_POLL_A,
46*7eba2f3bSAndroid Build Coastguard Worker .param = {.pa = {
47*7eba2f3bSAndroid Build Coastguard Worker .hr = {T1T_NDEF_SUPPORTED, 0x01},
48*7eba2f3bSAndroid Build Coastguard Worker .nfcid1 = TEST_NFCID_VALUE,
49*7eba2f3bSAndroid Build Coastguard Worker }}}};
50*7eba2f3bSAndroid Build Coastguard Worker
51*7eba2f3bSAndroid Build Coastguard Worker rw_init();
52*7eba2f3bSAndroid Build Coastguard Worker if (NFC_STATUS_OK != RW_SetActivatedTagType(&activate_params, rw_cback)) {
53*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG(MODULE_NAME ": RW_SetActivatedTagType failed");
54*7eba2f3bSAndroid Build Coastguard Worker return false;
55*7eba2f3bSAndroid Build Coastguard Worker }
56*7eba2f3bSAndroid Build Coastguard Worker
57*7eba2f3bSAndroid Build Coastguard Worker return true;
58*7eba2f3bSAndroid Build Coastguard Worker }
59*7eba2f3bSAndroid Build Coastguard Worker
Init_PresenceCheck(Fuzz_Context &)60*7eba2f3bSAndroid Build Coastguard Worker static bool Init_PresenceCheck(Fuzz_Context& /*ctx*/) {
61*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tPresenceCheck();
62*7eba2f3bSAndroid Build Coastguard Worker }
63*7eba2f3bSAndroid Build Coastguard Worker
Init_Rid(Fuzz_Context &)64*7eba2f3bSAndroid Build Coastguard Worker static bool Init_Rid(Fuzz_Context& /*ctx*/) {
65*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tRid();
66*7eba2f3bSAndroid Build Coastguard Worker }
67*7eba2f3bSAndroid Build Coastguard Worker
Init_ReadAll(Fuzz_Context &)68*7eba2f3bSAndroid Build Coastguard Worker static bool Init_ReadAll(Fuzz_Context& /*ctx*/) {
69*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tReadAll();
70*7eba2f3bSAndroid Build Coastguard Worker }
71*7eba2f3bSAndroid Build Coastguard Worker
Init_Read(Fuzz_Context &)72*7eba2f3bSAndroid Build Coastguard Worker static bool Init_Read(Fuzz_Context& /*ctx*/) {
73*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tRead(0, 0x10);
74*7eba2f3bSAndroid Build Coastguard Worker }
75*7eba2f3bSAndroid Build Coastguard Worker
Init_WriteErase(Fuzz_Context &)76*7eba2f3bSAndroid Build Coastguard Worker static bool Init_WriteErase(Fuzz_Context& /*ctx*/) {
77*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tWriteErase(0, 0x10, 0x20);
78*7eba2f3bSAndroid Build Coastguard Worker }
79*7eba2f3bSAndroid Build Coastguard Worker
Init_WriteNoErase(Fuzz_Context &)80*7eba2f3bSAndroid Build Coastguard Worker static bool Init_WriteNoErase(Fuzz_Context& /*ctx*/) {
81*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tWriteNoErase(0, 0x10, 0x20);
82*7eba2f3bSAndroid Build Coastguard Worker }
83*7eba2f3bSAndroid Build Coastguard Worker
Init_ReadSeg(Fuzz_Context &)84*7eba2f3bSAndroid Build Coastguard Worker static bool Init_ReadSeg(Fuzz_Context& /*ctx*/) {
85*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tReadSeg(0);
86*7eba2f3bSAndroid Build Coastguard Worker }
87*7eba2f3bSAndroid Build Coastguard Worker
Init_Read8(Fuzz_Context &)88*7eba2f3bSAndroid Build Coastguard Worker static bool Init_Read8(Fuzz_Context& /*ctx*/) {
89*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tRead8(0);
90*7eba2f3bSAndroid Build Coastguard Worker }
91*7eba2f3bSAndroid Build Coastguard Worker
Init_WriteErase8(Fuzz_Context & ctx)92*7eba2f3bSAndroid Build Coastguard Worker static bool Init_WriteErase8(Fuzz_Context& ctx) {
93*7eba2f3bSAndroid Build Coastguard Worker const uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04,
94*7eba2f3bSAndroid Build Coastguard Worker 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04};
95*7eba2f3bSAndroid Build Coastguard Worker
96*7eba2f3bSAndroid Build Coastguard Worker auto scratch = ctx.GetBuffer(sizeof(data), data);
97*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tWriteErase8(0, scratch);
98*7eba2f3bSAndroid Build Coastguard Worker }
99*7eba2f3bSAndroid Build Coastguard Worker
Init_WriteNoErase8(Fuzz_Context & ctx)100*7eba2f3bSAndroid Build Coastguard Worker static bool Init_WriteNoErase8(Fuzz_Context& ctx) {
101*7eba2f3bSAndroid Build Coastguard Worker const uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04,
102*7eba2f3bSAndroid Build Coastguard Worker 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04};
103*7eba2f3bSAndroid Build Coastguard Worker
104*7eba2f3bSAndroid Build Coastguard Worker auto scratch = ctx.GetBuffer(sizeof(data), data);
105*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tWriteNoErase8(0, scratch);
106*7eba2f3bSAndroid Build Coastguard Worker }
107*7eba2f3bSAndroid Build Coastguard Worker
Init_FormatNdef(Fuzz_Context &)108*7eba2f3bSAndroid Build Coastguard Worker static bool Init_FormatNdef(Fuzz_Context& /*ctx*/) {
109*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tFormatNDef();
110*7eba2f3bSAndroid Build Coastguard Worker }
Init_LocateTlv(Fuzz_Context &)111*7eba2f3bSAndroid Build Coastguard Worker static bool Init_LocateTlv(Fuzz_Context& /*ctx*/) {
112*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tLocateTlv(TAG_NDEF_TLV);
113*7eba2f3bSAndroid Build Coastguard Worker }
Init_ReadNdef(Fuzz_Context & ctx)114*7eba2f3bSAndroid Build Coastguard Worker static bool Init_ReadNdef(Fuzz_Context& ctx) {
115*7eba2f3bSAndroid Build Coastguard Worker tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
116*7eba2f3bSAndroid Build Coastguard Worker p_t1t->tag_attribute = RW_T1_TAG_ATTRB_READ_WRITE;
117*7eba2f3bSAndroid Build Coastguard Worker p_t1t->ndef_msg_len = 256;
118*7eba2f3bSAndroid Build Coastguard Worker
119*7eba2f3bSAndroid Build Coastguard Worker auto scratch = ctx.GetBuffer(4096);
120*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tReadNDef(scratch, 4096);
121*7eba2f3bSAndroid Build Coastguard Worker }
Init_WriteNdef(Fuzz_Context & ctx)122*7eba2f3bSAndroid Build Coastguard Worker static bool Init_WriteNdef(Fuzz_Context& ctx) {
123*7eba2f3bSAndroid Build Coastguard Worker const uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04,
124*7eba2f3bSAndroid Build Coastguard Worker 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04};
125*7eba2f3bSAndroid Build Coastguard Worker
126*7eba2f3bSAndroid Build Coastguard Worker auto scratch = ctx.GetBuffer(sizeof(data), data);
127*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tWriteNDef(sizeof(data), scratch);
128*7eba2f3bSAndroid Build Coastguard Worker }
Init_SetReadOnly(Fuzz_Context &)129*7eba2f3bSAndroid Build Coastguard Worker static bool Init_SetReadOnly(Fuzz_Context& /*ctx*/) {
130*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T1tSetTagReadOnly(true);
131*7eba2f3bSAndroid Build Coastguard Worker }
132*7eba2f3bSAndroid Build Coastguard Worker
Fuzz_Init(Fuzz_Context & ctx)133*7eba2f3bSAndroid Build Coastguard Worker static bool Fuzz_Init(Fuzz_Context& ctx) {
134*7eba2f3bSAndroid Build Coastguard Worker if (!Init(ctx)) {
135*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG(MODULE_NAME ": initialization failed");
136*7eba2f3bSAndroid Build Coastguard Worker return false;
137*7eba2f3bSAndroid Build Coastguard Worker }
138*7eba2f3bSAndroid Build Coastguard Worker
139*7eba2f3bSAndroid Build Coastguard Worker bool result = false;
140*7eba2f3bSAndroid Build Coastguard Worker switch (ctx.SubType) {
141*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_PRESENCE_CHECK:
142*7eba2f3bSAndroid Build Coastguard Worker result = Init_PresenceCheck(ctx);
143*7eba2f3bSAndroid Build Coastguard Worker break;
144*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_RID:
145*7eba2f3bSAndroid Build Coastguard Worker result = Init_Rid(ctx);
146*7eba2f3bSAndroid Build Coastguard Worker break;
147*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_READ_ALL:
148*7eba2f3bSAndroid Build Coastguard Worker result = Init_ReadAll(ctx);
149*7eba2f3bSAndroid Build Coastguard Worker break;
150*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_READ:
151*7eba2f3bSAndroid Build Coastguard Worker result = Init_Read(ctx);
152*7eba2f3bSAndroid Build Coastguard Worker break;
153*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_WRITE_ERASE:
154*7eba2f3bSAndroid Build Coastguard Worker result = Init_WriteErase(ctx);
155*7eba2f3bSAndroid Build Coastguard Worker break;
156*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_WRITE_NO_ERASE:
157*7eba2f3bSAndroid Build Coastguard Worker result = Init_WriteNoErase(ctx);
158*7eba2f3bSAndroid Build Coastguard Worker break;
159*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_READ_SEG:
160*7eba2f3bSAndroid Build Coastguard Worker result = Init_ReadSeg(ctx);
161*7eba2f3bSAndroid Build Coastguard Worker break;
162*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_READ_8:
163*7eba2f3bSAndroid Build Coastguard Worker result = Init_Read8(ctx);
164*7eba2f3bSAndroid Build Coastguard Worker break;
165*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_WRITE_ERASE_8:
166*7eba2f3bSAndroid Build Coastguard Worker result = Init_WriteErase8(ctx);
167*7eba2f3bSAndroid Build Coastguard Worker break;
168*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_WRITE_NO_ERASE_8:
169*7eba2f3bSAndroid Build Coastguard Worker result = Init_WriteNoErase8(ctx);
170*7eba2f3bSAndroid Build Coastguard Worker break;
171*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_FORMAT_NDEF:
172*7eba2f3bSAndroid Build Coastguard Worker result = Init_FormatNdef(ctx);
173*7eba2f3bSAndroid Build Coastguard Worker break;
174*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_LOCATE_TLV:
175*7eba2f3bSAndroid Build Coastguard Worker result = Init_LocateTlv(ctx);
176*7eba2f3bSAndroid Build Coastguard Worker break;
177*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_READ_NDEF:
178*7eba2f3bSAndroid Build Coastguard Worker result = Init_ReadNdef(ctx);
179*7eba2f3bSAndroid Build Coastguard Worker break;
180*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_WRITE_NDEF:
181*7eba2f3bSAndroid Build Coastguard Worker result = Init_WriteNdef(ctx);
182*7eba2f3bSAndroid Build Coastguard Worker break;
183*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_SET_READONLY:
184*7eba2f3bSAndroid Build Coastguard Worker result = Init_SetReadOnly(ctx);
185*7eba2f3bSAndroid Build Coastguard Worker break;
186*7eba2f3bSAndroid Build Coastguard Worker
187*7eba2f3bSAndroid Build Coastguard Worker default:
188*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG(MODULE_NAME ": Unknown command %d", ctx.SubType);
189*7eba2f3bSAndroid Build Coastguard Worker result = false;
190*7eba2f3bSAndroid Build Coastguard Worker break;
191*7eba2f3bSAndroid Build Coastguard Worker }
192*7eba2f3bSAndroid Build Coastguard Worker
193*7eba2f3bSAndroid Build Coastguard Worker if (!result) {
194*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG(MODULE_NAME ": Initializing command %02X failed", ctx.SubType);
195*7eba2f3bSAndroid Build Coastguard Worker }
196*7eba2f3bSAndroid Build Coastguard Worker
197*7eba2f3bSAndroid Build Coastguard Worker return result;
198*7eba2f3bSAndroid Build Coastguard Worker }
199*7eba2f3bSAndroid Build Coastguard Worker
Fuzz_Deinit(Fuzz_Context &)200*7eba2f3bSAndroid Build Coastguard Worker static void Fuzz_Deinit(Fuzz_Context& /*ctx*/) {
201*7eba2f3bSAndroid Build Coastguard Worker if (rf_cback) {
202*7eba2f3bSAndroid Build Coastguard Worker tNFC_CONN conn = {
203*7eba2f3bSAndroid Build Coastguard Worker .deactivate = {.status = NFC_STATUS_OK,
204*7eba2f3bSAndroid Build Coastguard Worker .type = NFC_DEACTIVATE_TYPE_IDLE,
205*7eba2f3bSAndroid Build Coastguard Worker .is_ntf = true,
206*7eba2f3bSAndroid Build Coastguard Worker .reason = NFC_DEACTIVATE_REASON_DH_REQ_FAILED}};
207*7eba2f3bSAndroid Build Coastguard Worker
208*7eba2f3bSAndroid Build Coastguard Worker rf_cback(NFC_RF_CONN_ID, NFC_DEACTIVATE_CEVT, &conn);
209*7eba2f3bSAndroid Build Coastguard Worker }
210*7eba2f3bSAndroid Build Coastguard Worker }
211*7eba2f3bSAndroid Build Coastguard Worker
Fuzz_Run(Fuzz_Context & ctx)212*7eba2f3bSAndroid Build Coastguard Worker static void Fuzz_Run(Fuzz_Context& ctx) {
213*7eba2f3bSAndroid Build Coastguard Worker for (auto it = ctx.Data.cbegin() + 1; it != ctx.Data.cend(); ++it) {
214*7eba2f3bSAndroid Build Coastguard Worker NFC_HDR* p_msg;
215*7eba2f3bSAndroid Build Coastguard Worker p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR) + it->size());
216*7eba2f3bSAndroid Build Coastguard Worker if (p_msg == nullptr || it->size() < 1) {
217*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG(MODULE_NAME ": GKI_getbuf returns null, size=%zu", it->size());
218*7eba2f3bSAndroid Build Coastguard Worker return;
219*7eba2f3bSAndroid Build Coastguard Worker }
220*7eba2f3bSAndroid Build Coastguard Worker
221*7eba2f3bSAndroid Build Coastguard Worker /* Initialize NFC_HDR */
222*7eba2f3bSAndroid Build Coastguard Worker p_msg->len = it->size() - 1;
223*7eba2f3bSAndroid Build Coastguard Worker p_msg->offset = 0;
224*7eba2f3bSAndroid Build Coastguard Worker
225*7eba2f3bSAndroid Build Coastguard Worker uint8_t* p = (uint8_t*)(p_msg + 1) + p_msg->offset;
226*7eba2f3bSAndroid Build Coastguard Worker memcpy(p, it->data(), it->size());
227*7eba2f3bSAndroid Build Coastguard Worker
228*7eba2f3bSAndroid Build Coastguard Worker tNFC_CONN conn = {.data = {
229*7eba2f3bSAndroid Build Coastguard Worker .status = NFC_STATUS_OK,
230*7eba2f3bSAndroid Build Coastguard Worker .p_data = p_msg,
231*7eba2f3bSAndroid Build Coastguard Worker }};
232*7eba2f3bSAndroid Build Coastguard Worker
233*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG(MODULE_NAME ": SubType=%02X, Response[%zd/%zd]=%s", ctx.SubType,
234*7eba2f3bSAndroid Build Coastguard Worker it - ctx.Data.cbegin(), ctx.Data.size() - 1,
235*7eba2f3bSAndroid Build Coastguard Worker BytesToHex(*it).c_str());
236*7eba2f3bSAndroid Build Coastguard Worker
237*7eba2f3bSAndroid Build Coastguard Worker rf_cback(NFC_RF_CONN_ID, NFC_DATA_CEVT, &conn);
238*7eba2f3bSAndroid Build Coastguard Worker }
239*7eba2f3bSAndroid Build Coastguard Worker }
240*7eba2f3bSAndroid Build Coastguard Worker
Type1_FixPackets(uint8_t,std::vector<bytes_t> &)241*7eba2f3bSAndroid Build Coastguard Worker void Type1_FixPackets(uint8_t /*SubType*/, std::vector<bytes_t>& /*Data*/) {}
242*7eba2f3bSAndroid Build Coastguard Worker
Type1_Fuzz(uint8_t SubType,const std::vector<bytes_t> & Data)243*7eba2f3bSAndroid Build Coastguard Worker void Type1_Fuzz(uint8_t SubType, const std::vector<bytes_t>& Data) {
244*7eba2f3bSAndroid Build Coastguard Worker Fuzz_Context ctx(SubType % SUB_TYPE_MAX, Data);
245*7eba2f3bSAndroid Build Coastguard Worker if (Fuzz_Init(ctx)) {
246*7eba2f3bSAndroid Build Coastguard Worker Fuzz_Run(ctx);
247*7eba2f3bSAndroid Build Coastguard Worker }
248*7eba2f3bSAndroid Build Coastguard Worker Fuzz_Deinit(ctx);
249*7eba2f3bSAndroid Build Coastguard Worker }
250