From: Samuel Mendoza-Jonas Date: Tue, 19 Jun 2018 06:35:22 +0000 (+1000) Subject: lib/pb-protocol: Add PB_PROTOCOL_ACTION_AUTHENTICATE X-Git-Tag: v1.10.0~11 X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=commitdiff_plain;h=de6f6c4bff7d42f63e2bbd01d2bab65ae9635877;ds=sidebyside lib/pb-protocol: Add PB_PROTOCOL_ACTION_AUTHENTICATE Add a new "authenticate" action. Depending on the 'op' field this is either a) an authentication request, b) a response indicating the result, or c) a request to change the password. Signed-off-by: Samuel Mendoza-Jonas --- diff --git a/lib/pb-protocol/pb-protocol.c b/lib/pb-protocol/pb-protocol.c index 7c563c8..5de382d 100644 --- a/lib/pb-protocol/pb-protocol.c +++ b/lib/pb-protocol/pb-protocol.c @@ -379,6 +379,25 @@ int pb_protocol_temp_autoboot_len(const struct autoboot_option *opt) return len; } +int pb_protocol_authenticate_len(struct auth_message *msg) +{ + switch (msg->op) { + case AUTH_MSG_REQUEST: + /* enum + password + length */ + return 4 + 4 + optional_strlen(msg->password); + case AUTH_MSG_RESPONSE: + /* enum + bool */ + return 4 + 4; + case AUTH_MSG_SET: + /* enum + password + password */ + return 4 + 4 + optional_strlen(msg->set_password.password) + + 4 + optional_strlen(msg->set_password.new_password); + default: + pb_log("%s: invalid input\n", __func__); + return 0; + } +} + int pb_protocol_serialise_device(const struct device *dev, char *buf, int buf_len) { @@ -703,6 +722,39 @@ int pb_protocol_serialise_temp_autoboot(const struct autoboot_option *opt, return 0; } +int pb_protocol_serialise_authenticate(struct auth_message *msg, + char *buf, int buf_len) +{ + char *pos = buf; + + *(enum auth_msg_type *)pos = msg->op; + pos += sizeof(enum auth_msg_type); + + switch(msg->op) { + case AUTH_MSG_REQUEST: + pos += pb_protocol_serialise_string(pos, msg->password); + break; + case AUTH_MSG_RESPONSE: + *(bool *)pos = msg->authenticated; + pos += sizeof(bool); + break; + case AUTH_MSG_SET: + pos += pb_protocol_serialise_string(pos, + msg->set_password.password); + pos += pb_protocol_serialise_string(pos, + msg->set_password.new_password); + break; + default: + pb_log("%s: invalid msg\n", __func__); + return -1; + }; + + assert(pos <= buf + buf_len); + (void)buf_len; + + return 0; +} + int pb_protocol_write_message(int fd, struct pb_protocol_message *message) { int total_len, rc; @@ -1346,3 +1398,39 @@ int pb_protocol_deserialise_temp_autoboot(struct autoboot_option *opt, out: return rc; } + +int pb_protocol_deserialise_authenticate(struct auth_message *msg, + const struct pb_protocol_message *message) +{ + unsigned int len; + const char *pos; + + len = message->payload_len; + pos = message->payload; + + msg->op = *(enum auth_msg_type *)pos; + pos += sizeof(enum auth_msg_type); + + switch (msg->op) { + case AUTH_MSG_REQUEST: + if (read_string(msg, &pos, &len, &msg->password)) + return -1; + break; + case AUTH_MSG_RESPONSE: + msg->authenticated = *(bool *)pos; + pos += sizeof(bool); + break; + case AUTH_MSG_SET: + if (read_string(msg, &pos, &len, &msg->set_password.password)) + return -1; + if (read_string(msg, &pos, &len, + &msg->set_password.new_password)) + return -1; + break; + default: + pb_log("%s: unable to parse\n", __func__); + return -1; + } + + return 0; +} diff --git a/lib/pb-protocol/pb-protocol.h b/lib/pb-protocol/pb-protocol.h index 14fd8a2..1d6c048 100644 --- a/lib/pb-protocol/pb-protocol.h +++ b/lib/pb-protocol/pb-protocol.h @@ -27,6 +27,7 @@ enum pb_protocol_action { PB_PROTOCOL_ACTION_PLUGINS_REMOVE = 0xd, PB_PROTOCOL_ACTION_PLUGIN_INSTALL = 0xe, PB_PROTOCOL_ACTION_TEMP_AUTOBOOT = 0xf, + PB_PROTOCOL_ACTION_AUTHENTICATE = 0x10, }; struct pb_protocol_message { @@ -35,6 +36,24 @@ struct pb_protocol_message { char payload[]; }; +enum auth_msg_type { + AUTH_MSG_REQUEST, + AUTH_MSG_RESPONSE, + AUTH_MSG_SET, +}; + +struct auth_message { + enum auth_msg_type op; + union { + bool authenticated; + char *password; + struct { + char *password; + char *new_password; + } set_password; + }; +}; + void pb_protocol_dump_device(const struct device *dev, const char *text, FILE *stream); int pb_protocol_device_len(const struct device *dev); @@ -46,6 +65,7 @@ int pb_protocol_config_len(const struct config *config); int pb_protocol_url_len(const char *url); int pb_protocol_plugin_option_len(const struct plugin_option *opt); int pb_protocol_temp_autoboot_len(const struct autoboot_option *opt); +int pb_protocol_authenticate_len(struct auth_message *msg); int pb_protocol_device_cmp(const struct device *a, const struct device *b); int pb_protocol_boot_option_cmp(const struct boot_option *a, @@ -72,6 +92,8 @@ int pb_protocol_serialise_plugin_option(const struct plugin_option *opt, char *buf, int buf_len); int pb_protocol_serialise_temp_autoboot(const struct autoboot_option *opt, char *buf, int buf_len); +int pb_protocol_serialise_authenticate(struct auth_message *msg, + char *buf, int buf_len); int pb_protocol_write_message(int fd, struct pb_protocol_message *message); @@ -100,6 +122,10 @@ int pb_protocol_deserialise_config(struct config *config, int pb_protocol_deserialise_plugin_option(struct plugin_option *opt, const struct pb_protocol_message *message); + int pb_protocol_deserialise_temp_autoboot(struct autoboot_option *opt, const struct pb_protocol_message *message); + +int pb_protocol_deserialise_authenticate(struct auth_message *msg, + const struct pb_protocol_message *message); #endif /* _PB_PROTOCOL_H */