From 8e9a149871080d25a70bb194b8baf7ea9bce307e Mon Sep 17 00:00:00 2001 From: "matthias.ringwald" <matthias.ringwald@1a0a8af8-31b5-11de-8e0c-53a27eea117e> Date: Fri, 13 Jun 2014 13:36:13 +0000 Subject: [PATCH] use local/peer instead of m/s for confirm --- ble/sm.c | 54 ++++++++++++++++++++---------------------------------- 1 file changed, 20 insertions(+), 34 deletions(-) diff --git a/ble/sm.c b/ble/sm.c index 242b3f408..3c89b1511 100644 --- a/ble/sm.c +++ b/ble/sm.c @@ -291,10 +291,11 @@ typedef struct sm_setup_context { // master sm_pairing_packet_t sm_m_preq; // pairing request - sm_key_t sm_m_confirm; // key distribution, received from master // commented keys that are not stored or used by Peripheral role + // uint16_t sm_m_y; + // uint16_t sm_m_div; // uint16_t sm_m_ediv; // uint8_t sm_m_rand[8]; uint8_t sm_m_addr_type; @@ -304,7 +305,6 @@ typedef struct sm_setup_context { // slave sm_pairing_packet_t sm_s_pres; // pairing response - sm_key_t sm_s_confirm; // key distribution, slave sends uint16_t sm_s_y; @@ -312,9 +312,9 @@ typedef struct sm_setup_context { uint16_t sm_s_ediv; uint8_t sm_s_rand[8]; // commented keys are not used in Perihperal role - // sm_key_t sm_s_csrk; uint8_t sm_s_addr_type; bd_addr_t sm_s_address; + // sm_key_t sm_s_csrk; } sm_setup_context_t; @@ -1094,11 +1094,7 @@ static void sm_run(void){ case SM_STATE_PH2_C1_SEND_PAIRING_CONFIRM: { uint8_t buffer[17]; buffer[0] = SM_CODE_PAIRING_CONFIRM; - if (connection->sm_role){ - swap128(setup->sm_s_confirm, &buffer[1]); - } else { - swap128(setup->sm_m_confirm, &buffer[1]); - } + swap128(setup->sm_local_confirm, &buffer[1]); l2cap_send_connectionless(connection->sm_handle, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, (uint8_t*) buffer, sizeof(buffer)); sm_2timeout_reset(); if (connection->sm_role){ @@ -1275,35 +1271,25 @@ static void sm_handle_encryption_result(uint8_t * data){ sm_next_responding_state(); return; case SM_STATE_PH2_C1_W4_ENC_B: - if (connection->sm_role){ - swap128(data, setup->sm_s_confirm); - print_key("c1!", setup->sm_s_confirm); - } else { - swap128(data, setup->sm_m_confirm); - print_key("c1!", setup->sm_m_confirm); - } + swap128(data, setup->sm_local_confirm); + print_key("c1!", setup->sm_local_confirm); connection->sm_state_responding = SM_STATE_PH2_C1_SEND_PAIRING_CONFIRM; return; case SM_STATE_PH2_C1_W4_ENC_D: { - sm_key_t remote_confirm_test; - swap128(data, remote_confirm_test); - print_key("c1!", remote_confirm_test); - if (connection->sm_role){ - if (memcmp(setup->sm_m_confirm, remote_confirm_test, 16) == 0){ - // send s_random - connection->sm_state_responding = SM_STATE_PH2_SEND_PAIRING_RANDOM; - return; - } - } else { - if (memcmp(setup->sm_s_confirm, remote_confirm_test, 16) == 0){ - connection->sm_state_responding = SM_STATE_PH2_CALC_STK; - return; - } + sm_key_t peer_confirm_test; + swap128(data, peer_confirm_test); + print_key("c1!", peer_confirm_test); + if (memcmp(setup->sm_peer_confirm, peer_confirm_test, 16) != 0){ + setup->sm_pairing_failed_reason = SM_REASON_CONFIRM_VALUE_FAILED; + connection->sm_state_responding = SM_STATE_SEND_PAIRING_FAILED; + return; + } + if (connection->sm_role){ + connection->sm_state_responding = SM_STATE_PH2_SEND_PAIRING_RANDOM; + } else { + connection->sm_state_responding = SM_STATE_PH2_CALC_STK; } - - setup->sm_pairing_failed_reason = SM_REASON_CONFIRM_VALUE_FAILED; - connection->sm_state_responding = SM_STATE_SEND_PAIRING_FAILED; } return; case SM_STATE_PH2_W4_STK: @@ -1707,7 +1693,7 @@ static void sm_packet_handler(uint8_t packet_type, uint16_t handle, uint8_t *pac } // store s_confirm - swap128(&packet[1], setup->sm_s_confirm); + swap128(&packet[1], setup->sm_peer_confirm); connection->sm_state_responding = SM_STATE_PH2_SEND_PAIRING_RANDOM; break; @@ -1779,7 +1765,7 @@ static void sm_packet_handler(uint8_t packet_type, uint16_t handle, uint8_t *pac } // received confirm value - swap128(&packet[1], setup->sm_m_confirm); + swap128(&packet[1], setup->sm_peer_confirm); // notify client to hide shown passkey if (setup->sm_stk_generation_method == PK_INIT_INPUT){