Linux bluetooth development
 help / color / mirror / Atom feed
* [PATCH 1/6] android/gatt: Fix client signed write on encrypted link
@ 2015-02-27 15:01 Szymon Janc
  2015-02-27 15:01 ` [PATCH 2/6] android/bluetooth: Store if CSRK is authenticated Szymon Janc
                   ` (5 more replies)
  0 siblings, 6 replies; 10+ messages in thread
From: Szymon Janc @ 2015-02-27 15:01 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

As defined in Core Specification 4.2:
"If a connection is already encrypted with LE security mode 1, level 2
or level 3 as defined in [Vol 3] Part C, Section 10.2 then, a Write
Without Response as defined in Section 4.9.1 shall be used instead of
a Signed Write Without Response."
---
 android/gatt.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/android/gatt.c b/android/gatt.c
index 53b1983..9e348d7 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -3358,14 +3358,14 @@ static void handle_client_write_characteristic(const void *buf, uint16_t len)
 			goto failed;
 		}
 
-		if (get_sec_level(conn->device) != BT_SECURITY_LOW) {
-			error("gatt: Cannot write signed on encrypted link");
-			status = HAL_STATUS_FAILED;
-			goto failed;
-		}
-
-		res = signed_write_cmd(conn->device, ch->ch.value_handle,
-							cmd->value, cmd->len);
+		if (get_sec_level(conn->device) > BT_SECURITY_LOW)
+			res = gatt_write_cmd(conn->device->attrib,
+						ch->ch.value_handle, cmd->value,
+						cmd->len, NULL, NULL);
+		else
+			res = signed_write_cmd(conn->device,
+						ch->ch.value_handle, cmd->value,
+						cmd->len);
 		break;
 	default:
 		error("gatt: Write type %d unsupported", cmd->write_type);
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/6] android/bluetooth: Store if CSRK is authenticated
  2015-02-27 15:01 [PATCH 1/6] android/gatt: Fix client signed write on encrypted link Szymon Janc
@ 2015-02-27 15:01 ` Szymon Janc
  2015-02-27 15:01 ` [PATCH 3/6] android/bluetooth: Add support for CSRK authetication level Szymon Janc
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Szymon Janc @ 2015-02-27 15:01 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

This adds support for storing information if CSRK is authenticated.
---
 android/bluetooth.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/android/bluetooth.c b/android/bluetooth.c
index d017418..dca6f48 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -120,10 +120,12 @@ struct device {
 	unsigned int confirm_id; /* mgtm command id if command pending */
 
 	bool valid_remote_csrk;
+	bool remote_csrk_auth;
 	uint8_t remote_csrk[16];
 	uint32_t remote_sign_cnt;
 
 	bool valid_local_csrk;
+	bool local_csrk_auth;
 	uint8_t local_csrk[16];
 	uint32_t local_sign_cnt;
 	uint16_t gatt_ccc;
@@ -2320,6 +2322,9 @@ static void store_csrk(struct device *dev)
 							dev->local_csrk[i]);
 
 		g_key_file_set_string(key_file, addr, "LocalCSRK", key_str);
+
+		g_key_file_set_boolean(key_file, addr, "LocalCSRKAuthenticated",
+							dev->local_csrk_auth);
 	}
 
 	if (dev->valid_remote_csrk) {
@@ -2328,6 +2333,10 @@ static void store_csrk(struct device *dev)
 							dev->remote_csrk[i]);
 
 		g_key_file_set_string(key_file, addr, "RemoteCSRK", key_str);
+
+		g_key_file_set_boolean(key_file, addr,
+						"RemoteCSRKAuthenticated",
+						dev->remote_csrk_auth);
 	}
 
 	data = g_key_file_to_data(key_file, &length, NULL);
