From 146b772916c55a0066582ab2900d873b19289213 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Tue, 4 Dec 2012 13:14:56 +0200 Subject: [PATCH] core: Move LKT storing from event.c to mgmt.c --- src/event.c | 77 --------------------------------------------------- src/event.h | 4 --- src/mgmt.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 75 insertions(+), 85 deletions(-) diff --git a/src/event.c b/src/event.c index d9d4e415c..6269f1cf9 100644 --- a/src/event.c +++ b/src/event.c @@ -82,61 +82,6 @@ static gboolean get_adapter_and_device(const bdaddr_t *src, bdaddr_t *dst, return TRUE; } -static void store_longtermkey(bdaddr_t *local, bdaddr_t *peer, - uint8_t bdaddr_type, unsigned char *key, - uint8_t master, uint8_t authenticated, - uint8_t enc_size, uint16_t ediv, - uint8_t rand[8]) -{ - char adapter_addr[18]; - char device_addr[18]; - char filename[PATH_MAX + 1]; - GKeyFile *key_file; - char key_str[35]; - char rand_str[19]; - char *str; - int i; - gsize length = 0; - - ba2str(local, adapter_addr); - ba2str(peer, device_addr); - - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", adapter_addr, - device_addr); - filename[PATH_MAX] = '\0'; - - key_file = g_key_file_new(); - g_key_file_load_from_file(key_file, filename, 0, NULL); - - key_str[0] = '0'; - key_str[1] = 'x'; - for (i = 0; i < 16; i++) - sprintf(key_str + 2 + (i * 2), "%2.2X", key[i]); - - g_key_file_set_string(key_file, "LongTermKey", "Key", key_str); - - g_key_file_set_integer(key_file, "LongTermKey", "Authenticated", - authenticated); - g_key_file_set_integer(key_file, "LongTermKey", "Master", master); - g_key_file_set_integer(key_file, "LongTermKey", "EncSize", enc_size); - g_key_file_set_integer(key_file, "LongTermKey", "EDiv", ediv); - - rand_str[0] = '0'; - rand_str[1] = 'x'; - for (i = 0; i < 8; i++) - sprintf(rand_str + 2 + (i * 2), "%2.2X", rand[i]); - - g_key_file_set_string(key_file, "LongTermKey", "Rand", rand_str); - - create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - - str = g_key_file_to_data(key_file, &length, NULL); - g_file_set_contents(filename, str, length, NULL); - g_free(str); - - g_key_file_free(key_file); -} - static void store_link_key(struct btd_adapter *adapter, struct btd_device *device, uint8_t *key, uint8_t type, uint8_t pin_length) @@ -200,25 +145,3 @@ int btd_event_link_key_notify(bdaddr_t *local, bdaddr_t *peer, return 0; } - -int btd_event_ltk_notify(bdaddr_t *local, bdaddr_t *peer, uint8_t bdaddr_type, - uint8_t *key, uint8_t master, - uint8_t authenticated, uint8_t enc_size, - uint16_t ediv, uint8_t rand[8]) -{ - struct btd_adapter *adapter; - struct btd_device *device; - - if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE)) - return -ENODEV; - - store_longtermkey(local, peer, bdaddr_type, key, master, - authenticated, enc_size, ediv, rand); - - device_set_bonded(device, TRUE); - - if (device_is_temporary(device)) - device_set_temporary(device, FALSE); - - return 0; -} diff --git a/src/event.h b/src/event.h index 1788a80f3..280d8a4cd 100644 --- a/src/event.h +++ b/src/event.h @@ -24,7 +24,3 @@ int btd_event_link_key_notify(bdaddr_t *local, bdaddr_t *peer, uint8_t *key, uint8_t key_type, uint8_t pin_length); -int btd_event_ltk_notify(bdaddr_t *local, bdaddr_t *peer, uint8_t bdaddr_type, - uint8_t *key, uint8_t master, - uint8_t authenticated, uint8_t enc_size, - uint16_t ediv, uint8_t rand[8]); diff --git a/src/mgmt.c b/src/mgmt.c index ad6a4fb22..f51e85d7b 100644 --- a/src/mgmt.c +++ b/src/mgmt.c @@ -26,6 +26,7 @@ #include #endif +#define _GNU_SOURCE #include #include #include @@ -34,6 +35,7 @@ #include #include #include +#include #include @@ -49,6 +51,7 @@ #include "device.h" #include "event.h" #include "eir.h" +#include "storage.h" #include "mgmt.h" #define MGMT_BUF_SIZE 1024 @@ -1897,10 +1900,67 @@ static void mgmt_device_unpaired(int sk, uint16_t index, void *buf, size_t len) adapter_remove_device(adapter, device, TRUE); } +static void store_longtermkey(bdaddr_t *local, bdaddr_t *peer, + uint8_t bdaddr_type, unsigned char *key, + uint8_t master, uint8_t authenticated, + uint8_t enc_size, uint16_t ediv, + uint8_t rand[8]) +{ + char adapter_addr[18]; + char device_addr[18]; + char filename[PATH_MAX + 1]; + GKeyFile *key_file; + char key_str[35]; + char rand_str[19]; + char *str; + int i; + gsize length = 0; + + ba2str(local, adapter_addr); + ba2str(peer, device_addr); + + snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", adapter_addr, + device_addr); + filename[PATH_MAX] = '\0'; + + key_file = g_key_file_new(); + g_key_file_load_from_file(key_file, filename, 0, NULL); + + key_str[0] = '0'; + key_str[1] = 'x'; + for (i = 0; i < 16; i++) + sprintf(key_str + 2 + (i * 2), "%2.2X", key[i]); + + g_key_file_set_string(key_file, "LongTermKey", "Key", key_str); + + g_key_file_set_integer(key_file, "LongTermKey", "Authenticated", + authenticated); + g_key_file_set_integer(key_file, "LongTermKey", "Master", master); + g_key_file_set_integer(key_file, "LongTermKey", "EncSize", enc_size); + g_key_file_set_integer(key_file, "LongTermKey", "EDiv", ediv); + + rand_str[0] = '0'; + rand_str[1] = 'x'; + for (i = 0; i < 8; i++) + sprintf(rand_str + 2 + (i * 2), "%2.2X", rand[i]); + + g_key_file_set_string(key_file, "LongTermKey", "Rand", rand_str); + + create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + + str = g_key_file_to_data(key_file, &length, NULL); + g_file_set_contents(filename, str, length, NULL); + g_free(str); + + g_key_file_free(key_file); +} + static void mgmt_new_ltk(int sk, uint16_t index, void *buf, size_t len) { struct mgmt_ev_new_long_term_key *ev = buf; struct controller_info *info; + struct btd_adapter *adapter; + struct btd_device *device; if (len != sizeof(*ev)) { error("mgmt_new_ltk event size mismatch (%zu != %zu)", @@ -1918,11 +1978,22 @@ static void mgmt_new_ltk(int sk, uint16_t index, void *buf, size_t len) info = &controllers[index]; + if (!get_adapter_and_device(&info->bdaddr, &ev->key.addr.bdaddr, + &adapter, &device, true)) + return; + if (ev->store_hint) { - btd_event_ltk_notify(&info->bdaddr, &ev->key.addr.bdaddr, - ev->key.addr.type, ev->key.val, ev->key.master, - ev->key.authenticated, ev->key.enc_size, - ev->key.ediv, ev->key.rand); + struct mgmt_ltk_info *key = &ev->key; + + store_longtermkey(&info->bdaddr, &key->addr.bdaddr, + key->addr.type, key->val, key->master, + key->authenticated, key->enc_size, + key->ediv, key->rand); + + device_set_bonded(device, TRUE); + + if (device_is_temporary(device)) + device_set_temporary(device, FALSE); } if (ev->key.master) -- 2.47.3