mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-10 06:44:32 +00:00
enable key distribution again, check for empty ediv and random in ltk request, work around sending set advertise enable twice in a row
This commit is contained in:
parent
9416e46f10
commit
86452e281a
@ -115,6 +115,7 @@ typedef enum {
|
|||||||
SM_STATE_IDLE,
|
SM_STATE_IDLE,
|
||||||
|
|
||||||
SM_STATE_SEND_SECURITY_REQUEST,
|
SM_STATE_SEND_SECURITY_REQUEST,
|
||||||
|
SM_STATE_SEND_LTK_REQUESTED_NEGATIVE_REPLY,
|
||||||
|
|
||||||
// Phase 1: Pairing Feature Exchange
|
// Phase 1: Pairing Feature Exchange
|
||||||
|
|
||||||
@ -280,6 +281,7 @@ static bd_addr_t sm_m_address;
|
|||||||
static key_t sm_m_csrk;
|
static key_t sm_m_csrk;
|
||||||
static key_t sm_m_irk;
|
static key_t sm_m_irk;
|
||||||
|
|
||||||
|
|
||||||
// @returns 1 if oob data is available
|
// @returns 1 if oob data is available
|
||||||
// stores oob data in provided 16 byte buffer if not null
|
// 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_oob_data)(uint8_t addres_type, bd_addr_t * addr, uint8_t * oob_data) = NULL;
|
||||||
@ -322,6 +324,16 @@ static inline void swap128(uint8_t src[16], uint8_t dst[16]){
|
|||||||
swapX(src, dst, 16);
|
swapX(src, dst, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @returns 1 if all bytes are 0
|
||||||
|
static int sm_is_null_random(uint8_t random[8]){
|
||||||
|
int i;
|
||||||
|
for (i=0; i < 8 ; i++){
|
||||||
|
if (random[i]) return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void print_key(const char * name, key_t key){
|
static void print_key(const char * name, key_t key){
|
||||||
printf("%-6s ", name);
|
printf("%-6s ", name);
|
||||||
hexdump(key, 16);
|
hexdump(key, 16);
|
||||||
@ -497,6 +509,11 @@ static void sm_run(void){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case SM_STATE_SEND_LTK_REQUESTED_NEGATIVE_REPLY:
|
||||||
|
hci_send_cmd(&hci_le_long_term_key_negative_reply, sm_response_handle);
|
||||||
|
sm_state_responding = SM_STATE_IDLE;
|
||||||
|
return;
|
||||||
|
|
||||||
case SM_STATE_SEND_PAIRING_FAILED: {
|
case SM_STATE_SEND_PAIRING_FAILED: {
|
||||||
uint8_t buffer[2];
|
uint8_t buffer[2];
|
||||||
buffer[0] = SM_CODE_PAIRING_FAILED;
|
buffer[0] = SM_CODE_PAIRING_FAILED;
|
||||||
@ -789,10 +806,10 @@ static void packet_handler (void * connection, uint8_t packet_type, uint16_t cha
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HCI_SUBEVENT_LE_LONG_TERM_KEY_REQUEST:
|
case HCI_SUBEVENT_LE_LONG_TERM_KEY_REQUEST:
|
||||||
log_info("LTK Request, state %u", sm_state_responding);
|
log_info("LTK Request: state %u", sm_state_responding);
|
||||||
if (sm_state_responding == SM_STATE_PH2_W4_LTK_REQUEST){
|
if (sm_state_responding == SM_STATE_PH2_W4_LTK_REQUEST){
|
||||||
// calculate STK
|
// calculate STK
|
||||||
log_info("calculating STK");
|
log_info("LTK Request: calculating STK");
|
||||||
// key_t sm_stk;
|
// key_t sm_stk;
|
||||||
// sm_s1(sm_tk, sm_s_random, sm_m_random, sm_stk);
|
// sm_s1(sm_tk, sm_s_random, sm_m_random, sm_stk);
|
||||||
sm_aes128_set_key(sm_tk);
|
sm_aes128_set_key(sm_tk);
|
||||||
@ -802,10 +819,18 @@ static void packet_handler (void * connection, uint8_t packet_type, uint16_t cha
|
|||||||
}
|
}
|
||||||
|
|
||||||
// re-establish previously used LTK using Rand and EDIV
|
// re-establish previously used LTK using Rand and EDIV
|
||||||
log_info("recalculating LTK");
|
|
||||||
swap64(&packet[5], sm_s_rand);
|
swap64(&packet[5], sm_s_rand);
|
||||||
sm_s_ediv = READ_BT_16(packet, 13);
|
sm_s_ediv = READ_BT_16(packet, 13);
|
||||||
|
|
||||||
|
// assume that we don't have a LTK for ediv == 0 and random == null
|
||||||
|
if (sm_s_ediv == 0 && sm_is_null_random(sm_s_rand)){
|
||||||
|
printf("LTK Request: ediv & random are empty\n");
|
||||||
|
sm_state_responding = SM_STATE_SEND_LTK_REQUESTED_NEGATIVE_REPLY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info("LTK Request: recalculating with ediv 0x%04x", sm_s_ediv);
|
||||||
|
|
||||||
// dhk = d1(IR, 1, 0) - enc
|
// dhk = d1(IR, 1, 0) - enc
|
||||||
// y = dm(dhk, rand) - enc
|
// y = dm(dhk, rand) - enc
|
||||||
// div = y xor ediv
|
// div = y xor ediv
|
||||||
@ -833,11 +858,14 @@ static void packet_handler (void * connection, uint8_t packet_type, uint16_t cha
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HCI_EVENT_DISCONNECTION_COMPLETE:
|
case HCI_EVENT_DISCONNECTION_COMPLETE:
|
||||||
|
// restart advertising if we have been connected before
|
||||||
|
// -> avoid sending advertise enable a second time before command complete was received
|
||||||
|
if (att_response_handle) {
|
||||||
|
hci_send_cmd(&hci_le_set_advertise_enable, 1);
|
||||||
|
}
|
||||||
|
|
||||||
att_response_handle = 0;
|
att_response_handle = 0;
|
||||||
att_response_size = 0;
|
att_response_size = 0;
|
||||||
|
|
||||||
// restart advertising
|
|
||||||
hci_send_cmd(&hci_le_set_advertise_enable, 1);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HCI_EVENT_COMMAND_COMPLETE:
|
case HCI_EVENT_COMMAND_COMPLETE:
|
||||||
@ -946,7 +974,7 @@ static void packet_handler (void * connection, uint8_t packet_type, uint16_t cha
|
|||||||
// distribute keys
|
// distribute keys
|
||||||
sm_distribute_keys();
|
sm_distribute_keys();
|
||||||
// done
|
// done
|
||||||
sm_state_responding = SM_STATE_IDLE;
|
sm_state_responding = SM_STATE_DISTRIBUTE_KEYS;
|
||||||
break;
|
break;
|
||||||
case SM_STATE_PH4_LTK_W4_ENC:
|
case SM_STATE_PH4_LTK_W4_ENC:
|
||||||
swap128(&packet[6], sm_s_ltk);
|
swap128(&packet[6], sm_s_ltk);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user