# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 533b0709a68fbbe5ddc9eff7dfb840b55ff092f5
# Parent e236794915cc152a949691ca5613cac63375c314
[VTPM_TOOLS] Moved the developement tpm_emulator down to ring 3, which
should make debugging easier as well as fix the emulator for x86_64
Signed-off-by: Vincent Scarlata <vincent.r.scarlata@xxxxxxxxx>
---
tools/vtpm/Rules.mk | 1
tools/vtpm/tpm_emulator.patch | 1097 ++++++++++++++++++++++++++++--
tools/vtpm_manager/Rules.mk | 3
tools/vtpm_manager/manager/vtpm_manager.c | 8
tools/vtpm_manager/tcs/transmit.c | 42 -
5 files changed, 1067 insertions(+), 84 deletions(-)
diff -r e236794915cc -r 533b0709a68f tools/vtpm/Rules.mk
--- a/tools/vtpm/Rules.mk Tue Jun 27 11:05:39 2006 +0100
+++ b/tools/vtpm/Rules.mk Tue Jun 27 11:13:24 2006 +0100
@@ -33,7 +33,6 @@ OBJS = $(patsubst %.c,%.o,$(SRCS))
-include $(DEP_FILES)
-# Emulator does not work on 64-bit systems, and may be broken on 32 right now
BUILD_EMULATOR = n
# Make sure these are just rules
diff -r e236794915cc -r 533b0709a68f tools/vtpm/tpm_emulator.patch
--- a/tools/vtpm/tpm_emulator.patch Tue Jun 27 11:05:39 2006 +0100
+++ b/tools/vtpm/tpm_emulator.patch Tue Jun 27 11:13:24 2006 +0100
@@ -1,68 +1,453 @@ diff -uprN orig/tpm_emulator-0.2-x86_64/
-diff -uprN orig/tpm_emulator-0.2-x86_64/AUTHORS tpm_emulator/AUTHORS
---- orig/tpm_emulator-0.2-x86_64/AUTHORS 2005-08-15 00:58:57.000000000
-0700
-+++ tpm_emulator/AUTHORS 2005-09-14 20:27:22.000000000 -0700
-@@ -1 +1,2 @@
+diff -uprN orig/tpm_emulator-0.3-x86_64/AUTHORS tpm_emulator/AUTHORS
+--- orig/tpm_emulator-0.3-x86_64/AUTHORS 2006-01-10 04:21:45.000000000
-0800
++++ tpm_emulator/AUTHORS 2006-06-02 13:36:03.000000000 -0700
+@@ -1,2 +1,3 @@
Mario Strasser <mast@xxxxxxx>
-+INTEL Corp <>
-diff -uprN orig/tpm_emulator-0.2-x86_64/ChangeLog tpm_emulator/ChangeLog
---- orig/tpm_emulator-0.2-x86_64/ChangeLog 2005-08-15 00:58:57.000000000
-0700
-+++ tpm_emulator/ChangeLog 2005-09-14 20:27:22.000000000 -0700
-@@ -1,3 +1,7 @@
-+2005-08-16: INTEL Corp
-+ * Set default permissions to PCRs
-+ * Changed device to /dev/tpm0
-+
- 2005-08-15 Mario Strasser <mast@xxxxxxx>
- * all: some typos corrected
- * tpm_integrity.c: bug in TPM_Extend fixed
-diff -uprN orig/tpm_emulator-0.2-x86_64/linux_module.h
tpm_emulator/linux_module.h
---- orig/tpm_emulator-0.2-x86_64/linux_module.h 2005-09-15
19:21:14.844078720 -0700
-+++ tpm_emulator/linux_module.h 2005-09-14 20:27:22.000000000 -0700
+ Heiko Stamer <stamer@xxxxxxxx> [DAA]
++INTEL Corp <> [Dropped to Ring3]
+diff -uprN orig/tpm_emulator-0.3-x86_64/ChangeLog tpm_emulator/ChangeLog
+--- orig/tpm_emulator-0.3-x86_64/ChangeLog 2006-01-10 04:21:45.000000000
-0800
++++ tpm_emulator/ChangeLog 2006-06-02 13:36:03.000000000 -0700
+@@ -1,3 +1,6 @@
++2005-08-16 Intel Corp
++ * Moved module out of kernel to run as a ring 3 app
++
+ 2005-12-24 Mario Strasser <mast@xxxxxxx>
+ * tpm_transport.c, tpm_marshalling.c, tpm_structures.h:
+ Transport session functionality added
+diff -uprN orig/tpm_emulator-0.3-x86_64/crypto/gmp_kernel_wrapper.c
tpm_emulator/crypto/gmp_kernel_wrapper.c
+--- orig/tpm_emulator-0.3-x86_64/crypto/gmp_kernel_wrapper.c 2006-06-05
09:54:21.000000000 -0700
++++ tpm_emulator/crypto/gmp_kernel_wrapper.c 2006-06-02 13:36:03.000000000
-0700
@@ -1,5 +1,6 @@
/* Software-Based Trusted Platform Module (TPM) Emulator for Linux
* Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
-+ * Copyright (C) 2005 INTEL Corp.
++ * Copyright (C) 2005 INTEL Corp
*
* This module is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
-@@ -35,7 +36,7 @@
- #include "tpm_version.h"
-
- #define TPM_DEVICE_MINOR 224
--#define TPM_DEVICE_NAME "tpm"
-+#define TPM_DEVICE_NAME "tpm0"
+@@ -24,15 +25,10 @@ int __gmp_junk;
+ void __attribute__ ((regparm(0))) __gmp_assert_fail(const char *filename,
+ int linenum, const char *expr)
+ {
+- panic(KERN_CRIT TPM_MODULE_NAME "%s:%d: GNU MP assertion failed: %s\n",
++ error("%s:%d: GNU MP assertion failed: %s\n",
+ filename, linenum, expr);
+ }
+
+-void __attribute__ ((regparm(0))) abort(void)
+-{
+- panic(KERN_CRIT TPM_MODULE_NAME "GNU MP abort() was called\n");
+-}
+-
+ /* overwrite GNU MP random functions (used by mpz/millerrabin.c) */
+
+ void __attribute__ ((regparm(0))) gmp_randinit(gmp_randstate_t rstate,
+@@ -77,20 +73,19 @@ void __attribute__ ((regparm(0))) mpz_ur
+
+ void __attribute__ ((regparm(0))) *kernel_allocate(size_t size)
+ {
+- void *ret = (void*)kmalloc(size, GFP_KERNEL);
+- if (!ret) panic(KERN_CRIT TPM_MODULE_NAME
+- "GMP: cannot allocate memory (size=%Zu)\n", size);
++ void *ret = (void*)malloc(size);
++ if (!ret) error("GMP: cannot allocate memory (size=%Zu)\n", size);
+ return ret;
+ }
+
+ void __attribute__ ((regparm(0))) *kernel_reallocate(void *oldptr,
+ size_t old_size, size_t new_size)
+ {
+- void *ret = (void*)kmalloc(new_size, GFP_KERNEL);
+- if (!ret) panic(KERN_CRIT TPM_MODULE_NAME "GMP: Cannot reallocate memory "
++ void *ret = (void*)malloc(new_size);
++ if (!ret) error("GMP: Cannot reallocate memory "
+ "(old_size=%Zu new_size=%Zu)\n", old_size, new_size);
+ memcpy(ret, oldptr, old_size);
+- kfree(oldptr);
++ free(oldptr);
+ return ret;
+ }
+
+@@ -99,7 +94,7 @@ void __attribute__ ((regparm(0))) kernel
+ /* overwrite used memory */
+ if (blk_ptr != NULL) {
+ memset(blk_ptr, 0, blk_size);
+- kfree(blk_ptr);
++ free(blk_ptr);
+ }
+ }
+
+diff -uprN orig/tpm_emulator-0.3-x86_64/crypto/rsa.c tpm_emulator/crypto/rsa.c
+--- orig/tpm_emulator-0.3-x86_64/crypto/rsa.c 2006-01-10 04:21:45.000000000
-0800
++++ tpm_emulator/crypto/rsa.c 2006-06-02 13:36:03.000000000 -0700
+@@ -1,5 +1,6 @@
+ /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
+ * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
++ * Copyright (C) 2005 INTEL Corp
+ *
+ * This module is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+@@ -381,7 +382,7 @@ static int encode_message(int type, uint
+ msg[0] = 0x00;
+ get_random_bytes(&msg[1], SHA1_DIGEST_LENGTH);
+ sha1_init(&ctx);
+- sha1_update(&ctx, "TCPA", 4);
++ sha1_update(&ctx, (uint8_t *) "TCPA", 4);
+ sha1_final(&ctx, &msg[1 + SHA1_DIGEST_LENGTH]);
+ memset(&msg[1 + 2 * SHA1_DIGEST_LENGTH], 0x00,
+ msg_len - data_len - 2 * SHA1_DIGEST_LENGTH - 2);
+@@ -429,7 +430,7 @@ static int decode_message(int type, uint
+ mask_generation(&msg[1], SHA1_DIGEST_LENGTH,
+ &msg[1 + SHA1_DIGEST_LENGTH], msg_len - SHA1_DIGEST_LENGTH - 1);
+ sha1_init(&ctx);
+- sha1_update(&ctx, "TCPA", 4);
++ sha1_update(&ctx, (uint8_t *) "TCPA", 4);
+ sha1_final(&ctx, &msg[1]);
+ if (memcmp(&msg[1], &msg[1 + SHA1_DIGEST_LENGTH],
+ SHA1_DIGEST_LENGTH) != 0) return -1;
+diff -uprN orig/tpm_emulator-0.3-x86_64/linux_module.c
tpm_emulator/linux_module.c
+--- orig/tpm_emulator-0.3-x86_64/linux_module.c 2006-06-05
09:54:21.000000000 -0700
++++ tpm_emulator/linux_module.c 1969-12-31 16:00:00.000000000 -0800
+@@ -1,194 +0,0 @@
+-/* Software-Based Trusted Platform Module (TPM) Emulator for Linux
+- * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
+- *
+- * This module is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published
+- * by the Free Software Foundation; either version 2 of the License,
+- * or (at your option) any later version.
+- *
+- * This module is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * $Id: linux_module.c 76 2006-01-02 22:17:58Z hstamer $
+- */
+-
+-#include <linux/module.h>
+-#include <linux/kernel.h>
+-#include <linux/init.h>
+-#include <linux/miscdevice.h>
+-#include <linux/poll.h>
+-#include "linux_module.h"
+-#include "tpm/tpm_emulator.h"
+-
+-MODULE_LICENSE("GPL");
+-MODULE_AUTHOR("Mario Strasser <mast@xxxxxxx>");
+-MODULE_DESCRIPTION("Trusted Platform Module (TPM) Emulator");
+-MODULE_SUPPORTED_DEVICE(TPM_DEVICE_NAME);
+-
+-/* module startup parameters */
+-char *startup = "save";
+-module_param(startup, charp, 0444);
+-MODULE_PARM_DESC(startup, " Sets the startup mode of the TPM. "
+- "Possible values are 'clear', 'save' (default) and 'deactivated.");
+-char *storage_file = "/var/tpm/tpm_emulator-1.2.0.2";
+-module_param(storage_file, charp, 0644);
+-MODULE_PARM_DESC(storage_file, " Sets the persistent-data storage "
+- "file of the TPM.");
+-
+-/* TPM lock */
+-static struct semaphore tpm_mutex;
+-
+-/* TPM command response */
+-static struct {
+- uint8_t *data;
+- uint32_t size;
+-} tpm_response;
+-
+-/* module state */
+-#define STATE_IS_OPEN 0
+-static uint32_t module_state;
+-
+-static int tpm_open(struct inode *inode, struct file *file)
+-{
+- debug("%s()", __FUNCTION__);
+- if (test_and_set_bit(STATE_IS_OPEN, (void*)&module_state)) return -EBUSY;
+- return 0;
+-}
+-
+-static int tpm_release(struct inode *inode, struct file *file)
+-{
+- debug("%s()", __FUNCTION__);
+- clear_bit(STATE_IS_OPEN, (void*)&module_state);
+- down(&tpm_mutex);
+- if (tpm_response.data != NULL) {
+- kfree(tpm_response.data);
+- tpm_response.data = NULL;
+- }
+- up(&tpm_mutex);
+- return 0;
+-}
+-
+-static ssize_t tpm_read(struct file *file, char *buf, size_t count, loff_t
*ppos)
+-{
+- debug("%s(%Zu)", __FUNCTION__, count);
+- down(&tpm_mutex);
+- if (tpm_response.data != NULL) {
+- count = min(count, (size_t)tpm_response.size - (size_t)*ppos);
+- count -= copy_to_user(buf, &tpm_response.data[*ppos], count);
+- *ppos += count;
+- if ((size_t)tpm_response.size == (size_t)*ppos) {
+- kfree(tpm_response.data);
+- tpm_response.data = NULL;
+- }
+- } else {
+- count = 0;
+- }
+- up(&tpm_mutex);
+- return count;
+-}
+-
+-static ssize_t tpm_write(struct file *file, const char *buf, size_t count,
loff_t *ppos)
+-{
+- debug("%s(%Zu)", __FUNCTION__, count);
+- down(&tpm_mutex);
+- *ppos = 0;
+- if (tpm_response.data != NULL) kfree(tpm_response.data);
+- if (tpm_handle_command(buf, count, &tpm_response.data,
+- &tpm_response.size) != 0) {
+- count = -EILSEQ;
+- tpm_response.data = NULL;
+- }
+- up(&tpm_mutex);
+- return count;
+-}
+-
+-#define TPMIOC_CANCEL _IO('T', 0x00)
+-#define TPMIOC_TRANSMIT _IO('T', 0x01)
+-
+-static int tpm_ioctl(struct inode *inode, struct file *file, unsigned int
cmd, unsigned long arg)
+-{
+- debug("%s(%d, %p)", __FUNCTION__, cmd, (char*)arg);
+- if (cmd == TPMIOC_TRANSMIT) {
+- uint32_t count = ntohl(*(uint32_t*)(arg + 2));
+- down(&tpm_mutex);
+- if (tpm_response.data != NULL) kfree(tpm_response.data);
+- if (tpm_handle_command((char*)arg, count, &tpm_response.data,
+- &tpm_response.size) == 0) {
+- tpm_response.size -= copy_to_user((char*)arg, tpm_response.data,
+- tpm_response.size);
+- kfree(tpm_response.data);
+- tpm_response.data = NULL;
+- } else {
+- tpm_response.size = 0;
+- tpm_response.data = NULL;
+- }
+- up(&tpm_mutex);
+- return tpm_response.size;
+- }
+- return -1;
+-}
+-
+-struct file_operations fops = {
+- .owner = THIS_MODULE,
+- .open = tpm_open,
+- .release = tpm_release,
+- .read = tpm_read,
+- .write = tpm_write,
+- .ioctl = tpm_ioctl,
+-};
+-
+-static struct miscdevice tpm_dev = {
+- .minor = TPM_DEVICE_MINOR,
+- .name = TPM_DEVICE_NAME,
+- .fops = &fops,
+-};
+-
+-int __init init_tpm_module(void)
+-{
+- int res = misc_register(&tpm_dev);
+- if (res != 0) {
+- error("misc_register() failed for minor %d\n", TPM_DEVICE_MINOR);
+- return res;
+- }
+- /* initialize variables */
+- sema_init(&tpm_mutex, 1);
+- module_state = 0;
+- tpm_response.data = NULL;
+- /* initialize TPM emulator */
+- if (!strcmp(startup, "clear")) {
+- tpm_emulator_init(1);
+- } else if (!strcmp(startup, "save")) {
+- tpm_emulator_init(2);
+- } else if (!strcmp(startup, "deactivated")) {
+- tpm_emulator_init(3);
+- } else {
+- error("invalid startup mode '%s'; must be 'clear', "
+- "'save' (default) or 'deactivated", startup);
+- misc_deregister(&tpm_dev);
+- return -EINVAL;
+- }
+- return 0;
+-}
+-
+-void __exit cleanup_tpm_module(void)
+-{
+- tpm_emulator_shutdown();
+- misc_deregister(&tpm_dev);
+- if (tpm_response.data != NULL) kfree(tpm_response.data);
+-}
+-
+-module_init(init_tpm_module);
+-module_exit(cleanup_tpm_module);
+-
+-uint64_t tpm_get_ticks(void)
+-{
+- static struct timespec old_time = {0, 0};
+- struct timespec new_time = current_kernel_time();
+- uint64_t ticks = (uint64_t)(old_time.tv_sec - new_time.tv_sec) * 1000000
+- + (old_time.tv_nsec - new_time.tv_nsec) / 1000;
+- old_time = new_time;
+- return (ticks > 0) ? ticks : 1;
+-}
+-
+diff -uprN orig/tpm_emulator-0.3-x86_64/linux_module.h
tpm_emulator/linux_module.h
+--- orig/tpm_emulator-0.3-x86_64/linux_module.h 2006-06-05
09:54:21.000000000 -0700
++++ tpm_emulator/linux_module.h 2006-06-02 13:36:03.000000000 -0700
+@@ -1,5 +1,6 @@
+ /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
+ * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
++ * Copyright (C) 2005 INTEL Corp
+ *
+ * This module is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+@@ -17,17 +18,22 @@
+ #ifndef _LINUX_MODULE_H_
+ #define _LINUX_MODULE_H_
+
+-#include <linux/version.h>
+-#include <linux/kernel.h>
+-#include <linux/slab.h>
++#include <malloc.h>
++#include <stdint.h>
++#include <stdio.h>
++#include <string.h>
+ #include <linux/types.h>
+-#include <linux/string.h>
+-#include <linux/random.h>
+-#include <linux/time.h>
+-#include <asm/byteorder.h>
+
+-/* module settings */
++#include <endian.h>
++#define __BYTEORDER_HAS_U64__
++#ifdef LITTLE_ENDIAN
++ #include <linux/byteorder/little_endian.h>
++#else
++ #include <linux/byteorder/big_endian.h>
++#endif
+
++/* module settings */
++#define min(A,B) ((A)<(B)?(A):(B))
+ #ifndef STR
+ #define STR(s) __STR__(s)
+ #define __STR__(s) #s
+@@ -38,35 +44,36 @@
+ #define TPM_DEVICE_NAME "tpm"
#define TPM_MODULE_NAME "tpm_emulator"
- /* debug and log output functions */
-diff -uprN orig/tpm_emulator-0.2-x86_64/Makefile tpm_emulator/Makefile
---- orig/tpm_emulator-0.2-x86_64/Makefile 2005-09-15 19:21:14.845078568
-0700
-+++ tpm_emulator/Makefile 2005-09-14 20:27:22.000000000 -0700
-@@ -1,16 +1,22 @@
+-/* debug and log output functions */
+-
+ #ifdef DEBUG
+-#define debug(fmt, ...) printk(KERN_DEBUG "%s %s:%d: Debug: " fmt "\n", \
+- TPM_MODULE_NAME, __FILE__, __LINE__, ## __VA_ARGS__)
++#define debug(fmt, ...) printf("TPMD: %s:%d: Debug: " fmt "\n", \
++ __FILE__, __LINE__, ## __VA_ARGS__)
+ #else
+ #define debug(fmt, ...)
+ #endif
+-#define info(fmt, ...) printk(KERN_INFO "%s %s:%d: Info: " fmt "\n", \
+- TPM_MODULE_NAME, __FILE__, __LINE__, ## __VA_ARGS__)
+-#define error(fmt, ...) printk(KERN_ERR "%s %s:%d: Error: " fmt "\n", \
+- TPM_MODULE_NAME, __FILE__, __LINE__, ## __VA_ARGS__)
+-#define alert(fmt, ...) printk(KERN_ALERT "%s %s:%d: Alert: " fmt "\n", \
+- TPM_MODULE_NAME, __FILE__, __LINE__, ## __VA_ARGS__)
++#define info(fmt, ...) printf("TPMD: %s:%d: Info: " fmt "\n", \
++ __FILE__, __LINE__, ## __VA_ARGS__)
++#define error(fmt, ...) printf("TPMD: %s:%d: Error: " fmt "\n", \
++ __FILE__, __LINE__, ## __VA_ARGS__)
++#define alert(fmt, ...) printf("TPMD: %s:%d: Alert: " fmt "\n", \
++ __FILE__, __LINE__, ## __VA_ARGS__)
+
+ /* memory allocation */
+
+ static inline void *tpm_malloc(size_t size)
+ {
+- return kmalloc(size, GFP_KERNEL);
++ return malloc(size);
+ }
+
+ static inline void tpm_free(const void *ptr)
+ {
+- if (ptr != NULL) kfree(ptr);
++ if (ptr != NULL) free( (void *) ptr);
+ }
+
+ /* random numbers */
+
++//FIXME;
++void get_random_bytes(void *buf, int nbytes);
++
+ static inline void tpm_get_random_bytes(void *buf, int nbytes)
+ {
+ get_random_bytes(buf, nbytes);
+@@ -86,9 +93,9 @@ uint64_t tpm_get_ticks(void);
+ #define CPU_TO_LE16(x) __cpu_to_le16(x)
+
+ #define BE64_TO_CPU(x) __be64_to_cpu(x)
+-#define LE64_TO_CPU(x) __be64_to_cpu(x)
++#define LE64_TO_CPU(x) __le64_to_cpu(x)
+ #define BE32_TO_CPU(x) __be32_to_cpu(x)
+-#define LE32_TO_CPU(x) __be32_to_cpu(x)
++#define LE32_TO_CPU(x) __le32_to_cpu(x)
+ #define BE16_TO_CPU(x) __be16_to_cpu(x)
+ #define LE16_TO_CPU(x) __le16_to_cpu(x)
+
+diff -uprN orig/tpm_emulator-0.3-x86_64/Makefile tpm_emulator/Makefile
+--- orig/tpm_emulator-0.3-x86_64/Makefile 2006-06-05 09:54:21.000000000
-0700
++++ tpm_emulator/Makefile 2006-06-02 13:36:03.000000000 -0700
+@@ -1,22 +1,31 @@
# Software-Based Trusted Platform Module (TPM) Emulator for Linux
# Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>
-+# Copyright (C) 2005 INTEL Corp.
++# Copyright (C) 2006 INTEL Corp.
#
- # $Id: Makefile 10 2005-04-26 20:59:50Z mast $
-
-+XEN_ROOT := ../../..
-+EUID := $(shell id -u)
-+
- # kernel settings
- KERNEL_RELEASE := $(shell uname -r)
+ # $Id: Makefile 69 2005-12-13 12:55:52Z mast $
+
+-# kernel settings
+-KERNEL_RELEASE := $(shell uname -r)
-KERNEL_BUILD := /lib/modules/$(KERNEL_RELEASE)/build
-+CUR_DIR := $(shell pwd)
-+LINUX_VERSION := $(shell cat
$(CUR_DIR)/$(XEN_ROOT)/buildconfigs/mk.linux-2.6-xen | grep "LINUX_VER" | grep
"2.6" | gawk '{ print $$3 }' )
-+KERNEL_BUILD := $(XEN_ROOT)/linux-$(LINUX_VERSION)-xen
- MOD_SUBDIR := misc
+-MOD_SUBDIR := misc
COMPILE_ARCH ?= $(shell uname -m | sed -e s/i.86/x86_32/)
# module settings
-MODULE_NAME := tpm_emulator
+BIN := tpm_emulator
VERSION_MAJOR := 0
- VERSION_MINOR := 2
+ VERSION_MINOR := 3
VERSION_BUILD := $(shell date +"%s")
-@@ -34,11 +38,9 @@ DIRS := . crypto tpm
+
+-# enable/disable DEBUG messages
+-EXTRA_CFLAGS += -Wall -DDEBUG -g
++# Installation program and options
++INSTALL = install
++INSTALL_PROG = $(INSTALL) -m0755
++INSTALL_DIR = $(INSTALL) -d -m0755
++
++# Xen tools installation directory
++TOOLS_INSTALL_DIR = $(DESTDIR)/usr/bin
++
++CC := gcc
++CFLAGS += -g -Wall $(INCLUDE) -DDEBUG
++CFLAGS += -I. -Itpm
++
++# Is the simulator running in it's own vm?
++#CFLAGS += -DVTPM_MULTI_VM
+
+ ifeq ($(COMPILE_ARCH),x86_64)
+ LIBDIR = lib64
+@@ -34,38 +43,31 @@ DIRS := . crypto tpm
SRCS := $(foreach dir, $(DIRS), $(wildcard $(src)/$(dir)/*.c))
OBJS := $(patsubst %.c, %.o, $(SRCS))
SRCS += $(foreach dir, $(DIRS), $(wildcard $(src)/$(dir)/*.h))
@@ -71,13 +456,23 @@ diff -uprN orig/tpm_emulator-0.2-x86_64/
-obj-m := $(MODULE_NAME).o
-$(MODULE_NAME)-objs := $(patsubst $(src)/%.o, %.o, $(OBJS)) crypto/libgmp.a
-+obj-m := $(BIN).o
++obj-m := $(BIN)
+$(BIN)-objs := $(patsubst $(src)/%.o, %.o, $(OBJS)) crypto/libgmp.a
EXTRA_CFLAGS += -I$(src) -I$(src)/crypto -I$(src)/tpm
-@@ -49,23 +51,17 @@ all: $(src)/crypto/gmp.h $(src)/crypto/l
- @$(MAKE) -C $(KERNEL_BUILD) M=$(CURDIR) modules
+ # do not print "Entering directory ..."
+ MAKEFLAGS += --no-print-directory
+
+-all: $(src)/crypto/gmp.h $(src)/crypto/libgmp.a version
+- @$(MAKE) -C $(KERNEL_BUILD) M=$(CURDIR) modules
++all: $(BIN)
++
++$(BIN): $(src)/crypto/gmp.h $(src)/crypto/libgmp.a version $(SRCS)
$(OBJS)
++ $(CC) $(CFLAGS) $(OBJS) $(src)/crypto/libgmp.a -o $(BIN)
++
++%.o: %.c
++ $(CC) $(CFLAGS) -c $< -o $@
install:
- @$(MAKE) -C $(KERNEL_BUILD) M=$(CURDIR) modules_install
@@ -85,15 +480,12 @@ diff -uprN orig/tpm_emulator-0.2-x86_64/
- test -c /dev/tpm || mknod /dev/tpm c 10 224
- chmod 666 /dev/tpm
- depmod -a
-+ @$(MAKE) -C $(KERNEL_BUILD) M=$(CURDIR) INSTALL_MOD_PATH=$(DESTDIR)
modules_install
-+ test -d $(DESTDIR)/var/tpm || mkdir $(DESTDIR)/var/tpm
-+ test -d $(DESTDIR)/dev || mkdir $(DESTDIR)/dev
-+ test -c $(DESTDIR)/dev/tpm0 || [ $(EUID) -ne 0 ] || mknod
$(DESTDIR)/dev/tpm0 c 10 224
-+ [ $(EUID) -ne 0 ] || chmod 666 $(DESTDIR)/dev/tpm0
++ $(INSTALL_PROG) $(BIN) $(TOOLS_INSTALL_DIR)
clean:
- @$(MAKE) -C $(KERNEL_BUILD) M=$(CURDIR) clean
- rm -f $(src)/crypto/gmp.h $(src)/crypto/libgmp.a
+- @$(MAKE) -C $(KERNEL_BUILD) M=$(CURDIR) clean
+- rm -f $(src)/crypto/gmp.h $(src)/crypto/libgmp.a
++ rm -f $(src)/crypto/gmp.h $(src)/crypto/libgmp.a $(OBJS)
-dist: $(DISTSRC)
- rm -rf $(DISTDIR)
@@ -103,25 +495,31 @@ diff -uprN orig/tpm_emulator-0.2-x86_64/
- tar -chzf $(DISTDIR).tar.gz $(DISTDIR)
- rm -rf $(DISTDIR)
+mrproper: clean
++ rm -f $(BIN) tpm_version.h
$(src)/crypto/libgmp.a:
test -f $(src)/crypto/libgmp.a || ln -s $(GMP_LIB)
$(src)/crypto/libgmp.a
-diff -uprN orig/tpm_emulator-0.2-x86_64/README tpm_emulator/README
---- orig/tpm_emulator-0.2-x86_64/README 2005-08-15 00:58:57.000000000
-0700
-+++ tpm_emulator/README 2005-09-14 20:27:22.000000000 -0700
-@@ -13,7 +13,8 @@ $Id: README 8 2005-01-25 21:11:45Z jmoli
+diff -uprN orig/tpm_emulator-0.3-x86_64/README tpm_emulator/README
+--- orig/tpm_emulator-0.3-x86_64/README 2006-06-05 09:54:21.000000000
-0700
++++ tpm_emulator/README 2006-06-02 13:36:03.000000000 -0700
+@@ -13,7 +13,8 @@ $Id: README 78 2006-01-07 10:45:39Z mast
Copyright
--------------------------------------------------------------------------
Copyright (C) 2004 Mario Strasser <mast@xxxxxxx> and Swiss Federal
-Institute of Technology (ETH) Zurich.
+ Institute of Technology (ETH) Zurich.
-+Copyright (C) 2005
++Copyright (C) 2005 INTEL Corp
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-diff -uprN orig/tpm_emulator-0.2-x86_64/tpm/tpm_data.c
tpm_emulator/tpm/tpm_data.c
---- orig/tpm_emulator-0.2-x86_64/tpm/tpm_data.c 2005-09-15
19:21:14.847078264 -0700
-+++ tpm_emulator/tpm/tpm_data.c 2005-09-14 20:27:22.000000000 -0700
+diff -uprN orig/tpm_emulator-0.3-x86_64/README.1st tpm_emulator/README.1st
+--- orig/tpm_emulator-0.3-x86_64/README.1st 1969-12-31 16:00:00.000000000
-0800
++++ tpm_emulator/README.1st 2006-06-02 13:37:48.000000000 -0700
+@@ -0,0 +1 @@
++Note that you must manually create /tmp/tpm_in.fifo and /tmp/tpm_out.fifo for
this emulator to work.
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm/tpm_audit.c
tpm_emulator/tpm/tpm_audit.c
+--- orig/tpm_emulator-0.3-x86_64/tpm/tpm_audit.c 2006-01-10
04:21:45.000000000 -0800
++++ tpm_emulator/tpm/tpm_audit.c 2006-06-02 13:36:03.000000000 -0700
@@ -1,6 +1,7 @@
/* Software-Based Trusted Platform Module (TPM) Emulator for Linux
* Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
@@ -130,15 +528,925 @@ diff -uprN orig/tpm_emulator-0.2-x86_64/
*
* This module is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
-@@ -85,6 +86,11 @@ void tpm_init_data(void)
- tpmData.permanent.data.version.revMinor = VERSION_MINOR;
- /* setup PCR attributes */
- for (i = 0; i < TPM_NUM_PCR; i++) {
-+ int j;
-+ for (j=0; j < TPM_NUM_LOCALITY; j++) {
-+ tpmData.permanent.data.pcrAttrib[i].pcrExtendLocal[j] = TRUE;
+@@ -45,14 +46,14 @@ void tpm_audit_request(TPM_COMMAND_CODE
+ tpmData.permanent.data.auditMonotonicCounter++;
+ }
+ /* update audit digest */
+- *((UINT16*)&buf[0]) = cpu_to_be16(TPM_TAG_AUDIT_EVENT_IN);
+- *((UINT32*)&buf[2]) = cpu_to_be32(ordinal);
++ *((UINT16*)&buf[0]) = CPU_TO_BE16(TPM_TAG_AUDIT_EVENT_IN);
++ *((UINT32*)&buf[2]) = CPU_TO_BE32(ordinal);
+ sha1_init(&sha1_ctx);
+ sha1_update(&sha1_ctx, req->param, req->paramSize);
+ sha1_final(&sha1_ctx, &buf[6]);
+- *((UINT16*)&buf[26]) = cpu_to_be16(TPM_TAG_COUNTER_VALUE);
++ *((UINT16*)&buf[26]) = CPU_TO_BE16(TPM_TAG_COUNTER_VALUE);
+ memset(&buf[30], 0, 4);
+- *((UINT32*)&buf[34]) =
cpu_to_be32(tpmData.permanent.data.auditMonotonicCounter);
++ *((UINT32*)&buf[34]) =
CPU_TO_BE32(tpmData.permanent.data.auditMonotonicCounter);
+ sha1_init(&sha1_ctx);
+ sha1_update(&sha1_ctx, tpmData.stany.data.auditDigest.digest,
+ sizeof(TPM_DIGEST));
+@@ -70,15 +71,15 @@ void tpm_audit_response(TPM_COMMAND_CODE
+ && (AUDIT_STATUS[ord / 8] & (1 << (ord & 0x07)))) {
+ info("tpm_audit_response()");
+ /* update audit digest */
+- *((UINT16*)&buf[0]) = cpu_to_be16(TPM_TAG_AUDIT_EVENT_OUT);
+- *((UINT32*)&buf[2]) = cpu_to_be32(ordinal);
++ *((UINT16*)&buf[0]) = CPU_TO_BE16(TPM_TAG_AUDIT_EVENT_OUT);
++ *((UINT32*)&buf[2]) = CPU_TO_BE32(ordinal);
+ sha1_init(&sha1_ctx);
+ sha1_update(&sha1_ctx, rsp->param, rsp->paramSize);
+ sha1_final(&sha1_ctx, &buf[6]);
+- *((UINT16*)&buf[26]) = cpu_to_be16(TPM_TAG_COUNTER_VALUE);
++ *((UINT16*)&buf[26]) = CPU_TO_BE16(TPM_TAG_COUNTER_VALUE);
+ memset(&buf[30], 0, 4);
+- *((UINT32*)&buf[34]) =
cpu_to_be32(tpmData.permanent.data.auditMonotonicCounter);
+- *((UINT32*)&buf[34]) = cpu_to_be32(rsp->result);
++ *((UINT32*)&buf[34]) =
CPU_TO_BE32(tpmData.permanent.data.auditMonotonicCounter);
++ *((UINT32*)&buf[34]) = CPU_TO_BE32(rsp->result);
+ sha1_init(&sha1_ctx);
+ sha1_update(&sha1_ctx, tpmData.stany.data.auditDigest.digest,
+ sizeof(TPM_DIGEST));
+@@ -158,7 +159,7 @@ TPM_RESULT TPM_GetAuditDigestSigned(TPM_
+ }
+ memcpy(&buf[0], "\x05\x00ADIG", 6);
+ memcpy(&buf[6], antiReplay->nonce, 20);
+- *(UINT32*)&buf[26] = cpu_to_be32(buf_size - 30);
++ *(UINT32*)&buf[26] = CPU_TO_BE32(buf_size - 30);
+ memcpy(&buf[30], auditDigest->digest, 20);
+ ptr = &buf[50];
+ len = buf_size - 50;
+@@ -198,4 +199,3 @@ TPM_RESULT TPM_SetOrdinalAuditStatus(TPM
+ }
+ return TPM_SUCCESS;
+ }
+-
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm/tpm_authorization.c
tpm_emulator/tpm/tpm_authorization.c
+--- orig/tpm_emulator-0.3-x86_64/tpm/tpm_authorization.c 2006-01-10
04:21:45.000000000 -0800
++++ tpm_emulator/tpm/tpm_authorization.c 2006-06-02 13:36:03.000000000
-0700
+@@ -1,6 +1,7 @@
+ /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
+ * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
+ * Swiss Federal Institute of Technology (ETH) Zurich
++ * Copyright (C) 2005 INTEL Corp
+ *
+ * This module is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+@@ -279,7 +280,7 @@ TPM_RESULT tpm_verify_auth(TPM_AUTH *aut
+ {
+ hmac_ctx_t ctx;
+ TPM_SESSION_DATA *session;
+- UINT32 auth_handle = cpu_to_be32(auth->authHandle);
++ UINT32 auth_handle = CPU_TO_BE32(auth->authHandle);
+
+ info("tpm_verify_auth(%08x)", auth->authHandle);
+ /* get dedicated authorization or transport session */
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm/tpm_capability.c
tpm_emulator/tpm/tpm_capability.c
+--- orig/tpm_emulator-0.3-x86_64/tpm/tpm_capability.c 2006-01-10
04:21:45.000000000 -0800
++++ tpm_emulator/tpm/tpm_capability.c 2006-06-02 13:36:03.000000000 -0700
+@@ -1,6 +1,7 @@
+ /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
+ * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
+ * Swiss Federal Institute of Technology (ETH) Zurich
++ * Copyright (C) 2005 INTEL Corp
+ *
+ * This module is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+@@ -406,7 +407,7 @@ TPM_RESULT TPM_GetCapability(TPM_CAPABIL
+
+ case TPM_CAP_KEY_HANDLE:
+ debug("[TPM_CAP_KEY_HANDLE]");
+- subCapSize = cpu_to_be32(TPM_RT_KEY);
++ subCapSize = CPU_TO_BE32(TPM_RT_KEY);
+ return cap_handle(4, (BYTE*)&subCapSize, respSize, resp);
+
+ case TPM_CAP_CHECK_LOADED:
+@@ -480,4 +481,3 @@ TPM_RESULT TPM_GetCapability(TPM_CAPABIL
+ return TPM_BAD_MODE;
+ }
+ }
+-
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm/tpm_cmd_handler.c
tpm_emulator/tpm/tpm_cmd_handler.c
+--- orig/tpm_emulator-0.3-x86_64/tpm/tpm_cmd_handler.c 2006-01-10
04:21:45.000000000 -0800
++++ tpm_emulator/tpm/tpm_cmd_handler.c 2006-06-02 13:36:03.000000000 -0700
+@@ -1,6 +1,7 @@
+ /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
+ * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
+ * Swiss Federal Institute of Technology (ETH) Zurich
++ * Copyright (C) 2005 INTEL Corp
+ *
+ * This module is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+@@ -73,7 +74,7 @@ void tpm_compute_in_param_digest(TPM_REQ
+ {
+ sha1_ctx_t sha1;
+ UINT32 offset = tpm_get_param_offset(req->ordinal);
+- UINT32 ord = cpu_to_be32(req->ordinal);
++ UINT32 ord = CPU_TO_BE32(req->ordinal);
+
+ /* compute SHA1 hash */
+ if (offset <= req->paramSize) {
+@@ -89,8 +90,8 @@ void tpm_compute_in_param_digest(TPM_REQ
+ void tpm_compute_out_param_digest(TPM_COMMAND_CODE ordinal, TPM_RESPONSE *rsp)
+ {
+ sha1_ctx_t sha1;
+- UINT32 res = cpu_to_be32(rsp->result);
+- UINT32 ord = cpu_to_be32(ordinal);
++ UINT32 res = CPU_TO_BE32(rsp->result);
++ UINT32 ord = CPU_TO_BE32(ordinal);
+
+ /* compute SHA1 hash */
+ sha1_init(&sha1);
+@@ -3123,7 +3124,7 @@ static void tpm_setup_rsp_auth(TPM_COMMA
+ hmac_update(&hmac, rsp->auth2->digest, sizeof(rsp->auth2->digest));
+ #if 0
+ if (tpm_get_auth(rsp->auth2->authHandle)->type == TPM_ST_OIAP) {
+- UINT32 handle = cpu_to_be32(rsp->auth2->authHandle);
++ UINT32 handle = CPU_TO_BE32(rsp->auth2->authHandle);
+ hmac_update(&hmac, (BYTE*)&handle, 4);
+ }
+ #endif
+@@ -3138,7 +3139,7 @@ static void tpm_setup_rsp_auth(TPM_COMMA
+ hmac_update(&hmac, rsp->auth1->digest, sizeof(rsp->auth1->digest));
+ #if 0
+ if (tpm_get_auth(rsp->auth1->authHandle)->type == TPM_ST_OIAP) {
+- UINT32 handle = cpu_to_be32(rsp->auth1->authHandle);
++ UINT32 handle = CPU_TO_BE32(rsp->auth1->authHandle);
+ hmac_update(&hmac, (BYTE*)&handle, 4);
+ }
+ #endif
+@@ -3221,7 +3222,9 @@ extern const char *tpm_error_to_string(T
+ void tpm_execute_command(TPM_REQUEST *req, TPM_RESPONSE *rsp)
+ {
+ TPM_RESULT res;
+-
++
++ req->tag = (BYTE) req->tag; // FIXME: Why is this here
++
+ /* setup authorisation as well as response tag and size */
+ memset(rsp, 0, sizeof(*rsp));
+ switch (req->tag) {
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm/tpm_crypto.c
tpm_emulator/tpm/tpm_crypto.c
+--- orig/tpm_emulator-0.3-x86_64/tpm/tpm_crypto.c 2006-06-05
09:54:21.000000000 -0700
++++ tpm_emulator/tpm/tpm_crypto.c 2006-06-02 13:36:03.000000000 -0700
+@@ -1,6 +1,7 @@
+ /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
+ * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
+ * Swiss Federal Institute of Technology (ETH) Zurich
++ * Copyright (C) 2005 INTEL Corp
+ *
+ * This module is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+@@ -106,7 +107,7 @@ TPM_RESULT tpm_sign(TPM_KEY_DATA *key, T
+ /* setup TPM_SIGN_INFO structure */
+ memcpy(&buf[0], "\x05\x00SIGN", 6);
+ memcpy(&buf[6], auth->nonceOdd.nonce, 20);
+- *(UINT32*)&buf[26] = cpu_to_be32(areaToSignSize);
++ *(UINT32*)&buf[26] = CPU_TO_BE32(areaToSignSize);
+ memcpy(&buf[30], areaToSign, areaToSignSize);
+ if (rsa_sign(&key->key, RSA_SSA_PKCS1_SHA1,
+ buf, areaToSignSize + 30, *sig)) {
+@@ -383,4 +384,3 @@ TPM_RESULT TPM_CertifyKey2(TPM_KEY_HANDL
+ }
+ return TPM_SUCCESS;
+ }
+-
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm/tpm_daa.c
tpm_emulator/tpm/tpm_daa.c
+--- orig/tpm_emulator-0.3-x86_64/tpm/tpm_daa.c 2006-01-10 04:21:45.000000000
-0800
++++ tpm_emulator/tpm/tpm_daa.c 2006-06-02 13:36:03.000000000 -0700
+@@ -700,14 +700,14 @@ info("tested until here");
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x00", 1);
++ sha1_update(&sha1, (BYTE *) "\x00", 1);
+ sha1_final(&sha1, scratch);
+ sha1_init(&sha1);
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_rekey,
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x01", 1);
++ sha1_update(&sha1, (BYTE *) "\x01", 1);
+ sha1_final(&sha1, scratch + SHA1_DIGEST_LENGTH);
+ mpz_init(f), mpz_init(q);
+ mpz_import(f, 2 * SHA1_DIGEST_LENGTH, 1, 1, 0, 0, scratch);
+@@ -787,14 +787,14 @@ info("tested until here");
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x00", 1);
++ sha1_update(&sha1, (BYTE *) "\x00", 1);
+ sha1_final(&sha1, scratch);
+ sha1_init(&sha1);
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_rekey,
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x01", 1);
++ sha1_update(&sha1, (BYTE *) "\x01", 1);
+ sha1_final(&sha1, scratch + SHA1_DIGEST_LENGTH);
+ mpz_init(f), mpz_init(q);
+ mpz_import(f, 2 * SHA1_DIGEST_LENGTH, 1, 1, 0, 0, scratch);
+@@ -1440,14 +1440,14 @@ info("tested until here");
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x00", 1);
++ sha1_update(&sha1, (BYTE *) "\x00", 1);
+ sha1_final(&sha1, scratch);
+ sha1_init(&sha1);
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_rekey,
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x01", 1);
++ sha1_update(&sha1, (BYTE *) "\x01", 1);
+ sha1_final(&sha1, scratch + SHA1_DIGEST_LENGTH);
+ mpz_init(f), mpz_init(q);
+ mpz_import(f, 2 * SHA1_DIGEST_LENGTH, 1, 1, 0, 0, scratch);
+@@ -1660,14 +1660,14 @@ info("tested until here");
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x00", 1);
++ sha1_update(&sha1, (BYTE *) "\x00", 1);
+ sha1_final(&sha1, scratch);
+ sha1_init(&sha1);
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_rekey,
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x01", 1);
++ sha1_update(&sha1, (BYTE *) "\x01", 1);
+ sha1_final(&sha1, scratch + SHA1_DIGEST_LENGTH);
+ mpz_init(f), mpz_init(q);
+ mpz_import(f, 2 * SHA1_DIGEST_LENGTH, 1, 1, 0, 0, scratch);
+@@ -1740,14 +1740,14 @@ info("tested until here");
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x00", 1);
++ sha1_update(&sha1, (BYTE *) "\x00", 1);
+ sha1_final(&sha1, scratch);
+ sha1_init(&sha1);
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_rekey,
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x01", 1);
++ sha1_update(&sha1, (BYTE *) "\x01", 1);
+ sha1_final(&sha1, scratch + SHA1_DIGEST_LENGTH);
+ mpz_init(f), mpz_init(q);
+ mpz_import(f, 2 * SHA1_DIGEST_LENGTH, 1, 1, 0, 0, scratch);
+@@ -2828,14 +2828,14 @@ TPM_RESULT TPM_DAA_Sign(TPM_HANDLE handl
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x00", 1);
++ sha1_update(&sha1, (BYTE *) "\x00", 1);
+ sha1_final(&sha1, scratch);
+ sha1_init(&sha1);
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_rekey,
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x01", 1);
++ sha1_update(&sha1, (BYTE *) "\x01", 1);
+ sha1_final(&sha1, scratch + SHA1_DIGEST_LENGTH);
+ mpz_init(f), mpz_init(q);
+ mpz_import(f, 2 * SHA1_DIGEST_LENGTH, 1, 1, 0, 0, scratch);
+@@ -3050,7 +3050,7 @@ TPM_RESULT TPM_DAA_Sign(TPM_HANDLE handl
+ sha1_init(&sha1);
+ sha1_update(&sha1, (BYTE*) &session->DAA_session.DAA_digest,
+ sizeof(session->DAA_session.DAA_digest));
+- sha1_update(&sha1, "\x01", 1);
++ sha1_update(&sha1, (BYTE *) "\x01", 1);
+ sha1_update(&sha1, inputData1, inputSize1);
+ sha1_final(&sha1, (BYTE*) &session->DAA_session.DAA_digest);
+ }
+@@ -3078,7 +3078,7 @@ TPM_RESULT TPM_DAA_Sign(TPM_HANDLE handl
+ sha1_init(&sha1);
+ sha1_update(&sha1, (BYTE*) &session->DAA_session.DAA_digest,
+ sizeof(session->DAA_session.DAA_digest));
+- sha1_update(&sha1, "\x01", 1);
++ sha1_update(&sha1, (BYTE *) "\x01", 1);
+ rsa_export_modulus(&aikData->key, scratch, &size);
+ sha1_update(&sha1, scratch, size);
+ sha1_final(&sha1, (BYTE*) &session->DAA_session.DAA_digest);
+@@ -3134,14 +3134,14 @@ TPM_RESULT TPM_DAA_Sign(TPM_HANDLE handl
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x00", 1);
++ sha1_update(&sha1, (BYTE *) "\x00", 1);
+ sha1_final(&sha1, scratch);
+ sha1_init(&sha1);
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_rekey,
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x01", 1);
++ sha1_update(&sha1, (BYTE *) "\x01", 1);
+ sha1_final(&sha1, scratch + SHA1_DIGEST_LENGTH);
+ mpz_init(f), mpz_init(q);
+ mpz_import(f, 2 * SHA1_DIGEST_LENGTH, 1, 1, 0, 0, scratch);
+@@ -3213,14 +3213,14 @@ TPM_RESULT TPM_DAA_Sign(TPM_HANDLE handl
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x00", 1);
++ sha1_update(&sha1, (BYTE *) "\x00", 1);
+ sha1_final(&sha1, scratch);
+ sha1_init(&sha1);
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_rekey,
+ sizeof(session->DAA_tpmSpecific.DAA_rekey));
+ sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count,
+ sizeof(session->DAA_tpmSpecific.DAA_count));
+- sha1_update(&sha1, "\x01", 1);
++ sha1_update(&sha1, (BYTE *) "\x01", 1);
+ sha1_final(&sha1, scratch + SHA1_DIGEST_LENGTH);
+ mpz_init(f), mpz_init(q);
+ mpz_import(f, 2 * SHA1_DIGEST_LENGTH, 1, 1, 0, 0, scratch);
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm/tpm_data.c
tpm_emulator/tpm/tpm_data.c
+--- orig/tpm_emulator-0.3-x86_64/tpm/tpm_data.c 2006-06-05
09:54:21.000000000 -0700
++++ tpm_emulator/tpm/tpm_data.c 2006-06-02 13:36:03.000000000 -0700
+@@ -150,44 +150,43 @@ void tpm_release_data(void)
+
+ #ifdef TPM_STORE_TO_FILE
+
+-#include <linux/fs.h>
+-#include <linux/unistd.h>
+-#include <asm/uaccess.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++#include <unistd.h>
+
+ #define TPM_STORAGE_FILE "/var/tpm/tpm_emulator-1.2." STR(VERSION_MAJOR) "."
STR(VERSION_MINOR)
+
+ static int write_to_file(uint8_t *data, size_t data_length)
+ {
+ int res;
+- struct file *fp;
+- mm_segment_t old_fs = get_fs();
+- fp = filp_open(TPM_STORAGE_FILE, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR |
S_IWUSR);
+- if (IS_ERR(fp)) return -1;
+- set_fs(get_ds());
+- res = fp->f_op->write(fp, data, data_length, &fp->f_pos);
+- set_fs(old_fs);
+- filp_close(fp, NULL);
++ int fp;
++ fp = open(TPM_STORAGE_FILE, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR |
S_IWUSR);
++ res = write(fp, data, data_length);
++ close(fp);
+ return (res == data_length) ? 0 : -1;
+ }
+
+ static int read_from_file(uint8_t **data, size_t *data_length)
+ {
+ int res;
+- struct file *fp;
+- mm_segment_t old_fs = get_fs();
+- fp = filp_open(TPM_STORAGE_FILE, O_RDONLY, 0);
+- if (IS_ERR(fp)) return -1;
+- *data_length = (size_t)fp->f_dentry->d_inode->i_size;
+- /* *data_length = i_size_read(fp->f_dentry->d_inode); */
++ int fp, file_status;
++ struct stat file_info;
++ fp = open(TPM_STORAGE_FILE, O_RDONLY, 0);
++ file_status = fstat(fp, &file_info);
++ if (file_status < 0) {
++ close(fp);
++ return -1;
++ }
++
++ *data_length = file_info.st_size;
+ *data = tpm_malloc(*data_length);
+ if (*data == NULL) {
+- filp_close(fp, NULL);
++ close(fp);
+ return -1;
+ }
+- set_fs(get_ds());
+- res = fp->f_op->read(fp, *data, *data_length, &fp->f_pos);
+- set_fs(old_fs);
+- filp_close(fp, NULL);
++ res = read(fp, *data, *data_length);
++ close(fp);
+ if (res != *data_length) {
+ tpm_free(*data);
+ return -1;
+@@ -267,7 +266,7 @@ int tpm_restore_permanent_data(void)
+
+ int tpm_erase_permanent_data(void)
+ {
+- int res = write_to_file("", 0);
++ int res = write_to_file((uint8_t *) "", 0);
+ return res;
+ }
+
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm/tpm_deprecated.c
tpm_emulator/tpm/tpm_deprecated.c
+--- orig/tpm_emulator-0.3-x86_64/tpm/tpm_deprecated.c 2006-01-10
04:21:45.000000000 -0800
++++ tpm_emulator/tpm/tpm_deprecated.c 2006-06-02 13:36:03.000000000 -0700
+@@ -1,6 +1,7 @@
+ /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
+ * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
+ * Swiss Federal Institute of Technology (ETH) Zurich
++ * Copyright (C) 2005 INTEL Corp
+ *
+ * This module is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+@@ -50,7 +51,7 @@ TPM_RESULT TPM_SaveKeyContext(TPM_KEY_HA
+ BYTE *ptr;
+ UINT32 len;
+ info("TPM_SaveKeyContext()");
+- res = TPM_SaveContext(keyHandle, TPM_RT_KEY, "SaveKeyContext..",
++ res = TPM_SaveContext(keyHandle, TPM_RT_KEY, (BYTE*)"SaveKeyContext..",
+ keyContextSize, &contextBlob);
+ if (res != TPM_SUCCESS) return res;
+ len = *keyContextSize;
+@@ -82,7 +83,7 @@ TPM_RESULT TPM_SaveAuthContext(TPM_AUTHH
+ BYTE *ptr;
+ UINT32 len;
+ info("TPM_SaveAuthContext()");
+- res = TPM_SaveContext(authHandle, TPM_RT_KEY, "SaveAuthContext.",
++ res = TPM_SaveContext(authHandle, TPM_RT_KEY, (BYTE*)"SaveAuthContext.",
+ authContextSize, &contextBlob);
+ if (res != TPM_SUCCESS) return res;
+ len = *authContextSize;
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm/tpm_emulator.h
tpm_emulator/tpm/tpm_emulator.h
+--- orig/tpm_emulator-0.3-x86_64/tpm/tpm_emulator.h 2006-01-10
04:21:45.000000000 -0800
++++ tpm_emulator/tpm/tpm_emulator.h 2006-06-02 13:36:03.000000000 -0700
+@@ -1,5 +1,6 @@
+ /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
+ * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
++ * Copyright (C) 2005 INTEL Corp
+ *
+ * This module is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+@@ -22,7 +23,8 @@
+ /* TPM configuration */
+ #define TPM_STORE_TO_FILE 1
+ #undef TPM_STRONG_PERSISTENCE
+-#undef TPM_GENERATE_EK
++//#undef TPM_GENERATE_EK
++#define TPM_GENERATE_EK
+ #undef TPM_GENERATE_SEED_DAA
+
+ #define TPM_MANUFACTURER 0x4554485A /* 'ETHZ' */
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm/tpm_integrity.c
tpm_emulator/tpm/tpm_integrity.c
+--- orig/tpm_emulator-0.3-x86_64/tpm/tpm_integrity.c 2006-01-10
04:21:45.000000000 -0800
++++ tpm_emulator/tpm/tpm_integrity.c 2006-06-02 13:36:03.000000000 -0700
+@@ -1,6 +1,7 @@
+ /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
+ * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
+ * Swiss Federal Institute of Technology (ETH) Zurich
++ * Copyright (C) 2005 INTEL Corp
+ *
+ * This module is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+@@ -194,4 +195,3 @@ TPM_RESULT tpm_verify_pcr(TPM_KEY_DATA *
+ }
+ return TPM_SUCCESS;
+ }
+-
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm/tpm_structures.h
tpm_emulator/tpm/tpm_structures.h
+--- orig/tpm_emulator-0.3-x86_64/tpm/tpm_structures.h 2006-01-10
04:21:45.000000000 -0800
++++ tpm_emulator/tpm/tpm_structures.h 2006-06-02 13:36:03.000000000 -0700
+@@ -1,6 +1,7 @@
+ /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
+ * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
+ * Swiss Federal Institute of Technology (ETH) Zurich
++ * Copyright (C) 2005 INTEL Corp
+ *
+ * This module is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+@@ -18,7 +19,7 @@
+ #ifndef _TPM_STRUCTURES_H_
+ #define _TPM_STRUCTURES_H_
+
+-#include <linux/types.h>
++//#include <linux/types.h>
+ #include "crypto/rsa.h"
+
+ /*
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm/tpm_testing.c
tpm_emulator/tpm/tpm_testing.c
+--- orig/tpm_emulator-0.3-x86_64/tpm/tpm_testing.c 2006-01-10
04:21:45.000000000 -0800
++++ tpm_emulator/tpm/tpm_testing.c 2006-06-02 13:36:03.000000000 -0700
+@@ -1,6 +1,7 @@
+ /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
+ * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
+ * Swiss Federal Institute of Technology (ETH) Zurich
++ * Copyright (C) 2005 INTEL Corp
+ *
+ * This module is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+@@ -95,24 +96,24 @@ static int tpm_test_sha1(void)
+ struct {
+ uint8_t *data; uint32_t repetitions; uint8_t *digest;
+ } test_cases[] = {{
+- "abc", 1,
+-
"\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E\x25\x71\x78\x50\xC2\x6C\x9C\xD0\xD8\x9D"
++ (uint8_t*)"abc", 1,
++
(uint8_t*)"\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E\x25\x71\x78\x50\xC2\x6C\x9C\xD0\xD8\x9D"
+ }, {
+- "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 1,
+-
"\x84\x98\x3E\x44\x1C\x3B\xD2\x6E\xBA\xAE\x4A\xA1\xF9\x51\x29\xE5\xE5\x46\x70\xF1"
++ (uint8_t*)"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 1,
++
(uint8_t*)"\x84\x98\x3E\x44\x1C\x3B\xD2\x6E\xBA\xAE\x4A\xA1\xF9\x51\x29\xE5\xE5\x46\x70\xF1"
+ }, {
+- "a", 1000000,
+-
"\x34\xAA\x97\x3C\xD4\xC4\xDA\xA4\xF6\x1E\xEB\x2B\xDB\xAD\x27\x31\x65\x34\x01\x6F"
++ (uint8_t*)"a", 1000000,
++
(uint8_t*)"\x34\xAA\x97\x3C\xD4\xC4\xDA\xA4\xF6\x1E\xEB\x2B\xDB\xAD\x27\x31\x65\x34\x01\x6F"
+ }, {
+- "0123456701234567012345670123456701234567012345670123456701234567", 10,
+-
"\xDE\xA3\x56\xA2\xCD\xDD\x90\xC7\xA7\xEC\xED\xC5\xEB\xB5\x63\x93\x4F\x46\x04\x52"
++
(uint8_t*)"0123456701234567012345670123456701234567012345670123456701234567",
10,
++
(uint8_t*)"\xDE\xA3\x56\xA2\xCD\xDD\x90\xC7\xA7\xEC\xED\xC5\xEB\xB5\x63\x93\x4F\x46\x04\x52"
+ }};
+
+ debug("tpm_test_sha1()");
+ for (i = 0; i < sizeof(test_cases) / sizeof(test_cases[0]); i++) {
+ sha1_init(&ctx);
+ for (j = 0; j < test_cases[i].repetitions; j++)
+- sha1_update(&ctx, test_cases[i].data, strlen(test_cases[i].data));
++ sha1_update(&ctx, test_cases[i].data,
strlen((char*)test_cases[i].data));
+ sha1_final(&ctx, digest);
+ if (memcmp(digest, test_cases[i].digest, SHA1_DIGEST_LENGTH) != 0) return
-1;
+ }
+@@ -128,41 +129,41 @@ static int tpm_test_hmac(void)
+ struct {
+ uint8_t *key, key_len, *data, data_len, *digest;
+ } test_cases[] = {{
+- "\x0b", 20, "Hi There", 8,
+-
"\xb6\x17\x31\x86\x55\x05\x72\x64\xe2\x8b\xc0\xb6\xfb\x37\x8c\x8e\xf1\x46\xbe\x00"
++ (uint8_t*)"\x0b", 20, (uint8_t*)"Hi There", 8,
++
(uint8_t*)"\xb6\x17\x31\x86\x55\x05\x72\x64\xe2\x8b\xc0\xb6\xfb\x37\x8c\x8e\xf1\x46\xbe\x00"
+ }, {
+- "Jefe", 4, "what do ya want for nothing?", 28,
+-
"\xef\xfc\xdf\x6a\xe5\xeb\x2f\xa2\xd2\x74\x16\xd5\xf1\x84\xdf\x9c\x25\x9a\x7c\x79"
++ (uint8_t*)"Jefe", 4, (uint8_t*)"what do ya want for nothing?", 28,
++
(uint8_t*)"\xef\xfc\xdf\x6a\xe5\xeb\x2f\xa2\xd2\x74\x16\xd5\xf1\x84\xdf\x9c\x25\x9a\x7c\x79"
+ }, {
+- "\xaa", 20, "\xdd", 50,
+-
"\x12\x5d\x73\x42\xb9\xac\x11\xcd\x91\xa3\x9a\xf4\x8a\xa1\x7b\x4f\x63\xf1\x75\xd3"
++ (uint8_t*)"\xaa", 20, (uint8_t*)"\xdd", 50,
++
(uint8_t*)"\x12\x5d\x73\x42\xb9\xac\x11\xcd\x91\xa3\x9a\xf4\x8a\xa1\x7b\x4f\x63\xf1\x75\xd3"
+ }, {
+-
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
+- "\x15\x16\x17\x18\x19", 25, "\xcd", 50,
+-
"\x4c\x90\x07\xf4\x02\x62\x50\xc6\xbc\x84\x14\xf9\xbf\x50\xc8\x6c\x2d\x72\x35\xda"
++
(uint8_t*)"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
++ "\x15\x16\x17\x18\x19", 25, (uint8_t*)"\xcd", 50,
++
(uint8_t*)"\x4c\x90\x07\xf4\x02\x62\x50\xc6\xbc\x84\x14\xf9\xbf\x50\xc8\x6c\x2d\x72\x35\xda"
+ }, {
+- "\x0c", 20, "Test With Truncation", 20,
+-
"\x4c\x1a\x03\x42\x4b\x55\xe0\x7f\xe7\xf2\x7b\xe1\xd5\x8b\xb9\x32\x4a\x9a\x5a\x04"
++ (uint8_t*)"\x0c", 20, (uint8_t*)"Test With Truncation", 20,
++
(uint8_t*)"\x4c\x1a\x03\x42\x4b\x55\xe0\x7f\xe7\xf2\x7b\xe1\xd5\x8b\xb9\x32\x4a\x9a\x5a\x04"
+ }, {
+- "\xaa", 80, "Test Using Larger Than Block-Size Key - Hash Key First", 54,
+-
"\xaa\x4a\xe5\xe1\x52\x72\xd0\x0e\x95\x70\x56\x37\xce\x8a\x3b\x55\xed\x40\x21\x12"
++ (uint8_t*)"\xaa", 80, (uint8_t*)"Test Using Larger Than Block-Size Key -
Hash Key First", 54,
++
(uint8_t*)"\xaa\x4a\xe5\xe1\x52\x72\xd0\x0e\x95\x70\x56\x37\xce\x8a\x3b\x55\xed\x40\x21\x12"
+ }, {
+- "\xaa", 80,
+- "Test Using Larger Than Block-Size Key and Larger Than One Block-Size
Data", 73,
+-
"\xe8\xe9\x9d\x0f\x45\x23\x7d\x78\x6d\x6b\xba\xa7\x96\x5c\x78\x08\xbb\xff\x1a\x91"
++ (uint8_t*)"\xaa", 80,
++ (uint8_t*)"Test Using Larger Than Block-Size Key and Larger Than One
Block-Size Data", 73,
++
(uint8_t*)"\xe8\xe9\x9d\x0f\x45\x23\x7d\x78\x6d\x6b\xba\xa7\x96\x5c\x78\x08\xbb\xff\x1a\x91"
+ }};
+
+ debug("tpm_test_hmac()");
+ for (i = 0; i < sizeof(test_cases) / sizeof(test_cases[0]); i++) {
+- if (strlen(test_cases[i].key) < test_cases[i].key_len) {
++ if (strlen((char*)test_cases[i].key) < test_cases[i].key_len) {
+ uint8_t key[test_cases[i].key_len];
+ memset(key, test_cases[i].key[0], test_cases[i].key_len);
+ hmac_init(&ctx, key, test_cases[i].key_len);
+ } else {
+ hmac_init(&ctx, test_cases[i].key, test_cases[i].key_len);
+ }
+- for (j = 0; j < test_cases[i].data_len; j += strlen(test_cases[i].data)) {
+- hmac_update(&ctx, test_cases[i].data, strlen(test_cases[i].data));
++ for (j = 0; j < test_cases[i].data_len; j +=
strlen((char*)test_cases[i].data)) {
++ hmac_update(&ctx, test_cases[i].data,
strlen((char*)test_cases[i].data));
+ }
+ hmac_final(&ctx, digest);
+ if (memcmp(digest, test_cases[i].digest, SHA1_DIGEST_LENGTH) != 0) return
-1;
+@@ -173,9 +174,9 @@ static int tpm_test_hmac(void)
+ static int tpm_test_rsa_EK(void)
+ {
+ int res = 0;
+- char *data = "RSA PKCS #1 v1.5 Test-String";
++ uint8_t *data = (uint8_t*)"RSA PKCS #1 v1.5 Test-String";
+ uint8_t buf[256];
+- size_t buf_len, data_len = strlen(data);
++ size_t buf_len, data_len = strlen((char*)data);
+ rsa_private_key_t priv_key;
+ rsa_public_key_t pub_key;
+
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm/tpm_ticks.c
tpm_emulator/tpm/tpm_ticks.c
+--- orig/tpm_emulator-0.3-x86_64/tpm/tpm_ticks.c 2006-01-10
04:21:45.000000000 -0800
++++ tpm_emulator/tpm/tpm_ticks.c 2006-06-02 13:36:03.000000000 -0700
+@@ -1,6 +1,7 @@
+ /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
+ * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
+ * Swiss Federal Institute of Technology (ETH) Zurich
++ * Copyright (C) 2005 INTEL Corp
+ *
+ * This module is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+@@ -37,9 +38,7 @@ TPM_RESULT TPM_SetTickType(TPM_TICKTYPE
+ TPM_RESULT TPM_GetTicks(TPM_CURRENT_TICKS *currentTime)
+ {
+ info("TPM_GetTicks()");
+- memcpy(currentTime, &tpmData.stany.data.currentTicks,
+- sizeof(TPM_CURRENT_TICKS));
+- return TPM_SUCCESS;
++ return TPM_DISABLED_CMD;
+ }
+
+ TPM_RESULT TPM_TickStampBlob(TPM_KEY_HANDLE keyHandle, TPM_NONCE *antiReplay,
+@@ -47,61 +46,12 @@ TPM_RESULT TPM_TickStampBlob(TPM_KEY_HAN
+ TPM_CURRENT_TICKS *currentTicks,
+ UINT32 *sigSize, BYTE **sig)
+ {
+- TPM_RESULT res;
+- TPM_KEY_DATA *key;
+- BYTE *info, *p;
+- UINT32 info_length, length;
+ info("TPM_TickStampBlob()");
+- /* get key */
+- key = tpm_get_key(keyHandle);
+- if (key == NULL) return TPM_INVALID_KEYHANDLE;
+- /* verify authorization */
+- res = tpm_verify_auth(auth1, key->usageAuth, keyHandle);
+- if (res != TPM_SUCCESS) return res;
+- if (key->keyUsage != TPM_KEY_SIGNING && key->keyUsage != TPM_KEY_LEGACY
+- && key->keyUsage != TPM_KEY_IDENTITY) return TPM_INVALID_KEYUSAGE;
+- /* get current ticks */
+- TPM_GetTicks(currentTicks);
+- /* sign data using signature scheme PKCS1_SHA1 and TPM_SIGN_INFO container
*/
+- *sigSize = key->key.size >> 3;
+- *sig = tpm_malloc(*sigSize);
+- if (*sig == NULL) return TPM_FAIL;
+- /* setup TPM_SIGN_INFO structure */
+- info_length = 30 + sizeof(TPM_DIGEST) +
sizeof_TPM_CURRENT_TICKS(currentTicks);
+- info = tpm_malloc(info_length);
+- if (info == NULL) {
+- tpm_free(*sig);
+- return TPM_FAIL;
+- }
+- memcpy(&info[0], "\x05\x00TSTP", 6);
+- memcpy(&info[6], antiReplay->nonce, 20);
+- *(UINT32*)&info[26] = cpu_to_be32(20
+- + sizeof_TPM_CURRENT_TICKS(currentTicks));
+- memcpy(&info[30], digestToStamp->digest, sizeof(TPM_DIGEST));
+- p = &info[30 + sizeof(TPM_DIGEST)];
+- length = sizeof_TPM_CURRENT_TICKS(currentTicks);
+- if (tpm_marshal_TPM_CURRENT_TICKS(&p, &length, currentTicks)
+- || rsa_sign(&key->key, RSA_SSA_PKCS1_SHA1, info, info_length, *sig)) {
+- tpm_free(*sig);
+- tpm_free(info);
+- return TPM_FAIL;
+- }
+- return TPM_SUCCESS;
++ return TPM_DISABLED_CMD;
+ }
+
+ void tpm_update_ticks(void)
+ {
+- if (tpmData.stany.data.currentTicks.tag == 0) {
+- tpmData.stany.data.currentTicks.tag = TPM_TAG_CURRENT_TICKS;
+- tpmData.stany.data.currentTicks.currentTicks += tpm_get_ticks();
+- tpmData.stany.data.currentTicks.tickType =
tpmData.permanent.data.tickType;
+- tpm_get_random_bytes(tpmData.stany.data.currentTicks.tickNonce.nonce,
+- sizeof(TPM_NONCE));
+- tpmData.stany.data.currentTicks.tickRate = 1;
+- tpmData.stany.data.currentTicks.tickSecurity = TICK_SEC_NO_CHECK;
+- } else {
+- tpmData.stany.data.currentTicks.currentTicks += tpm_get_ticks();
+- }
+ }
+
+
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm/tpm_transport.c
tpm_emulator/tpm/tpm_transport.c
+--- orig/tpm_emulator-0.3-x86_64/tpm/tpm_transport.c 2006-01-10
04:21:45.000000000 -0800
++++ tpm_emulator/tpm/tpm_transport.c 2006-06-02 13:36:03.000000000 -0700
+@@ -59,7 +59,7 @@ static int decrypt_transport_auth(TPM_KE
+ static void transport_log_in(TPM_COMMAND_CODE ordinal, BYTE parameters[20],
+ BYTE pubKeyHash[20], TPM_DIGEST *transDigest)
+ {
+- UINT32 tag = cpu_to_be32(TPM_TAG_TRANSPORT_LOG_IN);
++ UINT32 tag = CPU_TO_BE32(TPM_TAG_TRANSPORT_LOG_IN);
+ BYTE *ptr, buf[sizeof_TPM_TRANSPORT_LOG_IN(x)];
+ UINT32 len = sizeof(buf);
+ sha1_ctx_t sha1;
+@@ -76,7 +76,7 @@ static void transport_log_in(TPM_COMMAND
+ static void transport_log_out(TPM_CURRENT_TICKS *currentTicks, BYTE
parameters[20],
+ TPM_MODIFIER_INDICATOR locality, TPM_DIGEST
*transDigest)
+ {
+- UINT32 tag = cpu_to_be32(TPM_TAG_TRANSPORT_LOG_OUT);
++ UINT32 tag = CPU_TO_BE32(TPM_TAG_TRANSPORT_LOG_OUT);
+ BYTE *ptr, buf[sizeof_TPM_TRANSPORT_LOG_OUT(x)];
+ UINT32 len = sizeof(buf);
+ sha1_ctx_t sha1;
+@@ -191,7 +191,7 @@ static void decrypt_wrapped_command(BYTE
+ sha1_update(&sha1, auth->nonceOdd.nonce, sizeof(auth->nonceOdd.nonce));
+ sha1_update(&sha1, "in", 2);
+ sha1_update(&sha1, secret, sizeof(TPM_SECRET));
+- j = cpu_to_be32(i);
++ j = CPU_TO_BE32(i);
+ sha1_update(&sha1, (BYTE*)&j, 4);
+ sha1_final(&sha1, mask);
+ for (j = 0; j < sizeof(mask) && buf_len > 0; j++) {
+@@ -213,7 +213,7 @@ static void encrypt_wrapped_command(BYTE
+ sha1_update(&sha1, auth->nonceOdd.nonce, sizeof(auth->nonceOdd.nonce));
+ sha1_update(&sha1, "out", 3);
+ sha1_update(&sha1, secret, sizeof(TPM_SECRET));
+- j = cpu_to_be32(i);
++ j = CPU_TO_BE32(i);
+ sha1_update(&sha1, (BYTE*)&j, 4);
+ sha1_final(&sha1, mask);
+ for (j = 0; j < sizeof(mask) && buf_len > 0; j++) {
+@@ -253,9 +253,9 @@ TPM_RESULT TPM_ExecuteTransport(UINT32 i
+ /* verify authorization */
+ tpm_compute_in_param_digest(&req);
+ sha1_init(&sha1);
+- res = cpu_to_be32(TPM_ORD_ExecuteTransport);
++ res = CPU_TO_BE32(TPM_ORD_ExecuteTransport);
+ sha1_update(&sha1, (BYTE*)&res, 4);
+- res = cpu_to_be32(inWrappedCmdSize);
++ res = CPU_TO_BE32(inWrappedCmdSize);
+ sha1_update(&sha1, (BYTE*)&res, 4);
+ sha1_update(&sha1, req.auth1.digest, sizeof(req.auth1.digest));
+ sha1_final(&sha1, auth1->digest);
+@@ -357,7 +357,7 @@ TPM_RESULT TPM_ReleaseTransportSigned(TP
+ /* setup a TPM_SIGN_INFO structure */
+ memcpy(&buf[0], "\x05\x00TRAN", 6);
+ memcpy(&buf[6], antiReplay->nonce, 20);
+- *(UINT32*)&buf[26] = cpu_to_be32(20);
++ *(UINT32*)&buf[26] = CPU_TO_BE32(20);
+ memcpy(&buf[30], session->transInternal.transDigest.digest, 20);
+ /* sign info structure */
+ res = tpm_sign(key, auth1, TRUE, buf, sizeof(buf), signature, signSize);
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpmd.c tpm_emulator/tpmd.c
+--- orig/tpm_emulator-0.3-x86_64/tpmd.c 1969-12-31 16:00:00.000000000
-0800
++++ tpm_emulator/tpmd.c 2006-06-02 13:36:03.000000000 -0700
+@@ -0,0 +1,141 @@
++/* Software-Based Trusted Platform Module (TPM) Emulator for Linux
++ * Copyright (C) 2005 INTEL Corp
++ *
++ * This module is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published
++ * by the Free Software Foundation; either version 2 of the License,
++ * or (at your option) any later version.
++ *
++ * This module is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <string.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++#include <sys/time.h>
++
++#include "tpm_emulator.h"
++
++#define TPM_RX_FNAME "/tmp/tpm_in.fifo"
++#define TPM_TX_FNAME "/tmp/tpm_out.fifo"
++
++#define BUFFER_SIZE 2048
++
++static int devurandom=0;
++
++void get_random_bytes(void *buf, int nbytes) {
++
++ if (devurandom == 0) {
++ devurandom = open("/dev/urandom", O_RDONLY);
++ }
++
++ if (read(devurandom, buf, nbytes) != nbytes) {
++ printf("Can't get random number.\n");
++ exit(-1);
++ }
++}
++
++uint64_t tpm_get_ticks(void)
++{
++ //struct timeval tv;
++ //int gettimeofday(&tv, struct timezone *tz);
++ return 0;
++}
++
++int main(int argc, char **argv)
++{
++ uint8_t in[BUFFER_SIZE], *out;
++ uint32_t out_size;
++ int in_size, written;
++ int i;
++
++ int tpm_tx_fh=-1, tpm_rx_fh=-1;
++ if (argc < 2) {
++ printf("Usage: tpmd clear|save|deactivated\n" );
++ return -1;
++ }
++
++ /* initialize TPM emulator */
++ if (!strcmp(argv[1], "clear")) {
++ printf("Initializing tpm: %s\n", argv[1]);
++ tpm_emulator_init(1);
++ } else if (!strcmp(argv[1], "save")) {
++ printf("Initializing tpm: %s\n", argv[1]);
++ tpm_emulator_init(2);
++ } else if (!strcmp(argv[1], "deactivated")) {
++ printf("Initializing tpm: %s\n", argv[1]);
++ tpm_emulator_init(3);
++ } else {
++ printf("invalid startup mode '%s'; must be 'clear', "
++ "'save' (default) or 'deactivated", argv[1]);
++ return -1;
++ }
++
++ while (1) {
++abort_command:
++ if (tpm_rx_fh < 0) {
++ tpm_rx_fh = open(TPM_RX_FNAME, O_RDONLY);
+ }
-+
- tpmData.permanent.data.pcrAttrib[i].pcrReset = TRUE;
- }
- /* set tick type */
++
++ if (tpm_rx_fh < 0) {
++ printf("ERROR: failed to open devices to listen to guest.\n");
++ return -1;
++ }
++
++ if (tpm_tx_fh < 0) {
++ tpm_tx_fh = open(TPM_TX_FNAME, O_WRONLY);
++ }
++
++ if (tpm_tx_fh < 0) {
++ printf("ERROR: failed to open devices to respond to guest.\n");
++ return -1;
++ }
++
++ in_size = read(tpm_rx_fh, in, BUFFER_SIZE);
++ if (in_size < 6) { // Magic size of minium TPM command
++ printf("Recv[%d] to small: 0x", in_size);
++ if (in_size <= 0) {
++ close(tpm_rx_fh);
++ tpm_rx_fh = -1;
++ goto abort_command;
++ }
++ } else {
++ printf("Recv[%d]: 0x", in_size);
++ for (i=0; i< in_size; i++)
++ printf("%x ", in[i]);
++ printf("\n");
++ }
++
++
++ if (tpm_handle_command(in, in_size, &out, &out_size) != 0) {
++ printf("ERROR: Handler Failed.\n");
++ }
++
++ written = write(tpm_tx_fh, out, out_size);
++
++ if (written != out_size ) {
++ printf("ERROR: Part of response not written %d/%d.\nAttempt: ",
written, out_size);
++ } else {
++ printf("Sent[%Zu]: ", out_size);
++ }
++ for (i=0; i< out_size; i++)
++ printf("%x ", out[i]);
++ printf("\n");
++ tpm_free(out);
++
++ } // loop
++
++ tpm_emulator_shutdown();
++
++ close(tpm_tx_fh);
++ close(tpm_rx_fh);
++
++}
+diff -uprN orig/tpm_emulator-0.3-x86_64/tpm_version.h
tpm_emulator/tpm_version.h
+--- orig/tpm_emulator-0.3-x86_64/tpm_version.h 2006-01-10 04:21:45.000000000
-0800
++++ tpm_emulator/tpm_version.h 1969-12-31 16:00:00.000000000 -0800
+@@ -1,6 +0,0 @@
+-#ifndef _TPM_VERSION_H_
+-#define _TPM_VERSION_H_
+-#define VERSION_MAJOR 0
+-#define VERSION_MINOR 3
+-#define VERSION_BUILD 1136893683
+-#endif /* _TPM_VERSION_H_ */
diff -r e236794915cc -r 533b0709a68f tools/vtpm_manager/Rules.mk
--- a/tools/vtpm_manager/Rules.mk Tue Jun 27 11:05:39 2006 +0100
+++ b/tools/vtpm_manager/Rules.mk Tue Jun 27 11:13:24 2006 +0100
@@ -56,6 +56,9 @@ CFLAGS += -DLOGGING_MODULES="(BITMASK(VT
# vtpm_manager listens on fifo's rather than backend
#CFLAGS += -DDUMMY_BACKEND
+# TCS talks to fifo's rather than /dev/tpm. TPM Emulator assumed on fifos
+#CFLAGS += -DDUMMY_TPM
+
# Do not have manager launch DMs.
#CFLAGS += -DMANUAL_DM_LAUNCH
diff -r e236794915cc -r 533b0709a68f tools/vtpm_manager/manager/vtpm_manager.c
--- a/tools/vtpm_manager/manager/vtpm_manager.c Tue Jun 27 11:05:39 2006 +0100
+++ b/tools/vtpm_manager/manager/vtpm_manager.c Tue Jun 27 11:13:24 2006 +0100
@@ -92,8 +92,9 @@ TPM_RESULT VTPM_Create_Manager(){
status = VTSP_ReadPubek(vtpm_globals->manager_tcs_handle, &ek_cryptoInfo);
// If we can read PubEK then there is no owner and we should take it.
+ // We use the abilty to read the pubEK to flag that the TPM is owned.
+ // FIXME: Change to just trying to take ownership and react to the status
if (status == TPM_SUCCESS) {
- vtpmloginfo(VTPM_LOG_VTPM, "Failed to readEK meaning TPM has an owner.
Creating Keys off existing SRK.\n");
TPMTRYRETURN(VTSP_TakeOwnership(vtpm_globals->manager_tcs_handle,
(const
TPM_AUTHDATA*)&vtpm_globals->owner_usage_auth,
&SRK_AUTH,
@@ -103,6 +104,8 @@ TPM_RESULT VTPM_Create_Manager(){
TPMTRYRETURN(VTSP_DisablePubekRead(vtpm_globals->manager_tcs_handle,
(const
TPM_AUTHDATA*)&vtpm_globals->owner_usage_auth,
&vtpm_globals->keyAuth));
+ } else {
+ vtpmloginfo(VTPM_LOG_VTPM, "Failed to readEK meaning TPM has an owner.
Creating Keys off existing SRK.\n");
}
// Generate storage key's auth
@@ -165,7 +168,6 @@ TPM_RESULT VTPM_Create_Manager(){
&vtpm_globals->bootKey,
TRUE ) );
- printf("***************************** FIXME: SAVE NEW STATE *******\n");
goto egress;
abort_egress:
@@ -181,7 +183,7 @@ TPM_RESULT VTPM_Init_Manager() {
TPM_RESULT VTPM_Init_Manager() {
TPM_RESULT status = TPM_FAIL, serviceStatus;
BYTE *randomsead;
- UINT32 randomsize;
+ UINT32 randomsize=256;
if ((vtpm_globals = (VTPM_GLOBALS *) malloc(sizeof(VTPM_GLOBALS))) == NULL){
status = TPM_FAIL;
diff -r e236794915cc -r 533b0709a68f tools/vtpm_manager/tcs/transmit.c
--- a/tools/vtpm_manager/tcs/transmit.c Tue Jun 27 11:05:39 2006 +0100
+++ b/tools/vtpm_manager/tcs/transmit.c Tue Jun 27 11:13:24 2006 +0100
@@ -43,7 +43,17 @@
// flag to track whether TDDL has been opened
static int g_TDDL_open = 0;
-static int g_fd = -1; // the fd to the TPM
+static int g_tx_fd = -1; // the fd to the TPM
+
+#ifndef DUMMY_TPM
+ #define TPM_TX_FNAME "/dev/tpm0"
+ static int *g_rx_fdp = &g_tx_fd;
+#else
+ #define TPM_TX_FNAME "/tmp/tpm_in.fifo"
+ #define TPM_RX_FNAME "/tmp/tpm_out.fifo"
+ static int g_rx_fd = -1;
+ static int *g_rx_fdp = &g_rx_fd; // the fd to the TPM
+#endif
TPM_RESULT
TDDL_TransmitData( TDDL_BYTE* in,
@@ -60,10 +70,9 @@ TDDL_TransmitData( TDDL_BYTE* in,
vtpmloginfomore(VTPM_LOG_TXDATA, "\n");
ssize_t size = 0;
- int fd = g_fd;
// send the request
- size = write (fd, in, insize);
+ size = write (g_tx_fd, in, insize);
if (size < 0) {
vtpmlogerror(VTPM_LOG_TXDATA, "write() failed");
ERRORDIE (TPM_IOERROR);
@@ -74,7 +83,7 @@ TDDL_TransmitData( TDDL_BYTE* in,
}
// read the response
- size = read (fd, out, TCPA_MAX_BUFFER_LENGTH);
+ size = read (*g_rx_fdp, out, TCPA_MAX_BUFFER_LENGTH);
if (size < 0) {
vtpmlogerror(VTPM_LOG_TXDATA, "read() failed");
ERRORDIE (TPM_IOERROR);
@@ -98,18 +107,20 @@ TPM_RESULT TDDL_Open() {
TPM_RESULT TDDL_Open() {
TDDL_RESULT status = TDDL_SUCCESS;
- int fd = -1;
if (g_TDDL_open)
return TPM_FAIL;
-
- fd = open ("/dev/tpm0", O_RDWR);
- if (fd < 0) {
+
+#ifdef DUMMY_TPM
+ *g_rx_fdp = open (TPM_RX_FNAME, O_RDWR);
+#endif
+
+ g_tx_fd = open (TPM_TX_FNAME, O_RDWR);
+ if (g_tx_fd < 0) {
vtpmlogerror(VTPM_LOG_TXDATA, "TPM open failed");
return TPM_IOERROR;
}
- g_fd = fd;
g_TDDL_open = 1;
return status;
@@ -119,13 +130,18 @@ void TDDL_Close() {
if (! g_TDDL_open)
return;
- if (g_fd>= 0) {
- if (close(g_fd) < 0)
+ if (g_tx_fd>= 0) {
+ if (close(g_tx_fd) < 0)
vtpmlogerror(VTPM_LOG_TXDATA, "closeing tpm failed");
-
- g_fd = -1;
+ g_tx_fd = -1;
}
+ if (*g_rx_fdp>= 0) {
+ if (close(*g_rx_fdp) < 0)
+ vtpmlogerror(VTPM_LOG_TXDATA, "closeing tpm failed");
+ *g_rx_fdp = -1;
+ }
+
g_TDDL_open = 0;
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|