}
typedef struct PcrState {
+ char *bank;
const EVP_MD *md;
void *value;
size_t value_size;
if (!*pcr_state)
return;
- for (size_t i = 0; (*pcr_state)[i].value; i++)
+ for (size_t i = 0; (*pcr_state)[i].value; i++) {
+ free((*pcr_state)[i].bank);
free((*pcr_state)[i].value);
+ }
*pcr_state = mfree(*pcr_state);
}
return log_oom();
if (EVP_DigestInit_ex(mc, pcr_state->md, NULL) != 1)
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to initialize %s context.", EVP_MD_name(pcr_state->md));
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to initialize %s context.", pcr_state->bank);
/* First thing we do, is hash the old PCR value */
if (EVP_DigestUpdate(mc, pcr_state->value, pcr_state->value_size) != 1)
return log_oom();
if (EVP_DigestInit_ex(mdctx[i], pcr_states[i].md, NULL) != 1)
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to initialize data %s context.", EVP_MD_name(pcr_states[i].md));
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to initialize data %s context.", pcr_states[i].bank);
}
for (;;) {
/* Measure name of section */
if (EVP_Digest(unified_sections[c], strlen(unified_sections[c]) + 1, data_hash, &data_hash_size, pcr_states[i].md, NULL) != 1)
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to hash section name with %s.", EVP_MD_name(pcr_states[i].md));
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to hash section name with %s.", pcr_states[i].bank);
assert(data_hash_size == (unsigned) pcr_states[i].value_size);
STRV_FOREACH(d, arg_banks) {
const EVP_MD *implementation;
_cleanup_free_ void *v = NULL;
+ _cleanup_free_ char *b = NULL;
int sz;
assert_se(implementation = EVP_get_digestbyname(*d)); /* Must work, we already checked while parsing command line */
+ b = strdup(EVP_MD_name(implementation));
+ if (!b)
+ return log_oom();
+
sz = EVP_MD_size(implementation);
if (sz <= 0 || sz >= INT_MAX)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unexpected digest size: %i", sz);
return log_oom();
pcr_states[n++] = (struct PcrState) {
+ .bank = ascii_strlower(TAKE_PTR(b)),
.md = implementation,
.value = TAKE_PTR(v),
.value_size = sz,
return r;
for (size_t i = 0; i < n; i++) {
- _cleanup_free_ char *b = NULL;
-
- b = strdup(EVP_MD_name(pcr_states[i].md));
- if (!b)
- return log_oom();
-
- ascii_strlower(b);
-
if (arg_json_format_flags & JSON_FORMAT_OFF) {
_cleanup_free_ char *hd = NULL;
if (!hd)
return log_oom();
- printf("%" PRIu32 ":%s=%s\n", TPM_PCR_INDEX_KERNEL_IMAGE, b, hd);
+ printf("%" PRIu32 ":%s=%s\n", TPM_PCR_INDEX_KERNEL_IMAGE, pcr_states[i].bank, hd);
} else {
_cleanup_(json_variant_unrefp) JsonVariant *bv = NULL;
if (r < 0)
return log_error_errno(r, "Failed to build JSON object: %m");
- r = json_variant_set_field(&w, b, bv);
+ r = json_variant_set_field(&w, pcr_states[i].bank, bv);
if (r < 0)
return log_error_errno(r, "Failed to add bank info to object: %m");