2014-12-10 14:16:10

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 0/4] android/bluetooth: Enable privacy mode on starup

This set add support for privacy mode in BfA.
This is in order to follow Android Lollipop

Lukasz Rymanowski (4):
android/bluetooth: Start keep IRK for adapter
android/bluetooth: Store IRK when storing adapter config
android/bluetooth: Load IRK on adapter start
android/bluetooth: Enable LE privacy mode on BfA startup

android/bluetooth.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 65 insertions(+)

--
1.8.4



2014-12-10 15:43:25

by Marcel Holtmann

[permalink] [raw]
Subject: Re: [PATCH 4/4] android/bluetooth: Enable LE privacy mode on BfA startup

Hi Lukasz,

> Lets follow Android Lollipop behaviour and enable privacy on
> startup.
> ---
> android/bluetooth.c | 26 ++++++++++++++++++++++++++
> 1 file changed, 26 insertions(+)
>
> diff --git a/android/bluetooth.c b/android/bluetooth.c
> index 1d5d26d..c0c5137 100644
> --- a/android/bluetooth.c
> +++ b/android/bluetooth.c
> @@ -3413,6 +3413,28 @@ static void clear_auto_connect_list(void)
> error("Could not clear auto connect list");
> }
>
> +static void set_privacy_complete(uint8_t status, uint16_t length,
> + const void *param, void *user_data)
> +{
> + if (status != MGMT_STATUS_SUCCESS)
> + error("Failed to set privacy mode: %s (0x%02x)",
> + mgmt_errstr(status), status);
> +}
> +
> +static void set_privacy(void)
> +{
> + struct mgmt_cp_set_privacy cp;
> +
> + cp.privacy = 0x01;
> + memcpy(cp.irk, adapter.irk, sizeof(adapter.irk));
> +
> + if (mgmt_send(mgmt_if, MGMT_OP_SET_PRIVACY, adapter.index, sizeof(cp),
> + &cp, set_privacy_complete, NULL, NULL) > 0)
> + return;
> +
> + error("Could not set privacy mode");
> +}
> +
> static void read_info_complete(uint8_t status, uint16_t length,
> const void *param, void *user_data)
> {
> @@ -3487,6 +3509,10 @@ static void read_info_complete(uint8_t status, uint16_t length,
> if (missing_settings & MGMT_SETTING_BONDABLE)
> set_mode(MGMT_OP_SET_BONDABLE, 0x01);
>
> + if ((adapter.supported_settings & MGMT_SETTING_LE) &&
> + (missing_settings & MGMT_SETTING_PRIVACY))
> + set_privacy();
> +

the LE check is a bit useless. You want to enable privacy when it is supported and let the kernel figure out the details. I will also not tell you about this mode if LE is not available.

Regards

Marcel


2014-12-10 15:40:50

by Marcel Holtmann

[permalink] [raw]
Subject: Re: [PATCH 3/4] android/bluetooth: Load IRK on adapter start

Hi Lukasz,

> If IRK is not found it will be generated
> ---
> android/bluetooth.c | 29 +++++++++++++++++++++++++++++
> 1 file changed, 29 insertions(+)
>
> diff --git a/android/bluetooth.c b/android/bluetooth.c
> index 8865eac..1d5d26d 100644
> --- a/android/bluetooth.c
> +++ b/android/bluetooth.c
> @@ -294,6 +294,22 @@ static void store_adapter_config(void)
> g_key_file_free(key_file);
> }
>
> +static void generate_irk(void)
> +{
> + int i;
> +
> + srand(time(NULL));
> +
> + /* Need to generate 16 octets */
> + for (i = 0; i < 16; i =+ 4) {
> + int a = rand();
> +
> + memcpy(&adapter.irk[i], &a, 4);
> + }
> +
> + store_adapter_config();
> +}

bt_crypto_random_bytes() please.

Regards

Marcel


2014-12-10 14:16:14

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 4/4] android/bluetooth: Enable LE privacy mode on BfA startup

Lets follow Android Lollipop behaviour and enable privacy on
startup.
---
android/bluetooth.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)

diff --git a/android/bluetooth.c b/android/bluetooth.c
index 1d5d26d..c0c5137 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -3413,6 +3413,28 @@ static void clear_auto_connect_list(void)
error("Could not clear auto connect list");
}

