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);