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/17 18:02:20 UTC

[1/2] incubator-mynewt-core git commit: BLE Host - Send irk and csrk during key dist.

Repository: incubator-mynewt-core
Updated Branches:
  refs/heads/develop 26eef9af3 -> 5df4dc1e0


BLE Host - Send irk and csrk during key dist.


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

Branch: refs/heads/develop
Commit: 935806ba37a137af1ff87aee2241c1db02e30b89
Parents: 26eef9a
Author: Christopher Collins <cc...@apache.org>
Authored: Mon May 16 20:43:45 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Mon May 16 20:43:45 2016 -0700

----------------------------------------------------------------------
 net/nimble/host/include/host/ble_gap.h  |   2 +-
 net/nimble/host/src/ble_l2cap_sm.c      | 126 ++++++++++++++++++++++++---
 net/nimble/host/src/ble_l2cap_sm_priv.h |   5 +-
 3 files changed, 118 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/935806ba/net/nimble/host/include/host/ble_gap.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/include/host/ble_gap.h b/net/nimble/host/include/host/ble_gap.h
index d3fc26d..fd1c15a 100644
--- a/net/nimble/host/include/host/ble_gap.h
+++ b/net/nimble/host/include/host/ble_gap.h
@@ -151,7 +151,7 @@ struct ble_gap_key_parms {
     uint8_t ltk[16];
     uint8_t irk[16];
     uint8_t csrk[16];
-    uint8_t  addr[6];
+    uint8_t addr[6];
 };
 
 struct ble_gap_ltk_params {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/935806ba/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 198f4fa..f4e8131 100644
--- a/net/nimble/host/src/ble_l2cap_sm.c
+++ b/net/nimble/host/src/ble_l2cap_sm.c
@@ -162,6 +162,10 @@ static uint64_t ble_l2cap_sm_dbg_next_start_rand;
 static uint8_t ble_l2cap_sm_dbg_next_start_rand_set;
 static uint8_t ble_l2cap_sm_dbg_next_ltk[16];
 static uint8_t ble_l2cap_sm_dbg_next_ltk_set;
+static uint8_t ble_l2cap_sm_dbg_next_irk[16];
+static uint8_t ble_l2cap_sm_dbg_next_irk_set;
+static uint8_t ble_l2cap_sm_dbg_next_csrk[16];
+static uint8_t ble_l2cap_sm_dbg_next_csrk_set;
 
 void
 ble_l2cap_sm_dbg_set_next_pair_rand(uint8_t *next_pair_rand)
@@ -193,6 +197,22 @@ ble_l2cap_sm_dbg_set_next_ltk(uint8_t *next_ltk)
     ble_l2cap_sm_dbg_next_ltk_set = 1;
 }
 
+void
+ble_l2cap_sm_dbg_set_next_irk(uint8_t *next_irk)
+{
+    memcpy(ble_l2cap_sm_dbg_next_irk, next_irk,
+           sizeof ble_l2cap_sm_dbg_next_irk);
+    ble_l2cap_sm_dbg_next_irk_set = 1;
+}
+
+void
+ble_l2cap_sm_dbg_set_next_csrk(uint8_t *next_csrk)
+{
+    memcpy(ble_l2cap_sm_dbg_next_csrk, next_csrk,
+           sizeof ble_l2cap_sm_dbg_next_csrk);
+    ble_l2cap_sm_dbg_next_csrk_set = 1;
+}
+
 int
 ble_l2cap_sm_dbg_num_procs(void)
 {
@@ -324,6 +344,50 @@ ble_l2cap_sm_gen_ltk(struct ble_l2cap_sm_proc *proc, uint8_t *ltk)
     return 0;
 }
 
