BLE Host - Ignore EncKey flag in SC.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/487eabf0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/487eabf0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/487eabf0 Branch: refs/heads/develop Commit: 487eabf0004bc0df16287481ee080de46c98dad2 Parents: 67fbdd4 Author: Christopher Collins <ccoll...@apache.org> Authored: Wed Jun 1 10:22:38 2016 -0700 Committer: Christopher Collins <ccoll...@apache.org> Committed: Sun Jun 5 19:15:49 2016 +0800 ---------------------------------------------------------------------- net/nimble/host/src/ble_sm.c | 44 ++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/487eabf0/net/nimble/host/src/ble_sm.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/src/ble_sm.c b/net/nimble/host/src/ble_sm.c index a81f316..54f13db 100644 --- a/net/nimble/host/src/ble_sm.c +++ b/net/nimble/host/src/ble_sm.c @@ -832,6 +832,20 @@ ble_sm_process_result(uint16_t conn_handle, struct ble_sm_result *res) } } +static void +ble_sm_key_dist(struct ble_sm_proc *proc, + uint8_t *out_init_key_dist, uint8_t *out_resp_key_dist) +{ + *out_init_key_dist = proc->pair_req.init_key_dist; + *out_resp_key_dist = proc->pair_rsp.resp_key_dist; + + /* Encryption info and master ID are only sent in legacy pairing. */ + if (proc->flags & BLE_SM_PROC_F_SC) { + *out_init_key_dist &= ~BLE_SM_PAIR_KEY_DIST_ENC; + *out_resp_key_dist &= ~BLE_SM_PAIR_KEY_DIST_ENC; + } +} + /***************************************************************************** * $enc * *****************************************************************************/ @@ -1294,29 +1308,32 @@ ble_sm_state_after_pair(struct ble_sm_proc *proc) static void ble_sm_pair_cfg(struct ble_sm_proc *proc) { + uint8_t init_key_dist; + uint8_t resp_key_dist; uint8_t rx_key_dist; - if (proc->pair_req.authreq & BLE_SM_PAIR_AUTHREQ_BOND && - proc->pair_rsp.authreq & BLE_SM_PAIR_AUTHREQ_BOND && - proc->pair_rsp.init_key_dist && - proc->pair_rsp.resp_key_dist) { - - proc->flags |= BLE_SM_PROC_F_KEY_EXCHANGE; - } - if (proc->pair_req.authreq & BLE_SM_PAIR_AUTHREQ_SC && proc->pair_rsp.authreq & BLE_SM_PAIR_AUTHREQ_SC) { proc->flags |= BLE_SM_PROC_F_SC; } + ble_sm_key_dist(proc, &init_key_dist, &resp_key_dist); + if (proc->pair_req.authreq & BLE_SM_PAIR_AUTHREQ_BOND && + proc->pair_rsp.authreq & BLE_SM_PAIR_AUTHREQ_BOND && + init_key_dist != 0 && resp_key_dist != 0) { + + proc->flags |= BLE_SM_PROC_F_KEY_EXCHANGE; + } + if (proc->flags & BLE_SM_PROC_F_INITIATOR) { - rx_key_dist = proc->pair_rsp.resp_key_dist; + rx_key_dist = resp_key_dist; } else { - rx_key_dist = proc->pair_rsp.init_key_dist; + rx_key_dist = init_key_dist; } proc->rx_key_flags = 0; + if (rx_key_dist & BLE_SM_PAIR_KEY_DIST_ENC) { proc->rx_key_flags |= BLE_SM_KE_F_ENC_INFO | BLE_SM_KE_F_MASTER_ID; @@ -1597,13 +1614,16 @@ ble_sm_key_exch_go(struct ble_sm_proc *proc, struct ble_sm_master_id master_iden; struct ble_sm_id_info iden_info; struct ble_sm_enc_info enc_info; + uint8_t init_key_dist; + uint8_t resp_key_dist; uint8_t our_key_dist; int rc; + ble_sm_key_dist(proc, &init_key_dist, &resp_key_dist); if (proc->flags & BLE_SM_PROC_F_INITIATOR) { - our_key_dist = proc->pair_rsp.init_key_dist; + our_key_dist = init_key_dist; } else { - our_key_dist = proc->pair_rsp.resp_key_dist; + our_key_dist = resp_key_dist; } if (our_key_dist == 0) {