From 41abf5cb4823a46ee4824ff2a11a55f42c83e253 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Mon, 7 Jan 2013 11:24:28 +0200 Subject: [PATCH] core: Move mgmt LTKs loading to adapter code --- src/adapter.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++- src/mgmt.c | 51 ----------------------------------------- src/mgmt.h | 2 -- 3 files changed, 62 insertions(+), 54 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index ae864b8d4..d3e5dd417 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -1991,6 +1991,67 @@ static int load_link_keys(struct btd_adapter *adapter, GSList *keys, return 0; } +static void load_ltks_complete(uint8_t status, uint16_t length, + const void *param, void *user_data) +{ + struct btd_adapter *adapter = user_data; + + if (status != MGMT_STATUS_SUCCESS) { + error("Failed to load LTKs for hci%u: %s (0x%02x)", + adapter->dev_id, mgmt_errstr(status), status); + return; + } + + DBG("LTKs loaded for hci%u", adapter->dev_id); +} + +static int load_ltks(struct btd_adapter *adapter, GSList *keys) +{ + struct mgmt_cp_load_long_term_keys *cp; + struct mgmt_ltk_info *key; + size_t key_count, cp_size; + unsigned int id; + GSList *l; + + key_count = g_slist_length(keys); + + DBG("hci%u keys %zu", adapter->dev_id, key_count); + + cp_size = sizeof(*cp) + (key_count * sizeof(*key)); + + cp = g_try_malloc0(cp_size); + if (cp == NULL) + return -ENOMEM; + + cp->key_count = htobs(key_count); + + for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) { + struct smp_ltk_info *info = l->data; + + bacpy(&key->addr.bdaddr, &info->bdaddr); + key->addr.type = info->bdaddr_type; + memcpy(key->val, info->val, sizeof(info->val)); + memcpy(key->rand, info->rand, sizeof(info->rand)); + memcpy(&key->ediv, &info->ediv, sizeof(key->ediv)); + key->authenticated = info->authenticated; + key->master = info->master; + key->enc_size = info->enc_size; + } + + id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_LONG_TERM_KEYS, + adapter->dev_id, cp_size, cp, + load_ltks_complete, adapter, NULL); + + g_free(cp); + + if (id == 0) { + error("Failed to load LTKs for hci%u", adapter->dev_id); + return -EIO; + } + + return 0; +} + static void load_devices(struct btd_adapter *adapter) { char filename[PATH_MAX + 1]; @@ -2077,7 +2138,7 @@ free: g_slist_free_full(keys.keys, g_free); - err = mgmt_load_ltks(adapter->dev_id, ltks.keys); + err = load_ltks(adapter, ltks.keys); if (err < 0) error("Unable to load ltks: %s (%d)", strerror(-err), -err); diff --git a/src/mgmt.c b/src/mgmt.c index bed27954d..b0e091588 100644 --- a/src/mgmt.c +++ b/src/mgmt.c @@ -1026,54 +1026,3 @@ int mgmt_cancel_bonding(int index, const bdaddr_t *bdaddr, uint8_t addr_type) return 0; } - -int mgmt_load_ltks(int index, GSList *keys) -{ - char *buf; - struct mgmt_hdr *hdr; - struct mgmt_cp_load_long_term_keys *cp; - struct mgmt_ltk_info *key; - size_t key_count, cp_size; - GSList *l; - int err; - - key_count = g_slist_length(keys); - - DBG("index %d keys %zu", index, key_count); - - cp_size = sizeof(*cp) + (key_count * sizeof(*key)); - - buf = g_try_malloc0(sizeof(*hdr) + cp_size); - if (buf == NULL) - return -ENOMEM; - - hdr = (void *) buf; - hdr->opcode = htobs(MGMT_OP_LOAD_LONG_TERM_KEYS); - hdr->len = htobs(cp_size); - hdr->index = htobs(index); - - cp = (void *) (buf + sizeof(*hdr)); - cp->key_count = htobs(key_count); - - for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) { - struct smp_ltk_info *info = l->data; - - bacpy(&key->addr.bdaddr, &info->bdaddr); - key->addr.type = info->bdaddr_type; - memcpy(key->val, info->val, sizeof(info->val)); - memcpy(key->rand, info->rand, sizeof(info->rand)); - memcpy(&key->ediv, &info->ediv, sizeof(key->ediv)); - key->authenticated = info->authenticated; - key->master = info->master; - key->enc_size = info->enc_size; - } - - if (write(mgmt_sock, buf, sizeof(*hdr) + cp_size) < 0) - err = -errno; - else - err = 0; - - g_free(buf); - - return err; -} diff --git a/src/mgmt.h b/src/mgmt.h index 71c42b10b..91ea08566 100644 --- a/src/mgmt.h +++ b/src/mgmt.h @@ -25,8 +25,6 @@ int mgmt_setup(void); void mgmt_cleanup(void); -int mgmt_load_ltks(int index, GSList *keys); - int mgmt_create_bonding(int index, const bdaddr_t *bdaddr, uint8_t addr_type, uint8_t io_cap); int mgmt_cancel_bonding(int index, const bdaddr_t *bdaddr, uint8_t addr_type); -- 2.47.3