@@ -2360,12 +2369,14 @@ static void new_csrk_callback(uint16_t index, uint16_t length,
 		memcpy(dev->local_csrk, ev->key.val, 16);
 		dev->local_sign_cnt = 0;
 		dev->valid_local_csrk = true;
+		dev->local_csrk_auth = ev->key.type == 0x02;
 		break;
 	case 0x01:
 	case 0x03:
 		memcpy(dev->remote_csrk, ev->key.val, 16);
 		dev->remote_sign_cnt = 0;
 		dev->valid_remote_csrk = true;
+		dev->remote_csrk_auth = ev->key.type == 0x03;
 		break;
 	default:
 		error("Unknown CSRK key type 02%02x", ev->key.type);
@@ -2962,6 +2973,9 @@ static struct device *create_device_from_info(GKeyFile *key_file,
 
 		dev->local_sign_cnt = g_key_file_get_integer(key_file, peer,
 						"LocalCSRKSignCounter", NULL);
+
+		dev->local_csrk_auth = g_key_file_get_boolean(key_file, peer,
+						"LocalCSRKAuthenticated", NULL);
 	}
 
 	str = g_key_file_get_string(key_file, peer, "RemoteCSRK", NULL);
@@ -2976,6 +2990,10 @@ static struct device *create_device_from_info(GKeyFile *key_file,
 
 		dev->remote_sign_cnt = g_key_file_get_integer(key_file, peer,
 						"RemoteCSRKSignCounter", NULL);
+
+		dev->remote_csrk_auth = g_key_file_get_boolean(key_file, peer,
+						"RemoteCSRKAuthenticated",
+						NULL);
 	}
 
 	str = g_key_file_get_string(key_file, peer, "GattCCC", NULL);
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/6] android/bluetooth: Add support for CSRK authetication level
  2015-02-27 15:01 [PATCH 1/6] android/gatt: Fix client signed write on encrypted link Szymon Janc
  2015-02-27 15:01 ` [PATCH 2/6] android/bluetooth: Store if CSRK is authenticated Szymon Janc
@ 2015-02-27 15:01 ` Szymon Janc
  2015-02-27 15:01 ` [PATCH 4/6] android/gatt: Fix check if CSRK is authenticated Szymon Janc
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Szymon Janc @ 2015-02-27 15:01 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

This allows to get information if CSRK is authenticated or not.
For client it is don't care if CSRK is authenticated or not.
---
 android/bluetooth.c | 35 ++++++++++++++++++++++-------------
 android/bluetooth.h | 12 +++---------
 android/gatt.c      |  8 ++++----
 3 files changed, 29 insertions(+), 26 deletions(-)

diff --git a/android/bluetooth.c b/android/bluetooth.c
index dca6f48..e684d31 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -4098,22 +4098,33 @@ bool bt_read_device_rssi(const bdaddr_t *addr, bt_read_device_rssi_done cb,
 	return true;
 }
 
-bool bt_get_csrk(const bdaddr_t *addr, enum bt_csrk_type type, uint8_t key[16],
-							uint32_t *sign_cnt)
+bool bt_get_csrk(const bdaddr_t *addr, bool local, uint8_t key[16],
+					uint32_t *sign_cnt, bool *authenticated)
 {
 	struct device *dev;
-	bool local = (type == LOCAL_CSRK);
 
 	dev = find_device(addr);
 	if (!dev)
 		return false;
 
 	if (local && dev->valid_local_csrk) {
-		memcpy(key, dev->local_csrk, 16);
-		*sign_cnt = dev->local_sign_cnt;
+		if (key)
+			memcpy(key, dev->local_csrk, 16);
+
+		if (sign_cnt)
+			*sign_cnt = dev->local_sign_cnt;
+
+		if (authenticated)
+			*authenticated = dev->local_csrk_auth;
 	} else if (!local && dev->valid_remote_csrk) {
-		memcpy(key, dev->remote_csrk, 16);
-		*sign_cnt = dev->remote_sign_cnt;
+		if (key)
+			memcpy(key, dev->remote_csrk, 16);
+
+		if (sign_cnt)
+			*sign_cnt = dev->remote_sign_cnt;
+
+		if (authenticated)
+			*authenticated = dev->remote_csrk_auth;
 	} else {
 		return false;
 	}
@@ -4121,12 +4132,11 @@ bool bt_get_csrk(const bdaddr_t *addr, enum bt_csrk_type type, uint8_t key[16],
 	return true;
 }
 
-static void store_sign_counter(struct device *dev, enum bt_csrk_type type)
+static void store_sign_counter(struct device *dev, bool local)
 {
 	const char *sign_cnt_s;
 	uint32_t sign_cnt;
 	GKeyFile *key_file;
-	bool local = (type == LOCAL_CSRK);
 
 	gsize length = 0;
 	char addr[18];
@@ -4152,8 +4162,7 @@ static void store_sign_counter(struct device *dev, enum bt_csrk_type type)
 	g_key_file_free(key_file);
 }
 
-void bt_update_sign_counter(const bdaddr_t *addr, enum bt_csrk_type type,
-								uint32_t val)
+void bt_update_sign_counter(const bdaddr_t *addr, bool local, uint32_t val)
 {
 	struct device *dev;
 
@@ -4161,12 +4170,12 @@ void bt_update_sign_counter(const bdaddr_t *addr, enum bt_csrk_type type,
 	if (!dev)
 		return;
 
-	if (type == LOCAL_CSRK)
+	if (local)
 		dev->local_sign_cnt = val;
 	else
 		dev->remote_sign_cnt = val;
 
-	store_sign_counter(dev, type);
+	store_sign_counter(dev, local);
 }
 
 static uint8_t set_adapter_scan_mode(const void *buf, uint16_t len)
diff --git a/android/bluetooth.h b/android/bluetooth.h
index 9e7ab2c..8b8a1f0 100644
--- a/android/bluetooth.h
+++ b/android/bluetooth.h
@@ -21,11 +21,6 @@
  *
  */
 
-enum bt_csrk_type {
-	LOCAL_CSRK,
-	REMOTE_CSRK,
-};
-
 typedef void (*bt_bluetooth_ready)(int err, const bdaddr_t *addr);
 bool bt_bluetooth_start(int index, bool mgmt_dbg, bt_bluetooth_ready cb);
 
@@ -69,11 +64,10 @@ typedef void (*bt_read_device_rssi_done)(uint8_t status, const bdaddr_t *addr,
 bool bt_read_device_rssi(const bdaddr_t *addr, bt_read_device_rssi_done cb,
 							void *user_data);
 
-bool bt_get_csrk(const bdaddr_t *addr, enum bt_csrk_type type,
-					uint8_t key[16], uint32_t *sign_cnt);
+bool bt_get_csrk(const bdaddr_t *addr, bool local, uint8_t key[16],
+				uint32_t *sign_cnt, bool *authenticated);
 
-void bt_update_sign_counter(const bdaddr_t *addr, enum bt_csrk_type type,
-								uint32_t val);
+void bt_update_sign_counter(const bdaddr_t *addr, bool local, uint32_t val);
 
 void bt_store_gatt_ccc(const bdaddr_t *addr, uint16_t value);
 
diff --git a/android/gatt.c b/android/gatt.c
index 9e348d7..3f98e71 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -3263,7 +3263,7 @@ static guint signed_write_cmd(struct gatt_device *dev, uint16_t handle,
 
 	memset(csrk, 0, 16);
 
-	if (!bt_get_csrk(&dev->bdaddr, LOCAL_CSRK, csrk, &sign_cnt)) {
+	if (!bt_get_csrk(&dev->bdaddr, true, csrk, &sign_cnt, NULL)) {
 		error("gatt: Could not get csrk key");
 		return 0;
 	}
@@ -3275,7 +3275,7 @@ static guint signed_write_cmd(struct gatt_device *dev, uint16_t handle,
 		return 0;
 	}
 
-	bt_update_sign_counter(&dev->bdaddr, LOCAL_CSRK, ++sign_cnt);
+	bt_update_sign_counter(&dev->bdaddr, true, ++sign_cnt);
 
 	return res;
 }
@@ -6396,7 +6396,7 @@ static void write_signed_cmd_request(const uint8_t *cmd, uint16_t cmd_len,
 		return;
 	}
 
-	if (!bt_get_csrk(&dev->bdaddr, REMOTE_CSRK, csrk, &sign_cnt)) {
+	if (!bt_get_csrk(&dev->bdaddr, false, csrk, &sign_cnt, NULL)) {
 		error("gatt: No valid csrk from remote device");
 		return;
 	}
@@ -6438,7 +6438,7 @@ static void write_signed_cmd_request(const uint8_t *cmd, uint16_t cmd_len,
 			return;
 		}
 		/* Signature OK, proceed with write */
-		bt_update_sign_counter(&dev->bdaddr, REMOTE_CSRK, r_sign_cnt);
+		bt_update_sign_counter(&dev->bdaddr, false, r_sign_cnt);
 		gatt_db_attribute_write(attrib, 0, value, vlen, cmd[0],
 						g_attrib_get_att(dev->attrib),
 						write_confirm, NULL);
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 4/6] android/gatt: Fix check if CSRK is authenticated
  2015-02-27 15:01 [PATCH 1/6] android/gatt: Fix client signed write on encrypted link Szymon Janc
  2015-02-27 15:01 ` [PATCH 2/6] android/bluetooth: Store if CSRK is authenticated Szymon Janc
  2015-02-27 15:01 ` [PATCH 3/6] android/bluetooth: Add support for CSRK authetication level Szymon Janc
@ 2015-02-27 15:01 ` Szymon Janc
  2015-02-27 15:01 ` [PATCH 5/6] android/gatt: Fix error message in signed_write_cmd Szymon Janc
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Szymon Janc @ 2015-02-27 15:01 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

---
 android/gatt.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/android/gatt.c b/android/gatt.c
index 3f98e71..2e3a5c9 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -4683,9 +4683,15 @@ static uint8_t check_device_permissions(struct gatt_device *device,
 		if (!(permissions & GATT_PERM_WRITE_SIGNED))
 				return ATT_ECODE_WRITE_NOT_PERM;
 
-		if ((permissions & GATT_PERM_WRITE_SIGNED_MITM) &&
-						sec_level < BT_SECURITY_HIGH)
+		if (permissions & GATT_PERM_WRITE_SIGNED_MITM) {
+			bool auth;
+
+			if (bt_get_csrk(&device->bdaddr, true, NULL, NULL,
+					&auth) && auth)
+				break;
+
 			return ATT_ECODE_AUTHENTICATION;
+		}
 		break;
 	case ATT_OP_READ_BY_TYPE_REQ:
 	case ATT_OP_READ_REQ:
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 5/6] android/gatt: Fix error message in signed_write_cmd
  2015-02-27 15:01 [PATCH 1/6] android/gatt: Fix client signed write on encrypted link Szymon Janc
                   ` (2 preceding siblings ...)
  2015-02-27 15:01 ` [PATCH 4/6] android/gatt: Fix check if CSRK is authenticated Szymon Janc
@ 2015-02-27 15:01 ` Szymon Janc
  2015-02-27 15:01 ` [PATCH 6/6] shared/att: Fix signed write without transparent signing Szymon Janc
  2015-02-27 21:33 ` [PATCH 1/6] android/gatt: Fix client signed write on encrypted link Szymon Janc
  5 siblings, 0 replies; 10+ messages in thread
