From b107f94044a10f702cbf2a29d0ba0fdb67c5eea5 Mon Sep 17 00:00:00 2001 From: "matthias.ringwald" <matthias.ringwald@1a0a8af8-31b5-11de-8e0c-53a27eea117e> Date: Sun, 15 Jun 2014 15:43:05 +0000 Subject: [PATCH] extracted sm_trigger_user_response() and extend for Initiator role --- ble/sm.c | 63 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/ble/sm.c b/ble/sm.c index c178f6126..31a4ffff0 100644 --- a/ble/sm.c +++ b/ble/sm.c @@ -805,6 +805,43 @@ static void sm_cmac_handle_encryption_result(sm_key_t data){ } } +static void sm_trigger_user_response(){ + // notify client for: JUST WORKS confirm, PASSKEY display or input + setup->sm_user_response = SM_USER_RESPONSE_IDLE; + switch (setup->sm_stk_generation_method){ + case PK_RESP_INPUT: + if (connection->sm_role){ + setup->sm_user_response = SM_USER_RESPONSE_PENDING; + sm_notify_client(SM_PASSKEY_INPUT_NUMBER, setup->sm_m_addr_type, setup->sm_m_address, 0, 0); + } else { + 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; + case PK_INIT_INPUT: + if (connection->sm_role){ + sm_notify_client(SM_PASSKEY_DISPLAY_NUMBER, setup->sm_m_addr_type, setup->sm_m_address, READ_NET_32(setup->sm_tk, 12), 0); + } else { + setup->sm_user_response = SM_USER_RESPONSE_PENDING; + sm_notify_client(SM_PASSKEY_INPUT_NUMBER, setup->sm_m_addr_type, setup->sm_m_address, 0, 0); + } + break; + case JUST_WORKS: + switch (setup->sm_s_pres.io_capability){ + case IO_CAPABILITY_KEYBOARD_DISPLAY: + case IO_CAPABILITY_DISPLAY_YES_NO: + setup->sm_user_response = SM_USER_RESPONSE_PENDING; + sm_notify_client(SM_JUST_WORKS_REQUEST, setup->sm_m_addr_type, setup->sm_m_address, READ_NET_32(setup->sm_tk, 12), 0); + break; + default: + // cannot ask user + break; + } + break; + default: + break; + } +} + static int sm_key_distribution_all_received(){ int recv_flags = sm_key_distribution_flags_for_set(setup->sm_m_preq.initiator_key_distribution); return recv_flags == setup->sm_key_distribution_received_set; @@ -972,31 +1009,7 @@ static void sm_run(void){ l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) &setup->sm_s_pres, sizeof(sm_pairing_packet_t)); sm_2timeout_reset(); - // notify client for: JUST WORKS confirm, PASSKEY display or input - setup->sm_user_response = SM_USER_RESPONSE_IDLE; - switch (setup->sm_stk_generation_method){ - case PK_RESP_INPUT: - setup->sm_user_response = SM_USER_RESPONSE_PENDING; - sm_notify_client(SM_PASSKEY_INPUT_NUMBER, setup->sm_m_addr_type, setup->sm_m_address, 0, 0); - break; - case PK_INIT_INPUT: - 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; - case JUST_WORKS: - switch (setup->sm_s_pres.io_capability){ - case IO_CAPABILITY_KEYBOARD_DISPLAY: - case IO_CAPABILITY_DISPLAY_YES_NO: - setup->sm_user_response = SM_USER_RESPONSE_PENDING; - sm_notify_client(SM_JUST_WORKS_REQUEST, setup->sm_m_addr_type, setup->sm_m_address, READ_NET_32(setup->sm_tk, 12), 0); - break; - default: - // cannot ask user - break; - } - break; - default: - break; - } + sm_trigger_user_response(); connection->sm_engine_state = SM_RESPONDER_PH1_W4_PAIRING_CONFIRM; return;