X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=lib%2Fpb-protocol%2Fpb-protocol.c;h=d8771fcb9493296be9b879c1f841d4aa681a6273;hp=7c563c8e0ad17de54e8dd1ad86ae786949a11422;hb=87017f0478536fcb927010618be483a5efe9260c;hpb=2bc0df4aa35a89c5af7e54f459e2bbde20ca6a7e diff --git a/lib/pb-protocol/pb-protocol.c b/lib/pb-protocol/pb-protocol.c index 7c563c8..d8771fc 100644 --- a/lib/pb-protocol/pb-protocol.c +++ b/lib/pb-protocol/pb-protocol.c @@ -204,6 +204,7 @@ int pb_protocol_boot_option_len(const struct boot_option *opt) 4 + optional_strlen(opt->boot_args) + 4 + optional_strlen(opt->args_sig_file) + sizeof(opt->is_default) + + sizeof(opt->is_autoboot_default) + sizeof(opt->type); } @@ -379,6 +380,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) { @@ -415,6 +435,8 @@ int pb_protocol_serialise_boot_option(const struct boot_option *opt, *(bool *)pos = opt->is_default; pos += sizeof(bool); + *(bool *)pos = opt->is_autoboot_default; + pos += sizeof(bool); *(uint32_t *)pos = __cpu_to_be32(opt->type); pos += 4; @@ -703,6 +725,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; @@ -873,6 +928,9 @@ int pb_protocol_deserialise_boot_option(struct boot_option *opt, opt->is_default = *(bool *)(pos); pos += sizeof(bool); len -= sizeof(bool); + opt->is_autoboot_default = *(bool *)(pos); + pos += sizeof(bool); + len -= sizeof(bool); if (read_u32(&pos, &len, &opt->type)) return -1; @@ -1346,3 +1404,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; +}