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