From e58dea1758e00855e867d60b86a8b8fb991a247e Mon Sep 17 00:00:00 2001 From: Brian Gix Date: Wed, 11 Mar 2020 15:59:40 -0700 Subject: [PATCH] tools/mesh-cfgclient: Add support for Static OOB key This fixes a bug that didn't allow 16 octet Static OOB strings during provisioning. Change-Id: I08c04784d920b4cf4dcff0e172e9095d00be7bc7 Signed-off-by: Anupam Roy --- 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 81b87e0..cfeb64a 100644 --- a/tools/mesh-cfgclient.c +++ b/tools/mesh-cfgclient.c @@ -374,12 +374,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; @@ -388,12 +387,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; @@ -541,12 +546,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 1f83347..0258a38 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(); -- 2.7.4