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/05/25 22:21:25 UTC

[1/2] incubator-mynewt-core git commit: bleprph/bletiny - adjust for BLE host changes.

Repository: incubator-mynewt-core
Updated Branches:
  refs/heads/develop b6fa07ad9 -> 2328ac6bf


bleprph/bletiny - adjust for BLE host changes.


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/2328ac6b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/2328ac6b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/2328ac6b

Branch: refs/heads/develop
Commit: 2328ac6bf5f247d97094f0515df1f49f60b24024
Parents: cc094c5
Author: Christopher Collins <cc...@apache.org>
Authored: Wed May 25 15:20:48 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Wed May 25 15:21:22 2016 -0700

----------------------------------------------------------------------
 apps/bleprph/src/store.c | 252 ++++++++++++++++++++++++++++++++++--------
 apps/bletiny/src/store.c |  98 +++++++++-------
 2 files changed, 261 insertions(+), 89 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/2328ac6b/apps/bleprph/src/store.c
----------------------------------------------------------------------
diff --git a/apps/bleprph/src/store.c b/apps/bleprph/src/store.c
index 8e3e396..e80a625 100644
--- a/apps/bleprph/src/store.c
+++ b/apps/bleprph/src/store.c
@@ -30,73 +30,241 @@
 #include <inttypes.h>
 #include <string.h>
 
+#include "console/console.h"
 #include "host/ble_hs.h"
 
 #include "bleprph.h"
 
 #define STORE_MAX_SLV_LTKS   4
+#define STORE_MAX_CCCDS      16
 
 static struct ble_store_value_ltk store_slv_ltks[STORE_MAX_SLV_LTKS];
 static int store_num_slv_ltks;
 
+static struct ble_store_value_cccd store_cccds[STORE_MAX_CCCDS];
+static int store_num_cccds;
+
+/*****************************************************************************
+ * $ltk                                                                      *
+ *****************************************************************************/
+
+static void
+store_print_value_ltk(struct ble_store_value_ltk *ltk)
+{
+    BLEPRPH_LOG(INFO, "ediv=%u rand=%llu authenticated=%d ", ltk->ediv,
+                   ltk->rand_num, ltk->authenticated);
+    BLEPRPH_LOG(INFO, "ltk=");
+    print_bytes(ltk->key, 16);
+    BLEPRPH_LOG(INFO, "\n");
+}
+
+static void
+store_print_key_ltk(struct ble_store_key_ltk *key_ltk)
+{
+    if (key_ltk->peer_addr_type != BLE_STORE_ADDR_TYPE_NONE) {
+        BLEPRPH_LOG(INFO, "peer_addr_type=%d peer_addr=",
+                       key_ltk->peer_addr_type);
+        print_bytes(key_ltk->peer_addr, 6);
+        BLEPRPH_LOG(INFO, " ");
+    }
+    if (key_ltk->ediv_present) {
+        BLEPRPH_LOG(INFO, "ediv=0x%02x ", key_ltk->ediv);
+    }
+    if (key_ltk->rand_num_present) {
+        BLEPRPH_LOG(INFO, "rand=0x%llx ", key_ltk->rand_num);
+    }
+}
+
 static int