From: Szymon Janc @ 2015-02-27 15:01 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

---
 android/gatt.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/android/gatt.c b/android/gatt.c
index 2e3a5c9..6e9181e 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -3271,7 +3271,7 @@ static guint signed_write_cmd(struct gatt_device *dev, uint16_t handle,
 	res = gatt_signed_write_cmd(dev->attrib, handle, value, vlen, crypto,
 						csrk, sign_cnt, NULL, NULL);
 	if (!res) {
-		error("gatt: Could write signed cmd");
+		error("gatt: Could not write signed cmd");
 		return 0;
 	}
 
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 6/6] shared/att: Fix signed write without transparent signing
  2015-02-27 15:01 [PATCH 1/6] android/gatt: Fix client signed write on encrypted link Szymon Janc
                   ` (3 preceding siblings ...)
  2015-02-27 15:01 ` [PATCH 5/6] android/gatt: Fix error message in signed_write_cmd Szymon Janc
@ 2015-02-27 15:01 ` Szymon Janc
  2015-02-27 15:21   ` Michael Janssen
  2015-02-27 21:33 ` [PATCH 1/6] android/gatt: Fix client signed write on encrypted link Szymon Janc
  5 siblings, 1 reply; 10+ messages in thread
From: Szymon Janc @ 2015-02-27 15:01 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

If local key wasn't set by bt_att_set_local_key() assume that signing
is done by bt_att_send() caller ie. gattrib code.
---
 src/shared/att.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/shared/att.c b/src/shared/att.c
index 9787377..b20af21 100644
--- a/src/shared/att.c
+++ b/src/shared/att.c
@@ -308,7 +308,7 @@ static bool encode_pdu(struct bt_att *att, struct att_send_op *op,
 
 	sign = att->local_sign;
 	if (!sign)
-		goto fail;
+		true;
 
 	if (!sign->counter(&sign_cnt, sign->user_data))
 		goto fail;
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 6/6] shared/att: Fix signed write without transparent signing
  2015-02-27 15:01 ` [PATCH 6/6] shared/att: Fix signed write without transparent signing Szymon Janc
