You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2016/06/05 11:52:27 UTC
[40/43] incubator-mynewt-core git commit: BLE Host - sc;
persist both slv and mst keys.
BLE Host - sc; persist both slv and mst keys.
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/f409863d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/f409863d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/f409863d
Branch: refs/heads/develop
Commit: f409863df342a6aacc373211f352de525edd5a1f
Parents: 22748c6
Author: Christopher Collins <cc...@apache.org>
Authored: Sun Jun 5 16:08:37 2016 +0800
Committer: Christopher Collins <cc...@apache.org>
Committed: Sun Jun 5 19:17:09 2016 +0800
----------------------------------------------------------------------
net/nimble/host/src/ble_sm.c | 48 +++++++++++++++++------------
net/nimble/host/src/ble_sm_sc.c | 6 ++++
net/nimble/host/src/test/ble_sm_test.c | 16 ++++++++--
3 files changed, 48 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f409863d/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 186ad79..4fb1b64 100644
--- a/net/nimble/host/src/ble_sm.c
+++ b/net/nimble/host/src/ble_sm.c
@@ -1062,16 +1062,16 @@ ble_sm_ltk_restore_go(struct ble_sm_proc *proc, struct ble_sm_result *res,
}
static int
-ble_sm_retrieve_ltk(struct hci_le_lt_key_req *evt,
- struct ble_store_value_sec *value_sec)
+ble_sm_retrieve_ltk(struct hci_le_lt_key_req *evt, uint8_t peer_addr_type,
+ uint8_t *peer_addr, struct ble_store_value_sec *value_sec)
{
struct ble_store_key_sec key_sec;
int rc;
- /* Tell applicaiton to look up LTK by ediv/rand pair. */
- /* XXX: Also filter by peer address? */
+ /* Tell applicaiton to look up LTK by peer address and ediv/rand pair. */
memset(&key_sec, 0, sizeof key_sec);
- key_sec.peer_addr_type = BLE_STORE_ADDR_TYPE_NONE;
+ key_sec.peer_addr_type = peer_addr_type;
+ memcpy(key_sec.peer_addr, peer_addr, 6);
key_sec.ediv = evt->encrypted_diversifier;
key_sec.rand_num = evt->random_number;
key_sec.ediv_rand_present = 1;
@@ -1086,8 +1086,14 @@ ble_sm_rx_lt_key_req(struct hci_le_lt_key_req *evt)
struct ble_store_value_sec value_sec;
struct ble_sm_result res;
struct ble_sm_proc *proc;
+ struct ble_hs_conn *conn;
int store_rc;
int bonding;
+ uint8_t peer_addr[6];
+ uint8_t peer_addr_type;
+
+ /* Silence gcc warning. */
+ peer_addr_type = BLE_STORE_ADDR_TYPE_NONE;
memset(&res, 0, sizeof res);
@@ -1125,6 +1131,17 @@ ble_sm_rx_lt_key_req(struct hci_le_lt_key_req *evt)
} else {
/* The request is unexpected. Quietly ignore it. */
proc = NULL;
+ bonding = 0;
+ }
+
+ if (bonding) {
+ conn = ble_hs_conn_find(evt->connection_handle);
+ if (conn == NULL) {
+ res.app_status = BLE_HS_ENOTCONN;
+ } else {
+ peer_addr_type = conn->bhc_addr_type;
+ memcpy(peer_addr, conn->bhc_addr, 6);
+ }
}
ble_hs_unlock();
@@ -1133,23 +1150,16 @@ ble_sm_rx_lt_key_req(struct hci_le_lt_key_req *evt)
return res.app_status;
}
- if (bonding) {
- store_rc = ble_sm_retrieve_ltk(evt, &value_sec);
- if (store_rc == 0) {
- res.state_arg = &value_sec;
- }
- }
-
if (res.app_status == 0) {
- ble_hs_lock();
-
- proc = ble_sm_proc_find(evt->connection_handle,
- BLE_SM_PROC_STATE_NONE, 0, NULL);
- if (proc != NULL) {
- res.execute = 1;
+ if (bonding) {
+ store_rc = ble_sm_retrieve_ltk(evt, peer_addr_type, peer_addr,
+ &value_sec);
+ if (store_rc == 0) {
+ res.state_arg = &value_sec;
+ }
}
- ble_hs_unlock();
+ res.execute = 1;
}
ble_sm_process_result(evt->connection_handle, &res);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f409863d/net/nimble/host/src/ble_sm_sc.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_sm_sc.c b/net/nimble/host/src/ble_sm_sc.c
index 5da9cc1..ac546e1 100644
--- a/net/nimble/host/src/ble_sm_sc.c
+++ b/net/nimble/host/src/ble_sm_sc.c
@@ -398,6 +398,12 @@ ble_sm_sc_random_rx(struct ble_sm_proc *proc, struct ble_sm_result *res)
proc->our_keys.rand_val = 0;
proc->our_keys.ediv_rand_valid = 1;
+ memcpy(proc->peer_keys.ltk, proc->ltk, sizeof proc->peer_keys.ltk);
+ proc->peer_keys.ltk_valid = 1;
+ proc->peer_keys.ediv = 0;
+ proc->peer_keys.rand_val = 0;
+ proc->peer_keys.ediv_rand_valid = 1;
+
if (proc->flags & BLE_SM_PROC_F_INITIATOR) {
ble_sm_sc_random_advance(proc);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f409863d/net/nimble/host/src/test/ble_sm_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_sm_test.c b/net/nimble/host/src/test/ble_sm_test.c
index 843dcc8..94f0a7f 100644
--- a/net/nimble/host/src/test/ble_sm_test.c
+++ b/net/nimble/host/src/test/ble_sm_test.c
@@ -743,9 +743,17 @@ ble_sm_test_util_verify_sc_persist(struct ble_sm_test_sc_params *params)
memset(&key_sec, 0, sizeof key_sec);
key_sec.peer_addr_type = BLE_STORE_ADDR_TYPE_NONE;
- /* Verify no master keys were persisted. */
rc = ble_store_read_mst_sec(&key_sec, &value_sec);
- TEST_ASSERT_FATAL(rc == BLE_HS_ENOENT);
+ TEST_ASSERT_FATAL(rc == 0);
+ TEST_ASSERT(value_sec.peer_addr_type == 0);
+ TEST_ASSERT(memcmp(value_sec.peer_addr, params->init_addr, 6) == 0);
+ TEST_ASSERT(value_sec.ediv == 0);
+ TEST_ASSERT(value_sec.rand_num == 0);
+ TEST_ASSERT(value_sec.authenticated == params->authenticated);
+ TEST_ASSERT(value_sec.ltk_present == 1);
+ TEST_ASSERT(memcmp(value_sec.ltk, params->ltk, 16) == 0);
+ TEST_ASSERT(value_sec.irk_present == 0);
+ TEST_ASSERT(value_sec.csrk_present == 0);
rc = ble_store_read_slv_sec(&key_sec, &value_sec);
TEST_ASSERT_FATAL(rc == 0);
@@ -763,6 +771,8 @@ ble_sm_test_util_verify_sc_persist(struct ble_sm_test_sc_params *params)
key_sec.idx++;
rc = ble_store_read_slv_sec(&key_sec, &value_sec);
TEST_ASSERT_FATAL(rc == BLE_HS_ENOENT);
+ rc = ble_store_read_mst_sec(&key_sec, &value_sec);
+ TEST_ASSERT_FATAL(rc == BLE_HS_ENOENT);
}
static void
@@ -1220,7 +1230,7 @@ ble_sm_test_util_peer_bonding_good(int send_enc_req, uint8_t *ltk,
TEST_ASSERT(ble_sm_test_store_obj_type ==
BLE_STORE_OBJ_TYPE_SLV_SEC);
TEST_ASSERT(ble_sm_test_store_key.sec.peer_addr_type ==
- BLE_STORE_ADDR_TYPE_NONE);
+ BLE_ADDR_TYPE_PUBLIC);
TEST_ASSERT(ble_sm_test_store_key.sec.ediv_rand_present);
TEST_ASSERT(ble_sm_test_store_key.sec.ediv == ediv);
TEST_ASSERT(ble_sm_test_store_key.sec.rand_num == rand_num);