Message ID | 20200311225940.6628-1-brian.gix@intel.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Brian Gix |
Headers | show |
Series | [BlueZ,v2] tools/mesh-cfgclient: Add support for Static OOB key | expand |
Applied On Wed, 2020-03-11 at 15:59 -0700, Brian Gix wrote: > This fixes a bug that didn't allow 16 octet Static OOB strings during > provisioning. > --- > tools/mesh-cfgclient.c | 29 +++++++++++++++++++---------- > tools/mesh/agent.c | 10 ++++++---- > 2 files changed, 25 insertions(+), 14 deletions(-) > > diff --git a/tools/mesh-cfgclient.c b/tools/mesh-cfgclient.c > index b4d76de93..4b7bd2200 100644 > --- a/tools/mesh-cfgclient.c > +++ b/tools/mesh-cfgclient.c > @@ -372,12 +372,11 @@ static void agent_input_done(oob_type_t type, void *buf, uint16_t len, > struct l_dbus_message *reply = NULL; > struct l_dbus_message_builder *builder; > uint32_t val_u32; > - uint8_t ascii[16]; > + uint8_t oob_data[16]; > > switch (type) { > case NONE: > case OUTPUT: > - case HEXADECIMAL: > default: > break; > > @@ -386,12 +385,18 @@ static void agent_input_done(oob_type_t type, void *buf, uint16_t len, > bt_shell_printf("Bad input length\n"); > break; > } > + /* Fall Through */ > > - memset(ascii, 0, 16); > - memcpy(ascii, buf, len); > + case HEXADECIMAL: > + if (len > 16) { > + bt_shell_printf("Bad input length\n"); > + break; > + } > + memset(oob_data, 0, 16); > + memcpy(oob_data, buf, len); > reply = l_dbus_message_new_method_return(msg); > builder = l_dbus_message_builder_new(reply); > - append_byte_array(builder, ascii, 16); > + append_byte_array(builder, oob_data, 16); > l_dbus_message_builder_finalize(builder); > l_dbus_message_builder_destroy(builder); > break; > @@ -539,12 +544,16 @@ static struct l_dbus_message *prompt_static_call(struct l_dbus *dbus, > return l_dbus_message_new_error(msg, dbus_err_fail, NULL); > } > > - if (!strcmp(str, "in-alpha") && !strcmp(str, "out-alpha")) > - return l_dbus_message_new_error(msg, dbus_err_support, NULL); > - > - l_dbus_message_ref(msg); > - agent_input_request(ASCII, 8, "Enter displayed Ascii code", > + if (!strcmp(str, "in-alpha") || !strcmp(str, "out-alpha")) { > + l_dbus_message_ref(msg); > + agent_input_request(ASCII, 8, "Enter displayed Ascii code", > agent_input_done, msg); > + } else if (!strcmp(str, "static-oob")) { > + l_dbus_message_ref(msg); > + agent_input_request(HEXADECIMAL, 16, "Enter Static Key", > + agent_input_done, msg); > + } else > + return l_dbus_message_new_error(msg, dbus_err_support, NULL); > > return NULL; > } > diff --git a/tools/mesh/agent.c b/tools/mesh/agent.c > index 1f83347bf..0258a3803 100644 > --- a/tools/mesh/agent.c > +++ b/tools/mesh/agent.c > @@ -81,15 +81,16 @@ static bool str2hex(const char *str, uint16_t in_len, uint8_t *out, > static void response_hexadecimal(const char *input, void *user_data) > { > uint8_t buf[MAX_HEXADECIMAL_OOB_LEN]; > + uint16_t len = pending_request.len; > > if (!str2hex(input, strlen(input), buf, pending_request.len) ) { > bt_shell_printf("Incorrect input: expecting %d hex octets\n", > pending_request.len); > - return; > + len = 0; > } > > if (pending_request.cb) > - pending_request.cb(HEXADECIMAL, buf, pending_request.len, > + pending_request.cb(HEXADECIMAL, buf, len, > pending_request.user_data); > > reset_input_request(); > @@ -98,14 +99,15 @@ static void response_hexadecimal(const char *input, void *user_data) > static void response_decimal(const char *input, void *user_data) > { > uint8_t buf[DECIMAL_OOB_LEN]; > + uint16_t len = DECIMAL_OOB_LEN; > > if (strlen(input) > pending_request.len) > - return; > + len = 0; > > bt_put_be32(atoi(input), buf); > > if (pending_request.cb) > - pending_request.cb(DECIMAL, buf, DECIMAL_OOB_LEN, > + pending_request.cb(DECIMAL, buf, len, > pending_request.user_data); > > reset_input_request();
diff --git a/tools/mesh-cfgclient.c b/tools/mesh-cfgclient.c index b4d76de93..4b7bd2200 100644 --- a/tools/mesh-cfgclient.c +++ b/tools/mesh-cfgclient.c @@ -372,12 +372,11 @@ static void agent_input_done(oob_type_t type, void *buf, uint16_t len, struct l_dbus_message *reply = NULL; struct l_dbus_message_builder *builder; uint32_t val_u32; - uint8_t ascii[16]; + uint8_t oob_data[16]; switch (type) { case NONE: case OUTPUT: - case HEXADECIMAL: default: break; @@ -386,12 +385,18 @@ static void agent_input_done(oob_type_t type, void *buf, uint16_t len, bt_shell_printf("Bad input length\n"); break; } + /* Fall Through */ - memset(ascii, 0, 16); - memcpy(ascii, buf, len); + case HEXADECIMAL: + if (len > 16) { + bt_shell_printf("Bad input length\n"); + break; + } + memset(oob_data, 0, 16); + memcpy(oob_data, buf, len); reply = l_dbus_message_new_method_return(msg); builder = l_dbus_message_builder_new(reply); - append_byte_array(builder, ascii, 16); + append_byte_array(builder, oob_data, 16); l_dbus_message_builder_finalize(builder); l_dbus_message_builder_destroy(builder); break; @@ -539,12 +544,16 @@ static struct l_dbus_message *prompt_static_call(struct l_dbus *dbus, return l_dbus_message_new_error(msg, dbus_err_fail, NULL); } - if (!strcmp(str, "in-alpha") && !strcmp(str, "out-alpha")) - return l_dbus_message_new_error(msg, dbus_err_support, NULL); - - l_dbus_message_ref(msg); - agent_input_request(ASCII, 8, "Enter displayed Ascii code", + if (!strcmp(str, "in-alpha") || !strcmp(str, "out-alpha")) { + l_dbus_message_ref(msg); + agent_input_request(ASCII, 8, "Enter displayed Ascii code", agent_input_done, msg); + } else if (!strcmp(str, "static-oob")) { + l_dbus_message_ref(msg); + agent_input_request(HEXADECIMAL, 16, "Enter Static Key", + agent_input_done, msg); + } else + return l_dbus_message_new_error(msg, dbus_err_support, NULL); return NULL; } diff --git a/tools/mesh/agent.c b/tools/mesh/agent.c index 1f83347bf..0258a3803 100644 --- a/tools/mesh/agent.c +++ b/tools/mesh/agent.c @@ -81,15 +81,16 @@ static bool str2hex(const char *str, uint16_t in_len, uint8_t *out, static void response_hexadecimal(const char *input, void *user_data) { uint8_t buf[MAX_HEXADECIMAL_OOB_LEN]; + uint16_t len = pending_request.len; if (!str2hex(input, strlen(input), buf, pending_request.len) ) { bt_shell_printf("Incorrect input: expecting %d hex octets\n", pending_request.len); - return; + len = 0; } if (pending_request.cb) - pending_request.cb(HEXADECIMAL, buf, pending_request.len, + pending_request.cb(HEXADECIMAL, buf, len, pending_request.user_data); reset_input_request(); @@ -98,14 +99,15 @@ static void response_hexadecimal(const char *input, void *user_data) static void response_decimal(const char *input, void *user_data) { uint8_t buf[DECIMAL_OOB_LEN]; + uint16_t len = DECIMAL_OOB_LEN; if (strlen(input) > pending_request.len) - return; + len = 0; bt_put_be32(atoi(input), buf); if (pending_request.cb) - pending_request.cb(DECIMAL, buf, DECIMAL_OOB_LEN, + pending_request.cb(DECIMAL, buf, len, pending_request.user_data); reset_input_request();