@ 2015-02-27 15:21   ` Michael Janssen
  2015-02-27 15:27     ` Szymon Janc
  0 siblings, 1 reply; 10+ messages in thread
From: Michael Janssen @ 2015-02-27 15:21 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth@vger.kernel.org

Hi Szymon,

On Fri, Feb 27, 2015 at 7:01 AM, Szymon Janc <szymon.janc@tieto.com> wrote:
> If local key wasn't set by bt_att_set_local_key() assume that signing
> is done by bt_att_send() caller ie. gattrib code.
> ---
>  src/shared/att.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/src/shared/att.c b/src/shared/att.c
> index 9787377..b20af21 100644
> --- a/src/shared/att.c
> +++ b/src/shared/att.c
> @@ -308,7 +308,7 @@ static bool encode_pdu(struct bt_att *att, struct att_send_op *op,
>
>         sign = att->local_sign;
>         if (!sign)
> -               goto fail;
> +               true;

This should be 'return true;' I think?

>
>         if (!sign->counter(&sign_cnt, sign->user_data))
>                 goto fail;
> --
> 1.9.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Michael Janssen

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 6/6] shared/att: Fix signed write without transparent signing
  2015-02-27 15:21   ` Michael Janssen
@ 2015-02-27 15:27     ` Szymon Janc
  2015-02-27 16:02       ` Luiz Augusto von Dentz
  0 siblings, 1 reply; 10+ messages in thread
From: Szymon Janc @ 2015-02-27 15:27 UTC (permalink / raw)
  To: Michael Janssen; +Cc: linux-bluetooth@vger.kernel.org

Hi Michael,

On Friday 27 of February 2015 07:21:51 Michael Janssen wrote:
> Hi Szymon,
> 
> On Fri, Feb 27, 2015 at 7:01 AM, Szymon Janc <szymon.janc@tieto.com> wrote:
> > If local key wasn't set by bt_att_set_local_key() assume that signing
> > is done by bt_att_send() caller ie. gattrib code.
> > ---
> >  src/shared/att.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/src/shared/att.c b/src/shared/att.c
> > index 9787377..b20af21 100644
> > --- a/src/shared/att.c
> > +++ b/src/shared/att.c
> > @@ -308,7 +308,7 @@ static bool encode_pdu(struct bt_att *att, struct att_send_op *op,
> >
> >         sign = att->local_sign;
> >         if (!sign)
> > -               goto fail;
> > +               true;
> 
> This should be 'return true;' I think?

Good catch. I've got this right locally but forgot to amend before generating
patch :)

> 
> >
> >         if (!sign->counter(&sign_cnt, sign->user_data))
> >                 goto fail;
> > --
> > 1.9.3
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
> 
> 

-- 
Best regards, 
Szymon Janc

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 6/6] shared/att: Fix signed write without transparent signing
  2015-02-27 15:27     ` Szymon Janc
