2006-05-18 23:28:44

by Seiji Munetoh

[permalink] [raw]
Subject: [PATCH 2/2] tpm: bios log parsing fixes

This patch fixes the BINARY output format to actual ACPI TCPA log
structure for any userland tool easily parse the binary data with
reference to TCG PC specification.

Signed-off-by: Seiji Munetoh <[email protected]>
--- linux-2.6.17-rc4/drivers/char/tpm/tpm_bios.c 2006-05-16
09:33:06.000000000 +0900
+++ linux-2.6.17-rc4-tpm/drivers/char/tpm/tpm_bios.c 2006-05-19
08:12:30.000000000 +0900
@@ -275,53 +285,13 @@ static int get_event_name(char *dest, st

static int tpm_binary_bios_measurements_show(struct seq_file *m, void
*v)
{
-
- char *eventname;
- char data[4];
- u32 help;
- int i, len;
struct tcpa_event *event = (struct tcpa_event *) v;
- unsigned char *event_entry =
- (unsigned char *) (v + sizeof(struct tcpa_event));
-
- eventname = kmalloc(MAX_TEXT_EVENT, GFP_KERNEL);
- if (!eventname) {
- printk(KERN_ERR "%s: ERROR - No Memory for event name\n ",
- __func__);
- return -ENOMEM;
- }
-
- /* 1st: PCR used is in little-endian format (4 bytes) */
- help = le32_to_cpu(event->pcr_index);
- memcpy(data, &help, 4);
- for (i = 0; i < 4; i++)
- seq_putc(m, data[i]);
-
- /* 2nd: SHA1 (20 bytes) */
- for (i = 0; i < 20; i++)
- seq_putc(m, event->pcr_value[i]);
+ char *data = (char *) v;
+ int i;

- /* 3rd: event type identifier (4 bytes) */
- help = le32_to_cpu(event->event_type);
- memcpy(data, &help, 4);
- for (i = 0; i < 4; i++)
+ for (i = 0;i < sizeof(struct tcpa_event) + event->event_size; i++)
seq_putc(m, data[i]);

- len = 0;
-
- len += get_event_name(eventname, event, event_entry);
-
- /* 4th: filename <= 255 + \'0' delimiter */
- if (len > TCG_EVENT_NAME_LEN_MAX)
- len = TCG_EVENT_NAME_LEN_MAX;
-
- for (i = 0; i < len; i++)
- seq_putc(m, eventname[i]);
-
- /* 5th: delimiter */
- seq_putc(m, '\0');
-
- kfree(eventname);
return 0;
}




2006-05-18 23:59:16

by Alexey Dobriyan

[permalink] [raw]
Subject: Re: [PATCH 2/2] tpm: bios log parsing fixes

On Fri, May 19, 2006 at 08:29:07AM +0900, Seiji Munetoh wrote:
> This patch fixes the BINARY output format to actual ACPI TCPA log
> structure for any userland tool easily parse the binary data with
> reference to TCG PC specification.

Do you realize that you break backward compatibility? What was wrong
with old format?

> --- linux-2.6.17-rc4/drivers/char/tpm/tpm_bios.c
> +++ linux-2.6.17-rc4-tpm/drivers/char/tpm/tpm_bios.c
> @@ -275,53 +285,13 @@ static int get_event_name(char *dest, st
>
> static int tpm_binary_bios_measurements_show(struct seq_file *m, void
> *v)
> {
> -
> - char *eventname;
> - char data[4];
> - u32 help;
> - int i, len;
> struct tcpa_event *event = (struct tcpa_event *) v;
> - unsigned char *event_entry =
> - (unsigned char *) (v + sizeof(struct tcpa_event));
> -
> - eventname = kmalloc(MAX_TEXT_EVENT, GFP_KERNEL);
> - if (!eventname) {
> - printk(KERN_ERR "%s: ERROR - No Memory for event name\n ",
> - __func__);
> - return -ENOMEM;
> - }
> -
> - /* 1st: PCR used is in little-endian format (4 bytes) */
> - help = le32_to_cpu(event->pcr_index);
> - memcpy(data, &help, 4);
> - for (i = 0; i < 4; i++)
> - seq_putc(m, data[i]);
> -
> - /* 2nd: SHA1 (20 bytes) */
> - for (i = 0; i < 20; i++)
> - seq_putc(m, event->pcr_value[i]);
> + char *data = (char *) v;
> + int i;
>
> - /* 3rd: event type identifier (4 bytes) */
> - help = le32_to_cpu(event->event_type);
> - memcpy(data, &help, 4);
> - for (i = 0; i < 4; i++)
> + for (i = 0;i < sizeof(struct tcpa_event) + event->event_size; i++)
> seq_putc(m, data[i]);
>
> - len = 0;
> -
> - len += get_event_name(eventname, event, event_entry);
> -
> - /* 4th: filename <= 255 + \'0' delimiter */
> - if (len > TCG_EVENT_NAME_LEN_MAX)
> - len = TCG_EVENT_NAME_LEN_MAX;
> -
> - for (i = 0; i < len; i++)
> - seq_putc(m, eventname[i]);
> -
> - /* 5th: delimiter */
> - seq_putc(m, '\0');
> -
> - kfree(eventname);
> return 0;
> }

2006-05-19 01:20:30

by Kylene Jo Hall

[permalink] [raw]
Subject: Re: [PATCH 2/2] tpm: bios log parsing fixes

Ack'ed by: Kylene Hall <[email protected]>

On Fri, 2006-05-19 at 08:29 +0900, Seiji Munetoh wrote:
> This patch fixes the BINARY output format to actual ACPI TCPA log
> structure for any userland tool easily parse the binary data with
> reference to TCG PC specification.
>
> Signed-off-by: Seiji Munetoh <[email protected]>
> --- linux-2.6.17-rc4/drivers/char/tpm/tpm_bios.c 2006-05-16
> 09:33:06.000000000 +0900
> +++ linux-2.6.17-rc4-tpm/drivers/char/tpm/tpm_bios.c 2006-05-19
> 08:12:30.000000000 +0900
> @@ -275,53 +285,13 @@ static int get_event_name(char *dest, st
>
> static int tpm_binary_bios_measurements_show(struct seq_file *m, void
> *v)
> {
> -
> - char *eventname;
> - char data[4];
> - u32 help;
> - int i, len;
> struct tcpa_event *event = (struct tcpa_event *) v;
> - unsigned char *event_entry =
> - (unsigned char *) (v + sizeof(struct tcpa_event));
> -
> - eventname = kmalloc(MAX_TEXT_EVENT, GFP_KERNEL);
> - if (!eventname) {
> - printk(KERN_ERR "%s: ERROR - No Memory for event name\n ",
> - __func__);
> - return -ENOMEM;
> - }
> -
> - /* 1st: PCR used is in little-endian format (4 bytes) */
> - help = le32_to_cpu(event->pcr_index);
> - memcpy(data, &help, 4);
> - for (i = 0; i < 4; i++)
> - seq_putc(m, data[i]);
> -
> - /* 2nd: SHA1 (20 bytes) */
> - for (i = 0; i < 20; i++)
> - seq_putc(m, event->pcr_value[i]);
> + char *data = (char *) v;
> + int i;
>
> - /* 3rd: event type identifier (4 bytes) */
> - help = le32_to_cpu(event->event_type);
> - memcpy(data, &help, 4);
> - for (i = 0; i < 4; i++)
> + for (i = 0;i < sizeof(struct tcpa_event) + event->event_size; i++)
> seq_putc(m, data[i]);
>
> - len = 0;
> -
> - len += get_event_name(eventname, event, event_entry);
> -
> - /* 4th: filename <= 255 + \'0' delimiter */
> - if (len > TCG_EVENT_NAME_LEN_MAX)
> - len = TCG_EVENT_NAME_LEN_MAX;
> -
> - for (i = 0; i < len; i++)
> - seq_putc(m, eventname[i]);
> -
> - /* 5th: delimiter */
> - seq_putc(m, '\0');
> -
> - kfree(eventname);
> return 0;
> }
>
>
>

2006-05-22 00:26:56

by Seiji Munetoh

[permalink] [raw]
Subject: Re: [PATCH 2/2] tpm: bios log parsing fixes

2006/5/19, Alexey Dobriyan <[email protected]>:
> On Fri, May 19, 2006 at 08:29:07AM +0900, Seiji Munetoh wrote:
> > This patch fixes the BINARY output format to actual ACPI TCPA log
> > structure for any userland tool easily parse the binary data with
> > reference to TCG PC specification.
> Do you realize that you break backward compatibility? What was wrong
> with old format?

Yes I do, The problem is the binary output use get_event_name() to convert the
eventdata to ascii format. and the get_event_name() does not support all
eventdata types.Thus userspace application could not get the eventdata which
required to verify the PCRs in TPM.

I think actual ACPI log data is good for the binary output rather than current
unique binary format. It seems we are doing unnecessary transformation.

>
> > --- linux-2.6.17-rc4/drivers/char/tpm/tpm_bios.c
> > +++ linux-2.6.17-rc4-tpm/drivers/char/tpm/tpm_bios.c
> > @@ -275,53 +285,13 @@ static int get_event_name(char *dest, st
> >
> > static int tpm_binary_bios_measurements_show(struct seq_file *m, void
> > *v)
> > {
> > -
> > - char *eventname;
> > - char data[4];
> > - u32 help;
> > - int i, len;
> > struct tcpa_event *event = (struct tcpa_event *) v;
> > - unsigned char *event_entry =
> > - (unsigned char *) (v + sizeof(struct tcpa_event));
> > -
> > - eventname = kmalloc(MAX_TEXT_EVENT, GFP_KERNEL);
> > - if (!eventname) {
> > - printk(KERN_ERR "%s: ERROR - No Memory for event name\n ",
> > - __func__);
> > - return -ENOMEM;
> > - }
> > -
> > - /* 1st: PCR used is in little-endian format (4 bytes) */
> > - help = le32_to_cpu(event->pcr_index);
> > - memcpy(data, &help, 4);
> > - for (i = 0; i < 4; i++)
> > - seq_putc(m, data[i]);
> > -

> > - /* 2nd: SHA1 (20 bytes) */
> > - for (i = 0; i < 20; i++)
> > - seq_putc(m, event->pcr_value[i]);
> > + char *data = (char *) v;
> > + int i;
> >
> > - /* 3rd: event type identifier (4 bytes) */
> > - help = le32_to_cpu(event->event_type);
> > - memcpy(data, &help, 4);
> > - for (i = 0; i < 4; i++)
> > + for (i = 0;i < sizeof(struct tcpa_event) + event->event_size; i++)
> > seq_putc(m, data[i]);
> >
> > - len = 0;
> > -
> > - len += get_event_name(eventname, event, event_entry);
> > -
> > - /* 4th: filename <= 255 + \'0' delimiter */
> > - if (len > TCG_EVENT_NAME_LEN_MAX)
> > - len = TCG_EVENT_NAME_LEN_MAX;
> > -
> > - for (i = 0; i < len; i++)
> > - seq_putc(m, eventname[i]);
> > -
> > - /* 5th: delimiter */
> > - seq_putc(m, '\0');
> > -
> > - kfree(eventname);
> > return 0;
> > }
>
>