sm_s_auth_req and sm_s_io_capabilities into setup, sm_auth_req and sm_io_capabilites as global config

This commit is contained in:
matthias.ringwald 2014-06-12 22:15:27 +00:00
parent d90eba5c0c
commit 4582af4c24

View File

@ -182,8 +182,8 @@ typedef enum {
static uint8_t sm_accepted_stk_generation_methods; static uint8_t sm_accepted_stk_generation_methods;
static uint8_t sm_max_encryption_key_size; static uint8_t sm_max_encryption_key_size;
static uint8_t sm_min_encryption_key_size; static uint8_t sm_min_encryption_key_size;
static uint8_t sm_s_auth_req = 0; static uint8_t sm_auth_req = 0;
static uint8_t sm_s_io_capabilities = IO_CAPABILITY_UNKNOWN; static uint8_t sm_io_capabilities = IO_CAPABILITY_UNKNOWN;
static uint8_t sm_slave_request_security; static uint8_t sm_slave_request_security;
static stk_generation_method_t sm_stk_generation_method; static stk_generation_method_t sm_stk_generation_method;
@ -267,8 +267,10 @@ typedef struct sm_setup_context {
sm_key_t sm_m_irk; sm_key_t sm_m_irk;
// slave = local data // slave = local data
sm_key_t sm_s_random; uint8_t sm_s_io_capabilities;
uint8_t sm_s_have_oob_data; uint8_t sm_s_have_oob_data;
uint8_t sm_s_auth_req;
sm_key_t sm_s_random;
sm_key_t sm_s_confirm; sm_key_t sm_s_confirm;
uint8_t sm_s_pres[7]; uint8_t sm_s_pres[7];
@ -559,7 +561,7 @@ static void sm_setup_tk(){
// If both devices have not set the MITM option in the Authentication Requirements // If both devices have not set the MITM option in the Authentication Requirements
// Flags, then the IO capabilities shall be ignored and the Just Works association // Flags, then the IO capabilities shall be ignored and the Just Works association
// model shall be used. // model shall be used.
if ( ((setup->sm_m_auth_req & SM_AUTHREQ_MITM_PROTECTION) == 0x00) && ((sm_s_auth_req & SM_AUTHREQ_MITM_PROTECTION) == 0)){ if ( ((setup->sm_m_auth_req & SM_AUTHREQ_MITM_PROTECTION) == 0x00) && ((setup->sm_s_auth_req & SM_AUTHREQ_MITM_PROTECTION) == 0)){
return; return;
} }
@ -570,9 +572,9 @@ static void sm_setup_tk(){
// Otherwise the IO capabilities of the devices shall be used to determine the // Otherwise the IO capabilities of the devices shall be used to determine the
// pairing method as defined in Table 2.4. // pairing method as defined in Table 2.4.
sm_stk_generation_method = stk_generation_method[sm_s_io_capabilities][setup->sm_m_io_capabilities]; sm_stk_generation_method = stk_generation_method[setup->sm_s_io_capabilities][setup->sm_m_io_capabilities];
printf("sm_setup_tk: master io cap: %u, slave io cap: %u -> method %u\n", printf("sm_setup_tk: master io cap: %u, slave io cap: %u -> method %u\n",
setup->sm_m_io_capabilities, sm_s_io_capabilities, sm_stk_generation_method); setup->sm_m_io_capabilities, setup->sm_s_io_capabilities, sm_stk_generation_method);
} }
static int sm_key_distribution_flags_for_set(uint8_t key_set){ static int sm_key_distribution_flags_for_set(uint8_t key_set){
@ -929,9 +931,9 @@ static void sm_run(void){
memcpy(buffer, setup->sm_m_preq, 7); memcpy(buffer, setup->sm_m_preq, 7);
buffer[0] = SM_CODE_PAIRING_RESPONSE; buffer[0] = SM_CODE_PAIRING_RESPONSE;
buffer[1] = sm_s_io_capabilities; buffer[1] = setup->sm_s_io_capabilities;
buffer[2] = setup->sm_s_have_oob_data; buffer[2] = setup->sm_s_have_oob_data;
buffer[3] = sm_s_auth_req; buffer[3] = setup->sm_s_auth_req;
buffer[4] = sm_max_encryption_key_size; buffer[4] = sm_max_encryption_key_size;
memcpy(setup->sm_s_pres, buffer, 7); memcpy(setup->sm_s_pres, buffer, 7);
@ -952,7 +954,7 @@ static void sm_run(void){
sm_notify_client(SM_PASSKEY_DISPLAY_NUMBER, setup->sm_m_addr_type, setup->sm_m_address, READ_NET_32(setup->sm_tk, 12), 0); sm_notify_client(SM_PASSKEY_DISPLAY_NUMBER, setup->sm_m_addr_type, setup->sm_m_address, READ_NET_32(setup->sm_tk, 12), 0);
break; break;
case JUST_WORKS: case JUST_WORKS:
switch (sm_s_io_capabilities){ switch (setup->sm_s_io_capabilities){
case IO_CAPABILITY_KEYBOARD_DISPLAY: case IO_CAPABILITY_KEYBOARD_DISPLAY:
case IO_CAPABILITY_DISPLAY_YES_NO: case IO_CAPABILITY_DISPLAY_YES_NO:
setup->sm_user_response = SM_USER_RESPONSE_PENDING; setup->sm_user_response = SM_USER_RESPONSE_PENDING;
@ -1419,6 +1421,8 @@ static void sm_event_packet_handler (uint8_t packet_type, uint16_t channel, uint
hci_le_advertisement_address(&setup->sm_s_addr_type, &setup->sm_s_address); hci_le_advertisement_address(&setup->sm_s_addr_type, &setup->sm_s_address);
setup->sm_m_addr_type = packet[7]; setup->sm_m_addr_type = packet[7];
bt_flip_addr(setup->sm_m_address, &packet[8]); bt_flip_addr(setup->sm_m_address, &packet[8]);
setup->sm_s_auth_req = sm_auth_req;
setup->sm_s_io_capabilities = sm_io_capabilities;
// request security if we're slave and requested by app // request security if we're slave and requested by app
if (connection->sm_role == 0x01 && sm_slave_request_security){ if (connection->sm_role == 0x01 && sm_slave_request_security){
@ -1718,11 +1722,11 @@ void sm_set_encryption_key_size_range(uint8_t min_size, uint8_t max_size){
} }
void sm_set_authentication_requirements(uint8_t auth_req){ void sm_set_authentication_requirements(uint8_t auth_req){
sm_s_auth_req = auth_req; sm_auth_req = auth_req;
} }
void sm_set_io_capabilities(io_capability_t io_capability){ void sm_set_io_capabilities(io_capability_t io_capability){
sm_s_io_capabilities = io_capability; sm_io_capabilities = io_capability;
} }
void sm_set_request_security(int enable){ void sm_set_request_security(int enable){