xref: /aosp_15_r20/system/nfc/src/fuzzers/rw/t3t.cc (revision 7eba2f3b06c51ae21384f6a4f14577b668a869b3)
1*7eba2f3bSAndroid Build Coastguard Worker #include "fuzz.h"
2*7eba2f3bSAndroid Build Coastguard Worker 
3*7eba2f3bSAndroid Build Coastguard Worker #define MODULE_NAME "Type3 Read/Write"
4*7eba2f3bSAndroid Build Coastguard Worker 
5*7eba2f3bSAndroid Build Coastguard Worker enum {
6*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_CHECK_NDEF,
7*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_UPDATE_NDEF,
8*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_CHECK,
9*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_UPDATE,
10*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_SEND_RAW_FRAME,
11*7eba2f3bSAndroid Build Coastguard Worker 
12*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_NCI_CMD_FIRST,
13*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_DETECT_NDEF = SUB_TYPE_NCI_CMD_FIRST,
14*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_PRESENCE_CHECK,
15*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_POLL,
16*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_GET_SYSTEM_CODES,
17*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_FORMAT_NDEF,
18*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_SET_READ_ONLY_SOFT,
19*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_SET_READ_ONLY_HARD,
20*7eba2f3bSAndroid Build Coastguard Worker 
21*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_MAX
22*7eba2f3bSAndroid Build Coastguard Worker };
23*7eba2f3bSAndroid Build Coastguard Worker 
24*7eba2f3bSAndroid Build Coastguard Worker // The following definition are copied from rw_t3t.cc
25*7eba2f3bSAndroid Build Coastguard Worker // ============================================================================
26*7eba2f3bSAndroid Build Coastguard Worker 
27*7eba2f3bSAndroid Build Coastguard Worker /* Default NDEF attribute information block (used when formatting Felica-Lite
28*7eba2f3bSAndroid Build Coastguard Worker  * tags) */
29*7eba2f3bSAndroid Build Coastguard Worker /* NBr (max block reads per cmd)*/
30*7eba2f3bSAndroid Build Coastguard Worker #define RW_T3T_DEFAULT_FELICALITE_NBR 4
31*7eba2f3bSAndroid Build Coastguard Worker /* NBw (max block write per cmd)*/
32*7eba2f3bSAndroid Build Coastguard Worker #define RW_T3T_DEFAULT_FELICALITE_NBW 1
33*7eba2f3bSAndroid Build Coastguard Worker #define RW_T3T_DEFAULT_FELICALITE_NMAXB (T3T_FELICALITE_NMAXB)
34*7eba2f3bSAndroid Build Coastguard Worker #define RW_T3T_DEFAULT_FELICALITE_ATTRIB_INFO_CHECKSUM                       \
35*7eba2f3bSAndroid Build Coastguard Worker   ((T3T_MSG_NDEF_VERSION + RW_T3T_DEFAULT_FELICALITE_NBR +                   \
36*7eba2f3bSAndroid Build Coastguard Worker     RW_T3T_DEFAULT_FELICALITE_NBW + (RW_T3T_DEFAULT_FELICALITE_NMAXB >> 8) + \
37*7eba2f3bSAndroid Build Coastguard Worker     (RW_T3T_DEFAULT_FELICALITE_NMAXB & 0xFF) + T3T_MSG_NDEF_WRITEF_OFF +     \
38*7eba2f3bSAndroid Build Coastguard Worker     T3T_MSG_NDEF_RWFLAG_RW) &                                                \
39*7eba2f3bSAndroid Build Coastguard Worker    0xFFFF)
40*7eba2f3bSAndroid Build Coastguard Worker // ============================================================================
41*7eba2f3bSAndroid Build Coastguard Worker 
rw_cback(tRW_EVENT event,tRW_DATA * p_rw_data)42*7eba2f3bSAndroid Build Coastguard Worker static void rw_cback(tRW_EVENT event, tRW_DATA* p_rw_data) {
43*7eba2f3bSAndroid Build Coastguard Worker   FUZZLOG(MODULE_NAME ": rw_cback: event=0x%02x, p_rw_data=%p", event,
44*7eba2f3bSAndroid Build Coastguard Worker           p_rw_data);
45*7eba2f3bSAndroid Build Coastguard Worker 
46*7eba2f3bSAndroid Build Coastguard Worker   if (event == RW_T3T_RAW_FRAME_EVT) {
47*7eba2f3bSAndroid Build Coastguard Worker     if (p_rw_data->data.p_data) {
48*7eba2f3bSAndroid Build Coastguard Worker       GKI_freebuf(p_rw_data->data.p_data);
49*7eba2f3bSAndroid Build Coastguard Worker       p_rw_data->data.p_data = nullptr;
50*7eba2f3bSAndroid Build Coastguard Worker     }
51*7eba2f3bSAndroid Build Coastguard Worker   }
52*7eba2f3bSAndroid Build Coastguard Worker }
53*7eba2f3bSAndroid Build Coastguard Worker 
54*7eba2f3bSAndroid Build Coastguard Worker #define TEST_NFCID_VALUE \
55*7eba2f3bSAndroid Build Coastguard Worker   { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 }
56*7eba2f3bSAndroid Build Coastguard Worker const uint8_t TEST_NFCID[] = TEST_NFCID_VALUE;
57*7eba2f3bSAndroid Build Coastguard Worker 
Init(Fuzz_Context &)58*7eba2f3bSAndroid Build Coastguard Worker static bool Init(Fuzz_Context& /*ctx*/) {
59*7eba2f3bSAndroid Build Coastguard Worker   tNFC_ACTIVATE_DEVT activate_params = {
60*7eba2f3bSAndroid Build Coastguard Worker       .protocol = NFC_PROTOCOL_T3T,
61*7eba2f3bSAndroid Build Coastguard Worker       .rf_tech_param = {.mode = NFC_DISCOVERY_TYPE_POLL_F,
62*7eba2f3bSAndroid Build Coastguard Worker                         .param = {.pf = {
63*7eba2f3bSAndroid Build Coastguard Worker                                       .nfcid2 = TEST_NFCID_VALUE,
64*7eba2f3bSAndroid Build Coastguard Worker                                       .bit_rate = NFC_BIT_RATE_212,
65*7eba2f3bSAndroid Build Coastguard Worker                                       .sensf_res_len = NFC_MAX_SENSF_RES_LEN,
66*7eba2f3bSAndroid Build Coastguard Worker                                       .mrti_check = 1,
67*7eba2f3bSAndroid Build Coastguard Worker                                       .mrti_update = 1,
68*7eba2f3bSAndroid Build Coastguard Worker                                   }}}};
69*7eba2f3bSAndroid Build Coastguard Worker 
70*7eba2f3bSAndroid Build Coastguard Worker   rw_init();
71*7eba2f3bSAndroid Build Coastguard Worker   if (NFC_STATUS_OK != RW_SetActivatedTagType(&activate_params, rw_cback)) {
72*7eba2f3bSAndroid Build Coastguard Worker     FUZZLOG(MODULE_NAME ": RW_SetActivatedTagType failed");
73*7eba2f3bSAndroid Build Coastguard Worker     return false;
74*7eba2f3bSAndroid Build Coastguard Worker   }
75*7eba2f3bSAndroid Build Coastguard Worker 
76*7eba2f3bSAndroid Build Coastguard Worker   // A workaround to initialize Type3 tag attribute
77*7eba2f3bSAndroid Build Coastguard Worker   tRW_T3T_DETECT t3t_detect = {
78*7eba2f3bSAndroid Build Coastguard Worker       NFC_STATUS_OK,         // tNFC_STATUS status;
79*7eba2f3bSAndroid Build Coastguard Worker       T3T_MSG_NDEF_VERSION,  // uint8_t version; /* Ver: peer version */
80*7eba2f3bSAndroid Build Coastguard Worker       RW_T3T_DEFAULT_FELICALITE_NBR,  // uint8_t
81*7eba2f3bSAndroid Build Coastguard Worker                                       // nbr; /* NBr: number of blocks that can
82*7eba2f3bSAndroid Build Coastguard Worker                                       // be read using one Check command */
83*7eba2f3bSAndroid Build Coastguard Worker       RW_T3T_DEFAULT_FELICALITE_NBW,  // uint8_t nbw;    /* Nbw: number of
84*7eba2f3bSAndroid Build Coastguard Worker                                       // blocks that can be written using one
85*7eba2f3bSAndroid Build Coastguard Worker                                       // Update command */
86*7eba2f3bSAndroid Build Coastguard Worker       RW_T3T_DEFAULT_FELICALITE_NMAXB,  // uint16_t nmaxb; /* Nmaxb: maximum
87*7eba2f3bSAndroid Build Coastguard Worker                                         // number of blocks available for NDEF
88*7eba2f3bSAndroid Build Coastguard Worker                                         // data */
89*7eba2f3bSAndroid Build Coastguard Worker       T3T_MSG_NDEF_WRITEF_OFF,  // uint8_t writef; /* WriteFlag: 00h if writing
90*7eba2f3bSAndroid Build Coastguard Worker                                 // data finished; 0Fh if writing data in
91*7eba2f3bSAndroid Build Coastguard Worker                                 // progress */
92*7eba2f3bSAndroid Build Coastguard Worker       T3T_MSG_NDEF_RWFLAG_RW,   // uint8_t
93*7eba2f3bSAndroid Build Coastguard Worker                                // rwflag;  /* RWFlag: 00h NDEF is read-only; 01h
94*7eba2f3bSAndroid Build Coastguard Worker                                // if read/write available */
95*7eba2f3bSAndroid Build Coastguard Worker       0x100 * 16,  // uint32_t ln; /* Ln: actual size of stored NDEF data (in
96*7eba2f3bSAndroid Build Coastguard Worker                    // bytes) */
97*7eba2f3bSAndroid Build Coastguard Worker   };
98*7eba2f3bSAndroid Build Coastguard Worker 
99*7eba2f3bSAndroid Build Coastguard Worker   tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t;
100*7eba2f3bSAndroid Build Coastguard Worker   memcpy(&p_cb->ndef_attrib, &t3t_detect, sizeof(t3t_detect));
101*7eba2f3bSAndroid Build Coastguard Worker 
102*7eba2f3bSAndroid Build Coastguard Worker   // workaround of issue b/139424089
103*7eba2f3bSAndroid Build Coastguard Worker   p_cb->p_cur_cmd_buf->offset = 1;
104*7eba2f3bSAndroid Build Coastguard Worker   p_cb->p_cur_cmd_buf->len = 0;
105*7eba2f3bSAndroid Build Coastguard Worker   return true;
106*7eba2f3bSAndroid Build Coastguard Worker }
107*7eba2f3bSAndroid Build Coastguard Worker 
Init_CheckNDef(Fuzz_Context &)108*7eba2f3bSAndroid Build Coastguard Worker static bool Init_CheckNDef(Fuzz_Context& /*ctx*/) {
109*7eba2f3bSAndroid Build Coastguard Worker   return NFC_STATUS_OK == RW_T3tCheckNDef();
110*7eba2f3bSAndroid Build Coastguard Worker }
111*7eba2f3bSAndroid Build Coastguard Worker 
Init_UpdateNDef(Fuzz_Context & ctx)112*7eba2f3bSAndroid Build Coastguard Worker static bool Init_UpdateNDef(Fuzz_Context& ctx) {
113*7eba2f3bSAndroid Build Coastguard Worker   const uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04,
114*7eba2f3bSAndroid Build Coastguard Worker                           0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04};
115*7eba2f3bSAndroid Build Coastguard Worker 
116*7eba2f3bSAndroid Build Coastguard Worker   auto scratch = ctx.GetBuffer(sizeof(data), data);
117*7eba2f3bSAndroid Build Coastguard Worker   return NFC_STATUS_OK == RW_T3tUpdateNDef(sizeof(data), scratch);
118*7eba2f3bSAndroid Build Coastguard Worker }
119*7eba2f3bSAndroid Build Coastguard Worker 
Init_Check(Fuzz_Context &)120*7eba2f3bSAndroid Build Coastguard Worker static bool Init_Check(Fuzz_Context& /*ctx*/) {
121*7eba2f3bSAndroid Build Coastguard Worker   tT3T_BLOCK_DESC t3t_blocks = {0x000B, 5};
122*7eba2f3bSAndroid Build Coastguard Worker   return NFC_STATUS_OK == RW_T3tCheck(1, &t3t_blocks);
123*7eba2f3bSAndroid Build Coastguard Worker }
124*7eba2f3bSAndroid Build Coastguard Worker 
Init_Update(Fuzz_Context & ctx)125*7eba2f3bSAndroid Build Coastguard Worker static bool Init_Update(Fuzz_Context& ctx) {
126*7eba2f3bSAndroid Build Coastguard Worker   const uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04,
127*7eba2f3bSAndroid Build Coastguard Worker                           0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04};
128*7eba2f3bSAndroid Build Coastguard Worker   auto scratch = ctx.GetBuffer(sizeof(data), data);
129*7eba2f3bSAndroid Build Coastguard Worker   tT3T_BLOCK_DESC t3t_blocks = {0x000B, 5};
130*7eba2f3bSAndroid Build Coastguard Worker   return NFC_STATUS_OK == RW_T3tUpdate(1, &t3t_blocks, scratch);
131*7eba2f3bSAndroid Build Coastguard Worker }
132*7eba2f3bSAndroid Build Coastguard Worker 
Init_SendRawFrame(Fuzz_Context &)133*7eba2f3bSAndroid Build Coastguard Worker static bool Init_SendRawFrame(Fuzz_Context& /*ctx*/) {
134*7eba2f3bSAndroid Build Coastguard Worker   uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04,
135*7eba2f3bSAndroid Build Coastguard Worker                     0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04};
136*7eba2f3bSAndroid Build Coastguard Worker 
137*7eba2f3bSAndroid Build Coastguard Worker   return NFC_STATUS_OK == RW_T3tSendRawFrame(sizeof(data), data);
138*7eba2f3bSAndroid Build Coastguard Worker }
139*7eba2f3bSAndroid Build Coastguard Worker 
Init_DetectNDef(Fuzz_Context &)140*7eba2f3bSAndroid Build Coastguard Worker static bool Init_DetectNDef(Fuzz_Context& /*ctx*/) {
141*7eba2f3bSAndroid Build Coastguard Worker   return NFC_STATUS_OK == RW_T3tDetectNDef();
142*7eba2f3bSAndroid Build Coastguard Worker }
143*7eba2f3bSAndroid Build Coastguard Worker 
Init_PresenceCheck(Fuzz_Context &)144*7eba2f3bSAndroid Build Coastguard Worker static bool Init_PresenceCheck(Fuzz_Context& /*ctx*/) {
145*7eba2f3bSAndroid Build Coastguard Worker   return NFC_STATUS_OK == RW_T3tPresenceCheck();
146*7eba2f3bSAndroid Build Coastguard Worker }
147*7eba2f3bSAndroid Build Coastguard Worker 
Init_Poll(Fuzz_Context &)148*7eba2f3bSAndroid Build Coastguard Worker static bool Init_Poll(Fuzz_Context& /*ctx*/) {
149*7eba2f3bSAndroid Build Coastguard Worker   return NFC_STATUS_OK == RW_T3tPoll(0, 1, 0);
150*7eba2f3bSAndroid Build Coastguard Worker }
151*7eba2f3bSAndroid Build Coastguard Worker 
Init_GetSystemCode(Fuzz_Context &)152*7eba2f3bSAndroid Build Coastguard Worker static bool Init_GetSystemCode(Fuzz_Context& /*ctx*/) {
153*7eba2f3bSAndroid Build Coastguard Worker   return NFC_STATUS_OK == RW_T3tGetSystemCodes();
154*7eba2f3bSAndroid Build Coastguard Worker }
155*7eba2f3bSAndroid Build Coastguard Worker 
Init_FormatNDef(Fuzz_Context &)156*7eba2f3bSAndroid Build Coastguard Worker static bool Init_FormatNDef(Fuzz_Context& /*ctx*/) {
157*7eba2f3bSAndroid Build Coastguard Worker   return NFC_STATUS_OK == RW_T3tFormatNDef();
158*7eba2f3bSAndroid Build Coastguard Worker }
159*7eba2f3bSAndroid Build Coastguard Worker 
Init_SetReadonly(Fuzz_Context &)160*7eba2f3bSAndroid Build Coastguard Worker static bool Init_SetReadonly(Fuzz_Context& /*ctx*/) {
161*7eba2f3bSAndroid Build Coastguard Worker   return NFC_STATUS_OK == RW_T3tSetReadOnly(true);
162*7eba2f3bSAndroid Build Coastguard Worker }
163*7eba2f3bSAndroid Build Coastguard Worker 
Fuzz_Init(Fuzz_Context & ctx)164*7eba2f3bSAndroid Build Coastguard Worker static bool Fuzz_Init(Fuzz_Context& ctx) {
165*7eba2f3bSAndroid Build Coastguard Worker   if (!Init(ctx)) {
166*7eba2f3bSAndroid Build Coastguard Worker     FUZZLOG(MODULE_NAME ": initialization failed");
167*7eba2f3bSAndroid Build Coastguard Worker     return false;
168*7eba2f3bSAndroid Build Coastguard Worker   }
169*7eba2f3bSAndroid Build Coastguard Worker 
170*7eba2f3bSAndroid Build Coastguard Worker   bool result = false;
171*7eba2f3bSAndroid Build Coastguard Worker   switch (ctx.SubType) {
172*7eba2f3bSAndroid Build Coastguard Worker     case SUB_TYPE_CHECK_NDEF:
173*7eba2f3bSAndroid Build Coastguard Worker       result = Init_CheckNDef(ctx);
174*7eba2f3bSAndroid Build Coastguard Worker       break;
175*7eba2f3bSAndroid Build Coastguard Worker     case SUB_TYPE_UPDATE_NDEF:
176*7eba2f3bSAndroid Build Coastguard Worker       result = Init_UpdateNDef(ctx);
177*7eba2f3bSAndroid Build Coastguard Worker       break;
178*7eba2f3bSAndroid Build Coastguard Worker     case SUB_TYPE_CHECK:
179*7eba2f3bSAndroid Build Coastguard Worker       result = Init_Check(ctx);
180*7eba2f3bSAndroid Build Coastguard Worker       break;
181*7eba2f3bSAndroid Build Coastguard Worker     case SUB_TYPE_UPDATE:
182*7eba2f3bSAndroid Build Coastguard Worker       result = Init_Update(ctx);
183*7eba2f3bSAndroid Build Coastguard Worker       break;
184*7eba2f3bSAndroid Build Coastguard Worker     case SUB_TYPE_SEND_RAW_FRAME:
185*7eba2f3bSAndroid Build Coastguard Worker       result = Init_SendRawFrame(ctx);
186*7eba2f3bSAndroid Build Coastguard Worker       break;
187*7eba2f3bSAndroid Build Coastguard Worker     case SUB_TYPE_DETECT_NDEF:
188*7eba2f3bSAndroid Build Coastguard Worker       result = Init_DetectNDef(ctx);
189*7eba2f3bSAndroid Build Coastguard Worker       break;
190*7eba2f3bSAndroid Build Coastguard Worker     case SUB_TYPE_PRESENCE_CHECK:
191*7eba2f3bSAndroid Build Coastguard Worker       result = Init_PresenceCheck(ctx);
192*7eba2f3bSAndroid Build Coastguard Worker       break;
193*7eba2f3bSAndroid Build Coastguard Worker     case SUB_TYPE_POLL:
194*7eba2f3bSAndroid Build Coastguard Worker       result = Init_Poll(ctx);
195*7eba2f3bSAndroid Build Coastguard Worker       break;
196*7eba2f3bSAndroid Build Coastguard Worker     case SUB_TYPE_GET_SYSTEM_CODES:
197*7eba2f3bSAndroid Build Coastguard Worker       result = Init_GetSystemCode(ctx);
198*7eba2f3bSAndroid Build Coastguard Worker       break;
199*7eba2f3bSAndroid Build Coastguard Worker     case SUB_TYPE_FORMAT_NDEF:
200*7eba2f3bSAndroid Build Coastguard Worker       result = Init_FormatNDef(ctx);
201*7eba2f3bSAndroid Build Coastguard Worker       break;
202*7eba2f3bSAndroid Build Coastguard Worker     case SUB_TYPE_SET_READ_ONLY_SOFT:
203*7eba2f3bSAndroid Build Coastguard Worker     case SUB_TYPE_SET_READ_ONLY_HARD:
204*7eba2f3bSAndroid Build Coastguard Worker       result = Init_SetReadonly(ctx);
205*7eba2f3bSAndroid Build Coastguard Worker       break;
206*7eba2f3bSAndroid Build Coastguard Worker     default:
207*7eba2f3bSAndroid Build Coastguard Worker       FUZZLOG(MODULE_NAME ": Unknown command %d", ctx.SubType);
208*7eba2f3bSAndroid Build Coastguard Worker       result = false;
209*7eba2f3bSAndroid Build Coastguard Worker       break;
210*7eba2f3bSAndroid Build Coastguard Worker   }
211*7eba2f3bSAndroid Build Coastguard Worker 
212*7eba2f3bSAndroid Build Coastguard Worker   if (!result) {
213*7eba2f3bSAndroid Build Coastguard Worker     FUZZLOG(MODULE_NAME ": Initializing command %02X failed", ctx.SubType);
214*7eba2f3bSAndroid Build Coastguard Worker   }
215*7eba2f3bSAndroid Build Coastguard Worker 
216*7eba2f3bSAndroid Build Coastguard Worker   return result;
217*7eba2f3bSAndroid Build Coastguard Worker }
218*7eba2f3bSAndroid Build Coastguard Worker 
Fuzz_Deinit(Fuzz_Context &)219*7eba2f3bSAndroid Build Coastguard Worker static void Fuzz_Deinit(Fuzz_Context& /*ctx*/) {
220*7eba2f3bSAndroid Build Coastguard Worker   if (rf_cback) {
221*7eba2f3bSAndroid Build Coastguard Worker     tNFC_CONN conn = {
222*7eba2f3bSAndroid Build Coastguard Worker         .deactivate = {.status = NFC_STATUS_OK,
223*7eba2f3bSAndroid Build Coastguard Worker                        .type = NFC_DEACTIVATE_TYPE_IDLE,
224*7eba2f3bSAndroid Build Coastguard Worker                        .is_ntf = true,
225*7eba2f3bSAndroid Build Coastguard Worker                        .reason = NFC_DEACTIVATE_REASON_DH_REQ_FAILED}};
226*7eba2f3bSAndroid Build Coastguard Worker 
227*7eba2f3bSAndroid Build Coastguard Worker     rf_cback(NFC_RF_CONN_ID, NFC_DEACTIVATE_CEVT, &conn);
228*7eba2f3bSAndroid Build Coastguard Worker   }
229*7eba2f3bSAndroid Build Coastguard Worker }
230*7eba2f3bSAndroid Build Coastguard Worker 
t3t_nci_msg(NFC_HDR * p_msg)231*7eba2f3bSAndroid Build Coastguard Worker static void t3t_nci_msg(NFC_HDR* p_msg) {
232*7eba2f3bSAndroid Build Coastguard Worker   uint8_t status;
233*7eba2f3bSAndroid Build Coastguard Worker   uint8_t num_responses;
234*7eba2f3bSAndroid Build Coastguard Worker 
235*7eba2f3bSAndroid Build Coastguard Worker   uint8_t* p = (uint8_t*)(p_msg + 1) + p_msg->offset;
236*7eba2f3bSAndroid Build Coastguard Worker   uint8_t plen = p_msg->len;
237*7eba2f3bSAndroid Build Coastguard Worker 
238*7eba2f3bSAndroid Build Coastguard Worker   if (plen >= 2) {
239*7eba2f3bSAndroid Build Coastguard Worker     /* Pass result to RW_T3T for processing */
240*7eba2f3bSAndroid Build Coastguard Worker     STREAM_TO_UINT8(status, p);
241*7eba2f3bSAndroid Build Coastguard Worker     STREAM_TO_UINT8(num_responses, p);
242*7eba2f3bSAndroid Build Coastguard Worker     plen -= NFC_TL_SIZE;
243*7eba2f3bSAndroid Build Coastguard Worker     rw_t3t_handle_nci_poll_ntf(status, num_responses, (uint8_t)plen, p);
244*7eba2f3bSAndroid Build Coastguard Worker   }
245*7eba2f3bSAndroid Build Coastguard Worker 
246*7eba2f3bSAndroid Build Coastguard Worker   GKI_freebuf(p_msg);
247*7eba2f3bSAndroid Build Coastguard Worker }
248*7eba2f3bSAndroid Build Coastguard Worker 
t3t_data_msg(NFC_HDR * p_msg)249*7eba2f3bSAndroid Build Coastguard Worker static void t3t_data_msg(NFC_HDR* p_msg) {
250*7eba2f3bSAndroid Build Coastguard Worker   tNFC_CONN conn = {.data = {
251*7eba2f3bSAndroid Build Coastguard Worker                         .status = NFC_STATUS_OK,
252*7eba2f3bSAndroid Build Coastguard Worker                         .p_data = p_msg,
253*7eba2f3bSAndroid Build Coastguard Worker                     }};
254*7eba2f3bSAndroid Build Coastguard Worker   if (p_msg->len < 1) {
255*7eba2f3bSAndroid Build Coastguard Worker     FUZZLOG(MODULE_NAME ": Ivalid message length=%hu", p_msg->len);
256*7eba2f3bSAndroid Build Coastguard Worker     return;
257*7eba2f3bSAndroid Build Coastguard Worker   }
258*7eba2f3bSAndroid Build Coastguard Worker   p_msg->len--;
259*7eba2f3bSAndroid Build Coastguard Worker 
260*7eba2f3bSAndroid Build Coastguard Worker   rf_cback(NFC_RF_CONN_ID, NFC_DATA_CEVT, &conn);
261*7eba2f3bSAndroid Build Coastguard Worker }
262*7eba2f3bSAndroid Build Coastguard Worker 
Fuzz_Run(Fuzz_Context & ctx)263*7eba2f3bSAndroid Build Coastguard Worker static void Fuzz_Run(Fuzz_Context& ctx) {
264*7eba2f3bSAndroid Build Coastguard Worker   for (auto it = ctx.Data.cbegin() + 1; it != ctx.Data.cend(); ++it) {
265*7eba2f3bSAndroid Build Coastguard Worker     NFC_HDR* p_msg;
266*7eba2f3bSAndroid Build Coastguard Worker     p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR) + it->size());
267*7eba2f3bSAndroid Build Coastguard Worker     if (p_msg == nullptr) {
268*7eba2f3bSAndroid Build Coastguard Worker       FUZZLOG(MODULE_NAME ": GKI_getbuf returns null, size=%zu", it->size());
269*7eba2f3bSAndroid Build Coastguard Worker       return;
270*7eba2f3bSAndroid Build Coastguard Worker     }
271*7eba2f3bSAndroid Build Coastguard Worker 
272*7eba2f3bSAndroid Build Coastguard Worker     /* Initialize NFC_HDR */
273*7eba2f3bSAndroid Build Coastguard Worker     p_msg->len = it->size();
274*7eba2f3bSAndroid Build Coastguard Worker     p_msg->offset = 0;
275*7eba2f3bSAndroid Build Coastguard Worker 
276*7eba2f3bSAndroid Build Coastguard Worker     uint8_t* p = (uint8_t*)(p_msg + 1) + p_msg->offset;
277*7eba2f3bSAndroid Build Coastguard Worker     memcpy(p, it->data(), it->size());
278*7eba2f3bSAndroid Build Coastguard Worker 
279*7eba2f3bSAndroid Build Coastguard Worker     FUZZLOG(MODULE_NAME ": SubType=%02X, Response[%zd/%zd]=%s", ctx.SubType,
280*7eba2f3bSAndroid Build Coastguard Worker             it - ctx.Data.cbegin(), ctx.Data.size() - 1,
281*7eba2f3bSAndroid Build Coastguard Worker             BytesToHex(*it).c_str());
282*7eba2f3bSAndroid Build Coastguard Worker 
283*7eba2f3bSAndroid Build Coastguard Worker     if (ctx.SubType >= SUB_TYPE_NCI_CMD_FIRST) {
284*7eba2f3bSAndroid Build Coastguard Worker       t3t_nci_msg(p_msg);
285*7eba2f3bSAndroid Build Coastguard Worker     } else {
286*7eba2f3bSAndroid Build Coastguard Worker       t3t_data_msg(p_msg);
287*7eba2f3bSAndroid Build Coastguard Worker     }
288*7eba2f3bSAndroid Build Coastguard Worker   }
289*7eba2f3bSAndroid Build Coastguard Worker }
290*7eba2f3bSAndroid Build Coastguard Worker 
Type3_FixPackets(uint8_t SubType,std::vector<bytes_t> & Packets)291*7eba2f3bSAndroid Build Coastguard Worker void Type3_FixPackets(uint8_t SubType, std::vector<bytes_t>& Packets) {
292*7eba2f3bSAndroid Build Coastguard Worker   for (auto it = Packets.begin() + 1; it != Packets.end(); ++it) {
293*7eba2f3bSAndroid Build Coastguard Worker     if (SubType >= SUB_TYPE_NCI_CMD_FIRST) {
294*7eba2f3bSAndroid Build Coastguard Worker       if (it->size() < 3) {
295*7eba2f3bSAndroid Build Coastguard Worker         it->resize(3);
296*7eba2f3bSAndroid Build Coastguard Worker         memset(it->data(), 0, it->size());
297*7eba2f3bSAndroid Build Coastguard Worker       }
298*7eba2f3bSAndroid Build Coastguard Worker     } else {
299*7eba2f3bSAndroid Build Coastguard Worker       if (it->size() <= T3T_MSG_RSP_COMMON_HDR_LEN) {
300*7eba2f3bSAndroid Build Coastguard Worker         it->resize(T3T_MSG_RSP_COMMON_HDR_LEN + 1);
301*7eba2f3bSAndroid Build Coastguard Worker         memset(it->data(), 0, it->size());
302*7eba2f3bSAndroid Build Coastguard Worker       }
303*7eba2f3bSAndroid Build Coastguard Worker 
304*7eba2f3bSAndroid Build Coastguard Worker       uint8_t* p = it->data();
305*7eba2f3bSAndroid Build Coastguard Worker       p[0] = it->size();
306*7eba2f3bSAndroid Build Coastguard Worker       p[it->size() - 1] = NFC_STATUS_OK;
307*7eba2f3bSAndroid Build Coastguard Worker 
308*7eba2f3bSAndroid Build Coastguard Worker       auto rsp = &p[1];
309*7eba2f3bSAndroid Build Coastguard Worker       rsp[T3T_MSG_RSP_OFFSET_STATUS1] = T3T_MSG_RSP_STATUS_OK;
310*7eba2f3bSAndroid Build Coastguard Worker       memcpy(&rsp[T3T_MSG_RSP_OFFSET_IDM], TEST_NFCID, sizeof(TEST_NFCID));
311*7eba2f3bSAndroid Build Coastguard Worker     }
312*7eba2f3bSAndroid Build Coastguard Worker   }
313*7eba2f3bSAndroid Build Coastguard Worker }
314*7eba2f3bSAndroid Build Coastguard Worker 
Type3_Fuzz(uint8_t SubType,const std::vector<bytes_t> & Packets)315*7eba2f3bSAndroid Build Coastguard Worker void Type3_Fuzz(uint8_t SubType, const std::vector<bytes_t>& Packets) {
316*7eba2f3bSAndroid Build Coastguard Worker   Fuzz_Context ctx(SubType % SUB_TYPE_MAX, Packets);
317*7eba2f3bSAndroid Build Coastguard Worker   if (Fuzz_Init(ctx)) {
318*7eba2f3bSAndroid Build Coastguard Worker     Fuzz_Run(ctx);
319*7eba2f3bSAndroid Build Coastguard Worker   }
320*7eba2f3bSAndroid Build Coastguard Worker   Fuzz_Deinit(ctx);
321*7eba2f3bSAndroid Build Coastguard Worker }
322