@ 2015-02-27 16:02       ` Luiz Augusto von Dentz
  0 siblings, 0 replies; 10+ messages in thread
From: Luiz Augusto von Dentz @ 2015-02-27 16:02 UTC (permalink / raw)
  To: Szymon Janc; +Cc: Michael Janssen, linux-bluetooth@vger.kernel.org

Hi Szymon,

On Fri, Feb 27, 2015 at 5:27 PM, Szymon Janc <szymon.janc@tieto.com> wrote:
> Hi Michael,
>
> On Friday 27 of February 2015 07:21:51 Michael Janssen wrote:
>> Hi Szymon,
>>
>> On Fri, Feb 27, 2015 at 7:01 AM, Szymon Janc <szymon.janc@tieto.com> wrote:
>> > If local key wasn't set by bt_att_set_local_key() assume that signing
>> > is done by bt_att_send() caller ie. gattrib code.
>> > ---
>> >  src/shared/att.c | 2 +-
>> >  1 file changed, 1 insertion(+), 1 deletion(-)
>> >
>> > diff --git a/src/shared/att.c b/src/shared/att.c
>> > index 9787377..b20af21 100644
>> > --- a/src/shared/att.c
>> > +++ b/src/shared/att.c
>> > @@ -308,7 +308,7 @@ static bool encode_pdu(struct bt_att *att, struct att_send_op *op,
>> >
>> >         sign = att->local_sign;
>> >         if (!sign)
>> > -               goto fail;
>> > +               true;
>>
>> This should be 'return true;' I think?
>
> Good catch. I've got this right locally but forgot to amend before generating
> patch :)

Yep, but as discussed in the IRC there are more problems with it
because we increase the data length before this, I guess we are doing
to need some refactoring to fix this properly.


-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/6] android/gatt: Fix client signed write on encrypted link
  2015-02-27 15:01 [PATCH 1/6] android/gatt: Fix client signed write on encrypted link Szymon Janc
                   ` (4 preceding siblings ...)
  2015-02-27 15:01 ` [PATCH 6/6] shared/att: Fix signed write without transparent signing Szymon Janc
@ 2015-02-27 21:33 ` Szymon Janc
  5 siblings, 0 replies; 10+ messages in thread
