diff --git a/src/ble/sm.c b/src/ble/sm.c index afbeaddde..c9bf36aae 100644 --- a/src/ble/sm.c +++ b/src/ble/sm.c @@ -1288,11 +1288,15 @@ static void sm_address_resolution_handle_event(address_resolution_event_t event) if (sm_connection->sm_role) { #ifdef ENABLE_LE_PERIPHERAL - // LTK request received before, IRK required -> start LTK calculation + // IRK required before, continue if (sm_connection->sm_engine_state == SM_RESPONDER_PH0_RECEIVED_LTK_W4_IRK){ sm_connection->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST; break; } + if (sm_connection->sm_engine_state == SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED_W4_IRK){ + sm_connection->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED; + break; + } bool trigger_security_request = (sm_connection->sm_pairing_requested != 0) || (sm_slave_request_security != 0); sm_connection->sm_pairing_requested = 0; #ifdef ENABLE_LE_PROACTIVE_AUTHENTICATION @@ -3781,6 +3785,9 @@ static void sm_pdu_handler(uint8_t packet_type, hci_con_handle_t con_handle, uin return; } + int have_ltk; + uint8_t ltk[16]; + switch (sm_conn->sm_engine_state){ // a sm timeout requires a new physical connection @@ -3797,8 +3804,6 @@ static void sm_pdu_handler(uint8_t packet_type, hci_con_handle_t con_handle, uin } // IRK complete? - int have_ltk; - uint8_t ltk[16]; switch (sm_conn->sm_irk_lookup_state){ case IRK_LOOKUP_FAILED: // start pairing @@ -3932,9 +3937,18 @@ static void sm_pdu_handler(uint8_t packet_type, hci_con_handle_t con_handle, uin } // store pairing request - (void)memcpy(&sm_conn->sm_m_preq, packet, - sizeof(sm_pairing_packet_t)); - sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED; + (void)memcpy(&sm_conn->sm_m_preq, packet, sizeof(sm_pairing_packet_t)); + + // check if IRK completed + switch (sm_conn->sm_irk_lookup_state){ + case IRK_LOOKUP_SUCCEEDED: + case IRK_LOOKUP_FAILED: + sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED; + break; + default: + sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED_W4_IRK; + break; + } break; #endif diff --git a/src/hci.h b/src/hci.h index 035be11ef..a9101eb8e 100644 --- a/src/hci.h +++ b/src/hci.h @@ -330,6 +330,7 @@ typedef enum { SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY, SM_RESPONDER_PH1_W4_PAIRING_REQUEST, SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED, + SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED_W4_IRK, SM_RESPONDER_PH1_SEND_PAIRING_RESPONSE, SM_RESPONDER_PH1_W4_PAIRING_CONFIRM, SM_RESPONDER_PH2_W4_PAIRING_RANDOM,