mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-16 08:42:28 +00:00
use identity resolving event
This commit is contained in:
parent
1e57f667d3
commit
c3d83d1ea0
@ -80,10 +80,15 @@ typedef enum {
|
|||||||
static void att_run(void);
|
static void att_run(void);
|
||||||
|
|
||||||
static att_server_state_t att_server_state;
|
static att_server_state_t att_server_state;
|
||||||
static uint16_t att_request_handle = 0;
|
|
||||||
static uint16_t att_request_size = 0;
|
static uint16_t att_request_handle = 0;
|
||||||
static uint8_t att_request_buffer[28];
|
static uint16_t att_request_size = 0;
|
||||||
static int att_advertisements_enabled = 0;
|
static uint8_t att_request_buffer[28];
|
||||||
|
|
||||||
|
static int att_advertisements_enabled = 0;
|
||||||
|
|
||||||
|
static int att_ir_central_device_db_index = -1;
|
||||||
|
static int att_ir_lookup_active = 0;
|
||||||
|
|
||||||
static void app_packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
static void app_packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
||||||
|
|
||||||
@ -112,6 +117,7 @@ static void app_packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *
|
|||||||
// reset connection MTU
|
// reset connection MTU
|
||||||
att_connection.mtu = 23;
|
att_connection.mtu = 23;
|
||||||
att_advertisements_enabled = 0;
|
att_advertisements_enabled = 0;
|
||||||
|
att_ir_lookup_active = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -143,13 +149,22 @@ static void app_packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SM_IDENTITY_RESOLVING_SUCCEEDED:
|
||||||
|
att_ir_lookup_active = 0;
|
||||||
|
att_ir_central_device_db_index = ((sm_event_identity_resolving_t*) packet)->central_device_db_index;
|
||||||
|
att_run();
|
||||||
|
break;
|
||||||
|
case SM_IDENTITY_RESOLVING_FAILED:
|
||||||
|
att_ir_lookup_active = 0;
|
||||||
|
att_ir_central_device_db_index = -1;
|
||||||
|
att_run();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void att_signed_write_handle_cmac_result(uint8_t hash[8]){
|
static void att_signed_write_handle_cmac_result(uint8_t hash[8]){
|
||||||
|
|
||||||
if (att_server_state != ATT_SERVER_W4_SIGNED_WRITE_VALIDATION) return;
|
if (att_server_state != ATT_SERVER_W4_SIGNED_WRITE_VALIDATION) return;
|
||||||
@ -162,7 +177,7 @@ static void att_signed_write_handle_cmac_result(uint8_t hash[8]){
|
|||||||
|
|
||||||
// update sequence number
|
// update sequence number
|
||||||
uint32_t counter_packet = READ_BT_32(att_request_buffer, att_request_size-12);
|
uint32_t counter_packet = READ_BT_32(att_request_buffer, att_request_size-12);
|
||||||
central_device_db_counter_set(sm_central_device_db_matched(), counter_packet+1);
|
central_device_db_counter_set(att_ir_central_device_db_index, counter_packet+1);
|
||||||
// just treat signed write command as simple write command after validation
|
// just treat signed write command as simple write command after validation
|
||||||
att_request_buffer[0] = ATT_WRITE_COMMAND;
|
att_request_buffer[0] = ATT_WRITE_COMMAND;
|
||||||
att_server_state = ATT_SERVER_REQUEST_RECEIVED;
|
att_server_state = ATT_SERVER_REQUEST_RECEIVED;
|
||||||
@ -187,22 +202,19 @@ static void att_run(void){
|
|||||||
att_server_state = ATT_SERVER_IDLE;
|
att_server_state = ATT_SERVER_IDLE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (sm_central_device_db_matched()){
|
if (att_ir_lookup_active){
|
||||||
case -1:
|
// search ongoing,
|
||||||
printf("ATT Signed Write, CSRK not available\n");
|
return;
|
||||||
att_server_state = ATT_SERVER_IDLE;
|
}
|
||||||
return;
|
if (att_ir_central_device_db_index < 0){
|
||||||
case -2:
|
printf("ATT Signed Write, CSRK not available\n");
|
||||||
// search ongoing,
|
att_server_state = ATT_SERVER_IDLE;
|
||||||
// @todo: send events for central device lookup, as it provides a trigger
|
return;
|
||||||
return;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// check counter
|
// check counter
|
||||||
uint32_t counter_packet = READ_BT_32(att_request_buffer, att_request_size-12);
|
uint32_t counter_packet = READ_BT_32(att_request_buffer, att_request_size-12);
|
||||||
uint32_t counter_db = central_device_db_counter_get(sm_central_device_db_matched());
|
uint32_t counter_db = central_device_db_counter_get(att_ir_central_device_db_index);
|
||||||
printf("ATT Signed Write, DB counter %u, packet counter %u\n", counter_db, counter_packet);
|
printf("ATT Signed Write, DB counter %u, packet counter %u\n", counter_db, counter_packet);
|
||||||
if (counter_packet < counter_db){
|
if (counter_packet < counter_db){
|
||||||
printf("ATT Signed Write, db reports higher counter, abort\n");
|
printf("ATT Signed Write, db reports higher counter, abort\n");
|
||||||
@ -212,7 +224,7 @@ static void att_run(void){
|
|||||||
|
|
||||||
// signature is { sequence counter, secure hash }
|
// signature is { sequence counter, secure hash }
|
||||||
sm_key_t csrk;
|
sm_key_t csrk;
|
||||||
central_device_db_csrk(sm_central_device_db_matched(), csrk);
|
central_device_db_csrk(att_ir_central_device_db_index, csrk);
|
||||||
att_server_state = ATT_SERVER_W4_SIGNED_WRITE_VALIDATION;
|
att_server_state = ATT_SERVER_W4_SIGNED_WRITE_VALIDATION;
|
||||||
sm_cmac_start(csrk, att_request_size - 8, att_request_buffer, att_signed_write_handle_cmac_result);
|
sm_cmac_start(csrk, att_request_size - 8, att_request_buffer, att_signed_write_handle_cmac_result);
|
||||||
return;
|
return;
|
||||||
|
@ -1254,7 +1254,7 @@ static void sm_event_packet_handler (void * connection, uint8_t packet_type, uin
|
|||||||
dkg_state = DKG_CALC_IRK;
|
dkg_state = DKG_CALC_IRK;
|
||||||
|
|
||||||
sm_run();
|
sm_run();
|
||||||
return; // don't notify app packet handler
|
return; // don't notify app packet handler just yet
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1563,28 +1563,11 @@ static void sm_event_packet_handler (void * connection, uint8_t packet_type, uin
|
|||||||
sm_s_div = READ_NET_16(packet, 6);
|
sm_s_div = READ_NET_16(packet, 6);
|
||||||
print_hex16("div", sm_s_div);
|
print_hex16("div", sm_s_div);
|
||||||
|
|
||||||
// PLAN
|
|
||||||
// PH3B1 - calculate DHK from IR - enc
|
|
||||||
// PH3B2 - calculate Y from - enc
|
|
||||||
// PH3B3 - calculate EDIV
|
|
||||||
// PH3B4 - calculate LTK - enc
|
|
||||||
|
|
||||||
// skip PH3B1 - we got DHK during startup
|
|
||||||
// PH3B2 - calculate Y from - enc
|
// PH3B2 - calculate Y from - enc
|
||||||
// Y = dm(DHK, Rand)
|
// Y = dm(DHK, Rand)
|
||||||
sm_aes128_set_key(sm_persistent_dhk);
|
sm_aes128_set_key(sm_persistent_dhk);
|
||||||
sm_dm_r_prime(sm_s_rand, sm_aes128_plaintext);
|
sm_dm_r_prime(sm_s_rand, sm_aes128_plaintext);
|
||||||
sm_state_responding = SM_STATE_PH3_Y_GET_ENC;
|
sm_state_responding = SM_STATE_PH3_Y_GET_ENC;
|
||||||
|
|
||||||
// // calculate EDIV and LTK
|
|
||||||
// sm_s_ediv = sm_ediv(sm_persistent_dhk, sm_s_rand, sm_s_div);
|
|
||||||
// sm_s_ltk(sm_persistent_er, sm_s_div, sm_s_ltk);
|
|
||||||
// print_key("ltk", sm_s_ltk);
|
|
||||||
// print_hex16("ediv", sm_s_ediv);
|
|
||||||
// // distribute keys
|
|
||||||
// sm_distribute_keys();
|
|
||||||
// // done
|
|
||||||
// sm_state_responding = SM_STATE_IDLE;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1594,7 +1577,7 @@ static void sm_event_packet_handler (void * connection, uint8_t packet_type, uin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// forward packet to ATT or so
|
// forward packet to higher layer
|
||||||
if (sm_client_packet_handler){
|
if (sm_client_packet_handler){
|
||||||
sm_client_packet_handler(packet_type, 0, packet, size);
|
sm_client_packet_handler(packet_type, 0, packet, size);
|
||||||
}
|
}
|
||||||
@ -1725,13 +1708,3 @@ void sm_set_io_capabilities(io_capability_t io_capability){
|
|||||||
void sm_set_request_security(int enable){
|
void sm_set_request_security(int enable){
|
||||||
sm_s_request_security = enable;
|
sm_s_request_security = enable;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sm_central_device_db_matched(){
|
|
||||||
if (sm_central_device_matched >= 0) {
|
|
||||||
return sm_central_device_matched;
|
|
||||||
}
|
|
||||||
if (sm_central_device_test >= 0){
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
@ -143,8 +143,6 @@ void sm_set_request_security(int enable);
|
|||||||
// Support for signed writes
|
// Support for signed writes
|
||||||
int sm_cmac_ready();
|
int sm_cmac_ready();
|
||||||
void sm_cmac_start(sm_key_t k, uint16_t message_len, uint8_t * message, void (*done_handler)(uint8_t hash[8]));
|
void sm_cmac_start(sm_key_t k, uint16_t message_len, uint8_t * message, void (*done_handler)(uint8_t hash[8]));
|
||||||
// @returns -1 if device wasn't found, -2, if lookup is ongoing, or index for central_device_db
|
|
||||||
int sm_central_device_db_matched();
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// GAP LE API
|
// GAP LE API
|
||||||
|
Loading…
x
Reference in New Issue
Block a user