fwupd/plugins/tpm/fu-tpm-device.c
Richard Hughes e29c74180c Move the TPM handling into the TPM place
The fact that it currently lives in uefi-capsule is a historical
accident, and it doesn't really belong to tpm-eventlog either.

Fixes some of https://github.com/fwupd/fwupd/issues/3901
2021-11-01 14:51:27 +00:00

124 lines
3.2 KiB
C

/*
* Copyright (C) 2019 Richard Hughes <richard@hughsie.com>
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#include "config.h"
#include "fu-tpm-device.h"
typedef struct {
guint idx;
gchar *checksum;
} FuTpmDevicePcrItem;
typedef struct {
gchar *family;
GPtrArray *items; /* of FuTpmDevicePcrItem */
} FuTpmDevicePrivate;
G_DEFINE_TYPE_WITH_PRIVATE(FuTpmDevice, fu_tpm_device, FU_TYPE_UDEV_DEVICE)
#define GET_PRIVATE(o) (fu_tpm_device_get_instance_private(o))
void
fu_tpm_device_set_family(FuTpmDevice *self, const gchar *family)
{
FuTpmDevicePrivate *priv = GET_PRIVATE(self);
g_return_if_fail(FU_IS_TPM_DEVICE(self));
priv->family = g_strdup(family);
}
const gchar *
fu_tpm_device_get_family(FuTpmDevice *self)
{
FuTpmDevicePrivate *priv = GET_PRIVATE(self);
g_return_val_if_fail(FU_IS_TPM_DEVICE(self), NULL);
return priv->family;
}
void
fu_tpm_device_add_checksum(FuTpmDevice *self, guint idx, const gchar *checksum)
{
FuTpmDevicePrivate *priv = GET_PRIVATE(self);
FuTpmDevicePcrItem *item = g_new0(FuTpmDevicePcrItem, 1);
g_return_if_fail(FU_IS_TPM_DEVICE(self));
g_return_if_fail(checksum != NULL);
item->idx = idx;
item->checksum = g_strdup(checksum);
g_debug("added PCR-%02u=%s", item->idx, item->checksum);
g_ptr_array_add(priv->items, item);
}
GPtrArray *
fu_tpm_device_get_checksums(FuTpmDevice *self, guint idx)
{
FuTpmDevicePrivate *priv = GET_PRIVATE(self);
g_autoptr(GPtrArray) array = g_ptr_array_new_with_free_func(g_free);
g_return_val_if_fail(FU_IS_TPM_DEVICE(self), NULL);
for (guint i = 0; i < priv->items->len; i++) {
FuTpmDevicePcrItem *item = g_ptr_array_index(priv->items, i);
if (item->idx == idx)
g_ptr_array_add(array, g_strdup(item->checksum));
}
return g_steal_pointer(&array);
}
static void
fu_tpm_device_to_string(FuDevice *device, guint idt, GString *str)
{
FuTpmDevice *self = FU_TPM_DEVICE(device);
FuTpmDevicePrivate *priv = GET_PRIVATE(self);
if (priv->family != NULL)
fu_common_string_append_kv(str, idt, "Family", priv->family);
}
static void
fu_tpm_v2_device_item_free(FuTpmDevicePcrItem *item)
{
g_free(item->checksum);
g_free(item);
}
static void
fu_tpm_device_finalize(GObject *object)
{
FuTpmDevice *self = FU_TPM_DEVICE(object);
FuTpmDevicePrivate *priv = GET_PRIVATE(self);
g_free(priv->family);
g_ptr_array_unref(priv->items);
G_OBJECT_CLASS(fu_tpm_device_parent_class)->finalize(object);
}
static void
fu_tpm_device_init(FuTpmDevice *self)
{
FuTpmDevicePrivate *priv = GET_PRIVATE(self);
priv->items = g_ptr_array_new_with_free_func((GDestroyNotify)fu_tpm_v2_device_item_free);
fu_device_set_name(FU_DEVICE(self), "TPM");
fu_device_set_version_format(FU_DEVICE(self), FWUPD_VERSION_FORMAT_QUAD);
fu_device_add_flag(FU_DEVICE(self), FWUPD_DEVICE_FLAG_INTERNAL);
fu_device_add_icon(FU_DEVICE(self), "computer");
fu_udev_device_set_flags(FU_UDEV_DEVICE(self), FU_UDEV_DEVICE_FLAG_NONE);
fu_device_add_instance_id_full(FU_DEVICE(self),
"system-tpm",
FU_DEVICE_INSTANCE_FLAG_NO_QUIRKS);
}
static void
fu_tpm_device_class_init(FuTpmDeviceClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS(klass);
FuDeviceClass *klass_device = FU_DEVICE_CLASS(klass);
object_class->finalize = fu_tpm_device_finalize;
klass_device->to_string = fu_tpm_device_to_string;
}