summaryrefslogtreecommitdiff
path: root/src/adapter.c
diff options
context:
space:
mode:
authorArchie Pusaka <apusaka@chromium.org>2021-11-03 17:02:53 +0800
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2021-11-03 17:34:28 -0700
commit1a04dc35b3b2896b398d4352a34d5ae6db04e4f8 (patch)
tree9b958cd944703f4eafd785743e44b1a2ce44cffe /src/adapter.c
parent726058e39f7ab7afa7f62489f0a912ff2b658531 (diff)
downloadbluez-1a04dc35b3b2896b398d4352a34d5ae6db04e4f8.tar.gz
adapter: Use PeripheralLongTermKey to store LTK
Introducing PeripheralLongTermKey group for storing LTK info to replace the less inclusive term. Currently we still need to write/read from both to ensure smooth transition, but later we should deprecate the old term. Reviewed-by: Sonny Sasaka <sonnysasaka@chromium.org>
Diffstat (limited to 'src/adapter.c')
-rw-r--r--src/adapter.c47
1 files changed, 38 insertions, 9 deletions
diff --git a/src/adapter.c b/src/adapter.c
index d0d38621b..114ae84c1 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -3868,7 +3868,14 @@ static struct smp_ltk_info *get_peripheral_ltk_info(GKeyFile *key_file,
DBG("%s", peer);
- ltk = get_ltk(key_file, peer, bdaddr_type, "SlaveLongTermKey");
+ /* Peripheral* is the proper term, but for now read both entries
+ * so it won't break when user up/downgrades. Remove the other
+ * term after a few releases.
+ */
+ ltk = get_ltk(key_file, peer, bdaddr_type, "PeripheralLongTermKey");
+ if (!ltk)
+ ltk = get_ltk(key_file, peer, bdaddr_type, "SlaveLongTermKey");
+
if (ltk)
ltk->central = false;
@@ -8415,13 +8422,12 @@ static void new_link_key_callback(uint16_t index, uint16_t length,
bonding_complete(adapter, &addr->bdaddr, addr->type, 0);
}
-static void store_longtermkey(struct btd_adapter *adapter, const bdaddr_t *peer,
+static void store_ltk_group(struct btd_adapter *adapter, const bdaddr_t *peer,
uint8_t bdaddr_type, const unsigned char *key,
- uint8_t central, uint8_t authenticated,
+ const char *group, uint8_t authenticated,
uint8_t enc_size, uint16_t ediv,
uint64_t rand)
{
- const char *group = central ? "LongTermKey" : "SlaveLongTermKey";
char device_addr[18];
char filename[PATH_MAX];
GKeyFile *key_file;
@@ -8431,11 +8437,6 @@ static void store_longtermkey(struct btd_adapter *adapter, const bdaddr_t *peer,
char *str;
int i;
- if (central != 0x00 && central != 0x01) {
- error("Unsupported LTK type %u", central);
- return;
- }
-
ba2str(peer, device_addr);
snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
@@ -8475,6 +8476,34 @@ static void store_longtermkey(struct btd_adapter *adapter, const bdaddr_t *peer,
g_key_file_free(key_file);
}
+static void store_longtermkey(struct btd_adapter *adapter, const bdaddr_t *peer,
+ uint8_t bdaddr_type, const unsigned char *key,
+ uint8_t central, uint8_t authenticated,
+ uint8_t enc_size, uint16_t ediv,
+ uint64_t rand)
+{
+ if (central != 0x00 && central != 0x01) {
+ error("Unsupported LTK type %u", central);
+ return;
+ }
+
+ if (central) {
+ store_ltk_group(adapter, peer, bdaddr_type, key, "LongTermKey",
+ authenticated, enc_size, ediv, rand);
+ } else {
+ /* Peripheral* is the proper term, but for now keep duplicates
+ * so it won't break when user up/downgrades. Remove the other
+ * term after a few releases.
+ */
+ store_ltk_group(adapter, peer, bdaddr_type, key,
+ "PeripheralLongTermKey", authenticated,
+ enc_size, ediv, rand);
+ store_ltk_group(adapter, peer, bdaddr_type, key,
+ "SlaveLongTermKey", authenticated,
+ enc_size, ediv, rand);
+ }
+}
+
static void new_long_term_key_callback(uint16_t index, uint16_t length,
const void *param, void *user_data)
{