linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* RE: [PATCH BlueZ] mesh: Create and store random token per node
       [not found] <20190404224314.10694-1-brian.gix@intel.com>
@ 2019-04-10 15:53 ` Gix, Brian
  0 siblings, 0 replies; only message in thread
From: Gix, Brian @ 2019-04-10 15:53 UTC (permalink / raw)
  To: linux-bluetooth



> -----Original Message-----
> From: Gix, Brian
> Sent: Thursday, April 4, 2019 3:43 PM
> To: linux-bluetooth@vger.kernel.org
> Cc: Gix, Brian <brian.gix@intel.com>
> Subject: [PATCH BlueZ] mesh: Create and store random token per node
> 
> Fix issue with device key being used as a token. Token now seperate, and
> with a portable representation in the node database.
> ---
>  mesh/mesh-db.c | 38 ++++++++++++++++++++++++++++++++++++++
>  mesh/mesh-db.h |  2 ++
>  mesh/mesh.c    |  6 +++---
>  mesh/node.c    | 22 ++++++++++++++++++++--
>  mesh/node.h    |  2 ++
>  mesh/storage.c |  5 +++++
>  6 files changed, 70 insertions(+), 5 deletions(-)
> 
> diff --git a/mesh/mesh-db.c b/mesh/mesh-db.c index f1bf8d8fa..64e33cd91
> 100644
> --- a/mesh/mesh-db.c
> +++ b/mesh/mesh-db.c
> @@ -51,6 +51,21 @@ static bool get_int(json_object *jobj, const char
> *keyword, int *value)
>  	return true;
>  }
> 
> +static bool add_u64_value(json_object *jobject, const char *desc,
> +					const uint8_t u64[8])
> +{
> +	json_object *jstring;
> +	char hexstr[17];
> +
> +	hex2str((uint8_t *) u64, 8, hexstr, 17);
> +	jstring = json_object_new_string(hexstr);
> +	if (!jstring)
> +		return false;
> +
> +	json_object_object_add(jobject, desc, jstring);
> +	return true;
> +}
> +
>  static bool add_key_value(json_object *jobject, const char *desc,
>  					const uint8_t key[16])
>  {
> @@ -257,6 +272,24 @@ bool mesh_db_read_iv_index(json_object *jobj,
> uint32_t *idx, bool *update)
>  	return true;
>  }
> 
> +bool mesh_db_read_token(json_object *jobj, uint8_t token[8]) {
> +	json_object *jvalue;
> +	char *str;
> +
> +	if (!token)
> +		return false;
> +
> +	if (!json_object_object_get_ex(jobj, "token", &jvalue))
> +		return false;
> +
> +	str = (char *)json_object_get_string(jvalue);
> +	if (!str2hex(str, strlen(str), token, 8))
> +		return false;
> +
> +	return true;
> +}
> +
>  bool mesh_db_read_device_key(json_object *jobj, uint8_t key_buf[16])  {
>  	json_object *jvalue;
> @@ -515,6 +548,11 @@ bool mesh_db_write_device_key(json_object
> *jnode, uint8_t *key)
>  	return add_key_value(jnode, "deviceKey", key);  }
> 
> +bool mesh_db_write_token(json_object *jnode, uint8_t *token) {
> +	return add_u64_value(jnode, "token", token); }
> +
>  bool mesh_db_app_key_add(json_object *jobj, uint16_t net_idx, uint16_t
> app_idx,
>  							const uint8_t key[16])
>  {
> diff --git a/mesh/mesh-db.h b/mesh/mesh-db.h index b9af1203b..06aba1f31
> 100644
> --- a/mesh/mesh-db.h
> +++ b/mesh/mesh-db.h
> @@ -104,6 +104,7 @@ bool mesh_db_read_node(json_object *jobj,
> mesh_db_node_cb cb, void *user_data);  bool
> mesh_db_add_node(json_object *jnode, struct mesh_db_node *node);
> bool mesh_db_read_iv_index(json_object *jobj, uint32_t *idx, bool
> *update);  bool mesh_db_read_device_key(json_object *jobj, uint8_t
> key_buf[16]);
> +bool mesh_db_read_token(json_object *jobj, uint8_t token[8]);
>  bool mesh_db_read_net_transmit(json_object *jobj, uint8_t *cnt,
>  							uint16_t *interval);
>  bool mesh_db_write_net_transmit(json_object *jobj, uint8_t cnt, @@ -
> 113,6 +114,7 @@ bool mesh_db_read_net_keys(json_object *jobj,
> mesh_db_net_key_cb cb,  bool mesh_db_read_app_keys(json_object
> *jobj, mesh_db_app_key_cb cb,
>  							void *user_data);
>  bool mesh_db_write_device_key(json_object *jobj, uint8_t *key);
> +bool mesh_db_write_token(json_object *jobj, uint8_t *token);
>  bool mesh_db_write_network_key(json_object *jobj, uint16_t idx, uint8_t
> *key,
>  						uint8_t *new_key, int
> phase);
>  bool mesh_db_write_app_key(json_object *jobj, uint16_t net_idx, diff --git
> a/mesh/mesh.c b/mesh/mesh.c index a0a9a7c8e..e7eef0473 100644
> --- a/mesh/mesh.c
> +++ b/mesh/mesh.c
> @@ -487,7 +487,7 @@ static bool prov_complete_cb(void *user_data,
> uint8_t status,
>  	struct l_dbus_message *msg;
>  	const char *owner;
>  	const char *path;
> -	const uint8_t *dev_key;
> +	const uint8_t *token;
> 
>  	l_debug("Provisioning complete %s", prov_status_str(status));
> 
> @@ -506,13 +506,13 @@ static bool prov_complete_cb(void *user_data,
> uint8_t status,
>  		return false;
>  	}
> 
> -	dev_key = node_get_device_key(join_pending->node);
> +	token = node_get_token(join_pending->node);
> 
>  	msg = l_dbus_message_new_method_call(dbus, owner, path,
> 
> 	MESH_APPLICATION_INTERFACE,
>  						"JoinComplete");
> 
> -	l_dbus_message_set_arguments(msg, "t", l_get_u64(dev_key));
> +	l_dbus_message_set_arguments(msg, "t", l_get_be64(token));
> 
>  	l_dbus_send(dbus_get_bus(), msg);
> 
> diff --git a/mesh/node.c b/mesh/node.c
> index 79221b5e2..dae9a4b79 100644
> --- a/mesh/node.c
> +++ b/mesh/node.c
> @@ -91,6 +91,7 @@ struct mesh_node {
>  	} relay;
>  	uint8_t dev_uuid[16];
>  	uint8_t dev_key[16];
> +	uint8_t token[8];
>  	uint8_t num_ele;
>  	uint8_t ttl;
>  	uint8_t lpn;
> @@ -132,7 +133,7 @@ static bool match_token(const void *a, const void *b)
> {
>  	const struct mesh_node *node = a;
>  	const uint64_t *token = b;
> -	const uint64_t tmp = l_get_u64(node->dev_key);
> +	const uint64_t tmp = l_get_be64(node->token);
> 
>  	return *token == tmp;
>  }
> @@ -453,6 +454,19 @@ const uint8_t *node_get_device_key(struct
> mesh_node *node)
>  		return node->dev_key;
>  }
> 
> +void node_set_token(struct mesh_node *node, uint8_t token[8]) {
> +	memcpy(node->token, token, 8);
> +}
> +
> +const uint8_t *node_get_token(struct mesh_node *node) {
> +	if (!node)
> +		return NULL;
> +	else
> +		return node->token;
> +}
> +
>  uint8_t node_get_num_elements(struct mesh_node *node)  {
>  	return node->num_ele;
> @@ -1059,7 +1073,7 @@ static void get_managed_objects_attach_cb(struct
> l_dbus_message *msg,
>  	struct attach_obj_request *req = user_data;
>  	struct mesh_node *node = req->node;
>  	const char *path;
> -	uint64_t token = l_get_u64(node->dev_key);
> +	uint64_t token = l_get_be64(node->token);
>  	uint8_t num_ele;
> 
>  	if (l_dbus_message_is_error(msg)) {
> @@ -1748,6 +1762,10 @@ bool node_add_pending_local(struct mesh_node
> *node, void *prov_node_info,
>  	node->primary = info->unicast;
>  	mesh_net_register_unicast(node->net, info->unicast, node-
> >num_ele);
> 
> +	l_getrandom(node->token, sizeof(node->token));
> +	if (!mesh_db_write_token(node->jconfig, node->token))
> +		return false;
> +
>  	memcpy(node->dev_key, info->device_key, 16);
>  	if (!mesh_db_write_device_key(node->jconfig, info->device_key))
>  		return false;
> diff --git a/mesh/node.h b/mesh/node.h
> index 954dfca75..ebc82ffb8 100644
> --- a/mesh/node.h
> +++ b/mesh/node.h
> @@ -47,6 +47,8 @@ bool node_app_key_delete(struct mesh_net *net,
> uint16_t addr,
>  				uint16_t net_idx, uint16_t idx);
>  uint16_t node_get_primary(struct mesh_node *node);  uint16_t
> node_get_primary_net_idx(struct mesh_node *node);
> +void node_set_token(struct mesh_node *node, uint8_t token[8]); const
> +uint8_t *node_get_token(struct mesh_node *node);
>  void node_set_device_key(struct mesh_node *node, uint8_t key[16]);
> const uint8_t *node_get_device_key(struct mesh_node *node);  void
> node_set_num_elements(struct mesh_node *node, uint8_t num_ele); diff
> --git a/mesh/storage.c b/mesh/storage.c index f04e3ec89..8a70b5696 100644
> --- a/mesh/storage.c
> +++ b/mesh/storage.c
> @@ -156,6 +156,11 @@ static bool parse_node(struct mesh_node *node,
> json_object *jnode)
>  	if (!mesh_db_read_net_keys(jnode, read_net_keys_cb, net))
>  		return false;
> 
> +	if (!mesh_db_read_token(jnode, key_buf))
> +		return false;
> +
> +	node_set_token(node, key_buf);
> +
>  	if (!mesh_db_read_device_key(jnode, key_buf))
>  		return false;
> 
> --
> 2.14.5

Applied

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-04-10 15:53 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20190404224314.10694-1-brian.gix@intel.com>
2019-04-10 15:53 ` [PATCH BlueZ] mesh: Create and store random token per node Gix, Brian

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).