+static void set_privacy_complete(uint8_t status, uint16_t length,
+ const void *param, void *user_data)
+{
+ if (status != MGMT_STATUS_SUCCESS)
+ error("Failed to set privacy mode: %s (0x%02x)",
+ mgmt_errstr(status), status);
+}
+
+static void set_privacy(void)
+{
+ struct mgmt_cp_set_privacy cp;
+
+ cp.privacy = 0x01;
+ memcpy(cp.irk, adapter.irk, sizeof(adapter.irk));
+
+ if (mgmt_send(mgmt_if, MGMT_OP_SET_PRIVACY, adapter.index, sizeof(cp),
+ &cp, set_privacy_complete, NULL, NULL) > 0)
+ return;
+
+ error("Could not set privacy mode");
+}
+
static void read_info_complete(uint8_t status, uint16_t length,
const void *param, void *user_data)
{
@@ -3487,6 +3509,10 @@ static void read_info_complete(uint8_t status, uint16_t length,
if (missing_settings & MGMT_SETTING_BONDABLE)
set_mode(MGMT_OP_SET_BONDABLE, 0x01);

+ if ((adapter.supported_settings & MGMT_SETTING_LE) &&
+ (missing_settings & MGMT_SETTING_PRIVACY))
+ set_privacy();
+
load_devices_info(cb);
load_devices_cache();

--
1.8.4


2014-12-10 14:16:13

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 3/4] android/bluetooth: Load IRK on adapter start

If IRK is not found it will be generated
---
android/bluetooth.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)

diff --git a/android/bluetooth.c b/android/bluetooth.c
index 8865eac..1d5d26d 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -294,6 +294,22 @@ static void store_adapter_config(void)
g_key_file_free(key_file);
}

+static void generate_irk(void)
+{
+ int i;
+
+ srand(time(NULL));
+
+ /* Need to generate 16 octets */
+ for (i = 0; i < 16; i =+ 4) {
+ int a = rand();
+
+ memcpy(&adapter.irk[i], &a, 4);
+ }
+
+ store_adapter_config();
+}
+
static void load_adapter_config(void)
{
GError *gerr = NULL;
@@ -306,6 +322,7 @@ static void load_adapter_config(void)
str = g_key_file_get_string(key_file, "General", "Address", NULL);
if (!str) {
g_key_file_free(key_file);
+ generate_irk();
return;
}

@@ -321,6 +338,18 @@ static void load_adapter_config(void)
g_clear_error(&gerr);
}

+ str = g_key_file_get_string(key_file, "General", "IRK", NULL);
+ if (str) {
+ int i;
+
+ for (i = 0; i < 16; i++)
+ sscanf(str + (i * 2), "%02hhX", &adapter.irk[i]);
+
+ g_free(str);
+ } else {
+ generate_irk();
+ }
+
g_key_file_free(key_file);
}

--
1.8.4


2014-12-10 14:16:12

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 2/4] android/bluetooth: Store IRK when storing adapter config

---
android/bluetooth.c | 7 +++++++
1 file changed, 7 insertions(+)

diff --git a/android/bluetooth.c b/android/bluetooth.c
index e9c5be1..8865eac 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -263,6 +263,8 @@ static void store_adapter_config(void)
gsize length = 0;
char addr[18];
char *data;
+ char key_str[33];
+ int i;

key_file = g_key_file_new();

@@ -279,6 +281,11 @@ static void store_adapter_config(void)
g_key_file_set_integer(key_file, "General", "DiscoverableTimeout",
adapter.discoverable_timeout);

+ for (i = 0; i < 16; i++)
+ sprintf(key_str + (i * 2), "%2.2X", adapter.irk[i]);
+
+ g_key_file_set_string(key_file, "General", "IRK", key_str);
+
data = g_key_file_to_data(key_file, &length, NULL);

g_file_set_contents(SETTINGS_FILE, data, length, NULL);
--
1.8.4


2014-12-10 14:16:11

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 1/4] android/bluetooth: Start keep IRK for adapter

---
android/bluetooth.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/android/bluetooth.c b/android/bluetooth.c
index 48ca231..e9c5be1 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -176,6 +176,8 @@ static struct {

char *name;

+ uint8_t irk[16];
+
uint8_t max_advert_instance;
uint8_t rpa_offload_supported;
uint8_t max_irk_list_size;
@@ -196,6 +198,7 @@ static struct {
.index = MGMT_INDEX_NONE,
.dev_class = 0,
.name = NULL,
+ .irk = {0},
.max_advert_instance = 0,
.rpa_offload_supported = 0,
.max_irk_list_size = 0,
--
1.8.4