mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-21 13:21:05 +00:00
sm: send le read p256 public key on start
This commit is contained in:
parent
82180fcac7
commit
09e4d3970f
43
src/ble/sm.c
43
src/ble/sm.c
@ -137,6 +137,7 @@ typedef enum {
|
||||
typedef enum {
|
||||
EC_KEY_GENERATION_IDLE,
|
||||
EC_KEY_GENERATION_ACTIVE,
|
||||
EC_KEY_GENERATION_W4_KEY,
|
||||
EC_KEY_GENERATION_DONE,
|
||||
} ec_key_generation_state_t;
|
||||
|
||||
@ -222,15 +223,18 @@ static btstack_packet_callback_registration_t hci_event_callback_registration;
|
||||
/* to dispatch sm event */
|
||||
static btstack_linked_list_t sm_event_handlers;
|
||||
|
||||
// LE Secure Connections
|
||||
#ifdef ENABLE_LE_SECURE_CONNECTIONS
|
||||
static ec_key_generation_state_t ec_key_generation_state;
|
||||
static uint8_t ec_d[32];
|
||||
static uint8_t ec_qx[32];
|
||||
static uint8_t ec_qy[32];
|
||||
#endif
|
||||
|
||||
// Software ECDH implementation provided by mbedtls
|
||||
#ifdef USE_MBEDTLS_FOR_ECDH
|
||||
// group is always valid
|
||||
static mbedtls_ecp_group mbedtls_ec_group;
|
||||
static ec_key_generation_state_t ec_key_generation_state;
|
||||
static uint8_t ec_qx[32];
|
||||
static uint8_t ec_qy[32];
|
||||
static uint8_t ec_d[32];
|
||||
#ifndef HAVE_MALLOC
|
||||
// COMP Method with Window 2
|
||||
// 1300 bytes with 23 allocations
|
||||
@ -1333,8 +1337,6 @@ static int sm_passkey_used(stk_generation_method_t method);
|
||||
static int sm_just_works_or_numeric_comparison(stk_generation_method_t method);
|
||||
|
||||
static void sm_log_ec_keypair(void){
|
||||
log_info("Elliptic curve: d");
|
||||
log_info_hexdump(ec_d,32);
|
||||
log_info("Elliptic curve: X");
|
||||
log_info_hexdump(ec_qx,32);
|
||||
log_info("Elliptic curve: Y");
|
||||
@ -1813,9 +1815,14 @@ static void sm_run(void){
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef USE_MBEDTLS_FOR_ECDH
|
||||
#ifdef ENABLE_LE_SECURE_CONNECTIONS
|
||||
if (ec_key_generation_state == EC_KEY_GENERATION_ACTIVE){
|
||||
#ifdef USE_MBEDTLS_FOR_ECDH
|
||||
sm_random_start(NULL);
|
||||
#else
|
||||
ec_key_generation_state = EC_KEY_GENERATION_W4_KEY;
|
||||
hci_send_cmd(&hci_le_read_local_p256_public_key);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
@ -2743,6 +2750,8 @@ static void sm_handle_random_result(uint8_t * data){
|
||||
mbedtls_ecp_point_free(&P);
|
||||
mbedtls_mpi_free(&d);
|
||||
ec_key_generation_state = EC_KEY_GENERATION_DONE;
|
||||
log_info("Elliptic curve: d");
|
||||
log_info_hexdump(ec_d,32);
|
||||
sm_log_ec_keypair();
|
||||
|
||||
#if 0
|
||||
@ -2882,7 +2891,7 @@ static void sm_event_packet_handler (uint8_t packet_type, uint16_t channel, uint
|
||||
|
||||
dkg_state = sm_persistent_irk_ready ? DKG_CALC_DHK : DKG_CALC_IRK;
|
||||
rau_state = RAU_IDLE;
|
||||
#ifdef USE_MBEDTLS_FOR_ECDH
|
||||
#ifdef ENABLE_LE_SECURE_CONNECTIONS
|
||||
if (!sm_have_ec_keypair){
|
||||
setup->sm_passkey_bit = 0;
|
||||
ec_key_generation_state = EC_KEY_GENERATION_ACTIVE;
|
||||
@ -2973,7 +2982,16 @@ static void sm_event_packet_handler (uint8_t packet_type, uint16_t channel, uint
|
||||
sm_conn->sm_engine_state = SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case HCI_SUBEVENT_LE_READ_LOCAL_P256_PUBLIC_KEY_COMPLETE:
|
||||
if (hci_subevent_le_read_local_p256_public_key_complete_get_status(packet)){
|
||||
log_error("Read Local P256 Public Key failed");
|
||||
break;
|
||||
}
|
||||
hci_subevent_le_read_local_p256_public_key_complete_get_dhkey_x(packet, ec_qx);
|
||||
hci_subevent_le_read_local_p256_public_key_complete_get_dhkey_y(packet, ec_qy);
|
||||
ec_key_generation_state = EC_KEY_GENERATION_DONE;
|
||||
sm_log_ec_keypair();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -3602,8 +3620,11 @@ void sm_init(void){
|
||||
// and L2CAP PDUs + L2CAP_EVENT_CAN_SEND_NOW
|
||||
l2cap_register_fixed_channel(sm_pdu_handler, L2CAP_CID_SECURITY_MANAGER_PROTOCOL);
|
||||
|
||||
#ifdef USE_MBEDTLS_FOR_ECDH
|
||||
#ifdef ENABLE_LE_SECURE_CONNECTIONS
|
||||
ec_key_generation_state = EC_KEY_GENERATION_IDLE;
|
||||
#endif
|
||||
|
||||
#ifdef USE_MBEDTLS_FOR_ECDH
|
||||
|
||||
#ifndef HAVE_MALLOC
|
||||
sm_mbedtls_allocator_init(mbedtls_memory_buffer, sizeof(mbedtls_memory_buffer));
|
||||
@ -3886,7 +3907,7 @@ void gap_random_address_set(bd_addr_t addr){
|
||||
*/
|
||||
void gap_advertisements_set_params(uint16_t adv_int_min, uint16_t adv_int_max, uint8_t adv_type,
|
||||
uint8_t direct_address_typ, bd_addr_t direct_address, uint8_t channel_map, uint8_t filter_policy){
|
||||
hci_le_advertisements_set_params(adv_int_min, adv_int_max, adv_type, gap_random_adress_type,
|
||||
hci_le_advertisements_set_params(adv_int_min, adv_int_max, adv_type, gap_random_adress_type == 0 ? 0 : 1,
|
||||
direct_address_typ, direct_address, channel_map, filter_policy);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user