sm: allow to override ltk with sm_register_ltk_callback

This commit is contained in:
Matthias Ringwald 2022-01-27 20:54:10 +01:00
parent 12d9fd2d3f
commit b96d60a610
2 changed files with 15 additions and 1 deletions

View File

@ -386,6 +386,7 @@ static uint16_t sm_active_connection_handle = HCI_CON_HANDLE_INVALID;
// stores oob data in provided 16 byte buffer if not null
static int (*sm_get_oob_data)(uint8_t addres_type, bd_addr_t addr, uint8_t * oob_data) = NULL;
static int (*sm_get_sc_oob_data)(uint8_t addres_type, bd_addr_t addr, uint8_t * oob_sc_peer_confirm, uint8_t * oob_sc_peer_random);
static bool (*sm_get_ltk_callback)(hci_con_handle_t con_handle, uint8_t addres_type, bd_addr_t addr, uint8_t * ltk);
static void sm_run(void);
static void sm_done_for_handle(hci_con_handle_t con_handle);
@ -3011,6 +3012,10 @@ static void sm_run(void){
return;
}
case SM_RESPONDER_PH4_SEND_LTK_REPLY: {
// allow to override LTK
if (sm_get_ltk_callback != NULL){
(void)(*sm_get_ltk_callback)(connection->sm_handle, connection->sm_peer_addr_type, connection->sm_peer_address, setup->sm_ltk);
}
sm_key_t ltk_flipped;
reverse_128(setup->sm_ltk, ltk_flipped);
connection->sm_engine_state = SM_PH4_W4_CONNECTION_ENCRYPTED;
@ -4640,6 +4645,10 @@ void sm_register_sc_oob_data_callback( int (*get_sc_oob_data_callback)(uint8_t a
sm_get_sc_oob_data = get_sc_oob_data_callback;
}
void sm_register_ltk_callback( bool (*get_ltk_callback)(hci_con_handle_t con_handle, uint8_t address_type, bd_addr_t addr, uint8_t * ltk)){
sm_get_ltk_callback = get_ltk_callback;
}
void sm_add_event_handler(btstack_packet_callback_registration_t * callback_handler){
btstack_linked_list_add_tail(&sm_event_handlers, (btstack_linked_item_t*) callback_handler);
}

View File

@ -262,13 +262,18 @@ void sm_allow_ltk_reconstruction_without_le_device_db_entry(int allow);
uint8_t sm_generate_sc_oob_data(void (*callback)(const uint8_t * confirm_value, const uint8_t * random_value));
/**
*
* @brief Registers OOB Data Callback for LE Secure Conections. The callback should set all arguments and return 1 if OOB data is availble
* @note the oob_sc_local_random usually is the random_value returend by sm_generate_sc_oob_data
* @param get_oob_data_callback
*/
void sm_register_sc_oob_data_callback( int (*get_sc_oob_data_callback)(uint8_t address_type, bd_addr_t addr, uint8_t * oob_sc_peer_confirm, uint8_t * oob_sc_peer_random));
/**
* @bbrief Register LTK Callback that allows to provide a custom LTK on re-encryption. The callback returns true if LTK was modified
* @param get_ltk_callback
*/
void sm_register_ltk_callback( bool (*get_ltk_callback)(hci_con_handle_t con_handle, uint8_t address_type, bd_addr_t addr, uint8_t * ltk));
/* API_END */
/**