xref: /btstack/test/fuzz/fuzz_l2cap.c (revision 68894c745704da77c007581d29c82abbfe30897e)
1*68894c74SMatthias Ringwald #include <stdint.h>
2*68894c74SMatthias Ringwald #include <stddef.h>
3*68894c74SMatthias Ringwald #include <stdio.h>
4*68894c74SMatthias Ringwald 
5*68894c74SMatthias Ringwald #include <btstack_util.h>
6*68894c74SMatthias Ringwald #include <btstack.h>
7*68894c74SMatthias Ringwald #include <btstack_run_loop_posix.h>
8*68894c74SMatthias Ringwald #include "hci.h"
9*68894c74SMatthias Ringwald 
10*68894c74SMatthias Ringwald static hci_connection_t hci_connection;
11*68894c74SMatthias Ringwald 
12*68894c74SMatthias Ringwald static btstack_linked_list_t hci_connections;
13*68894c74SMatthias Ringwald 
14*68894c74SMatthias Ringwald static btstack_packet_handler_t acl_packet_handler;
15*68894c74SMatthias Ringwald static btstack_packet_handler_t event_packet_handler;
16*68894c74SMatthias Ringwald 
17*68894c74SMatthias Ringwald static uint8_t outgoing_buffer[2000];
18*68894c74SMatthias Ringwald static bool outgoing_reserved;
19*68894c74SMatthias Ringwald 
20*68894c74SMatthias Ringwald void l2cap_setup_test_channels_fuzz(void);
21*68894c74SMatthias Ringwald void l2cap_free_channels_fuzz(void);
22*68894c74SMatthias Ringwald 
23*68894c74SMatthias Ringwald void hci_add_event_handler(btstack_packet_callback_registration_t * callback_handler){
24*68894c74SMatthias Ringwald     event_packet_handler = callback_handler->callback;
25*68894c74SMatthias Ringwald }
26*68894c74SMatthias Ringwald 
27*68894c74SMatthias Ringwald void hci_register_acl_packet_handler(btstack_packet_handler_t handler){
28*68894c74SMatthias Ringwald     acl_packet_handler = handler;
29*68894c74SMatthias Ringwald }
30*68894c74SMatthias Ringwald 
31*68894c74SMatthias Ringwald bool hci_can_send_acl_packet_now(hci_con_handle_t con_handle){
32*68894c74SMatthias Ringwald     return true;
33*68894c74SMatthias Ringwald }
34*68894c74SMatthias Ringwald 
35*68894c74SMatthias Ringwald hci_connection_t * hci_connection_for_bd_addr_and_type(const bd_addr_t addr, bd_addr_type_t addr_type){
36*68894c74SMatthias Ringwald     return &hci_connection;
37*68894c74SMatthias Ringwald }
38*68894c74SMatthias Ringwald 
39*68894c74SMatthias Ringwald hci_connection_t * hci_connection_for_handle(hci_con_handle_t con_handle){
40*68894c74SMatthias Ringwald     return &hci_connection;
41*68894c74SMatthias Ringwald }
42*68894c74SMatthias Ringwald 
43*68894c74SMatthias Ringwald void gap_connectable_control(uint8_t enable){
44*68894c74SMatthias Ringwald }
45*68894c74SMatthias Ringwald 
46*68894c74SMatthias Ringwald void hci_remote_features_query(hci_con_handle_t con_handle){
47*68894c74SMatthias Ringwald }
48*68894c74SMatthias Ringwald 
49*68894c74SMatthias Ringwald void hci_disconnect_security_block(hci_con_handle_t con_handle){
50*68894c74SMatthias Ringwald }
51*68894c74SMatthias Ringwald 
52*68894c74SMatthias Ringwald void gap_request_security_level(hci_con_handle_t con_handle, gap_security_level_t requested_level){
53*68894c74SMatthias Ringwald }
54*68894c74SMatthias Ringwald 
55*68894c74SMatthias Ringwald void gap_set_minimal_service_security_level(gap_security_level_t security_level){
56*68894c74SMatthias Ringwald }
57*68894c74SMatthias Ringwald 
58*68894c74SMatthias Ringwald void hci_connections_get_iterator(btstack_linked_list_iterator_t *it){
59*68894c74SMatthias Ringwald     btstack_linked_list_iterator_init(it, &hci_connections);
60*68894c74SMatthias Ringwald }
61*68894c74SMatthias Ringwald 
62*68894c74SMatthias Ringwald bool hci_is_le_connection_type(bd_addr_type_t address_type){
63*68894c74SMatthias Ringwald     switch (address_type){
64*68894c74SMatthias Ringwald         case BD_ADDR_TYPE_LE_PUBLIC:
65*68894c74SMatthias Ringwald         case BD_ADDR_TYPE_LE_RANDOM:
66*68894c74SMatthias Ringwald         case BD_ADDR_TYPE_LE_PUBLIC_IDENTITY:
67*68894c74SMatthias Ringwald         case BD_ADDR_TYPE_LE_RANDOM_IDENTITY:
68*68894c74SMatthias Ringwald             return true;
69*68894c74SMatthias Ringwald         default:
70*68894c74SMatthias Ringwald             return false;
71*68894c74SMatthias Ringwald     }
72*68894c74SMatthias Ringwald }
73*68894c74SMatthias Ringwald 
74*68894c74SMatthias Ringwald bool hci_non_flushable_packet_boundary_flag_supported(void){
75*68894c74SMatthias Ringwald     return true;
76*68894c74SMatthias Ringwald }
77*68894c74SMatthias Ringwald 
78*68894c74SMatthias Ringwald uint16_t hci_automatic_flush_timeout(void){
79*68894c74SMatthias Ringwald     return 0;
80*68894c74SMatthias Ringwald }
81*68894c74SMatthias Ringwald 
82*68894c74SMatthias Ringwald bool hci_can_send_prepared_acl_packet_now(hci_con_handle_t con_handle) {
83*68894c74SMatthias Ringwald     return true;
84*68894c74SMatthias Ringwald }
85*68894c74SMatthias Ringwald 
86*68894c74SMatthias Ringwald bool hci_can_send_acl_classic_packet_now(void){
87*68894c74SMatthias Ringwald     return true;
88*68894c74SMatthias Ringwald }
89*68894c74SMatthias Ringwald 
90*68894c74SMatthias Ringwald bool hci_can_send_acl_le_packet_now(void){
91*68894c74SMatthias Ringwald     return true;
92*68894c74SMatthias Ringwald }
93*68894c74SMatthias Ringwald 
94*68894c74SMatthias Ringwald bool hci_can_send_command_packet_now(void){
95*68894c74SMatthias Ringwald     return true;
96*68894c74SMatthias Ringwald }
97*68894c74SMatthias Ringwald 
98*68894c74SMatthias Ringwald uint8_t hci_send_cmd(const hci_cmd_t * cmd, ...){
99*68894c74SMatthias Ringwald     return ERROR_CODE_SUCCESS;
100*68894c74SMatthias Ringwald }
101*68894c74SMatthias Ringwald 
102*68894c74SMatthias Ringwald uint16_t hci_usable_acl_packet_types(void){
103*68894c74SMatthias Ringwald     return 0;
104*68894c74SMatthias Ringwald }
105*68894c74SMatthias Ringwald 
106*68894c74SMatthias Ringwald uint8_t hci_get_allow_role_switch(void){
107*68894c74SMatthias Ringwald     return true;
108*68894c74SMatthias Ringwald }
109*68894c74SMatthias Ringwald 
110*68894c74SMatthias Ringwald bool hci_reserve_packet_buffer(void){
111*68894c74SMatthias Ringwald     outgoing_reserved = true;
112*68894c74SMatthias Ringwald     return true;
113*68894c74SMatthias Ringwald }
114*68894c74SMatthias Ringwald 
115*68894c74SMatthias Ringwald void hci_release_packet_buffer(void){
116*68894c74SMatthias Ringwald     outgoing_reserved = false;
117*68894c74SMatthias Ringwald }
118*68894c74SMatthias Ringwald 
119*68894c74SMatthias Ringwald bool hci_is_packet_buffer_reserved(void){
120*68894c74SMatthias Ringwald     return outgoing_reserved;
121*68894c74SMatthias Ringwald }
122*68894c74SMatthias Ringwald 
123*68894c74SMatthias Ringwald uint8_t* hci_get_outgoing_packet_buffer(void){
124*68894c74SMatthias Ringwald     return outgoing_buffer;
125*68894c74SMatthias Ringwald }
126*68894c74SMatthias Ringwald 
127*68894c74SMatthias Ringwald uint8_t hci_send_acl_packet_buffer(int size){
128*68894c74SMatthias Ringwald     outgoing_reserved = false;
129*68894c74SMatthias Ringwald     return ERROR_CODE_SUCCESS;
130*68894c74SMatthias Ringwald }
131*68894c74SMatthias Ringwald 
132*68894c74SMatthias Ringwald uint16_t hci_max_acl_data_packet_length(void){
133*68894c74SMatthias Ringwald     return 100;
134*68894c74SMatthias Ringwald }
135*68894c74SMatthias Ringwald 
136*68894c74SMatthias Ringwald bool hci_authentication_active_for_handle(hci_con_handle_t handle){
137*68894c74SMatthias Ringwald     return false;
138*68894c74SMatthias Ringwald }
139*68894c74SMatthias Ringwald 
140*68894c74SMatthias Ringwald void gap_drop_link_key_for_bd_addr(bd_addr_t addr){
141*68894c74SMatthias Ringwald }
142*68894c74SMatthias Ringwald 
143*68894c74SMatthias Ringwald void gap_get_connection_parameter_range(le_connection_parameter_range_t * range){
144*68894c74SMatthias Ringwald     memset(range, 0, sizeof(le_connection_parameter_range_t));
145*68894c74SMatthias Ringwald }
146*68894c74SMatthias Ringwald 
147*68894c74SMatthias Ringwald authorization_state_t gap_authorization_state(hci_con_handle_t con_handle){
148*68894c74SMatthias Ringwald     return AUTHORIZATION_GRANTED;
149*68894c74SMatthias Ringwald }
150*68894c74SMatthias Ringwald 
151*68894c74SMatthias Ringwald // TODO: use fuzzer input for level
152*68894c74SMatthias Ringwald int gap_connection_parameter_range_included(le_connection_parameter_range_t * existing_range, uint16_t le_conn_interval_min, uint16_t le_conn_interval_max, uint16_t le_conn_latency, uint16_t le_supervision_timeout){
153*68894c74SMatthias Ringwald     return true;
154*68894c74SMatthias Ringwald }
155*68894c74SMatthias Ringwald 
156*68894c74SMatthias Ringwald // TODO: use fuzzer input for level
157*68894c74SMatthias Ringwald bool gap_secure_connection(hci_con_handle_t con_handle){
158*68894c74SMatthias Ringwald     return true;
159*68894c74SMatthias Ringwald }
160*68894c74SMatthias Ringwald 
161*68894c74SMatthias Ringwald // TODO: use fuzzer input for level
162*68894c74SMatthias Ringwald bool gap_get_secure_connections_only_mode(void){
163*68894c74SMatthias Ringwald     return false;
164*68894c74SMatthias Ringwald }
165*68894c74SMatthias Ringwald 
166*68894c74SMatthias Ringwald // TODO: use fuzzer input for level
167*68894c74SMatthias Ringwald gap_connection_type_t gap_get_connection_type(hci_con_handle_t connection_handle){
168*68894c74SMatthias Ringwald     return GAP_CONNECTION_ACL;
169*68894c74SMatthias Ringwald }
170*68894c74SMatthias Ringwald 
171*68894c74SMatthias Ringwald // TODO: use fuzzer input for level
172*68894c74SMatthias Ringwald gap_security_level_t gap_get_security_level(void){
173*68894c74SMatthias Ringwald     return LEVEL_4;
174*68894c74SMatthias Ringwald }
175*68894c74SMatthias Ringwald 
176*68894c74SMatthias Ringwald // TODO: use fuzzer input for level
177*68894c74SMatthias Ringwald gap_security_level_t gap_security_level(hci_con_handle_t con_handle){
178*68894c74SMatthias Ringwald     return LEVEL_4;
179*68894c74SMatthias Ringwald }
180*68894c74SMatthias Ringwald 
181*68894c74SMatthias Ringwald // TODO: use fuzzer input for level
182*68894c74SMatthias Ringwald gap_security_mode_t gap_get_security_mode(void){
183*68894c74SMatthias Ringwald     return GAP_SECURITY_MODE_4;
184*68894c74SMatthias Ringwald }
185*68894c74SMatthias Ringwald 
186*68894c74SMatthias Ringwald // TODO: use fuzzer input for level
187*68894c74SMatthias Ringwald bool hci_remote_features_available(hci_con_handle_t handle){
188*68894c74SMatthias Ringwald     return true;
189*68894c74SMatthias Ringwald }
190*68894c74SMatthias Ringwald 
191*68894c74SMatthias Ringwald // TODO: use fuzzer input for level
192*68894c74SMatthias Ringwald bool gap_ssp_supported_on_both_sides(hci_con_handle_t handle){
193*68894c74SMatthias Ringwald     return true;
194*68894c74SMatthias Ringwald }
195*68894c74SMatthias Ringwald 
196*68894c74SMatthias Ringwald // TODO: use fuzzer input for level
197*68894c74SMatthias Ringwald uint8_t gap_encryption_key_size(hci_con_handle_t con_handle){
198*68894c74SMatthias Ringwald     return 16;
199*68894c74SMatthias Ringwald }
200*68894c74SMatthias Ringwald 
201*68894c74SMatthias Ringwald // TODO: use fuzzer input for level
202*68894c74SMatthias Ringwald bool gap_authenticated(hci_con_handle_t con_handle){
203*68894c74SMatthias Ringwald     return true;
204*68894c74SMatthias Ringwald }
205*68894c74SMatthias Ringwald 
206*68894c74SMatthias Ringwald // SM
207*68894c74SMatthias Ringwald void sm_add_event_handler(btstack_packet_callback_registration_t * callback_handler){
208*68894c74SMatthias Ringwald }
209*68894c74SMatthias Ringwald void sm_request_pairing(hci_con_handle_t con_handle){
210*68894c74SMatthias Ringwald }
211*68894c74SMatthias Ringwald 
212*68894c74SMatthias Ringwald int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
213*68894c74SMatthias Ringwald     static int initialized = 0;
214*68894c74SMatthias Ringwald     if (initialized == 0){
215*68894c74SMatthias Ringwald         initialized = 1;
216*68894c74SMatthias Ringwald         btstack_memory_init();
217*68894c74SMatthias Ringwald         btstack_run_loop_init(btstack_run_loop_posix_get_instance());
218*68894c74SMatthias Ringwald         hci_connection.con_handle = 0x0000;
219*68894c74SMatthias Ringwald     }
220*68894c74SMatthias Ringwald 
221*68894c74SMatthias Ringwald     // prepare test data
222*68894c74SMatthias Ringwald     if (size < 5) return 0;
223*68894c74SMatthias Ringwald     uint8_t  packet_type  = (data[0] & 1) ? HCI_EVENT_PACKET : HCI_ACL_DATA_PACKET;
224*68894c74SMatthias Ringwald     uint16_t connection_handle = ((data[0] >> 2) & 0x07); // 0x0000 - 0x0007
225*68894c74SMatthias Ringwald     uint8_t  pb_or_ps = (data[0] >> 5) & 0x003;            // 0x00-0x03
226*68894c74SMatthias Ringwald     uint16_t cid;
227*68894c74SMatthias Ringwald     switch (data[1] & 3){
228*68894c74SMatthias Ringwald         case 0:
229*68894c74SMatthias Ringwald             cid = 1;
230*68894c74SMatthias Ringwald             break;
231*68894c74SMatthias Ringwald         case 1:
232*68894c74SMatthias Ringwald             cid = 0x41;
233*68894c74SMatthias Ringwald             break;
234*68894c74SMatthias Ringwald         case 2:
235*68894c74SMatthias Ringwald             cid = 0x42;
236*68894c74SMatthias Ringwald             break;
237*68894c74SMatthias Ringwald         case 3:
238*68894c74SMatthias Ringwald             cid = 0x43;
239*68894c74SMatthias Ringwald             break;
240*68894c74SMatthias Ringwald     }
241*68894c74SMatthias Ringwald     size -= 3;
242*68894c74SMatthias Ringwald     data += 3;
243*68894c74SMatthias Ringwald     uint8_t packet[1000];
244*68894c74SMatthias Ringwald     uint16_t packet_len;
245*68894c74SMatthias Ringwald     switch (packet_type){
246*68894c74SMatthias Ringwald         case HCI_EVENT_PACKET:
247*68894c74SMatthias Ringwald             packet[0] = data[0];
248*68894c74SMatthias Ringwald             size--;
249*68894c74SMatthias Ringwald             data++;
250*68894c74SMatthias Ringwald             if (size > 255) return 0;
251*68894c74SMatthias Ringwald             packet[1] = size;
252*68894c74SMatthias Ringwald             memcpy(&packet[2], data, size);
253*68894c74SMatthias Ringwald             packet_len = size + 2;
254*68894c74SMatthias Ringwald             break;
255*68894c74SMatthias Ringwald         case HCI_ACL_DATA_PACKET:
256*68894c74SMatthias Ringwald             little_endian_store_16(packet, 0, (pb_or_ps << 12) | connection_handle);
257*68894c74SMatthias Ringwald             little_endian_store_16(packet, 2, size + 4);
258*68894c74SMatthias Ringwald             little_endian_store_16(packet, 4, size);
259*68894c74SMatthias Ringwald             little_endian_store_16(packet, 6, cid);
260*68894c74SMatthias Ringwald             if (size > (sizeof(packet) - 8)) return 0;
261*68894c74SMatthias Ringwald             memcpy(&packet[8], data, size);
262*68894c74SMatthias Ringwald             packet_len = size + 8;
263*68894c74SMatthias Ringwald             break;
264*68894c74SMatthias Ringwald         default:
265*68894c74SMatthias Ringwald             return 0;
266*68894c74SMatthias Ringwald     }
267*68894c74SMatthias Ringwald 
268*68894c74SMatthias Ringwald     // init hci mock
269*68894c74SMatthias Ringwald     outgoing_reserved = false;
270*68894c74SMatthias Ringwald     hci_connections = (btstack_linked_item_t*) &hci_connection;
271*68894c74SMatthias Ringwald 
272*68894c74SMatthias Ringwald     // init l2cap
273*68894c74SMatthias Ringwald     l2cap_init();
274*68894c74SMatthias Ringwald     l2cap_setup_test_channels_fuzz();
275*68894c74SMatthias Ringwald 
276*68894c74SMatthias Ringwald     // deliver test data
277*68894c74SMatthias Ringwald     switch (packet_type){
278*68894c74SMatthias Ringwald         case HCI_EVENT_PACKET:
279*68894c74SMatthias Ringwald             (*event_packet_handler)(packet_type, 0, packet, packet_len);
280*68894c74SMatthias Ringwald             break;
281*68894c74SMatthias Ringwald         case HCI_ACL_DATA_PACKET:
282*68894c74SMatthias Ringwald             (*acl_packet_handler)(packet_type, 0, packet, packet_len);
283*68894c74SMatthias Ringwald             break;
284*68894c74SMatthias Ringwald         default:
285*68894c74SMatthias Ringwald             return 0;
286*68894c74SMatthias Ringwald     }
287*68894c74SMatthias Ringwald 
288*68894c74SMatthias Ringwald     // teardown
289*68894c74SMatthias Ringwald     l2cap_free_channels_fuzz();
290*68894c74SMatthias Ringwald     return 0;
291*68894c74SMatthias Ringwald }
292