xref: /aosp_15_r20/system/nfc/src/fuzzers/ce/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 Emulator:"
4*7eba2f3bSAndroid Build Coastguard Worker 
5*7eba2f3bSAndroid Build Coastguard Worker // Copied from ce_t3t.cc
6*7eba2f3bSAndroid Build Coastguard Worker enum {
7*7eba2f3bSAndroid Build Coastguard Worker   CE_T3T_COMMAND_INVALID,
8*7eba2f3bSAndroid Build Coastguard Worker   CE_T3T_COMMAND_NFC_FORUM,
9*7eba2f3bSAndroid Build Coastguard Worker   CE_T3T_COMMAND_FELICA
10*7eba2f3bSAndroid Build Coastguard Worker };
11*7eba2f3bSAndroid Build Coastguard Worker 
12*7eba2f3bSAndroid Build Coastguard Worker enum {
13*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_READONLY,
14*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_READWRITE,
15*7eba2f3bSAndroid Build Coastguard Worker 
16*7eba2f3bSAndroid Build Coastguard Worker   SUB_TYPE_MAX
17*7eba2f3bSAndroid Build Coastguard Worker };
18*7eba2f3bSAndroid Build Coastguard Worker 
ce_cback(tCE_EVENT event,tCE_DATA * p_ce_data)19*7eba2f3bSAndroid Build Coastguard Worker static void ce_cback(tCE_EVENT event, tCE_DATA* p_ce_data) {
20*7eba2f3bSAndroid Build Coastguard Worker   FUZZLOG(MODULE_NAME ": event=0x%02x, p_ce_data=%p", event, p_ce_data);
21*7eba2f3bSAndroid Build Coastguard Worker }
22*7eba2f3bSAndroid Build Coastguard Worker 
23*7eba2f3bSAndroid Build Coastguard Worker #define TEST_NFCID_VALUE \
24*7eba2f3bSAndroid Build Coastguard Worker   { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 }
25*7eba2f3bSAndroid Build Coastguard Worker const uint8_t TEST_NFCID[] = TEST_NFCID_VALUE;
26*7eba2f3bSAndroid Build Coastguard Worker 
Init(Fuzz_Context &)27*7eba2f3bSAndroid Build Coastguard Worker static bool Init(Fuzz_Context& /*ctx*/) {
28*7eba2f3bSAndroid Build Coastguard Worker   tNFC_ACTIVATE_DEVT activate_params = {
29*7eba2f3bSAndroid Build Coastguard Worker       .protocol = NFC_PROTOCOL_T3T,
30*7eba2f3bSAndroid Build Coastguard Worker       .rf_tech_param = {.param = {.lf = {
31*7eba2f3bSAndroid Build Coastguard Worker                                       .nfcid2 = TEST_NFCID_VALUE,
32*7eba2f3bSAndroid Build Coastguard Worker                                   }}}};
33*7eba2f3bSAndroid Build Coastguard Worker 
34*7eba2f3bSAndroid Build Coastguard Worker   ce_init();
35*7eba2f3bSAndroid Build Coastguard Worker   if (NFC_STATUS_OK != CE_SetActivatedTagType(&activate_params,
36*7eba2f3bSAndroid Build Coastguard Worker                                               T3T_SYSTEM_CODE_NDEF, ce_cback)) {
37*7eba2f3bSAndroid Build Coastguard Worker     FUZZLOG(MODULE_NAME ": CE_SetActivatedTagType failed");
38*7eba2f3bSAndroid Build Coastguard Worker     return false;
39*7eba2f3bSAndroid Build Coastguard Worker   }
40*7eba2f3bSAndroid Build Coastguard Worker 
41*7eba2f3bSAndroid Build Coastguard Worker   return true;
42*7eba2f3bSAndroid Build Coastguard Worker }
43*7eba2f3bSAndroid Build Coastguard Worker 
Init_ReadOnly(Fuzz_Context & ctx)44*7eba2f3bSAndroid Build Coastguard Worker static bool Init_ReadOnly(Fuzz_Context& ctx) {
45*7eba2f3bSAndroid Build Coastguard Worker   const uint32_t size_max = 1024;
46*7eba2f3bSAndroid Build Coastguard Worker   const uint32_t size_current = 256;
47*7eba2f3bSAndroid Build Coastguard Worker 
48*7eba2f3bSAndroid Build Coastguard Worker   auto p_buf = ctx.GetBuffer(size_max);
49*7eba2f3bSAndroid Build Coastguard Worker 
50*7eba2f3bSAndroid Build Coastguard Worker   return NFC_STATUS_OK ==
51*7eba2f3bSAndroid Build Coastguard Worker          CE_T3tSetLocalNDEFMsg(true, size_max, size_current, p_buf, nullptr);
52*7eba2f3bSAndroid Build Coastguard Worker }
53*7eba2f3bSAndroid Build Coastguard Worker 
Init_ReadWrite(Fuzz_Context & ctx)54*7eba2f3bSAndroid Build Coastguard Worker static bool Init_ReadWrite(Fuzz_Context& ctx) {
55*7eba2f3bSAndroid Build Coastguard Worker   const uint32_t size_max = 1024;
56*7eba2f3bSAndroid Build Coastguard Worker   const uint32_t size_current = 256;
57*7eba2f3bSAndroid Build Coastguard Worker 
58*7eba2f3bSAndroid Build Coastguard Worker   auto p_buf = ctx.GetBuffer(size_max);
59*7eba2f3bSAndroid Build Coastguard Worker   auto p_scratch = ctx.GetBuffer(size_max);
60*7eba2f3bSAndroid Build Coastguard Worker 
61*7eba2f3bSAndroid Build Coastguard Worker   return NFC_STATUS_OK ==
62*7eba2f3bSAndroid Build Coastguard Worker          CE_T3tSetLocalNDEFMsg(false, size_max, size_current, p_buf, p_scratch);
63*7eba2f3bSAndroid Build Coastguard Worker }
64*7eba2f3bSAndroid Build Coastguard Worker 
Fuzz_Init(Fuzz_Context & ctx)65*7eba2f3bSAndroid Build Coastguard Worker static bool Fuzz_Init(Fuzz_Context& ctx) {
66*7eba2f3bSAndroid Build Coastguard Worker   if (!Init(ctx)) {
67*7eba2f3bSAndroid Build Coastguard Worker     FUZZLOG(MODULE_NAME ": initialization failed");
68*7eba2f3bSAndroid Build Coastguard Worker     return false;
69*7eba2f3bSAndroid Build Coastguard Worker   }
70*7eba2f3bSAndroid Build Coastguard Worker 
71*7eba2f3bSAndroid Build Coastguard Worker   bool result = false;
72*7eba2f3bSAndroid Build Coastguard Worker   switch (ctx.SubType) {
73*7eba2f3bSAndroid Build Coastguard Worker     case SUB_TYPE_READONLY:
74*7eba2f3bSAndroid Build Coastguard Worker       result = Init_ReadOnly(ctx);
75*7eba2f3bSAndroid Build Coastguard Worker       break;
76*7eba2f3bSAndroid Build Coastguard Worker     case SUB_TYPE_READWRITE:
77*7eba2f3bSAndroid Build Coastguard Worker       result = Init_ReadWrite(ctx);
78*7eba2f3bSAndroid Build Coastguard Worker       break;
79*7eba2f3bSAndroid Build Coastguard Worker     default:
80*7eba2f3bSAndroid Build Coastguard Worker       FUZZLOG(MODULE_NAME ": Unknown command %d", ctx.SubType);
81*7eba2f3bSAndroid Build Coastguard Worker       result = false;
82*7eba2f3bSAndroid Build Coastguard Worker       break;
83*7eba2f3bSAndroid Build Coastguard Worker   }
84*7eba2f3bSAndroid Build Coastguard Worker 
85*7eba2f3bSAndroid Build Coastguard Worker   if (!result) {
86*7eba2f3bSAndroid Build Coastguard Worker     FUZZLOG(MODULE_NAME ": Initializing command %02X failed", ctx.SubType);
87*7eba2f3bSAndroid Build Coastguard Worker   }
88*7eba2f3bSAndroid Build Coastguard Worker 
89*7eba2f3bSAndroid Build Coastguard Worker   return result;
90*7eba2f3bSAndroid Build Coastguard Worker }
91*7eba2f3bSAndroid Build Coastguard Worker 
Fuzz_Run(Fuzz_Context & ctx)92*7eba2f3bSAndroid Build Coastguard Worker static void Fuzz_Run(Fuzz_Context& ctx) {
93*7eba2f3bSAndroid Build Coastguard Worker   for (auto it = ctx.Data.cbegin(); it != ctx.Data.cend(); ++it) {
94*7eba2f3bSAndroid Build Coastguard Worker     NFC_HDR* p_msg;
95*7eba2f3bSAndroid Build Coastguard Worker     p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR) + it->size());
96*7eba2f3bSAndroid Build Coastguard Worker     if (p_msg == nullptr || it->size() < 1) {
97*7eba2f3bSAndroid Build Coastguard Worker       FUZZLOG(MODULE_NAME ": GKI_getbuf returns null, size=%zu", it->size());
98*7eba2f3bSAndroid Build Coastguard Worker       return;
99*7eba2f3bSAndroid Build Coastguard Worker     }
100*7eba2f3bSAndroid Build Coastguard Worker 
101*7eba2f3bSAndroid Build Coastguard Worker     /* Initialize NFC_HDR */
102*7eba2f3bSAndroid Build Coastguard Worker     p_msg->len = it->size() - 1;
103*7eba2f3bSAndroid Build Coastguard Worker     p_msg->offset = 0;
104*7eba2f3bSAndroid Build Coastguard Worker 
105*7eba2f3bSAndroid Build Coastguard Worker     uint8_t* p = (uint8_t*)(p_msg + 1) + p_msg->offset;
106*7eba2f3bSAndroid Build Coastguard Worker     memcpy(p, it->data(), it->size());
107*7eba2f3bSAndroid Build Coastguard Worker 
108*7eba2f3bSAndroid Build Coastguard Worker     tNFC_CONN conn = {.data = {
109*7eba2f3bSAndroid Build Coastguard Worker                           .status = NFC_STATUS_OK,
110*7eba2f3bSAndroid Build Coastguard Worker                           .p_data = p_msg,
111*7eba2f3bSAndroid Build Coastguard Worker                       }};
112*7eba2f3bSAndroid Build Coastguard Worker 
113*7eba2f3bSAndroid Build Coastguard Worker     FUZZLOG(MODULE_NAME ": SubType=%02X, Response[%zd/%zu]=%s", ctx.SubType,
114*7eba2f3bSAndroid Build Coastguard Worker             it - ctx.Data.cbegin() + 1, ctx.Data.size(),
115*7eba2f3bSAndroid Build Coastguard Worker             BytesToHex(*it).c_str());
116*7eba2f3bSAndroid Build Coastguard Worker 
117*7eba2f3bSAndroid Build Coastguard Worker     rf_cback(NFC_RF_CONN_ID, NFC_DATA_CEVT, &conn);
118*7eba2f3bSAndroid Build Coastguard Worker   }
119*7eba2f3bSAndroid Build Coastguard Worker }
120*7eba2f3bSAndroid Build Coastguard Worker 
Type3_FixPackets(uint8_t,std::vector<bytes_t> & Packets)121*7eba2f3bSAndroid Build Coastguard Worker void Type3_FixPackets(uint8_t /*SubType*/, std::vector<bytes_t>& Packets) {
122*7eba2f3bSAndroid Build Coastguard Worker   for (auto it = Packets.begin() + 1; it != Packets.end(); ++it) {
123*7eba2f3bSAndroid Build Coastguard Worker     if (it->size() < T3T_MSG_CMD_COMMON_HDR_LEN) {
124*7eba2f3bSAndroid Build Coastguard Worker       it->resize(T3T_MSG_CMD_COMMON_HDR_LEN);
125*7eba2f3bSAndroid Build Coastguard Worker       memset(it->data(), 0, it->size());
126*7eba2f3bSAndroid Build Coastguard Worker     }
127*7eba2f3bSAndroid Build Coastguard Worker 
128*7eba2f3bSAndroid Build Coastguard Worker     auto p = it->data();
129*7eba2f3bSAndroid Build Coastguard Worker     p[0] = it->size();
130*7eba2f3bSAndroid Build Coastguard Worker 
131*7eba2f3bSAndroid Build Coastguard Worker     if (p[1] != CE_T3T_COMMAND_FELICA) {
132*7eba2f3bSAndroid Build Coastguard Worker       memcpy(&p[2], TEST_NFCID, sizeof(TEST_NFCID));
133*7eba2f3bSAndroid Build Coastguard Worker     }
134*7eba2f3bSAndroid Build Coastguard Worker   }
135*7eba2f3bSAndroid Build Coastguard Worker }
136*7eba2f3bSAndroid Build Coastguard Worker 
Type3_Fuzz(uint8_t SubType,const std::vector<bytes_t> & Packets)137*7eba2f3bSAndroid Build Coastguard Worker void Type3_Fuzz(uint8_t SubType, const std::vector<bytes_t>& Packets) {
138*7eba2f3bSAndroid Build Coastguard Worker   Fuzz_Context ctx(SubType % SUB_TYPE_MAX, Packets);
139*7eba2f3bSAndroid Build Coastguard Worker   if (Fuzz_Init(ctx)) {
140*7eba2f3bSAndroid Build Coastguard Worker     Fuzz_Run(ctx);
141*7eba2f3bSAndroid Build Coastguard Worker   }
142*7eba2f3bSAndroid Build Coastguard Worker }
143