-store_find_slv_ltk(struct ble_store_key_ltk *key_ltk)
+store_find_ltk(struct ble_store_key_ltk *key_ltk,
+               struct ble_store_value_ltk *value_ltks, int num_value_ltks)
 {
     struct ble_store_value_ltk *cur;
     int i;
 
-    for (i = 0; i < store_num_slv_ltks; i++) {
-        cur = store_slv_ltks + i;
+    for (i = 0; i < num_value_ltks; i++) {
+        cur = value_ltks + i;
+
+        if (key_ltk->peer_addr_type != BLE_STORE_ADDR_TYPE_NONE) {
+            if (cur->peer_addr_type != key_ltk->peer_addr_type) {
+                continue;
+            }
+
+            if (memcmp(cur->peer_addr, key_ltk->peer_addr,
+                       sizeof cur->peer_addr) != 0) {
+                continue;
+            }
+        }
 
-        if (cur->ediv == key_ltk->ediv &&
-            cur->rand_num == key_ltk->rand_num) {
+        if (key_ltk->ediv_present && cur->ediv != key_ltk->ediv) {
+            continue;
+        }
 
-            return i;
+        if (key_ltk->rand_num_present && cur->rand_num != key_ltk->rand_num) {
+            continue;
         }
+
+        return i;
     }
 
     return -1;
 }
 
-static void
-store_print_ltk(struct ble_store_value_ltk *ltk)
+static int
+store_read_slv_ltk(struct ble_store_key_ltk *key_ltk,
+                   struct ble_store_value_ltk *value_ltk)
 {
-    BLEPRPH_LOG(INFO, "ediv=%u rand=%llu authenticated=%d ", ltk->ediv,
-                   ltk->rand_num, ltk->authenticated);
-    BLEPRPH_LOG(INFO, "ltk=");
-    print_bytes(ltk->key, 16);
-    BLEPRPH_LOG(INFO, "\n");
+    int idx;
+
+    idx = store_find_ltk(key_ltk, store_slv_ltks, store_num_slv_ltks);
+    if (idx == -1) {
+        return BLE_HS_ENOENT;
+    }
+
+    *value_ltk = store_slv_ltks[idx];
+    return 0;
+}
+
+static int
+store_write_slv_ltk(struct ble_store_value_ltk *value_ltk)
+{
+    struct ble_store_key_ltk key_ltk;
+    int idx;
+
+    BLEPRPH_LOG(INFO, "persisting slv ltk; ");
+    store_print_value_ltk(value_ltk);
+
+    ble_store_key_from_value_ltk(&key_ltk, value_ltk);
+    idx = store_find_ltk(&key_ltk, store_slv_ltks, store_num_slv_ltks);
+    if (idx == -1) {
+        if (store_num_slv_ltks >= STORE_MAX_SLV_LTKS) {
+            BLEPRPH_LOG(INFO, "error persisting slv ltk; too many entries "
+                              "(%d)\n", store_num_slv_ltks);
+            return BLE_HS_ENOMEM;
+        }
+
+        idx = store_num_slv_ltks;
+        store_num_slv_ltks++;
+    }
+
+    store_slv_ltks[idx] = *value_ltk;
+    return 0;
+}
+
+/*****************************************************************************
+ * $cccd                                                                     *
+ *****************************************************************************/
+
+static int
+store_find_cccd(struct ble_store_key_cccd *key)
+{
+    struct ble_store_value_cccd *cccd;
+    int skipped;
+    int i;
+
+    skipped = 0;
+    for (i = 0; i < store_num_cccds; i++) {
+        cccd = store_cccds + i;
+
+        if (key->peer_addr_type != BLE_STORE_ADDR_TYPE_NONE) {
+            if (cccd->peer_addr_type != key->peer_addr_type) {
+                continue;
+            }
+
+            if (memcmp(cccd->peer_addr, key->peer_addr, 6) != 0) {
+                continue;
+            }
+        }
+
+        if (key->chr_val_handle != 0) {
+            if (cccd->chr_val_handle != key->chr_val_handle) {
+                continue;
+            }
+        }
+
+        if (key->idx > skipped) {
+            skipped++;
+            continue;
+        }
+
+        return i;
+    }
+
+    return -1;
 }
 
+static int
+store_read_cccd(struct ble_store_key_cccd *key_cccd,
+                struct ble_store_value_cccd *value_cccd)
+{
+    int idx;
+
+    idx = store_find_cccd(key_cccd);
+    if (idx == -1) {
+        return BLE_HS_ENOENT;
+    }
+
+    *value_cccd = store_cccds[idx];
+    return 0;
+}
+
+static int
+store_write_cccd(struct ble_store_value_cccd *value_cccd)
+{
+    struct ble_store_key_cccd key_cccd;
+    int idx;
+
+    ble_store_key_from_value_cccd(&key_cccd, value_cccd);
+    idx = store_find_cccd(&key_cccd);
+    if (idx == -1) {
+        if (store_num_cccds >= STORE_MAX_SLV_LTKS) {
+            BLEPRPH_LOG(INFO, "error persisting cccd; too many entries (%d)\n",
+                           store_num_cccds);
+            return BLE_HS_ENOMEM;
+        }
+
+        idx = store_num_cccds;
+        store_num_cccds++;
+    }
+
+    store_cccds[idx] = *value_cccd;
+    return 0;
+}
+
+/*****************************************************************************
+ * $api                                                                      *
+ *****************************************************************************/
+
 /**
- * Searches the database for a long-term key matching the specified criteria.
+ * Searches the database for an object matching the specified criteria.
  *
  * @return                      0 if a key was found; else BLE_HS_ENOENT.
  */
 int
-store_read(int obj_type, union ble_store_key *key, union ble_store_value *dst)
+store_read(int obj_type, union ble_store_key *key,
+           union ble_store_value *value)
 {
-    int idx;
+    int rc;
 
     switch (obj_type) {
-    case BLE_STORE_OBJ_TYPE_MST_LTK:
+    case BLE_STORE_OBJ_TYPE_SLV_LTK:
         /* An encryption procedure (bonding) is being attempted.  The nimble
          * stack is asking us to look in our key database for a long-term key
          * corresponding to the specified ediv and random number.
-         */
-        BLEPRPH_LOG(INFO, "looking up ltk with ediv=0x%02x rand=0x%llx\n",
-                    key->ltk.ediv, key->ltk.rand_num);
-
-        /* Perform a key lookup and populate the context object with the
+         *
+         * Perform a key lookup and populate the context object with the
          * result.  The nimble stack will use this key if this function returns
          * success.
          */
-        idx = store_find_slv_ltk(&key->ltk);
-        if (idx == -1) {
-            return BLE_HS_ENOENT;
-        }
-        dst->ltk = store_slv_ltks[idx];
-        return 0;
+        BLEPRPH_LOG(INFO, "looking up slv ltk; ");
+        store_print_key_ltk(&key->ltk);
+        BLEPRPH_LOG(INFO, "\n");
+        rc = store_read_slv_ltk(&key->ltk, &value->ltk);
+        return rc;
+
+    case BLE_STORE_OBJ_TYPE_CCCD:
+        rc = store_read_cccd(&key->cccd, &value->cccd);
+        return rc;
 
     default:
         return BLE_HS_ENOTSUP;
@@ -104,7 +272,7 @@ store_read(int obj_type, union ble_store_key *key, union ble_store_value *dst)
 }
 
 /**
- * Adds the specified key to the database.
+ * Adds the specified object to the database.
  *
  * @return                      0 on success; BLE_HS_ENOMEM if the database is
  *                                  full.
@@ -112,28 +280,16 @@ store_read(int obj_type, union ble_store_key *key, union ble_store_value *dst)
 int
 store_write(int obj_type, union ble_store_value *val)
 {
-    struct ble_store_key_ltk key_ltk;
-    int idx;
+    int rc;
 
     switch (obj_type) {
-    case BLE_STORE_OBJ_TYPE_MST_LTK:
-        BLEPRPH_LOG(INFO, "persisting slv ltk; ");
-        store_print_ltk(&val->ltk);
-
-        ble_store_key_from_value_ltk(&key_ltk, &val->ltk);
-        idx = store_find_slv_ltk(&key_ltk);
-        if (idx == -1) {
-            if (store_num_slv_ltks >= STORE_MAX_SLV_LTKS) {
-                BLEPRPH_LOG(INFO, "error persisting LTK; too many entries\n");
-                return BLE_HS_ENOMEM;
-            }
-
-            idx = store_num_slv_ltks;
-            store_num_slv_ltks++;
-        }
+    case BLE_STORE_OBJ_TYPE_SLV_LTK:
+        rc = store_write_slv_ltk(&val->ltk);
+        return rc;
 
-        store_slv_ltks[idx] = val->ltk;
-        return 0;
+    case BLE_STORE_OBJ_TYPE_CCCD:
+        rc = store_write_cccd(&val->cccd);
+        return rc;
 
     default:
         return BLE_HS_ENOTSUP;

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/2328ac6b/apps/bletiny/src/store.c
----------------------------------------------------------------------
diff --git a/apps/bletiny/src/store.c b/apps/bletiny/src/store.c
index 2297466..b3403ae 100644
--- a/apps/bletiny/src/store.c
+++ b/apps/bletiny/src/store.c
@@ -53,7 +53,7 @@ static int store_num_cccds;
  *****************************************************************************/
 
 static void
-store_print_ltk(struct ble_store_value_ltk *ltk)
+store_print_value_ltk(struct ble_store_value_ltk *ltk)
 {
     console_printf("ediv=%u rand=%llu authenticated=%d ", ltk->ediv,
                    ltk->rand_num, ltk->authenticated);
@@ -62,20 +62,53 @@ store_print_ltk(struct ble_store_value_ltk *ltk)
     console_printf("\n");
 }
 
+static void
+store_print_key_ltk(struct ble_store_key_ltk *key_ltk)
+{
+    if (key_ltk->peer_addr_type != BLE_STORE_ADDR_TYPE_NONE) {
+        console_printf("peer_addr_type=%d peer_addr=",
+                       key_ltk->peer_addr_type);
+        print_bytes(key_ltk->peer_addr, 6);
+        console_printf(" ");
+    }
+    if (key_ltk->ediv_present) {
+        console_printf("ediv=0x%02x ", key_ltk->ediv);
+    }
+    if (key_ltk->rand_num_present) {
+        console_printf("rand=0x%llx ", key_ltk->rand_num);
+    }
+}
+
 static int
-store_find_slv_ltk(struct ble_store_key_ltk *key_ltk)
+store_find_ltk(struct ble_store_key_ltk *key_ltk,
+               struct ble_store_value_ltk *value_ltks, int num_value_ltks)
 {
     struct ble_store_value_ltk *cur;
     int i;
 
-    for (i = 0; i < store_num_slv_ltks; i++) {
-        cur = store_slv_ltks + i;
+    for (i = 0; i < num_value_ltks; i++) {
+        cur = value_ltks + i;
 
-        if (cur->ediv == key_ltk->ediv &&
-            cur->rand_num == key_ltk->rand_num) {
+        if (key_ltk->peer_addr_type != BLE_STORE_ADDR_TYPE_NONE) {
+            if (cur->peer_addr_type != key_ltk->peer_addr_type) {
+                continue;
+            }
 
-            return i;
+            if (memcmp(cur->peer_addr, key_ltk->peer_addr,
+                       sizeof cur->peer_addr) != 0) {
+                continue;
+            }
         }
+
+        if (key_ltk->ediv_present && cur->ediv != key_ltk->ediv) {
+            continue;
+        }
+
+        if (key_ltk->rand_num_present && cur->rand_num != key_ltk->rand_num) {
+            continue;
+        }
+
+        return i;
     }
 
     return -1;
@@ -87,7 +120,7 @@ store_read_slv_ltk(struct ble_store_key_ltk *key_ltk,
 {
     int idx;
 
-    idx = store_find_slv_ltk(key_ltk);
+    idx = store_find_ltk(key_ltk, store_slv_ltks, store_num_slv_ltks);
     if (idx == -1) {
         return BLE_HS_ENOENT;
     }
@@ -103,10 +136,10 @@ store_write_slv_ltk(struct ble_store_value_ltk *value_ltk)
     int idx;
 
     console_printf("persisting slv ltk; ");
-    store_print_ltk(value_ltk);
+    store_print_value_ltk(value_ltk);
 
     ble_store_key_from_value_ltk(&key_ltk, value_ltk);
-    idx = store_find_slv_ltk(&key_ltk);
+    idx = store_find_ltk(&key_ltk, store_slv_ltks, store_num_slv_ltks);
     if (idx == -1) {
         if (store_num_slv_ltks >= STORE_MAX_SLV_LTKS) {
             console_printf("error persisting slv ltk; too many entries (%d)\n",
@@ -123,31 +156,12 @@ store_write_slv_ltk(struct ble_store_value_ltk *value_ltk)
 }
 
 static int
-store_find_mst_ltk(struct ble_store_key_ltk *key_ltk)
-{
-    struct ble_store_value_ltk *cur;
-    int i;
-
-    for (i = 0; i < store_num_mst_ltks; i++) {
-        cur = store_mst_ltks + i;
-
-        if (cur->ediv == key_ltk->ediv &&
-            cur->rand_num == key_ltk->rand_num) {
-
-            return i;
-        }
-    }
-
-    return -1;
-}
-
-static int
 store_read_mst_ltk(struct ble_store_key_ltk *key_ltk,
-                    struct ble_store_value_ltk *value_ltk)
+                   struct ble_store_value_ltk *value_ltk)
 {
     int idx;
 
-    idx = store_find_mst_ltk(key_ltk);
+    idx = store_find_ltk(key_ltk, store_mst_ltks, store_num_mst_ltks);
     if (idx == -1) {
         return BLE_HS_ENOENT;
     }
@@ -163,10 +177,10 @@ store_write_mst_ltk(struct ble_store_value_ltk *value_ltk)
     int idx;
 
     console_printf("persisting mst ltk; ");
-    store_print_ltk(value_ltk);
+    store_print_value_ltk(value_ltk);
 
     ble_store_key_from_value_ltk(&key_ltk, value_ltk);
-    idx = store_find_mst_ltk(&key_ltk);
+    idx = store_find_ltk(&key_ltk, store_mst_ltks, store_num_mst_ltks);
     if (idx == -1) {
         if (store_num_mst_ltks >= STORE_MAX_MST_LTKS) {
             console_printf("error persisting mst ltk; too many entries "
@@ -287,15 +301,17 @@ store_read(int obj_type, union ble_store_key *key,
          * result.  The nimble stack will use this key if this function returns
          * success.
          */
-        console_printf("looking up slv ltk with ediv=0x%02x rand=0x%llx\n",
-                       key->ltk.ediv, key->ltk.rand_num);
-        rc = store_read_slv_ltk(&key->ltk, &value->ltk);
+        console_printf("looking up mst ltk; ");
+        store_print_key_ltk(&key->ltk);
+        console_printf("\n");
+        rc = store_read_mst_ltk(&key->ltk, &value->ltk);
         return rc;
 
     case BLE_STORE_OBJ_TYPE_SLV_LTK:
-        console_printf("looking up mst ltk with ediv=0x%02x rand=0x%llx\n",
-                       key->ltk.ediv, key->ltk.rand_num);
-        rc = store_read_mst_ltk(&key->ltk, &value->ltk);
+        console_printf("looking up slv ltk; ");
+        store_print_key_ltk(&key->ltk);
+        console_printf("\n");
+        rc = store_read_slv_ltk(&key->ltk, &value->ltk);
         return rc;
 
     case BLE_STORE_OBJ_TYPE_CCCD:
@@ -320,11 +336,11 @@ store_write(int obj_type, union ble_store_value *val)
 
     switch (obj_type) {
     case BLE_STORE_OBJ_TYPE_MST_LTK:
-        rc = store_write_slv_ltk(&val->ltk);
+        rc = store_write_mst_ltk(&val->ltk);
         return rc;
 
     case BLE_STORE_OBJ_TYPE_SLV_LTK:
-        rc = store_write_mst_ltk(&val->ltk);
+        rc = store_write_slv_ltk(&val->ltk);
         return rc;
 
     case BLE_STORE_OBJ_TYPE_CCCD:


[2/2] incubator-mynewt-core git commit: BLE Host - Fix some SM mst/slv mismatches.

Posted by cc...@apache.org.
BLE Host - Fix some SM mst/slv mismatches.


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/cc094c5c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/cc094c5c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/cc094c5c

Branch: refs/heads/develop
Commit: cc094c5cd1c0b3ffc604853bdffab75db63f849b
Parents: b6fa07a
Author: Christopher Collins <cc...@apache.org>
Authored: Wed May 25 15:03:45 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Wed May 25 15:21:22 2016 -0700

----------------------------------------------------------------------
 net/nimble/host/src/ble_l2cap_sm.c           | 41 +++++++++--------------
 net/nimble/host/src/ble_store.c              |  8 ++---
 net/nimble/host/src/test/ble_l2cap_sm_test.c |  6 ++--
 3 files changed, 23 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/cc094c5c/net/nimble/host/src/ble_l2cap_sm.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_l2cap_sm.c b/net/nimble/host/src/ble_l2cap_sm.c
index 8e17ad7..a16ad55 100644
--- a/net/nimble/host/src/ble_l2cap_sm.c
+++ b/net/nimble/host/src/ble_l2cap_sm.c
@@ -507,29 +507,21 @@ ble_l2cap_sm_key_exchange_events(struct ble_l2cap_sm_proc *proc)
             !!(proc->flags & BLE_L2CAP_SM_PROC_F_AUTHENTICATED);
         value_ltk.sc = 0;
 
-        if (proc->flags & BLE_L2CAP_SM_PROC_F_INITIATOR) {
-            ble_store_write_mst_ltk(&value_ltk);
-        } else {
-            ble_store_write_slv_ltk(&value_ltk);
-        }
+        ble_store_write_slv_ltk(&value_ltk);
     }
 
     if (proc->peer_keys.ediv_rand_valid && proc->peer_keys.ltk_valid) {
         value_ltk.peer_addr_type = peer_addr_type;
         memcpy(value_ltk.peer_addr, peer_addr, sizeof value_ltk.peer_addr);
-        value_ltk.ediv = proc->our_keys.ediv;
-        value_ltk.rand_num = proc->our_keys.rand_val;
-        memcpy(value_ltk.key, proc->our_keys.ltk,
+        value_ltk.ediv = proc->peer_keys.ediv;
+        value_ltk.rand_num = proc->peer_keys.rand_val;
+        memcpy(value_ltk.key, proc->peer_keys.ltk,
                sizeof value_ltk.key);
         value_ltk.authenticated =
             !!(proc->flags & BLE_L2CAP_SM_PROC_F_AUTHENTICATED);
         value_ltk.sc = 0;
 
-        if (proc->flags & BLE_L2CAP_SM_PROC_F_INITIATOR) {
-            ble_store_write_slv_ltk(&value_ltk);
-        } else {
-            ble_store_write_mst_ltk(&value_ltk);
-        }
+        ble_store_write_mst_ltk(&value_ltk);
     }
 
     /* XXX: Persist other key data. */
@@ -1788,8 +1780,8 @@ ble_l2cap_sm_rx_pair_fail(uint16_t conn_handle, uint8_t op,
 static int
 ble_l2cap_sm_lt_key_req_ltk_handle(struct hci_le_lt_key_req *evt)
 {
-    union ble_store_value store_value;
-    union ble_store_key store_key;
+    struct ble_store_value_ltk value_ltk;
+    struct ble_store_key_ltk key_ltk;
     struct ble_l2cap_sm_proc *proc;
     struct ble_l2cap_sm_proc *prev;
     int store_rc;
@@ -1797,18 +1789,17 @@ ble_l2cap_sm_lt_key_req_ltk_handle(struct hci_le_lt_key_req *evt)
 
     /* Tell applicaiton to look up LTK by ediv/rand pair. */
     /* XXX: Also filter by peer address? */
-    memset(&store_key, 0, sizeof store_key);
-    store_key.ltk.peer_addr_type = BLE_STORE_ADDR_TYPE_NONE;
-    store_key.ltk.ediv = evt->encrypted_diversifier;
-    store_key.ltk.ediv_present = 1;
-    store_key.ltk.rand_num = evt->random_number;
-    store_key.ltk.rand_num_present = 1;
-    store_rc = ble_store_read(BLE_STORE_OBJ_TYPE_MST_LTK, &store_key,
-                              &store_value);
+    memset(&key_ltk, 0, sizeof key_ltk);
+    key_ltk.peer_addr_type = BLE_STORE_ADDR_TYPE_NONE;
+    key_ltk.ediv = evt->encrypted_diversifier;
+    key_ltk.ediv_present = 1;
+    key_ltk.rand_num = evt->random_number;
+    key_ltk.rand_num_present = 1;
+    store_rc = ble_store_read_slv_ltk(&key_ltk, &value_ltk);
     if (store_rc == 0) {
         /* Store provided a key; send it to the controller. */
         rc = ble_l2cap_sm_lt_key_req_reply_tx(evt->connection_handle,
-                                              store_value.ltk.key);
+                                              value_ltk.key);
     } else {
         /* Application does not have the requested key in its database.  Send a
          * negative reply to the controller.
@@ -1824,7 +1815,7 @@ ble_l2cap_sm_lt_key_req_ltk_handle(struct hci_le_lt_key_req *evt)
         rc = BLE_HS_EUNKNOWN;
     } else if (store_rc == 0 && rc == 0) {
         proc->state = BLE_L2CAP_SM_PROC_STATE_ENC_CHANGE;
-        if (store_value.ltk.authenticated) {
+        if (value_ltk.authenticated) {
             proc->flags |= BLE_L2CAP_SM_PROC_F_AUTHENTICATED;
         }
     } else {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/cc094c5c/net/nimble/host/src/ble_store.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_store.c b/net/nimble/host/src/ble_store.c
index 2694d60..91e7fb5 100644
--- a/net/nimble/host/src/ble_store.c
+++ b/net/nimble/host/src/ble_store.c
@@ -75,7 +75,7 @@ ble_store_read_slv_ltk(struct ble_store_key_ltk *key_ltk,
 
     store_key = (void *)key_ltk;
     store_value = (void *)value_ltk;
-    rc = ble_store_read(BLE_STORE_OBJ_TYPE_MST_LTK, store_key, store_value);
+    rc = ble_store_read(BLE_STORE_OBJ_TYPE_SLV_LTK, store_key, store_value);
     return rc;
 }
 
@@ -86,7 +86,7 @@ ble_store_write_slv_ltk(struct ble_store_value_ltk *value_ltk)
     int rc;
 
     store_value = (void *)value_ltk;
-    rc = ble_store_write(BLE_STORE_OBJ_TYPE_MST_LTK, store_value);
+    rc = ble_store_write(BLE_STORE_OBJ_TYPE_SLV_LTK, store_value);
     return rc;
 }
 
@@ -100,7 +100,7 @@ ble_store_read_mst_ltk(struct ble_store_key_ltk *key_ltk,
 
     store_key = (void *)key_ltk;
     store_value = (void *)value_ltk;
-    rc = ble_store_read(BLE_STORE_OBJ_TYPE_SLV_LTK, store_key, store_value);
+    rc = ble_store_read(BLE_STORE_OBJ_TYPE_MST_LTK, store_key, store_value);
     return rc;
 }
 
@@ -111,7 +111,7 @@ ble_store_write_mst_ltk(struct ble_store_value_ltk *value_ltk)
     int rc;
 
     store_value = (void *)value_ltk;
-    rc = ble_store_write(BLE_STORE_OBJ_TYPE_SLV_LTK, store_value);
+    rc = ble_store_write(BLE_STORE_OBJ_TYPE_MST_LTK, store_value);
     return rc;
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/cc094c5c/net/nimble/host/src/test/ble_l2cap_sm_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_l2cap_sm_test.c b/net/nimble/host/src/test/ble_l2cap_sm_test.c
index 88cec19..60c52c8 100644
--- a/net/nimble/host/src/test/ble_l2cap_sm_test.c
+++ b/net/nimble/host/src/test/ble_l2cap_sm_test.c
@@ -1158,11 +1158,10 @@ ble_l2cap_sm_test_util_peer_bonding_good(int send_enc_req, uint8_t *ltk,
     ble_l2cap_sm_test_util_set_lt_key_req_reply_ack(0, 2);
     ble_l2cap_sm_test_util_rx_lt_key_req(2, rand_num, ediv);
     TEST_ASSERT(!conn->bhc_sec_state.enc_enabled);
-    TEST_ASSERT(ble_l2cap_sm_dbg_num_procs() == 1);
 
     /* Ensure the LTK request event got sent to the application. */
     TEST_ASSERT(ble_l2cap_sm_test_store_obj_type ==
-                BLE_STORE_OBJ_TYPE_MST_LTK);
+                BLE_STORE_OBJ_TYPE_SLV_LTK);
     TEST_ASSERT(ble_l2cap_sm_test_store_key.ltk.peer_addr_type ==
                 BLE_STORE_ADDR_TYPE_NONE);
     TEST_ASSERT(ble_l2cap_sm_test_store_key.ltk.ediv_present);
@@ -1215,6 +1214,7 @@ ble_l2cap_sm_test_util_peer_bonding_bad(uint16_t ediv, uint64_t rand_num)
     ble_hs_lock();
     conn = ble_hs_conn_find(2);
     TEST_ASSERT_FATAL(conn != NULL);
+    conn->bhc_flags &= ~BLE_HS_CONN_F_MASTER;
     ble_hs_unlock();
 
     TEST_ASSERT(!conn->bhc_sec_state.enc_enabled);
@@ -1227,7 +1227,7 @@ ble_l2cap_sm_test_util_peer_bonding_bad(uint16_t ediv, uint64_t rand_num)
 
     /* Ensure the LTK request event got sent to the application. */
     TEST_ASSERT(ble_l2cap_sm_test_store_obj_type ==
-                BLE_STORE_OBJ_TYPE_MST_LTK);
+                BLE_STORE_OBJ_TYPE_SLV_LTK);
     TEST_ASSERT(ble_l2cap_sm_test_store_key.ltk.ediv_present);
     TEST_ASSERT(ble_l2cap_sm_test_store_key.ltk.ediv == ediv);
     TEST_ASSERT(ble_l2cap_sm_test_store_key.ltk.rand_num_present);