+static int
+ble_l2cap_sm_gen_irk(struct ble_l2cap_sm_proc *proc, uint8_t *irk)
+{
+    int rc;
+
+#ifdef BLE_HS_DEBUG
+    if (ble_l2cap_sm_dbg_next_irk_set) {
+        ble_l2cap_sm_dbg_next_irk_set = 0;
+        memcpy(irk, ble_l2cap_sm_dbg_next_irk,
+               sizeof ble_l2cap_sm_dbg_next_irk);
+        return 0;
+    }
+#endif
+
+    rc = ble_hci_util_rand(irk, 16);
+    if (rc != 0) {
+        return rc;
+    }
+
+    return 0;
+}
+
+static int
+ble_l2cap_sm_gen_csrk(struct ble_l2cap_sm_proc *proc, uint8_t *csrk)
+{
+    int rc;
+
+#ifdef BLE_HS_DEBUG
+    if (ble_l2cap_sm_dbg_next_csrk_set) {
+        ble_l2cap_sm_dbg_next_csrk_set = 0;
+        memcpy(csrk, ble_l2cap_sm_dbg_next_csrk,
+               sizeof ble_l2cap_sm_dbg_next_csrk);
+        return 0;
+    }
+#endif
+
+    rc = ble_hci_util_rand(csrk, 16);
+    if (rc != 0) {
+        return rc;
+    }
+
+    return 0;
+}
+
 static void
 ble_l2cap_sm_proc_set_timer(struct ble_l2cap_sm_proc *proc)
 {
@@ -1190,11 +1254,17 @@ static int
 ble_l2cap_sm_key_exchange_go(struct ble_l2cap_sm_proc *proc,
                              uint8_t *sm_status)
 {
+    struct ble_l2cap_sm_iden_addr_info addr_info;
+    struct ble_l2cap_sm_signing_info sign_info;
     struct ble_l2cap_sm_master_iden master_iden;
+    struct ble_l2cap_sm_iden_info iden_info;
     struct ble_l2cap_sm_enc_info enc_info;
     uint8_t our_key_dist;
     int rc;
 
+    /* There are no appropriate error codes for key distribution failures. */
+    *sm_status = BLE_L2CAP_SM_ERR_UNSPECIFIED;
+
     if (proc->flags & BLE_L2CAP_SM_PROC_F_INITIATOR) {
         our_key_dist = proc->pair_rsp.init_key_dist;
     } else {
@@ -1205,42 +1275,75 @@ ble_l2cap_sm_key_exchange_go(struct ble_l2cap_sm_proc *proc,
         /* Send encryption information. */
         rc = ble_l2cap_sm_gen_ltk(proc, enc_info.ltk_le);
         if (rc != 0) {
-            *sm_status = BLE_L2CAP_SM_ERR_UNSPECIFIED;
             return rc;
         }
         rc = ble_l2cap_sm_enc_info_tx(proc->conn_handle, &enc_info);
         if (rc != 0) {
-            *sm_status = BLE_L2CAP_SM_ERR_UNSPECIFIED;
             return rc;
         }
+        proc->our_keys.ltk_valid = 1;
+        memcpy(proc->our_keys.ltk, enc_info.ltk_le, 16);
 
         /* Send master identification. */
         rc = ble_l2cap_sm_gen_ediv(&master_iden.ediv);
         if (rc != 0) {
-            *sm_status = BLE_L2CAP_SM_ERR_UNSPECIFIED;
             return rc;
         }
         rc = ble_l2cap_sm_gen_start_rand(&master_iden.rand_val);
         if (rc != 0) {
-            *sm_status = BLE_L2CAP_SM_ERR_UNSPECIFIED;
             return rc;
         }
         rc = ble_l2cap_sm_master_iden_tx(proc->conn_handle, &master_iden);
         if (rc != 0) {
-            *sm_status = BLE_L2CAP_SM_ERR_UNSPECIFIED;
             return rc;
         }
-
-        /* copy data to pass to application */
-        proc->our_keys.is_ours = 1;
-        proc->our_keys.ltk_valid = 1;
         proc->our_keys.ediv_rand_valid = 1;
         proc->our_keys.rand_val = master_iden.rand_val;
         proc->our_keys.ediv = master_iden.ediv;
-        memcpy(proc->our_keys.ltk, enc_info.ltk_le, 16);
     }
 
-    /* XXX: Send remainining key information. */
+    if (our_key_dist & BLE_L2CAP_SM_PAIR_KEY_DIST_ID) {
+        /* Send identity information. */
+        rc = ble_l2cap_sm_gen_irk(proc, iden_info.irk_le);
+        if (rc != 0) {
+            return rc;
+        }
+        rc = ble_l2cap_sm_iden_info_tx(proc->conn_handle, &iden_info);
+        if (rc != 0) {
+            return rc;
+        }
+        proc->our_keys.irk_valid = 1;
+        memcpy(proc->our_keys.irk, iden_info.irk_le, 16);
+
+        /* Send identity address information. */
+        if (ble_hs_our_dev.has_random_addr) {
+            addr_info.addr_type = BLE_ADDR_TYPE_RANDOM;
+            memcpy(addr_info.bd_addr_le, ble_hs_our_dev.random_addr, 6);
+        } else {
+            addr_info.addr_type = BLE_ADDR_TYPE_PUBLIC;
+            memcpy(addr_info.bd_addr_le, ble_hs_our_dev.public_addr, 6);
+        }
+        rc = ble_l2cap_sm_iden_addr_tx(proc->conn_handle, &addr_info);
+        if (rc != 0) {
+            return rc;
+        }
+        proc->our_keys.addr_type = addr_info.addr_type;
+        memcpy(proc->our_keys.addr, addr_info.bd_addr_le, 6);
+    }
+
+    if (our_key_dist & BLE_L2CAP_SM_PAIR_KEY_DIST_SIGN) {
+        /* Send signing information. */
+        rc = ble_l2cap_sm_gen_csrk(proc, sign_info.sig_key_le);
+        if (rc != 0) {
+            return rc;
+        }
+        rc = ble_l2cap_sm_signing_info_tx(proc->conn_handle, &sign_info);
+        if (rc != 0) {
+            return rc;
+        }
+        proc->our_keys.csrk_valid = 1;
+        memcpy(proc->our_keys.csrk, sign_info.sig_key_le, 16);
+    }
 
     return 0;
 }
@@ -1320,7 +1423,6 @@ ble_l2cap_sm_rx_key_exchange(uint16_t conn_handle, uint8_t op,
 
     ble_hs_lock();
 
-    /* Check connection state; reject if not appropriate. */
     proc = ble_l2cap_sm_proc_find(conn_handle, BLE_L2CAP_SM_PROC_STATE_KEY_EXCH,
                                   -1, &prev);
     if (proc != NULL) {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/935806ba/net/nimble/host/src/ble_l2cap_sm_priv.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_l2cap_sm_priv.h b/net/nimble/host/src/ble_l2cap_sm_priv.h
index 09a4a53..f084f6e 100644
--- a/net/nimble/host/src/ble_l2cap_sm_priv.h
+++ b/net/nimble/host/src/ble_l2cap_sm_priv.h
@@ -111,7 +111,7 @@ struct ble_l2cap_sm_master_iden {
  * | (Code=0x08)                        | 1                 |
  * | irk                                | 16                |
  */
- #define BLE_L2CAP_SM_IDEN_INFO_SZ      16
+#define BLE_L2CAP_SM_IDEN_INFO_SZ      16
 struct ble_l2cap_sm_iden_info {
     uint8_t irk_le[16];
 };
@@ -125,7 +125,6 @@ struct ble_l2cap_sm_iden_info {
  */
 #define BLE_L2CAP_SM_IDEN_ADDR_INFO_SZ  7
 struct ble_l2cap_sm_iden_addr_info {
-
     uint8_t addr_type;
     uint8_t bd_addr_le[6];
 };
@@ -160,6 +159,8 @@ void ble_l2cap_sm_dbg_set_next_pair_rand(uint8_t *next_pair_rand);
 void ble_l2cap_sm_dbg_set_next_ediv(uint16_t next_ediv);
 void ble_l2cap_sm_dbg_set_next_start_rand(uint64_t next_start_rand);
 void ble_l2cap_sm_dbg_set_next_ltk(uint8_t *next_ltk);
+void ble_l2cap_sm_dbg_set_next_irk(uint8_t *next_irk);
+void ble_l2cap_sm_dbg_set_next_csrk(uint8_t *next_csrk);
 int ble_l2cap_sm_dbg_num_procs(void);
 #endif
 


[2/2] incubator-mynewt-core git commit: bleprph - Send the startup sequence to controller.

Posted by cc...@apache.org.
bleprph - Send the startup sequence to controller.


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

Branch: refs/heads/develop
Commit: 5df4dc1e0908fdb4a3d43a6c0eb65f8dc0ead494
Parents: 935806b
Author: Christopher Collins <cc...@apache.org>
Authored: Tue May 17 11:01:48 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Tue May 17 11:01:48 2016 -0700

----------------------------------------------------------------------
 apps/bleprph/src/main.c | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5df4dc1e/apps/bleprph/src/main.c
----------------------------------------------------------------------
diff --git a/apps/bleprph/src/main.c b/apps/bleprph/src/main.c
index 3394c67..d03f8b5 100755
--- a/apps/bleprph/src/main.c
+++ b/apps/bleprph/src/main.c
@@ -185,6 +185,10 @@ bleprph_task_handler(void *unused)
 {
     struct os_event *ev;
     struct os_callout_func *cf;
+    int rc;
+
+    rc = ble_hs_start();
+    assert(rc == 0);
 
     /* Begin advertising. */
     bleprph_advertise();