1*7eba2f3bSAndroid Build Coastguard Worker #include "fuzz.h"
2*7eba2f3bSAndroid Build Coastguard Worker
3*7eba2f3bSAndroid Build Coastguard Worker #define MODULE_NAME "Type2 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_READ,
8*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_WRITE,
9*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_SECTOR_SELECT,
10*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_SET_TAG_READONLY,
11*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_WRITE_NDEF,
12*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_READ_NDEF,
13*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_DETECT_NDEF,
14*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_LOCATE_TLV,
15*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_FORMAT_NDEF,
16*7eba2f3bSAndroid Build Coastguard Worker SUB_TYPE_MAX
17*7eba2f3bSAndroid Build Coastguard Worker };
18*7eba2f3bSAndroid Build Coastguard Worker
rw_cback(tRW_EVENT event,tRW_DATA * p_rw_data)19*7eba2f3bSAndroid Build Coastguard Worker static void rw_cback(tRW_EVENT event, tRW_DATA* p_rw_data) {
20*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG(MODULE_NAME ": rw_cback: event=0x%02x, p_rw_data=%p", event,
21*7eba2f3bSAndroid Build Coastguard Worker p_rw_data);
22*7eba2f3bSAndroid Build Coastguard Worker
23*7eba2f3bSAndroid Build Coastguard Worker if (event == RW_T2T_READ_CPLT_EVT || event == RW_T2T_RAW_FRAME_EVT) {
24*7eba2f3bSAndroid Build Coastguard Worker if (p_rw_data->data.p_data) {
25*7eba2f3bSAndroid Build Coastguard Worker GKI_freebuf(p_rw_data->data.p_data);
26*7eba2f3bSAndroid Build Coastguard Worker p_rw_data->data.p_data = nullptr;
27*7eba2f3bSAndroid Build Coastguard Worker }
28*7eba2f3bSAndroid Build Coastguard Worker }
29*7eba2f3bSAndroid Build Coastguard Worker }
30*7eba2f3bSAndroid Build Coastguard Worker
31*7eba2f3bSAndroid Build Coastguard Worker #define TEST_NFCID_VALUE \
32*7eba2f3bSAndroid Build Coastguard Worker { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 }
33*7eba2f3bSAndroid Build Coastguard Worker
Init(Fuzz_Context &)34*7eba2f3bSAndroid Build Coastguard Worker static bool Init(Fuzz_Context& /*ctx*/) {
35*7eba2f3bSAndroid Build Coastguard Worker tNFC_ACTIVATE_DEVT activate_params = {
36*7eba2f3bSAndroid Build Coastguard Worker .protocol = NFC_PROTOCOL_T2T,
37*7eba2f3bSAndroid Build Coastguard Worker .rf_tech_param = {.mode = NFC_DISCOVERY_TYPE_POLL_A,
38*7eba2f3bSAndroid Build Coastguard Worker .param = {.pa = {
39*7eba2f3bSAndroid Build Coastguard Worker .sel_rsp = NFC_SEL_RES_NFC_FORUM_T2T,
40*7eba2f3bSAndroid Build Coastguard Worker }}}};
41*7eba2f3bSAndroid Build Coastguard Worker
42*7eba2f3bSAndroid Build Coastguard Worker rw_init();
43*7eba2f3bSAndroid Build Coastguard Worker if (NFC_STATUS_OK != RW_SetActivatedTagType(&activate_params, rw_cback)) {
44*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG(MODULE_NAME ": RW_SetActivatedTagType failed");
45*7eba2f3bSAndroid Build Coastguard Worker return false;
46*7eba2f3bSAndroid Build Coastguard Worker }
47*7eba2f3bSAndroid Build Coastguard Worker
48*7eba2f3bSAndroid Build Coastguard Worker return true;
49*7eba2f3bSAndroid Build Coastguard Worker }
50*7eba2f3bSAndroid Build Coastguard Worker
Init_PresenceCheck(Fuzz_Context &)51*7eba2f3bSAndroid Build Coastguard Worker static bool Init_PresenceCheck(Fuzz_Context& /*ctx*/) {
52*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T2tPresenceCheck();
53*7eba2f3bSAndroid Build Coastguard Worker }
54*7eba2f3bSAndroid Build Coastguard Worker
Init_Read(Fuzz_Context &)55*7eba2f3bSAndroid Build Coastguard Worker static bool Init_Read(Fuzz_Context& /*ctx*/) {
56*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T2tRead(0);
57*7eba2f3bSAndroid Build Coastguard Worker }
58*7eba2f3bSAndroid Build Coastguard Worker
Init_Write(Fuzz_Context & ctx)59*7eba2f3bSAndroid Build Coastguard Worker static bool Init_Write(Fuzz_Context& ctx) {
60*7eba2f3bSAndroid Build Coastguard Worker const uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04,
61*7eba2f3bSAndroid Build Coastguard Worker 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04};
62*7eba2f3bSAndroid Build Coastguard Worker
63*7eba2f3bSAndroid Build Coastguard Worker auto scratch = ctx.GetBuffer(sizeof(data), data);
64*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T2tWrite(0, scratch);
65*7eba2f3bSAndroid Build Coastguard Worker }
66*7eba2f3bSAndroid Build Coastguard Worker
Init_SectorSelect(Fuzz_Context &)67*7eba2f3bSAndroid Build Coastguard Worker static bool Init_SectorSelect(Fuzz_Context& /*ctx*/) {
68*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T2tSectorSelect(0);
69*7eba2f3bSAndroid Build Coastguard Worker }
70*7eba2f3bSAndroid Build Coastguard Worker
Init_SetTagReadOnly(Fuzz_Context &)71*7eba2f3bSAndroid Build Coastguard Worker static bool Init_SetTagReadOnly(Fuzz_Context& /*ctx*/) {
72*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T2tSetTagReadOnly(true);
73*7eba2f3bSAndroid Build Coastguard Worker }
74*7eba2f3bSAndroid Build Coastguard Worker
Init_WriteNDef(Fuzz_Context & ctx)75*7eba2f3bSAndroid Build Coastguard Worker static bool Init_WriteNDef(Fuzz_Context& ctx) {
76*7eba2f3bSAndroid Build Coastguard Worker const uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04,
77*7eba2f3bSAndroid Build Coastguard Worker 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04};
78*7eba2f3bSAndroid Build Coastguard Worker
79*7eba2f3bSAndroid Build Coastguard Worker auto scratch = ctx.GetBuffer(sizeof(data), data);
80*7eba2f3bSAndroid Build Coastguard Worker tRW_T2T_CB* p_t2t = &rw_cb.tcb.t2t;
81*7eba2f3bSAndroid Build Coastguard Worker
82*7eba2f3bSAndroid Build Coastguard Worker p_t2t->ndef_status = T2T_NDEF_DETECTED;
83*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T2tWriteNDef(sizeof(data), scratch);
84*7eba2f3bSAndroid Build Coastguard Worker }
85*7eba2f3bSAndroid Build Coastguard Worker
Init_ReadNDef(Fuzz_Context & ctx)86*7eba2f3bSAndroid Build Coastguard Worker static bool Init_ReadNDef(Fuzz_Context& ctx) {
87*7eba2f3bSAndroid Build Coastguard Worker auto scratch = ctx.GetBuffer(256);
88*7eba2f3bSAndroid Build Coastguard Worker tRW_T2T_CB* p_t2t = &rw_cb.tcb.t2t;
89*7eba2f3bSAndroid Build Coastguard Worker
90*7eba2f3bSAndroid Build Coastguard Worker p_t2t->ndef_status = T2T_NDEF_DETECTED;
91*7eba2f3bSAndroid Build Coastguard Worker p_t2t->ndef_msg_len = 128;
92*7eba2f3bSAndroid Build Coastguard Worker p_t2t->bytes_count = 128;
93*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T2tReadNDef(scratch, 256);
94*7eba2f3bSAndroid Build Coastguard Worker }
95*7eba2f3bSAndroid Build Coastguard Worker
Init_DetectNDef(Fuzz_Context &)96*7eba2f3bSAndroid Build Coastguard Worker static bool Init_DetectNDef(Fuzz_Context& /*ctx*/) {
97*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T2tDetectNDef(true);
98*7eba2f3bSAndroid Build Coastguard Worker }
99*7eba2f3bSAndroid Build Coastguard Worker
Init_LocateTlv(Fuzz_Context &)100*7eba2f3bSAndroid Build Coastguard Worker static bool Init_LocateTlv(Fuzz_Context& /*ctx*/) {
101*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T2tLocateTlv(TAG_LOCK_CTRL_TLV);
102*7eba2f3bSAndroid Build Coastguard Worker }
103*7eba2f3bSAndroid Build Coastguard Worker
Init_FormatNDef(Fuzz_Context &)104*7eba2f3bSAndroid Build Coastguard Worker static bool Init_FormatNDef(Fuzz_Context& /*ctx*/) {
105*7eba2f3bSAndroid Build Coastguard Worker return NFC_STATUS_OK == RW_T2tFormatNDef();
106*7eba2f3bSAndroid Build Coastguard Worker }
107*7eba2f3bSAndroid Build Coastguard Worker
Fuzz_Init(Fuzz_Context & ctx)108*7eba2f3bSAndroid Build Coastguard Worker static bool Fuzz_Init(Fuzz_Context& ctx) {
109*7eba2f3bSAndroid Build Coastguard Worker if (!Init(ctx)) {
110*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG(MODULE_NAME ": initialization failed");
111*7eba2f3bSAndroid Build Coastguard Worker return false;
112*7eba2f3bSAndroid Build Coastguard Worker }
113*7eba2f3bSAndroid Build Coastguard Worker
114*7eba2f3bSAndroid Build Coastguard Worker bool result = false;
115*7eba2f3bSAndroid Build Coastguard Worker switch (ctx.SubType) {
116*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_PRESENCE_CHECK:
117*7eba2f3bSAndroid Build Coastguard Worker result = Init_PresenceCheck(ctx);
118*7eba2f3bSAndroid Build Coastguard Worker break;
119*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_READ:
120*7eba2f3bSAndroid Build Coastguard Worker result = Init_Read(ctx);
121*7eba2f3bSAndroid Build Coastguard Worker break;
122*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_WRITE:
123*7eba2f3bSAndroid Build Coastguard Worker result = Init_Write(ctx);
124*7eba2f3bSAndroid Build Coastguard Worker break;
125*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_SECTOR_SELECT:
126*7eba2f3bSAndroid Build Coastguard Worker result = Init_SectorSelect(ctx);
127*7eba2f3bSAndroid Build Coastguard Worker break;
128*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_SET_TAG_READONLY:
129*7eba2f3bSAndroid Build Coastguard Worker result = Init_SetTagReadOnly(ctx);
130*7eba2f3bSAndroid Build Coastguard Worker break;
131*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_WRITE_NDEF:
132*7eba2f3bSAndroid Build Coastguard Worker result = Init_WriteNDef(ctx);
133*7eba2f3bSAndroid Build Coastguard Worker break;
134*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_READ_NDEF:
135*7eba2f3bSAndroid Build Coastguard Worker result = Init_ReadNDef(ctx);
136*7eba2f3bSAndroid Build Coastguard Worker break;
137*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_DETECT_NDEF:
138*7eba2f3bSAndroid Build Coastguard Worker result = Init_DetectNDef(ctx);
139*7eba2f3bSAndroid Build Coastguard Worker break;
140*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_LOCATE_TLV:
141*7eba2f3bSAndroid Build Coastguard Worker result = Init_LocateTlv(ctx);
142*7eba2f3bSAndroid Build Coastguard Worker break;
143*7eba2f3bSAndroid Build Coastguard Worker case SUB_TYPE_FORMAT_NDEF:
144*7eba2f3bSAndroid Build Coastguard Worker result = Init_FormatNDef(ctx);
145*7eba2f3bSAndroid Build Coastguard Worker break;
146*7eba2f3bSAndroid Build Coastguard Worker default:
147*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG(MODULE_NAME ": Unknown command %d", ctx.SubType);
148*7eba2f3bSAndroid Build Coastguard Worker result = false;
149*7eba2f3bSAndroid Build Coastguard Worker break;
150*7eba2f3bSAndroid Build Coastguard Worker }
151*7eba2f3bSAndroid Build Coastguard Worker
152*7eba2f3bSAndroid Build Coastguard Worker if (!result) {
153*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG(MODULE_NAME ": Initializing command %02X failed", ctx.SubType);
154*7eba2f3bSAndroid Build Coastguard Worker }
155*7eba2f3bSAndroid Build Coastguard Worker
156*7eba2f3bSAndroid Build Coastguard Worker return result;
157*7eba2f3bSAndroid Build Coastguard Worker }
158*7eba2f3bSAndroid Build Coastguard Worker
Fuzz_Deinit(Fuzz_Context &)159*7eba2f3bSAndroid Build Coastguard Worker static void Fuzz_Deinit(Fuzz_Context& /*ctx*/) {
160*7eba2f3bSAndroid Build Coastguard Worker if (rf_cback) {
161*7eba2f3bSAndroid Build Coastguard Worker tNFC_CONN conn = {
162*7eba2f3bSAndroid Build Coastguard Worker .deactivate = {.status = NFC_STATUS_OK,
163*7eba2f3bSAndroid Build Coastguard Worker .type = NFC_DEACTIVATE_TYPE_IDLE,
164*7eba2f3bSAndroid Build Coastguard Worker .is_ntf = true,
165*7eba2f3bSAndroid Build Coastguard Worker .reason = NFC_DEACTIVATE_REASON_DH_REQ_FAILED}};
166*7eba2f3bSAndroid Build Coastguard Worker
167*7eba2f3bSAndroid Build Coastguard Worker rf_cback(NFC_RF_CONN_ID, NFC_DEACTIVATE_CEVT, &conn);
168*7eba2f3bSAndroid Build Coastguard Worker }
169*7eba2f3bSAndroid Build Coastguard Worker }
170*7eba2f3bSAndroid Build Coastguard Worker
Fuzz_Run(Fuzz_Context & ctx)171*7eba2f3bSAndroid Build Coastguard Worker static void Fuzz_Run(Fuzz_Context& ctx) {
172*7eba2f3bSAndroid Build Coastguard Worker for (auto it = ctx.Data.cbegin() + 1; it != ctx.Data.cend(); ++it) {
173*7eba2f3bSAndroid Build Coastguard Worker NFC_HDR* p_msg;
174*7eba2f3bSAndroid Build Coastguard Worker p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR) + it->size());
175*7eba2f3bSAndroid Build Coastguard Worker if (p_msg == nullptr || it->size() < 1) {
176*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG(MODULE_NAME ": GKI_getbuf returns null, size=%zu", it->size());
177*7eba2f3bSAndroid Build Coastguard Worker return;
178*7eba2f3bSAndroid Build Coastguard Worker }
179*7eba2f3bSAndroid Build Coastguard Worker
180*7eba2f3bSAndroid Build Coastguard Worker /* Initialize NFC_HDR */
181*7eba2f3bSAndroid Build Coastguard Worker p_msg->len = it->size() - 1;
182*7eba2f3bSAndroid Build Coastguard Worker p_msg->offset = 0;
183*7eba2f3bSAndroid Build Coastguard Worker
184*7eba2f3bSAndroid Build Coastguard Worker uint8_t* p = (uint8_t*)(p_msg + 1) + p_msg->offset;
185*7eba2f3bSAndroid Build Coastguard Worker memcpy(p, it->data(), it->size());
186*7eba2f3bSAndroid Build Coastguard Worker
187*7eba2f3bSAndroid Build Coastguard Worker tNFC_CONN conn = {.data = {
188*7eba2f3bSAndroid Build Coastguard Worker .status = NFC_STATUS_OK,
189*7eba2f3bSAndroid Build Coastguard Worker .p_data = p_msg,
190*7eba2f3bSAndroid Build Coastguard Worker }};
191*7eba2f3bSAndroid Build Coastguard Worker
192*7eba2f3bSAndroid Build Coastguard Worker FUZZLOG(MODULE_NAME ": SubType=%02X, Response[%zd/%zd]=%s", ctx.SubType,
193*7eba2f3bSAndroid Build Coastguard Worker it - ctx.Data.cbegin(), ctx.Data.size() - 1,
194*7eba2f3bSAndroid Build Coastguard Worker BytesToHex(*it).c_str());
195*7eba2f3bSAndroid Build Coastguard Worker
196*7eba2f3bSAndroid Build Coastguard Worker rf_cback(NFC_RF_CONN_ID, NFC_DATA_CEVT, &conn);
197*7eba2f3bSAndroid Build Coastguard Worker }
198*7eba2f3bSAndroid Build Coastguard Worker }
199*7eba2f3bSAndroid Build Coastguard Worker
Type2_FixPackets(uint8_t,std::vector<bytes_t> &)200*7eba2f3bSAndroid Build Coastguard Worker void Type2_FixPackets(uint8_t /*SubType*/, std::vector<bytes_t>& /*Data*/) {}
201*7eba2f3bSAndroid Build Coastguard Worker
Type2_Fuzz(uint8_t SubType,const std::vector<bytes_t> & Data)202*7eba2f3bSAndroid Build Coastguard Worker void Type2_Fuzz(uint8_t SubType, const std::vector<bytes_t>& Data) {
203*7eba2f3bSAndroid Build Coastguard Worker Fuzz_Context ctx(SubType % SUB_TYPE_MAX, Data);
204*7eba2f3bSAndroid Build Coastguard Worker if (Fuzz_Init(ctx)) {
205*7eba2f3bSAndroid Build Coastguard Worker Fuzz_Run(ctx);
206*7eba2f3bSAndroid Build Coastguard Worker }
207*7eba2f3bSAndroid Build Coastguard Worker
208*7eba2f3bSAndroid Build Coastguard Worker Fuzz_Deinit(ctx);
209*7eba2f3bSAndroid Build Coastguard Worker }
210