AvbSlotVerifyResult avb_add_root_digest_substitution( const char* part_name, const uint8_t* digest, size_t digest_size, AvbCmdlineSubstList* out_cmdline_subst) { const char* kDigestSubPrefix = "$(AVB_"; const char* kDigestSubSuffix = "_ROOT_DIGEST)"; size_t part_name_len = avb_strlen(part_name); size_t list_index = out_cmdline_subst->size; avb_assert(part_name_len < AVB_PART_NAME_MAX_SIZE); avb_assert(digest_size <= AVB_SHA512_DIGEST_SIZE); if (part_name_len >= AVB_PART_NAME_MAX_SIZE || digest_size > AVB_SHA512_DIGEST_SIZE) { return AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_METADATA; } if (out_cmdline_subst->size >= AVB_MAX_NUM_CMDLINE_SUBST) { /* The list is full. Currently dynamic growth of this list is not supported. */ return AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_METADATA; } /* Construct the token to replace in the command line based on the partition * name. For partition 'foo', this will be '$(AVB_FOO_ROOT_DIGEST)'. */ out_cmdline_subst->tokens[list_index] = avb_strdupv(kDigestSubPrefix, part_name, kDigestSubSuffix, NULL); if (out_cmdline_subst->tokens[list_index] == NULL) { goto fail; } avb_uppercase(out_cmdline_subst->tokens[list_index]); /* The digest value is hex encoded when inserted in the command line. */ out_cmdline_subst->values[list_index] = avb_bin2hex(digest, digest_size); if (out_cmdline_subst->values[list_index] == NULL) { goto fail; } out_cmdline_subst->size++; return AVB_SLOT_VERIFY_RESULT_OK; fail: if (out_cmdline_subst->tokens[list_index]) { avb_free(out_cmdline_subst->tokens[list_index]); } if (out_cmdline_subst->values[list_index]) { avb_free(out_cmdline_subst->values[list_index]); } return AVB_SLOT_VERIFY_RESULT_ERROR_OOM; }
char *append_cmd_line(char *cmdline_orig, char *cmdline_new) { char *cmd_line; if (!cmdline_new) return cmdline_orig; if (cmdline_orig) cmd_line = cmdline_orig; else cmd_line = " "; cmd_line = avb_strdupv(cmd_line, " ", cmdline_new, NULL); return cmd_line; }