From: Szymon Janc @ 2015-02-27 21:33 UTC (permalink / raw)
  To: linux-bluetooth

On Friday 27 of February 2015 16:01:09 Szymon Janc wrote:
> As defined in Core Specification 4.2:
> "If a connection is already encrypted with LE security mode 1, level 2
> or level 3 as defined in [Vol 3] Part C, Section 10.2 then, a Write
> Without Response as defined in Section 4.9.1 shall be used instead of
> a Signed Write Without Response."
> ---
>  android/gatt.c | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/android/gatt.c b/android/gatt.c
> index 53b1983..9e348d7 100644
> --- a/android/gatt.c
> +++ b/android/gatt.c
> @@ -3358,14 +3358,14 @@ static void handle_client_write_characteristic(const
> void *buf, uint16_t len) goto failed;
>  		}
> 
> -		if (get_sec_level(conn->device) != BT_SECURITY_LOW) {
> -			error("gatt: Cannot write signed on encrypted link");
> -			status = HAL_STATUS_FAILED;
> -			goto failed;
> -		}
> -
> -		res = signed_write_cmd(conn->device, ch->ch.value_handle,
> -							cmd->value, cmd->len);
> +		if (get_sec_level(conn->device) > BT_SECURITY_LOW)
> +			res = gatt_write_cmd(conn->device->attrib,
> +						ch->ch.value_handle, cmd->value,
> +						cmd->len, NULL, NULL);
> +		else
> +			res = signed_write_cmd(conn->device,
> +						ch->ch.value_handle, cmd->value,
> +						cmd->len);
>  		break;
>  	default:
>  		error("gatt: Write type %d unsupported", cmd->write_type);

Patches 1-5 are applied.

-- 
BR
Szymon Janc

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2015-02-27 21:33 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-27 15:01 [PATCH 1/6] android/gatt: Fix client signed write on encrypted link Szymon Janc
2015-02-27 15:01 ` [PATCH 2/6] android/bluetooth: Store if CSRK is authenticated Szymon Janc
2015-02-27 15:01 ` [PATCH 3/6] android/bluetooth: Add support for CSRK authetication level Szymon Janc
2015-02-27 15:01 ` [PATCH 4/6] android/gatt: Fix check if CSRK is authenticated Szymon Janc
2015-02-27 15:01 ` [PATCH 5/6] android/gatt: Fix error message in signed_write_cmd Szymon Janc
2015-02-27 15:01 ` [PATCH 6/6] shared/att: Fix signed write without transparent signing Szymon Janc
2015-02-27 15:21   ` Michael Janssen
2015-02-27 15:27     ` Szymon Janc
2015-02-27 16:02       ` Luiz Augusto von Dentz
2015-02-27 21:33 ` [PATCH 1/6] android/gatt: Fix client signed write on encrypted link Szymon Janc

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox