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/15 02:28:10 UTC
[48/50] [abbrv] incubator-mynewt-core git commit: BLE Host - unit
tests for combined priv/sc.
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/b4c34462/net/nimble/host/src/test/ble_sm_test_util.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_sm_test_util.c b/net/nimble/host/src/test/ble_sm_test_util.c
index 28c2a2a..0dcd8af 100644
--- a/net/nimble/host/src/test/ble_sm_test_util.c
+++ b/net/nimble/host/src/test/ble_sm_test_util.c
@@ -533,6 +533,10 @@ ble_sm_test_util_verify_tx_id_addr_info(struct ble_sm_id_addr_info *exp_cmd)
{
struct ble_sm_id_addr_info cmd;
struct os_mbuf *om;
+ uint8_t *our_id_addr;
+ uint8_t our_id_addr_type;
+
+ our_id_addr = bls_hs_priv_get_local_identity_addr(&our_id_addr_type);
ble_hs_test_util_tx_all();
om = ble_sm_test_util_verify_tx_hdr(BLE_SM_OP_IDENTITY_ADDR_INFO,
@@ -541,6 +545,9 @@ ble_sm_test_util_verify_tx_id_addr_info(struct ble_sm_id_addr_info *exp_cmd)
TEST_ASSERT(cmd.addr_type == exp_cmd->addr_type);
TEST_ASSERT(memcmp(cmd.bd_addr, exp_cmd->bd_addr, 6) == 0);
+
+ TEST_ASSERT(cmd.addr_type == our_id_addr_type);
+ TEST_ASSERT(memcmp(cmd.bd_addr, our_id_addr, 6) == 0);
}
static void
@@ -691,6 +698,30 @@ ble_sm_test_util_verify_tx_start_enc(uint16_t conn_handle,
TEST_ASSERT(memcmp(param + 12, ltk, 16) == 0);
}
+static void
+ble_sm_test_util_verify_tx_add_resolve_list(uint8_t peer_id_addr_type,
+ uint8_t *peer_id_addr,
+ uint8_t *peer_irk,
+ uint8_t *our_irk)
+{
+ uint8_t buf[16];
+ uint8_t param_len;
+ uint8_t *param;
+
+ param = ble_hs_test_util_verify_tx_hci(BLE_HCI_OGF_LE,
+ BLE_HCI_OCF_LE_ADD_RESOLV_LIST,
+ ¶m_len);
+ TEST_ASSERT(param_len == BLE_HCI_ADD_TO_RESOLV_LIST_LEN);
+ TEST_ASSERT(param[0] == peer_id_addr_type);
+ TEST_ASSERT(memcmp(param + 1, peer_id_addr, 6) == 0);
+
+ /* Ensure IRKs are sent in little endian. */
+ memcpy(buf, peer_irk, 16);
+ TEST_ASSERT(memcmp(param + 7, buf, 16) == 0);
+ memcpy(buf, our_irk, 16);
+ TEST_ASSERT(memcmp(param + 23, buf, 16) == 0);
+}
+
void
ble_sm_test_util_io_inject(struct ble_sm_test_passkey_info *passkey_info,
uint8_t cur_sm_state)
@@ -818,7 +849,7 @@ ble_sm_test_util_verify_lgcy_persist(struct ble_sm_test_lgcy_params *params)
rc = ble_store_read_peer_sec(&key_sec, &value_sec);
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(memcmp(value_sec.peer_addr, params->init_id_addr, 6) == 0);
TEST_ASSERT(value_sec.ediv == params->ediv);
TEST_ASSERT(value_sec.rand_num == params->r);
TEST_ASSERT(value_sec.authenticated == params->authenticated);
@@ -843,7 +874,7 @@ ble_sm_test_util_verify_lgcy_persist(struct ble_sm_test_lgcy_params *params)
rc = ble_store_read_our_sec(&key_sec, &value_sec);
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(memcmp(value_sec.peer_addr, params->init_id_addr, 6) == 0);
TEST_ASSERT(value_sec.ediv == params->ediv);
TEST_ASSERT(value_sec.rand_num == params->r);
TEST_ASSERT(value_sec.authenticated == params->authenticated);
@@ -865,16 +896,18 @@ ble_sm_test_util_verify_sc_persist(struct ble_sm_test_sc_params *params,
{
struct ble_store_value_sec value_sec;
struct ble_store_key_sec key_sec;
- uint8_t *peer_addr;
- uint8_t *mst_csrk;
- uint8_t *slv_csrk;
- uint8_t *mst_irk;
- uint8_t *slv_irk;
+ uint8_t *peer_id_addr;
+ uint8_t *peer_csrk;
+ uint8_t *our_csrk;
+ uint8_t *peer_irk;
+ uint8_t *our_irk;
+ uint8_t peer_id_addr_type;
uint8_t peer_addr_type;
uint8_t peer_key_dist;
uint8_t our_key_dist;
int csrk_expected;
- int irk_expected;
+ int peer_irk_expected;
+ int our_irk_expected;
int bonding;
int rc;
@@ -882,25 +915,26 @@ ble_sm_test_util_verify_sc_persist(struct ble_sm_test_sc_params *params,
our_key_dist = params->pair_rsp.init_key_dist;
peer_key_dist = params->pair_rsp.resp_key_dist;
- peer_addr_type = 0;
- peer_addr = params->resp_addr;
+ peer_addr_type = params->resp_addr_type;
+ peer_id_addr = params->resp_id_addr;
- mst_irk = params->id_info_req.irk;
- mst_csrk = params->sign_info_req.sig_key;
- slv_irk = params->id_info_rsp.irk;
- slv_csrk = params->sign_info_rsp.sig_key;
+ peer_irk = params->id_info_req.irk;
+ peer_csrk = params->sign_info_req.sig_key;
+ our_irk = params->id_info_rsp.irk;
+ our_csrk = params->sign_info_rsp.sig_key;
} else {
our_key_dist = params->pair_rsp.resp_key_dist;
peer_key_dist = params->pair_rsp.init_key_dist;
- peer_addr_type = 0;
- peer_addr = params->init_addr;
+ peer_addr_type = params->init_addr_type;
+ peer_id_addr = params->init_id_addr;
- mst_irk = params->id_info_rsp.irk;
- mst_csrk = params->sign_info_rsp.sig_key;
- slv_irk = params->id_info_req.irk;
- slv_csrk = params->sign_info_req.sig_key;
+ peer_irk = params->id_info_rsp.irk;
+ peer_csrk = params->sign_info_rsp.sig_key;
+ our_irk = params->id_info_req.irk;
+ our_csrk = params->sign_info_req.sig_key;
}
+ peer_id_addr_type = ble_hs_misc_addr_type_to_id(peer_addr_type);
memset(&key_sec, 0, sizeof key_sec);
key_sec.peer_addr_type = BLE_STORE_ADDR_TYPE_NONE;
@@ -911,14 +945,15 @@ ble_sm_test_util_verify_sc_persist(struct ble_sm_test_sc_params *params,
rc = ble_store_read_peer_sec(&key_sec, &value_sec);
if (!bonding) {
TEST_ASSERT(rc == BLE_HS_ENOENT);
+ peer_irk_expected = 0;
} else {
TEST_ASSERT_FATAL(rc == 0);
- irk_expected = !!(peer_key_dist & BLE_SM_PAIR_KEY_DIST_ID);
+ peer_irk_expected = !!(peer_key_dist & BLE_SM_PAIR_KEY_DIST_ID);
csrk_expected = !!(peer_key_dist & BLE_SM_PAIR_KEY_DIST_SIGN);
- TEST_ASSERT(value_sec.peer_addr_type == peer_addr_type);
- TEST_ASSERT(memcmp(value_sec.peer_addr, peer_addr, 6) == 0);
+ TEST_ASSERT(value_sec.peer_addr_type == peer_id_addr_type);
+ TEST_ASSERT(memcmp(value_sec.peer_addr, peer_id_addr, 6) == 0);
TEST_ASSERT(value_sec.ediv == 0);
TEST_ASSERT(value_sec.rand_num == 0);
TEST_ASSERT(value_sec.authenticated == params->authenticated);
@@ -928,14 +963,14 @@ ble_sm_test_util_verify_sc_persist(struct ble_sm_test_sc_params *params,
TEST_ASSERT(value_sec.ltk_present == 1);
TEST_ASSERT(memcmp(value_sec.ltk, params->ltk, 16) == 0);
- TEST_ASSERT(value_sec.irk_present == irk_expected);
- if (irk_expected) {
- TEST_ASSERT(memcmp(value_sec.irk, mst_irk, 16) == 0);
+ TEST_ASSERT(value_sec.irk_present == peer_irk_expected);
+ if (peer_irk_expected) {
+ TEST_ASSERT(memcmp(value_sec.irk, peer_irk, 16) == 0);
}
TEST_ASSERT(value_sec.csrk_present == csrk_expected);
if (csrk_expected) {
- TEST_ASSERT(memcmp(value_sec.csrk, mst_csrk, 16) == 0);
+ TEST_ASSERT(memcmp(value_sec.csrk, peer_csrk, 16) == 0);
}
}
@@ -945,11 +980,11 @@ ble_sm_test_util_verify_sc_persist(struct ble_sm_test_sc_params *params,
} else {
TEST_ASSERT_FATAL(rc == 0);
- irk_expected = !!(our_key_dist & BLE_SM_PAIR_KEY_DIST_ID);
+ our_irk_expected = !!(our_key_dist & BLE_SM_PAIR_KEY_DIST_ID);
csrk_expected = !!(our_key_dist & BLE_SM_PAIR_KEY_DIST_SIGN);
- TEST_ASSERT(value_sec.peer_addr_type == peer_addr_type);
- TEST_ASSERT(memcmp(value_sec.peer_addr, peer_addr, 6) == 0);
+ TEST_ASSERT(value_sec.peer_addr_type == peer_id_addr_type);
+ TEST_ASSERT(memcmp(value_sec.peer_addr, peer_id_addr, 6) == 0);
TEST_ASSERT(value_sec.ediv == 0);
TEST_ASSERT(value_sec.rand_num == 0);
TEST_ASSERT(value_sec.authenticated == params->authenticated);
@@ -957,14 +992,14 @@ ble_sm_test_util_verify_sc_persist(struct ble_sm_test_sc_params *params,
TEST_ASSERT(value_sec.ltk_present == 1);
TEST_ASSERT(memcmp(value_sec.ltk, params->ltk, 16) == 0);
- TEST_ASSERT(value_sec.irk_present == irk_expected);
- if (irk_expected) {
- TEST_ASSERT(memcmp(value_sec.irk, slv_irk, 16) == 0);
+ TEST_ASSERT(value_sec.irk_present == our_irk_expected);
+ if (our_irk_expected) {
+ TEST_ASSERT(memcmp(value_sec.irk, our_irk, 16) == 0);
}
TEST_ASSERT(value_sec.csrk_present == csrk_expected);
if (csrk_expected) {
- TEST_ASSERT(memcmp(value_sec.csrk, slv_csrk, 16) == 0);
+ TEST_ASSERT(memcmp(value_sec.csrk, our_csrk, 16) == 0);
}
}
@@ -974,6 +1009,13 @@ ble_sm_test_util_verify_sc_persist(struct ble_sm_test_sc_params *params,
TEST_ASSERT_FATAL(rc == BLE_HS_ENOENT);
rc = ble_store_read_peer_sec(&key_sec, &value_sec);
TEST_ASSERT_FATAL(rc == BLE_HS_ENOENT);
+
+ /* Verify we sent the peer's IRK to the controller. */
+ if (peer_irk_expected) {
+ ble_sm_test_util_verify_tx_add_resolve_list(peer_id_addr_type,
+ peer_id_addr,
+ peer_irk, our_irk);
+ }
}
void
@@ -984,7 +1026,7 @@ ble_sm_test_util_us_lgcy_good(
int rc;
ble_sm_test_util_init();
- ble_hs_test_util_set_public_addr(params->init_addr);
+ ble_hs_test_util_set_public_addr(params->init_id_addr);
ble_sm_dbg_set_next_pair_rand(params->random_req.value);
ble_sm_dbg_set_next_ediv(params->ediv);
ble_sm_dbg_set_next_start_rand(params->r);
@@ -993,7 +1035,7 @@ ble_sm_test_util_us_lgcy_good(
ble_sm_dbg_set_next_ltk(params->enc_info_req.ltk);
}
- ble_hs_test_util_create_conn(2, params->resp_addr,
+ ble_hs_test_util_create_conn(2, params->resp_id_addr,
ble_sm_test_util_conn_cb,
NULL);
@@ -1096,7 +1138,7 @@ ble_sm_test_util_us_lgcy_good(
void
ble_sm_test_util_peer_fail_inval(
int we_are_master,
- uint8_t *init_addr,
+ uint8_t *init_id_addr,
uint8_t *resp_addr,
struct ble_sm_pair_cmd *pair_req,
struct ble_sm_pair_fail *pair_fail)
@@ -1106,7 +1148,7 @@ ble_sm_test_util_peer_fail_inval(
ble_sm_test_util_init();
ble_hs_test_util_set_public_addr(resp_addr);
- ble_hs_test_util_create_conn(2, init_addr, ble_sm_test_util_conn_cb,
+ ble_hs_test_util_create_conn(2, init_id_addr, ble_sm_test_util_conn_cb,
NULL);
/* This test inspects and modifies the connection object after unlocking
@@ -1148,7 +1190,7 @@ ble_sm_test_util_peer_fail_inval(
void
ble_sm_test_util_peer_lgcy_fail_confirm(
- uint8_t *init_addr,
+ uint8_t *init_id_addr,
uint8_t *resp_addr,
struct ble_sm_pair_cmd *pair_req,
struct ble_sm_pair_cmd *pair_rsp,
@@ -1164,7 +1206,7 @@ ble_sm_test_util_peer_lgcy_fail_confirm(
ble_hs_test_util_set_public_addr(resp_addr);
ble_sm_dbg_set_next_pair_rand(random_rsp->value);
- ble_hs_test_util_create_conn(2, init_addr, ble_sm_test_util_conn_cb,
+ ble_hs_test_util_create_conn(2, init_id_addr, ble_sm_test_util_conn_cb,
NULL);
/* This test inspects and modifies the connection object after unlocking
@@ -1248,7 +1290,7 @@ ble_sm_test_util_peer_lgcy_good_once(struct ble_sm_test_lgcy_params *params)
ble_hs_cfg.sm_our_key_dist = params->pair_rsp.resp_key_dist;
ble_hs_cfg.sm_their_key_dist = params->pair_rsp.init_key_dist;
- ble_hs_test_util_set_public_addr(params->resp_addr);
+ ble_hs_test_util_set_public_addr(params->resp_id_addr);
ble_sm_dbg_set_next_pair_rand(params->random_rsp.value);
ble_sm_dbg_set_next_ediv(params->ediv);
ble_sm_dbg_set_next_start_rand(params->r);
@@ -1257,7 +1299,7 @@ ble_sm_test_util_peer_lgcy_good_once(struct ble_sm_test_lgcy_params *params)
ble_sm_dbg_set_next_ltk(params->enc_info_req.ltk);
}
- ble_hs_test_util_create_conn(2, params->init_addr,
+ ble_hs_test_util_create_conn(2, params->init_id_addr,
ble_sm_test_util_conn_cb,
NULL);
@@ -1599,7 +1641,7 @@ ble_sm_test_util_peer_sc_good_once(struct ble_sm_test_sc_params *params)
ble_hs_cfg.sm_our_key_dist = params->pair_rsp.resp_key_dist;
ble_hs_cfg.sm_their_key_dist = params->pair_rsp.init_key_dist;
- ble_hs_test_util_set_public_addr(params->resp_addr);
+ ble_hs_test_util_set_public_addr(params->resp_id_addr);
ble_sm_dbg_set_next_pair_rand(params->random_rsp[0].value);
ble_sm_dbg_set_sc_keys(params->public_key_rsp.x, params->our_priv_key);
@@ -1609,9 +1651,12 @@ ble_sm_test_util_peer_sc_good_once(struct ble_sm_test_sc_params *params)
ble_sm_dbg_set_next_csrk(params->sign_info_req.sig_key);
}
- ble_hs_test_util_create_conn(2, params->init_addr,
- ble_sm_test_util_conn_cb,
- NULL);
+ ble_hs_test_util_create_rpa_conn(2, params->resp_rpa,
+ params->init_addr_type,
+ params->init_id_addr,
+ params->init_rpa,
+ ble_sm_test_util_conn_cb,
+ NULL);
/* This test inspects and modifies the connection object after unlocking
* the host mutex. It is not OK for real code to do this, but this test
@@ -1765,6 +1810,9 @@ ble_sm_test_util_peer_sc_good_once(struct ble_sm_test_sc_params *params)
/* Receive key material from peer. */
if (params->pair_rsp.init_key_dist & BLE_SM_PAIR_KEY_DIST_ID) {
+ ble_hs_test_util_set_ack(
+ host_hci_opcode_join(BLE_HCI_OGF_LE,
+ BLE_HCI_OCF_LE_ADD_RESOLV_LIST), 0);
ble_sm_test_util_rx_id_info(2, ¶ms->id_info_rsp, 0);
ble_sm_test_util_rx_id_addr_info(2, ¶ms->id_addr_info_rsp, 0);
}
@@ -1810,22 +1858,22 @@ ble_sm_test_util_peer_sc_good(struct ble_sm_test_sc_params *params)
/*** Verify link can be restored via the encryption procedure. */
/* Peer is master; peer initiates procedure. */
- ble_sm_test_util_peer_bonding_good(0, 0, params->init_addr,
+ ble_sm_test_util_peer_bonding_good(0, 0, params->init_id_addr,
params->ltk, params->authenticated,
0, 0);
/* Peer is master; we initiate procedure via security request. */
- ble_sm_test_util_peer_bonding_good(1, 0, params->init_addr,
+ ble_sm_test_util_peer_bonding_good(1, 0, params->init_id_addr,
params->ltk, params->authenticated,
0, 0);
/* We are master; we initiate procedure. */
- ble_sm_test_util_us_bonding_good(0, 0, params->init_addr,
+ ble_sm_test_util_us_bonding_good(0, 0, params->init_id_addr,
params->ltk, params->authenticated,
0, 0);
/* We are master; peer initiates procedure via security request. */
- ble_sm_test_util_us_bonding_good(1, 0, params->init_addr,
+ ble_sm_test_util_us_bonding_good(1, 0, params->init_id_addr,
params->ltk, params->authenticated,
0, 0);
}
@@ -1852,7 +1900,7 @@ ble_sm_test_util_us_sc_good(struct ble_sm_test_sc_params *params)
ble_hs_cfg.sm_our_key_dist = params->pair_req.init_key_dist;
ble_hs_cfg.sm_their_key_dist = params->pair_req.resp_key_dist;
- ble_hs_test_util_set_public_addr(params->init_addr);
+ ble_hs_test_util_set_public_addr(params->init_id_addr);
ble_sm_dbg_set_next_pair_rand(params->random_req[0].value);
ble_sm_dbg_set_sc_keys(params->public_key_req.x, params->our_priv_key);
@@ -1862,9 +1910,12 @@ ble_sm_test_util_us_sc_good(struct ble_sm_test_sc_params *params)
ble_sm_dbg_set_next_csrk(params->sign_info_rsp.sig_key);
}
- ble_hs_test_util_create_conn(2, params->resp_addr,
- ble_sm_test_util_conn_cb,
- NULL);
+ ble_hs_test_util_create_rpa_conn(2, params->init_rpa,
+ params->resp_addr_type,
+ params->resp_id_addr,
+ params->resp_rpa,
+ ble_sm_test_util_conn_cb,
+ NULL);
/* This test inspects and modifies the connection object after unlocking
* the host mutex. It is not OK for real code to do this, but this test
@@ -2037,11 +2088,11 @@ ble_sm_test_util_us_fail_inval(
int rc;
ble_sm_test_util_init();
- ble_hs_test_util_set_public_addr(params->resp_addr);
+ ble_hs_test_util_set_public_addr(params->resp_id_addr);
ble_sm_dbg_set_next_pair_rand(((uint8_t[16]){0}));
- ble_hs_test_util_create_conn(2, params->init_addr,
+ ble_hs_test_util_create_conn(2, params->init_id_addr,
ble_sm_test_util_conn_cb,
NULL);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/b4c34462/net/nimble/host/src/test/ble_sm_test_util.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_sm_test_util.h b/net/nimble/host/src/test/ble_sm_test_util.h
index b9dac79..9d95c92 100644
--- a/net/nimble/host/src/test/ble_sm_test_util.h
+++ b/net/nimble/host/src/test/ble_sm_test_util.h
@@ -27,8 +27,12 @@ struct ble_sm_test_passkey_info {
};
struct ble_sm_test_lgcy_params {
- uint8_t init_addr[6];
- uint8_t resp_addr[6];
+ uint8_t init_addr_type;
+ uint8_t init_id_addr[6];
+ uint8_t init_rpa[6];
+ uint8_t resp_addr_type;
+ uint8_t resp_id_addr[6];
+ uint8_t resp_rpa[6];
struct ble_sm_sec_req sec_req;
struct ble_sm_pair_cmd pair_req;
struct ble_sm_pair_cmd pair_rsp;
@@ -58,8 +62,12 @@ struct ble_sm_test_lgcy_params {
};
struct ble_sm_test_sc_params {
- uint8_t init_addr[6];
- uint8_t resp_addr[6];
+ uint8_t init_addr_type;
+ uint8_t init_id_addr[6];
+ uint8_t init_rpa[6];
+ uint8_t resp_addr_type;
+ uint8_t resp_id_addr[6];
+ uint8_t resp_rpa[6];
struct ble_sm_sec_req sec_req;
struct ble_sm_pair_cmd pair_req;
struct ble_sm_pair_cmd pair_rsp;