return 0;
}
-static int escape_and_truncate_data(const void *data, size_t size, char **ret) {
+static int escape_and_truncate_data(const struct iovec *data, char **ret) {
_cleanup_free_ char *safe = NULL;
- assert(data || size == 0);
+ assert(data);
+ assert(iovec_is_valid(data));
assert(ret);
- if (size > EXTENSION_STRING_SAFE_LIMIT) {
- safe = cescape_length(data, EXTENSION_STRING_SAFE_LIMIT);
+ if (data->iov_len > EXTENSION_STRING_SAFE_LIMIT) {
+ safe = cescape_length(data->iov_base, EXTENSION_STRING_SAFE_LIMIT);
if (!safe)
return -ENOMEM;
if (!strextend(&safe, "..."))
return -ENOMEM;
} else {
- safe = cescape_length(data, size);
+ safe = cescape_length(data->iov_base, data->iov_len);
if (!safe)
return -ENOMEM;
}
static int extend_pcr_now(
uint32_t pcr_mask,
- const void *data,
- size_t size,
+ const struct iovec *data,
Tpm2UserspaceEventType event) {
_cleanup_(tpm2_context_unrefp) Tpm2Context *c = NULL;
return log_oom();
_cleanup_free_ char *safe = NULL;
- if (escape_and_truncate_data(data, size, &safe) < 0)
+ if (escape_and_truncate_data(data, &safe) < 0)
return log_oom();
BIT_FOREACH(pcr, pcr_mask) {
log_debug("Measuring '%s' into PCR index %i, banks %s.", safe, pcr, joined_banks);
- r = tpm2_pcr_extend_bytes(c, arg_banks, pcr, &IOVEC_MAKE(data, size), /* secret= */ NULL, event, safe);
+ r = tpm2_pcr_extend_bytes(c, arg_banks, pcr, data, /* secret= */ NULL, event, safe);
if (r < 0)
return log_error_errno(r, "Could not extend PCR: %m");
static int extend_nvpcr_now(
const char *name,
- const void *data,
- size_t size,
+ const struct iovec *data,
Tpm2UserspaceEventType event) {
_cleanup_(tpm2_context_unrefp) Tpm2Context *c = NULL;
return r;
_cleanup_free_ char *safe = NULL;
- if (escape_and_truncate_data(data, size, &safe) < 0)
+ if (escape_and_truncate_data(data, &safe) < 0)
return log_oom();
log_debug("Measuring '%s' into NvPCR index '%s'.", safe, name);
c,
/* session= */ NULL,
name,
- &IOVEC_MAKE(data, size),
+ data,
/* secret= */ NULL,
event,
safe);
return sd_varlink_error_invalid_parameter_name(link, p.text ? "text" : "data");
if (p.nvpcr) {
- r = extend_nvpcr_now(p.nvpcr, extend_iovec->iov_base, extend_iovec->iov_len, p.event_type);
+ r = extend_nvpcr_now(p.nvpcr, extend_iovec, p.event_type);
if (IN_SET(r, -ENOENT, -ENODEV))
return sd_varlink_error(link, "io.systemd.PCRExtend.NoSuchNvPCR", NULL);
if (r == -ENOBUFS)
return sd_varlink_error(link, "io.systemd.PCRExtend.NvPCRSpaceExhausted", NULL);
} else
- r = extend_pcr_now(INDEX_TO_MASK(uint32_t, p.pcr), extend_iovec->iov_base, extend_iovec->iov_len, p.event_type);
+ r = extend_pcr_now(INDEX_TO_MASK(uint32_t, p.pcr), extend_iovec, p.event_type);
if (r < 0)
return r;
}
if (arg_nvpcr_name)
- r = extend_nvpcr_now(arg_nvpcr_name, word, strlen(word), event);
+ r = extend_nvpcr_now(arg_nvpcr_name, &IOVEC_MAKE(word, strlen(word)), event);
else
- r = extend_pcr_now(arg_pcr_mask, word, strlen(word), event);
+ r = extend_pcr_now(arg_pcr_mask, &IOVEC_MAKE(word, strlen(word)), event);
/* Both extend paths report "TPM cannot be used for this measurement" (no PCR bank, missing crypto,
* no TPM device — see tpm2_context_new_for_measurement()) as -EOPNOTSUPP. Under --graceful we skip
* those rather than fail and block boot. Genuine faults keep their own errno and are never