[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] VTPM_TOOLS: Updated vtpm for new release of tpm_emulator 0.4, and set



# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID 6b08035e10c516c5b9ecd4a449e27664edc973c6
# Parent  7d6f0791c650332306039a76617eaf10fc6a6b24
VTPM_TOOLS: Updated vtpm for new release of tpm_emulator 0.4, and set
up easier tracking of the emulator. Also fixed a few minor bugs in the
manager.

Signed-off-by: Vincent Scarlata <vincent.r.scarlata@xxxxxxxxx>
---
 tools/vtpm/tpm_emulator-0.3-x86_64.patch          |  657 -----------
 tools/vtpm/Makefile                               |   43 
 tools/vtpm/tpm_emulator.patch                     | 1284 ++++++++++------------
 tools/vtpm/vtpm.patch                             | 1134 +++----------------
 tools/vtpm_manager/manager/dmictl.c               |    3 
 tools/vtpm_manager/manager/vtpm_manager_handler.c |    3 
 tools/vtpm_manager/manager/vtpmd.c                |    2 
 tools/vtpm_manager/tcs/tcs.c                      |    3 
 tools/vtpm_manager/tcs/transmit.c                 |    4 
 9 files changed, 870 insertions(+), 2263 deletions(-)

diff -r 7d6f0791c650 -r 6b08035e10c5 tools/vtpm/Makefile
--- a/tools/vtpm/Makefile       Tue Jul 25 11:19:48 2006 +0100
+++ b/tools/vtpm/Makefile       Tue Jul 25 11:30:30 2006 +0100
@@ -7,9 +7,11 @@ TPM_EMULATOR_DIR = tpm_emulator
 TPM_EMULATOR_DIR = tpm_emulator
 # Dir name for vtpm instance
 VTPM_DIR = vtpm
+ORIG_DIR = orig
 
 # Emulator tarball name
-TPM_EMULATOR_TARFILE = tpm_emulator-0.3.tar.gz
+TPM_EMULATOR_NAME = tpm_emulator-0.4
+TPM_EMULATOR_TARFILE = $(TPM_EMULATOR_NAME).tar.gz
 
 GMP_HEADER = /usr/include/gmp.h
 
@@ -17,7 +19,7 @@ all: build
 all: build
 
 .PHONY: build
-build: $(TPM_EMULATOR_DIR) $(VTPM_DIR) build_sub
+build: $(VTPM_DIR) $(TPM_EMULATOR_DIR) build_sub
 
 .PHONY: install
 install: build
@@ -37,9 +39,8 @@ clean:
 
 .PHONY: mrproper
 mrproper:
-       rm -f $(TPM_EMULATOR_TARFILE)
-       rm -rf $(TPM_EMULATOR_DIR)
-       rm -rf $(VTPM_DIR)
+       rm -f $(TPM_EMULATOR_TARFILE) tpm_emulator.patch.old vtpm.patch.old
+       rm -rf $(TPM_EMULATOR_DIR) $(VTPM_DIR) $(ORIG_DIR)
 
 # Download Swiss emulator
 $(TPM_EMULATOR_TARFILE):
@@ -47,24 +48,38 @@ mrproper:
 
 # Create vtpm and TPM emulator dirs
 # apply patches for 1) used as dom0 tpm driver 2) used as vtpm device instance
-$(TPM_EMULATOR_DIR): $(TPM_EMULATOR_TARFILE) tpm_emulator.patch 
tpm_emulator-0.3-x86_64.patch
+$(TPM_EMULATOR_DIR): $(TPM_EMULATOR_TARFILE) tpm_emulator.patch 
        if [ "$(BUILD_EMULATOR)" = "y" ]; then \
+               rm -rf $(TPM_EMULATOR_DIR); \
                tar -xzf $(TPM_EMULATOR_TARFILE); \
-               rm -rf $(TPM_EMULATOR_DIR); \
-               mv tpm_emulator-0.3 $(TPM_EMULATOR_DIR); \
+               mv $(TPM_EMULATOR_NAME) $(TPM_EMULATOR_DIR); \
                cd $(TPM_EMULATOR_DIR); \
-               patch -p1 < ../tpm_emulator-0.3-x86_64.patch; \
                patch -p1 <../tpm_emulator.patch; \
        fi
 
-$(VTPM_DIR): $(TPM_EMULATOR_TARFILE) tpm_emulator-0.3-x86_64.patch vtpm.patch
+$(VTPM_DIR): $(TPM_EMULATOR_TARFILE) vtpm.patch
+       rm -rf $(VTPM_DIR)
        tar -xzf $(TPM_EMULATOR_TARFILE);  
-       rm -rf $(VTPM_DIR)
-       mv tpm_emulator-0.3 $(VTPM_DIR); 
+       mv $(TPM_EMULATOR_NAME) $(VTPM_DIR); 
 
        cd $(VTPM_DIR); \
-       patch -p1 < ../tpm_emulator-0.3-x86_64.patch; \
-       patch -p1 <../vtpm.patch
+       patch -p1 < ../tpm_emulator.patch; \
+       patch -p1 < ../vtpm.patch
+
+orig: $(TPM_EMULATOR_TARFILE)
+       mkdir $(ORIG_DIR);
+       cd $(ORIG_DIR); \
+       tar -xzf ../$(TPM_EMULATOR_TARFILE);
+
+updatepatches: clean orig
+       if [ "$(BUILD_EMULATOR)" = "y" ]; then \
+               find $(TPM_EMULATOR_DIR) -name "*.orig" -print | xargs rm -f; \
+               mv tpm_emulator.patch tpm_emulator.patch.old; \
+               diff -uprN orig/$(TPM_EMULATOR_NAME) $(TPM_EMULATOR_DIR) > 
tpm_emulator.patch || true; \
+        fi; 
+       find $(VTPM_DIR) -name "*.orig" -print | xargs rm -f; 
+       mv vtpm.patch vtpm.patch.old; 
+       diff -uprN $(TPM_EMULATOR_DIR) $(VTPM_DIR) > vtpm.patch || true;
 
 .PHONY: build_sub
 build_sub:
diff -r 7d6f0791c650 -r 6b08035e10c5 tools/vtpm/tpm_emulator.patch
--- a/tools/vtpm/tpm_emulator.patch     Tue Jul 25 11:19:48 2006 +0100
+++ b/tools/vtpm/tpm_emulator.patch     Tue Jul 25 11:30:30 2006 +0100
@@ -1,136 +1,23 @@ diff -uprN tpm_emulator-0.3-x86_64/AUTHO
-diff -uprN tpm_emulator-0.3-x86_64/AUTHORS tpm_emulator/AUTHORS
---- tpm_emulator-0.3-x86_64/AUTHORS    2006-08-29 15:07:21.618299064 -0700
-+++ tpm_emulator/AUTHORS       2006-08-29 15:26:17.099679656 -0700
+diff -uprN orig/tpm_emulator-0.4/AUTHORS tpm_emulator/AUTHORS
+--- orig/tpm_emulator-0.4/AUTHORS      2006-06-23 03:37:07.000000000 -0700
++++ tpm_emulator/AUTHORS       2006-07-24 14:35:35.000000000 -0700
 @@ -1,2 +1,3 @@
  Mario Strasser <mast@xxxxxxx>
  Heiko Stamer <stamer@xxxxxxxx> [DAA]
 +INTEL Corp <> [Dropped to Ring3]
-diff -uprN tpm_emulator-0.3-x86_64/ChangeLog tpm_emulator/ChangeLog
---- tpm_emulator-0.3-x86_64/ChangeLog  2006-08-29 15:07:21.618299064 -0700
-+++ tpm_emulator/ChangeLog     2006-08-29 15:26:17.100679504 -0700
+diff -uprN orig/tpm_emulator-0.4/ChangeLog tpm_emulator/ChangeLog
+--- orig/tpm_emulator-0.4/ChangeLog    2006-06-23 03:37:07.000000000 -0700
++++ tpm_emulator/ChangeLog     2006-07-24 14:35:35.000000000 -0700
 @@ -1,3 +1,6 @@
-+2005-08-16 Intel Corp
++????-??-?? 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 tpm_emulator-0.3-x86_64/Makefile tpm_emulator/Makefile
---- tpm_emulator-0.3-x86_64/Makefile   2006-08-29 15:08:20.532342768 -0700
-+++ tpm_emulator/Makefile      2006-08-29 15:27:39.559143912 -0700
-@@ -1,22 +1,31 @@
- # Software-Based Trusted Platform Module (TPM) Emulator for Linux
- # Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>
-+# Copyright (C) 2006 INTEL Corp.
- #
- # $Id: Makefile 69 2005-12-13 12:55:52Z mast $
- 
--# kernel settings
--KERNEL_RELEASE := $(shell uname -r)
--KERNEL_BUILD   := /lib/modules/$(KERNEL_RELEASE)/build
--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  := 3
- VERSION_BUILD  := $(shell date +"%s")
- 
--# 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))
--DISTSRC        := ./README ./AUTHORS ./ChangeLog ./Makefile $(SRCS)
--DISTDIR        := tpm_emulator-$(VERSION_MAJOR).$(VERSION_MINOR)
- 
--obj-m               := $(MODULE_NAME).o
--$(MODULE_NAME)-objs := $(patsubst $(src)/%.o, %.o, $(OBJS)) crypto/libgmp.a
-+obj-m               := $(BIN)
-+$(BIN)-objs := $(patsubst $(src)/%.o, %.o, $(OBJS)) crypto/libgmp.a
- 
- EXTRA_CFLAGS   += -I$(src) -I$(src)/crypto -I$(src)/tpm 
- 
- # 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
--      test -d /var/tpm || mkdir /var/tpm
--      test -c /dev/tpm || mknod /dev/tpm c 10 224
--      chmod 666 /dev/tpm
--      depmod -a
-+install: $(BIN)
-+      $(INSTALL_PROG) $(BIN) $(TOOLS_INSTALL_DIR)
- 
- clean:
--      @$(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)
--      mkdir $(DISTDIR)
--      cp --parents $(DISTSRC) $(DISTDIR)/
--      rm -f $(DISTDIR)/crypto/gmp.h 
--      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 tpm_emulator-0.3-x86_64/README tpm_emulator/README
---- tpm_emulator-0.3-x86_64/README     2006-08-29 15:07:43.530967832 -0700
-+++ tpm_emulator/README        2006-08-29 15:26:17.105678744 -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 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 tpm_emulator-0.3-x86_64/README.1st tpm_emulator/README.1st
---- tpm_emulator-0.3-x86_64/README.1st 1969-12-31 16:00:00.000000000 -0800
-+++ tpm_emulator/README.1st    2006-08-29 15:26:17.105678744 -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 tpm_emulator-0.3-x86_64/crypto/gmp_kernel_wrapper.c 
tpm_emulator/crypto/gmp_kernel_wrapper.c
---- tpm_emulator-0.3-x86_64/crypto/gmp_kernel_wrapper.c        2006-08-29 
15:07:43.525968592 -0700
-+++ tpm_emulator/crypto/gmp_kernel_wrapper.c   2006-08-29 15:26:17.101679352 
-0700
+ 2006-06-23  Mario Strasser <mast@xxxxxxx>
+       * tpm_startup.c: behaviour of ST_CLEAR and storage of
+               persistent data adapted
+diff -uprN orig/tpm_emulator-0.4/crypto/gmp_kernel_wrapper.c 
tpm_emulator/crypto/gmp_kernel_wrapper.c
+--- orig/tpm_emulator-0.4/crypto/gmp_kernel_wrapper.c  2006-06-23 
03:37:07.000000000 -0700
++++ tpm_emulator/crypto/gmp_kernel_wrapper.c   2006-07-24 14:35:35.000000000 
-0700
 @@ -1,5 +1,6 @@
  /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
   * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
@@ -161,7 +48,7 @@ diff -uprN tpm_emulator-0.3-x86_64/crypt
  {
 -  void *ret  = (void*)kmalloc(size, GFP_KERNEL);
 -  if (!ret) panic(KERN_CRIT TPM_MODULE_NAME 
--    "GMP: cannot allocate memory (size=%Zu)\n", size);
+-    "GMP: cannot allocate memory (size=%u)\n", size);
 +  void *ret  = (void*)malloc(size);
 +  if (!ret) error("GMP: cannot allocate memory (size=%Zu)\n", size);
    return ret;
@@ -172,9 +59,10 @@ diff -uprN tpm_emulator-0.3-x86_64/crypt
  {
 -  void *ret = (void*)kmalloc(new_size, GFP_KERNEL);
 -  if (!ret) panic(KERN_CRIT TPM_MODULE_NAME "GMP: Cannot reallocate memory "
+-    "(old_size=%u new_size=%u)\n", old_size, new_size);
 +  void *ret = (void*)malloc(new_size);
 +  if (!ret) error("GMP: Cannot reallocate memory "
-     "(old_size=%Zu new_size=%Zu)\n", old_size, new_size);
++    "(old_size=%Zu new_size=%Zu)\n", old_size, new_size);
    memcpy(ret, oldptr, old_size);
 -  kfree(oldptr);
 +  free(oldptr);
@@ -190,9 +78,9 @@ diff -uprN tpm_emulator-0.3-x86_64/crypt
    }
  }
  
-diff -uprN tpm_emulator-0.3-x86_64/crypto/rsa.c tpm_emulator/crypto/rsa.c
---- tpm_emulator-0.3-x86_64/crypto/rsa.c       2006-08-29 15:07:21.618299064 
-0700
-+++ tpm_emulator/crypto/rsa.c  2006-08-29 15:26:17.102679200 -0700
+diff -uprN orig/tpm_emulator-0.4/crypto/rsa.c tpm_emulator/crypto/rsa.c
+--- orig/tpm_emulator-0.4/crypto/rsa.c 2006-06-23 03:37:07.000000000 -0700
++++ tpm_emulator/crypto/rsa.c  2006-07-24 14:35:35.000000000 -0700
 @@ -1,5 +1,6 @@
  /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
   * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
@@ -218,10 +106,10 @@ diff -uprN tpm_emulator-0.3-x86_64/crypt
        sha1_final(&ctx, &msg[1]);
        if (memcmp(&msg[1], &msg[1 + SHA1_DIGEST_LENGTH], 
            SHA1_DIGEST_LENGTH) != 0) return -1;
-diff -uprN tpm_emulator-0.3-x86_64/linux_module.c tpm_emulator/linux_module.c
---- tpm_emulator-0.3-x86_64/linux_module.c     2006-08-29 15:07:43.526968440 
-0700
+diff -uprN orig/tpm_emulator-0.4/linux_module.c tpm_emulator/linux_module.c
+--- orig/tpm_emulator-0.4/linux_module.c       2006-06-23 03:37:07.000000000 
-0700
 +++ tpm_emulator/linux_module.c        1969-12-31 16:00:00.000000000 -0800
-@@ -1,194 +0,0 @@
+@@ -1,195 +0,0 @@
 -/* Software-Based Trusted Platform Module (TPM) Emulator for Linux 
 - * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
 - *
@@ -235,7 +123,7 @@ diff -uprN tpm_emulator-0.3-x86_64/linux
 - * 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 $
+- * $Id: linux_module.c 91 2006-03-13 13:51:41Z mast $
 - */
 -
 -#include <linux/module.h>
@@ -273,6 +161,7 @@ diff -uprN tpm_emulator-0.3-x86_64/linux
 -/* module state */
 -#define STATE_IS_OPEN 0
 -static uint32_t module_state;
+-static struct timespec old_time;
 -
 -static int tpm_open(struct inode *inode, struct file *file)
 -{
@@ -296,7 +185,7 @@ diff -uprN tpm_emulator-0.3-x86_64/linux
 -
 -static ssize_t tpm_read(struct file *file, char *buf, size_t count, loff_t 
*ppos)
 -{
--  debug("%s(%Zu)", __FUNCTION__, count);
+-  debug("%s(%d)", __FUNCTION__, count);
 -  down(&tpm_mutex);
 -  if (tpm_response.data != NULL) {
 -    count = min(count, (size_t)tpm_response.size - (size_t)*ppos);
@@ -315,7 +204,7 @@ diff -uprN tpm_emulator-0.3-x86_64/linux
 -
 -static ssize_t tpm_write(struct file *file, const char *buf, size_t count, 
loff_t *ppos)
 -{
--  debug("%s(%Zu)", __FUNCTION__, count);
+-  debug("%s(%d)", __FUNCTION__, count);
 -  down(&tpm_mutex);
 -  *ppos = 0;
 -  if (tpm_response.data != NULL) kfree(tpm_response.data);
@@ -379,7 +268,8 @@ diff -uprN tpm_emulator-0.3-x86_64/linux
 -  /* initialize variables */
 -  sema_init(&tpm_mutex, 1);
 -  module_state = 0;
--  tpm_response.data = NULL;    
+-  tpm_response.data = NULL;
+-  old_time = current_kernel_time();
 -  /* initialize TPM emulator */
 -  if (!strcmp(startup, "clear")) {
 -    tpm_emulator_init(1);
@@ -408,17 +298,16 @@ diff -uprN tpm_emulator-0.3-x86_64/linux
 -
 -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;
+-  uint64_t ticks = (uint64_t)(new_time.tv_sec - old_time.tv_sec) * 1000000
+-                   + (new_time.tv_nsec - old_time.tv_nsec) / 1000;
 -  old_time = new_time;
 -  return (ticks > 0) ? ticks : 1;
 -}
 -
-diff -uprN tpm_emulator-0.3-x86_64/linux_module.h tpm_emulator/linux_module.h
---- tpm_emulator-0.3-x86_64/linux_module.h     2006-08-29 15:07:43.527968288 
-0700
-+++ tpm_emulator/linux_module.h        2006-08-29 15:26:17.103679048 -0700
+diff -uprN orig/tpm_emulator-0.4/linux_module.h tpm_emulator/linux_module.h
+--- orig/tpm_emulator-0.4/linux_module.h       2006-06-23 03:37:07.000000000 
-0700
++++ tpm_emulator/linux_module.h        2006-07-24 14:35:35.000000000 -0700
 @@ -1,5 +1,6 @@
  /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
   * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
@@ -426,7 +315,7 @@ diff -uprN tpm_emulator-0.3-x86_64/linux
   *
   * 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 @@
+@@ -17,54 +18,62 @@
  #ifndef _LINUX_MODULE_H_
  #define _LINUX_MODULE_H_
  
@@ -454,12 +343,15 @@ diff -uprN tpm_emulator-0.3-x86_64/linux
  
 +/* module settings */
 +#define min(A,B) ((A)<(B)?(A):(B))
- #ifndef STR
++#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"
++#endif
+ #include "tpm_version.h"
+ 
+ #define TPM_DEVICE_MINOR  224
+ #define TPM_DEVICE_NAME   "tpm"
+ #define TPM_MODULE_NAME   "tpm_emulator"
  
 -/* debug and log output functions */
 -
@@ -506,7 +398,7 @@ diff -uprN tpm_emulator-0.3-x86_64/linux
  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);
+@@ -84,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)
@@ -518,205 +410,242 @@ diff -uprN tpm_emulator-0.3-x86_64/linux
  #define BE16_TO_CPU(x) __be16_to_cpu(x)
  #define LE16_TO_CPU(x) __le16_to_cpu(x)
  
-diff -uprN tpm_emulator-0.3-x86_64/tpm/tpm_audit.c tpm_emulator/tpm/tpm_audit.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_audit.c    2006-08-29 15:07:21.620298760 
-0700
-+++ tpm_emulator/tpm/tpm_audit.c       2006-08-29 15:26:17.107678440 -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
-@@ -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_
+diff -uprN orig/tpm_emulator-0.4/Makefile tpm_emulator/Makefile
+--- orig/tpm_emulator-0.4/Makefile     2006-06-23 03:37:07.000000000 -0700
++++ tpm_emulator/Makefile      2006-07-24 14:35:35.000000000 -0700
+@@ -1,24 +1,40 @@
+ # Software-Based Trusted Platform Module (TPM) Emulator for Linux
+ # Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>
++# Copyright (C) 2006 INTEL Corp.
+ #
+ # $Id: Makefile 115 2006-06-23 10:36:44Z mast $
+ 
+-# kernel settings
+-KERNEL_RELEASE := $(shell uname -r)
+-KERNEL_BUILD   := /lib/modules/$(KERNEL_RELEASE)/build
+-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  := 4
+ VERSION_BUILD  := $(shell date +"%s")
+ 
+-# 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
++else
++LIBDIR = lib
++endif
+ 
+ # GNU MP configuration
+-GMP_LIB        := /usr/lib/libgmp.a
++GMP_LIB        := /usr/$(LIBDIR)/libgmp.a
+ GMP_HEADER     := /usr/include/gmp.h
+ 
+ # sources and objects
+@@ -27,38 +43,32 @@ DIRS           := . crypto tpm 
+ SRCS           := $(foreach dir, $(DIRS), $(wildcard $(src)/$(dir)/*.c))
+ OBJS           := $(patsubst %.c, %.o, $(SRCS))
+ SRCS           += $(foreach dir, $(DIRS), $(wildcard $(src)/$(dir)/*.h))
+-DISTSRC        := ./README ./AUTHORS ./ChangeLog ./Makefile $(SRCS)
+-DISTDIR        := tpm_emulator-$(VERSION_MAJOR).$(VERSION_MINOR)
+ 
+-obj-m               := $(MODULE_NAME).o
+-$(MODULE_NAME)-objs := $(patsubst $(src)/%.o, %.o, $(OBJS)) crypto/libgmp.a
++obj-m               := $(BIN)
++$(BIN)-objs := $(patsubst $(src)/%.o, %.o, $(OBJS)) crypto/libgmp.a
+ 
+ EXTRA_CFLAGS   += -I$(src) -I$(src)/crypto -I$(src)/tpm 
+ 
+ # 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)
+ 
+-install:
+-      @$(MAKE) -C $(KERNEL_BUILD) M=$(CURDIR) modules_install
+-      test -d /var/tpm || mkdir /var/tpm
+-      test -c /dev/tpm || mknod /dev/tpm c 10 224
+-      chmod 666 /dev/tpm
+-      depmod -a
++$(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: $(BIN)
++      $(INSTALL_PROG) $(BIN) $(TOOLS_INSTALL_DIR)
++      @if [ ! -d "/var/tpm" ]; then mkdir /var/tpm; fi
+ 
+ clean:
+-      @$(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)
+-      mkdir $(DISTDIR)
+-      cp --parents $(DISTSRC) $(DISTDIR)/
+-      rm -f $(DISTDIR)/crypto/gmp.h 
+-      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
+@@ -88,4 +98,3 @@ version:
+       @echo "#endif /* _TPM_VERSION_H_ */" >> $(src)/tpm_version.h
+ 
+ .PHONY: all install clean dist gmp version
+-
+diff -uprN orig/tpm_emulator-0.4/README tpm_emulator/README
+--- orig/tpm_emulator-0.4/README       2006-06-23 03:37:07.000000000 -0700
++++ tpm_emulator/README        2006-07-24 14:35:35.000000000 -0700
+@@ -13,7 +13,8 @@ $Id: README 113 2006-06-18 12:38:13Z hst
+ Copyright
+ --------------------------------------------------------------------------
+ Copyright (C) 2004 Mario Strasser <mast@xxxxxxx> and Swiss Federal 
+-Institute of Technology (ETH) Zurich.
++                   Institute of Technology (ETH) Zurich.
++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
+@@ -43,6 +44,12 @@ Example:
+ GMP_LIB        := /usr/lib/libgmp.a
+ GMP_HEADER     := /usr/include/gmp.h
+ 
++GNU MP Library on 64 bit Systems
++--------------------------------------------------------------------------
++Some 64-bit kernels have problems with importing the user-space gmp 
++library (/usr/lib*/libgmp.a) into kernel space.  These kernels will require
++that the gmp library be recompiled for kernel space with -mcmodel=kernel.
++
+ Installation
+ --------------------------------------------------------------------------
+ The compilation and installation process uses the build environment for 
+diff -uprN orig/tpm_emulator-0.4/tpm/tpm_credentials.c 
tpm_emulator/tpm/tpm_credentials.c
+--- orig/tpm_emulator-0.4/tpm/tpm_credentials.c        2006-06-23 
03:37:07.000000000 -0700
++++ tpm_emulator/tpm/tpm_credentials.c 2006-07-24 14:35:35.000000000 -0700
+@@ -47,16 +47,16 @@ int tpm_compute_pubkey_checksum(TPM_NONC
+ 
+ TPM_RESULT tpm_get_pubek(TPM_PUBKEY *pubEndorsementKey)
+ {
+-  UINT32 key_length;
++  size_t key_length;
+   if (!tpmData.permanent.data.endorsementKey.size) return TPM_NO_ENDORSEMENT;
+   /* setup TPM_PUBKEY structure */
+-  key_length = tpmData.permanent.data.endorsementKey.size;
+-  pubEndorsementKey->pubKey.keyLength = key_length >> 3;
++  pubEndorsementKey->pubKey.keyLength = 
tpmData.permanent.data.endorsementKey.size >> 3;
+   pubEndorsementKey->pubKey.key = 
tpm_malloc(pubEndorsementKey->pubKey.keyLength);
+   if (pubEndorsementKey->pubKey.key == NULL) return TPM_FAIL;
+   rsa_export_modulus(&tpmData.permanent.data.endorsementKey,
+-    pubEndorsementKey->pubKey.key,
+-    &pubEndorsementKey->pubKey.keyLength);
++                   pubEndorsementKey->pubKey.key,
++                   &key_length);
++  pubEndorsementKey->pubKey.keyLength = key_length;
+   pubEndorsementKey->algorithmParms.algorithmID = TPM_ALG_RSA;
+   pubEndorsementKey->algorithmParms.encScheme = TPM_ES_RSAESOAEP_SHA1_MGF1;
+   pubEndorsementKey->algorithmParms.sigScheme = TPM_SS_NONE;
+@@ -175,6 +175,7 @@ TPM_RESULT TPM_OwnerReadInternalPub(TPM_
+ {
+   TPM_RESULT res;
+   TPM_KEY_DATA *srk = &tpmData.permanent.data.srk;
++  size_t key_length;
+   info("TPM_OwnerReadInternalPub()");
+   /* verify authorization */
+   res = tpm_verify_auth(auth1, tpmData.permanent.data.ownerAuth, 
TPM_KH_OWNER);
+@@ -186,7 +187,8 @@ TPM_RESULT TPM_OwnerReadInternalPub(TPM_
+     publicPortion->pubKey.key = tpm_malloc(publicPortion->pubKey.keyLength);
+     if (publicPortion->pubKey.key == NULL) return TPM_FAIL;
+     rsa_export_modulus(&srk->key, publicPortion->pubKey.key, 
+-      &publicPortion->pubKey.keyLength);
++      &key_length);
++    publicPortion->pubKey.keyLength = key_length;
+     publicPortion->algorithmParms.algorithmID = TPM_ALG_RSA;
+     publicPortion->algorithmParms.encScheme = srk->encScheme;
+     publicPortion->algorithmParms.sigScheme = srk->sigScheme;
+diff -uprN orig/tpm_emulator-0.4/tpm/tpm_crypto.c tpm_emulator/tpm/tpm_crypto.c
+--- orig/tpm_emulator-0.4/tpm/tpm_crypto.c     2006-06-23 03:37:07.000000000 
-0700
++++ tpm_emulator/tpm/tpm_crypto.c      2006-07-24 14:35:35.000000000 -0700
+@@ -182,7 +182,8 @@ TPM_RESULT TPM_CertifyKey(TPM_KEY_HANDLE
+   TPM_KEY_DATA *cert, *key;
+   sha1_ctx_t sha1_ctx;
+   BYTE *buf, *p;
+-  UINT32 length;
++  UINT32 length32;
++  size_t length;
+   info("TPM_CertifyKey()");
+   /* get keys */
+   cert = tpm_get_key(certHandle);
+@@ -264,14 +265,15 @@ TPM_RESULT TPM_CertifyKey(TPM_KEY_HANDLE
+   /* compute the digest of the CERTIFY_INFO[2] structure and sign it */
+   length = sizeof_TPM_CERTIFY_INFO((*certifyInfo));
+   p = buf = tpm_malloc(length);
++  length32=(UINT32) length;
+   if (buf == NULL
+-      || tpm_marshal_TPM_CERTIFY_INFO(&p, &length, certifyInfo)) {
++      || tpm_marshal_TPM_CERTIFY_INFO(&p, &length32, certifyInfo)) {
+     free_TPM_KEY_PARMS(certifyInfo->algorithmParms);
+     return TPM_FAIL;
    }
-   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
+   length = sizeof_TPM_CERTIFY_INFO((*certifyInfo));
+   sha1_init(&sha1_ctx);
+-  sha1_update(&sha1_ctx, buf, length);
++  sha1_update(&sha1_ctx, buf, (size_t) length);
+   sha1_final(&sha1_ctx, buf);
+   res = tpm_sign(cert, auth1, FALSE, buf, SHA1_DIGEST_LENGTH, outData, 
outDataSize);
+   tpm_free(buf);
+@@ -292,7 +294,8 @@ TPM_RESULT TPM_CertifyKey2(TPM_KEY_HANDL
+   TPM_KEY_DATA *cert, *key;
+   sha1_ctx_t sha1_ctx;
+   BYTE *buf, *p;
+-  UINT32 length;
++  size_t length;
++  UINT32 length32;
+   info("TPM_CertifyKey2()");
+   /* get keys */
+   cert = tpm_get_key(certHandle);
+@@ -362,8 +365,9 @@ TPM_RESULT TPM_CertifyKey2(TPM_KEY_HANDL
+   /* compute the digest of the CERTIFY_INFO[2] structure and sign it */
+   length = sizeof_TPM_CERTIFY_INFO((*certifyInfo));
+   p = buf = tpm_malloc(length);
++  length32 = (UINT32) length;
+   if (buf == NULL
+-      || tpm_marshal_TPM_CERTIFY_INFO(&p, &length, certifyInfo)) {
++      || tpm_marshal_TPM_CERTIFY_INFO(&p, &length32, certifyInfo)) {
+     free_TPM_KEY_PARMS(certifyInfo->algorithmParms);
+     return TPM_FAIL;
    }
-   return TPM_SUCCESS;
- }
--
-diff -uprN tpm_emulator-0.3-x86_64/tpm/tpm_authorization.c 
tpm_emulator/tpm/tpm_authorization.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_authorization.c    2006-08-29 
15:07:21.620298760 -0700
-+++ tpm_emulator/tpm/tpm_authorization.c       2006-08-29 15:26:17.108678288 
-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 tpm_emulator-0.3-x86_64/tpm/tpm_capability.c 
tpm_emulator/tpm/tpm_capability.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_capability.c       2006-08-29 
15:07:21.620298760 -0700
-+++ tpm_emulator/tpm/tpm_capability.c  2006-08-29 15:26:17.109678136 -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 tpm_emulator-0.3-x86_64/tpm/tpm_cmd_handler.c 
tpm_emulator/tpm/tpm_cmd_handler.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_cmd_handler.c      2006-08-29 
15:07:21.621298608 -0700
-+++ tpm_emulator/tpm/tpm_cmd_handler.c 2006-08-29 15:26:17.113677528 -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 tpm_emulator-0.3-x86_64/tpm/tpm_crypto.c 
tpm_emulator/tpm/tpm_crypto.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_crypto.c   2006-08-29 15:07:43.531967680 
-0700
-+++ tpm_emulator/tpm/tpm_crypto.c      2006-08-29 15:26:17.114677376 -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 tpm_emulator-0.3-x86_64/tpm/tpm_daa.c tpm_emulator/tpm/tpm_daa.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_daa.c      2006-08-29 15:07:21.622298456 
-0700
-+++ tpm_emulator/tpm/tpm_daa.c 2006-08-29 15:26:17.119676616 -0700
-@@ -700,14 +700,14 @@ info("tested until here");
+diff -uprN orig/tpm_emulator-0.4/tpm/tpm_daa.c tpm_emulator/tpm/tpm_daa.c
+--- orig/tpm_emulator-0.4/tpm/tpm_daa.c        2006-06-23 03:37:07.000000000 
-0700
++++ tpm_emulator/tpm/tpm_daa.c 2006-07-24 14:35:35.000000000 -0700
+@@ -716,14 +716,14 @@ TPM_RESULT TPM_DAA_Join(TPM_HANDLE handl
            sizeof(session->DAA_tpmSpecific.DAA_rekey));
        sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count, 
            sizeof(session->DAA_tpmSpecific.DAA_count));
@@ -733,7 +662,7 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
        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");
+@@ -805,14 +805,14 @@ TPM_RESULT TPM_DAA_Join(TPM_HANDLE handl
            sizeof(session->DAA_tpmSpecific.DAA_rekey));
        sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count, 
            sizeof(session->DAA_tpmSpecific.DAA_count));
@@ -750,7 +679,7 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
        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");
+@@ -1489,14 +1489,14 @@ TPM_RESULT TPM_DAA_Join(TPM_HANDLE handl
            sizeof(session->DAA_tpmSpecific.DAA_rekey));
        sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count, 
            sizeof(session->DAA_tpmSpecific.DAA_count));
@@ -767,7 +696,7 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
        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");
+@@ -1712,14 +1712,14 @@ TPM_RESULT TPM_DAA_Join(TPM_HANDLE handl
            sizeof(session->DAA_tpmSpecific.DAA_rekey));
        sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count, 
            sizeof(session->DAA_tpmSpecific.DAA_count));
@@ -784,7 +713,7 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
        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");
+@@ -1793,14 +1793,14 @@ TPM_RESULT TPM_DAA_Join(TPM_HANDLE handl
            sizeof(session->DAA_tpmSpecific.DAA_rekey));
        sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count, 
            sizeof(session->DAA_tpmSpecific.DAA_count));
@@ -801,7 +730,7 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
        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
+@@ -2918,14 +2918,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));
@@ -818,7 +747,7 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
        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
+@@ -3143,7 +3143,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));
@@ -827,16 +756,16 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
          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
+@@ -3172,7 +3172,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, "\x00", 1);
++        sha1_update(&sha1, (BYTE*) "\x00", 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
+@@ -3229,14 +3229,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));
@@ -853,7 +782,7 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
        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
+@@ -3309,14 +3309,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));
@@ -870,10 +799,27 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
        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 tpm_emulator-0.3-x86_64/tpm/tpm_data.c tpm_emulator/tpm/tpm_data.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_data.c     2006-08-29 15:08:20.535342312 
-0700
-+++ tpm_emulator/tpm/tpm_data.c        2006-08-29 15:26:17.121676312 -0700
-@@ -150,44 +150,43 @@ void tpm_release_data(void)
+diff -uprN orig/tpm_emulator-0.4/tpm/tpm_data.c tpm_emulator/tpm/tpm_data.c
+--- orig/tpm_emulator-0.4/tpm/tpm_data.c       2006-06-23 03:37:07.000000000 
-0700
++++ tpm_emulator/tpm/tpm_data.c        2006-07-24 14:35:35.000000000 -0700
+@@ -40,6 +40,7 @@ static inline void init_pcr_attr(int pcr
+ void tpm_init_data(void)
+ {
+   /* endorsement key */
++#ifndef TPM_GENERATE_EK
+   uint8_t ek_n[] =  "\xa8\xdb\xa9\x42\xa8\xf3\xb8\x06\x85\x90\x76\x93\xad\xf7"
+     "\x74\xec\x3f\xd3\x3d\x9d\xe8\x2e\xff\x15\xed\x0e\xce\x5f\x93"
+     "\x92\xeb\xd1\x96\x2b\x72\x18\x81\x79\x12\x9d\x9c\x40\xd7\x1a"
+@@ -77,6 +78,8 @@ void tpm_init_data(void)
+     "\xd1\xc0\x8b\x5b\xa2\x2e\xa7\x15\xca\x50\x75\x10\x48\x9c\x2b"
+     "\x18\xb9\x67\x8f\x5d\x64\xc3\x28\x9f\x2f\x16\x2f\x08\xda\x47"
+     "\xec\x86\x43\x0c\x80\x99\x07\x34\x0f";
++#endif
++
+   int i;
+   /* reset all data to NULL, FALSE or 0 */
+   memset(&tpmData, 0, sizeof(tpmData));
+@@ -152,44 +155,43 @@ void tpm_release_data(void)
  
  #ifdef TPM_STORE_TO_FILE
  
@@ -939,306 +885,86 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
    if (res != *data_length) {
      tpm_free(*data);
      return -1;
-@@ -278,7 +277,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 tpm_emulator-0.3-x86_64/tpm/tpm_data.c.orig 
tpm_emulator/tpm/tpm_data.c.orig
---- tpm_emulator-0.3-x86_64/tpm/tpm_data.c.orig        1969-12-31 
16:00:00.000000000 -0800
-+++ tpm_emulator/tpm/tpm_data.c.orig   2006-08-29 15:26:08.469991568 -0700
-@@ -0,0 +1,284 @@
-+/* Software-Based Trusted Platform Module (TPM) Emulator for Linux
-+ * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
-+ *                    Swiss Federal Institute of Technology (ETH) Zurich
-+ *
-+ * 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: tpm_data.c 36 2005-10-26 20:31:19Z hstamer $
-+ */
-+
-+#include "tpm_emulator.h"
-+#include "tpm_structures.h"
-+#include "tpm_marshalling.h"
-+#include "linux_module.h"
-+
-+TPM_DATA tpmData;
-+
-+BOOL tpm_get_physical_presence(void)
-+{
-+  return (tpmData.stclear.flags.physicalPresence || TRUE);
-+}
-+
-+static inline void init_pcr_attr(int pcr, BOOL reset, BYTE rl, BYTE el)
-+{
-+  int i;
-+  tpmData.permanent.data.pcrAttrib[pcr].pcrReset = reset;
-+  for (i = 0; i < TPM_NUM_LOCALITY; i++) {
-+    tpmData.permanent.data.pcrAttrib[pcr].pcrResetLocal[i] = (rl & (1 << i));
-+    tpmData.permanent.data.pcrAttrib[pcr].pcrExtendLocal[i] = (el & (1 << i));
-+  }
-+}
-+
-+void tpm_init_data(void)
-+{
-+  /* endorsement key */
-+  uint8_t ek_n[] =  "\xa8\xdb\xa9\x42\xa8\xf3\xb8\x06\x85\x90\x76\x93\xad\xf7"
-+    "\x74\xec\x3f\xd3\x3d\x9d\xe8\x2e\xff\x15\xed\x0e\xce\x5f\x93"
-+    "\x92\xeb\xd1\x96\x2b\x72\x18\x81\x79\x12\x9d\x9c\x40\xd7\x1a"
-+    "\x21\xda\x5f\x56\xe0\xc9\x48\x31\xdd\x96\xdc\xbb\x45\xc6\x8e"
-+    "\xad\x58\x23\xcb\xbe\xbb\x13\x2d\x6b\x86\xc5\x57\xf5\xdd\x48"
-+    "\xc1\x3d\xcd\x4d\xda\x81\xc4\x43\x17\xaa\x05\x40\x33\x62\x0a"
-+    "\x59\xdb\x28\xcd\xb5\x08\x31\xbb\x06\xf5\xf7\x71\xae\x21\xa8"
-+    "\xf2\x2f\x0e\x17\x80\x5d\x9c\xdf\xaa\xe9\x89\x09\x54\x65\x2b"
-+    "\x46\xfb\x9d\xb2\x00\x70\x63\x0d\x9a\x6d\x3d\x5e\x11\x78\x65"
-+    "\x90\xe6\x26\xee\x77\xbe\x08\xff\x07\x60\x5a\xcc\xf1\x0a\xbd"
-+    "\x44\x92\x6b\xca\xb6\xce\x66\xf9\x93\x40\xae\xf3\x3e\x53\x02"
-+    "\x3c\xa6\x81\xb3\xbe\xad\x6e\x6c\xa6\xf0\xeb\xdf\xe9\xa2\x83"
-+    "\x36\x0e\x52\x0d\x64\x17\xd9\xff\xa1\x74\x7c\x2b\xbc\x6a\xcc"
-+    "\xe5\x4e\xb4\x52\xd9\xec\x43\xbd\x26\x6a\x2b\x19\x19\x6e\x97"
-+    "\xb8\x1d\x9f\x7b\xe7\x32\x2d\xdd\x7c\x51\xc8\xe4\xf3\x02\xd4"
-+    "\x7c\x90\x44\xa0\x33\x72\x81\x75\xa9\x16\x27\x5c\x00\x1d\x07"
-+    "\x81\xd4\xf7\xac\xcb\xfe\xd6\x60\x03\x6f\x7a\xcc\x00\xd1\xc4"
-+    "\x85\x37";
-+  uint8_t ek_e[] = "\x01\x00\x01";
-+  uint8_t ek_p[] = "\xd7\xea\x61\x15\x8b\xa3\x71\xdf\xa8\x74\x77\xca\x88\x95"
-+    "\xd0\x76\x17\x43\x2c\xf6\x23\x27\x44\xb9\x0e\x18\x35\x7e\xe4"
-+    "\xc3\xcb\x13\x6e\xfc\x38\x02\x1e\x77\x26\x40\x9d\x17\xb2\x39"
-+    "\x9c\x7f\x5f\x98\xe6\xf2\x55\x0c\x12\x05\x4c\xb3\x51\xae\x29"
-+    "\xe7\xcd\xce\x41\x0b\x28\x4d\x97\x13\x4b\x60\xc8\xd8\x70\x81"
-+    "\xf9\x1c\x12\x44\xdf\x53\x0a\x87\x9d\x33\x92\x4a\x34\x69\xf0"
-+    "\x70\x5e\x1b\x5d\x65\xc7\x84\x90\xa2\x62\xdf\x83\x14\x10\x69"
-+    "\xe2\xa7\x18\x43\xd7\x1f\x60\xc9\x03\x8f\xd6\xa4\xce\xb2\x9d"
-+    "\x40\x37\x70\x17\x4c\xe3\x69\xd4\x59";
-+  uint8_t ek_q[] = "\xc8\x34\xd2\xd0\x7c\xfa\xdc\x68\xe2\x72\xd7\x92\xe2\x50"
-+    "\x93\xfc\xbb\x72\x55\x4d\x6b\x7a\x0c\x0b\xcf\x87\x66\x1f\x81"
-+    "\x71\xf3\x50\xcb\xaa\xe6\x43\x7e\xbe\x11\xc4\xec\x00\x53\xf4"
-+    "\x78\x13\x2b\x59\x26\x4a\x9f\x91\x61\x8f\xa7\x07\x64\x11\x5a"
-+    "\xf4\xaf\x9c\x9b\x5a\x5d\x69\x20\x17\x55\x74\xba\xd8\xe4\x59"
-+    "\x39\x1a\x0a\x7b\x4a\x30\xf0\xc8\x7f\xd9\xaf\x72\xc5\xb6\x71"
-+    "\xd1\xc0\x8b\x5b\xa2\x2e\xa7\x15\xca\x50\x75\x10\x48\x9c\x2b"
-+    "\x18\xb9\x67\x8f\x5d\x64\xc3\x28\x9f\x2f\x16\x2f\x08\xda\x47"
-+    "\xec\x86\x43\x0c\x80\x99\x07\x34\x0f";
-+  int i;
-+  /* reset all data to NULL, FALSE or 0 */
-+  memset(&tpmData, 0, sizeof(tpmData));
-+  tpmData.permanent.data.tag = TPM_TAG_PERMANENT_DATA;
-+  /* set permanent flags */
-+  tpmData.permanent.flags.tag = TPM_TAG_PERMANENT_FLAGS;
-+  tpmData.permanent.flags.disable = FALSE;
-+  tpmData.permanent.flags.deactivated = FALSE;
-+  tpmData.permanent.flags.ownership = TRUE;
-+  tpmData.permanent.flags.readPubek = TRUE;
-+  tpmData.permanent.flags.allowMaintenance = TRUE;
-+  tpmData.permanent.flags.enableRevokeEK = TRUE;
-+  /* set TPM vision */
-+  tpmData.permanent.data.version.major = 1;
-+  tpmData.permanent.data.version.minor = 2;
-+  tpmData.permanent.data.version.revMajor = VERSION_MAJOR;
-+  tpmData.permanent.data.version.revMinor = VERSION_MINOR;
-+  /* setup PCR attributes */
-+  for (i = 0; i < min(16, TPM_NUM_PCR); i++) {
-+    init_pcr_attr(i, FALSE, 0x00, 0x1f);
-+  }
-+  if (TPM_NUM_PCR >= 24) {
-+    init_pcr_attr(16, TRUE, 0x1f, 0x1f);
-+    init_pcr_attr(17, TRUE, 0x10, 0x1c);
-+    init_pcr_attr(18, TRUE, 0x10, 0x1c);
-+    init_pcr_attr(19, TRUE, 0x10, 0x0c);
-+    init_pcr_attr(20, TRUE, 0x14, 0x0e);
-+    init_pcr_attr(21, TRUE, 0x04, 0x04);
-+    init_pcr_attr(22, TRUE, 0x04, 0x04);
-+    init_pcr_attr(23, TRUE, 0x1f, 0x1f);
-+  }
-+  for (i = 24; i < TPM_NUM_PCR; i++) {
-+    init_pcr_attr(i, TRUE, 0x00, 0x00);
-+  }
-+  /* set tick type */
-+  tpmData.permanent.data.tickType = TICK_INC;
-+#ifdef TPM_GENERATE_EK
-+  /* generate a new endorsement key */
-+  rsa_generate_key(&tpmData.permanent.data.endorsementKey, 2048);
-+#else
-+  /* setup endorsement key */
-+  rsa_import_key(&tpmData.permanent.data.endorsementKey, 
-+    RSA_MSB_FIRST, ek_n, 256, ek_e, 3, ek_p, ek_q);
-+#endif
-+#ifdef TPM_GENERATE_SEED_DAA
-+  /* generate the DAA seed (cf. [TPM_Part2], v1.2 rev 85, Section 7.4) */
-+  tpm_get_random_bytes(tpmData.permanent.data.tpmDAASeed.digest, 
-+    sizeof(tpmData.permanent.data.tpmDAASeed.digest));
-+#else
-+  /* FIXME: setup DAA seed */
-+  memcpy(tpmData.permanent.data.tpmDAASeed.digest, 
-+    "\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
-+    "\x00\x00\x00\x77", 20);
-+#endif
-+
-+  memcpy(tpmData.permanent.data.ekReset.nonce, "\xde\xad\xbe\xef", 4);
-+}
-+
-+void tpm_release_data(void)
-+{
-+  int i;
-+  /* release the EK, SRK as well as all other rsa keys */
-+  if (tpmData.permanent.data.endorsementKey.size > 0)
-+    rsa_release_private_key(&tpmData.permanent.data.endorsementKey);
-+  if (tpmData.permanent.data.srk.valid)
-+    rsa_release_private_key(&tpmData.permanent.data.srk.key);
-+  for (i = 0; i < TPM_MAX_KEYS; i++)
-+    if (tpmData.permanent.data.keys[i].valid)
-+      rsa_release_private_key(&tpmData.permanent.data.keys[i].key);
-+}
-+
-+#ifdef TPM_STORE_TO_FILE
-+
-+#include <linux/fs.h>
-+#include <linux/unistd.h>
-+#include <asm/uaccess.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);
-+  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); */
-+  *data = tpm_malloc(*data_length);
-+  if (*data == NULL) {
-+    filp_close(fp, NULL);
-+    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);
-+  if (res != *data_length) {
-+    tpm_free(*data);
-+    return -1;
-+  }
-+  return 0;
-+}
-+
-+#else
-+
-+static int write_to_file(uint8_t *data, size_t data_length)
-+{
-+  info("TPM_STORE_TO_FILE disabled, no data written");
-+  return 0;
-+}
-+
-+static int read_from_file(uint8_t **data, size_t *data_length)
-+{
-+  info("TPM_STORE_TO_FILE disabled, no data read");
-+  return 0;
-+}
-+
-+#endif /* TPM_STORE_TO_FILE */
-+
-+int tpm_store_permanent_data(void)
-+{
-+  uint8_t *buf, *ptr;
+@@ -216,23 +218,30 @@ static int read_from_file(uint8_t **data
+ int tpm_store_permanent_data(void)
+ {
+   uint8_t *buf, *ptr;
+-  size_t buf_length, len;
 +  UINT32 buf_length, len;
-+
-+  /* marshal data */
+ 
+   /* marshal data */
+-  buf_length = len = sizeof_TPM_STCLEAR_FLAGS(tpmData.stclear.flags)
+-    + sizeof_TPM_PERMANENT_FLAGS(tpmData.permanent.flags) + 2
+-    + sizeof_TPM_PERMANENT_DATA(tpmData.permanent.data);
 +  buf_length = len = 4 + sizeof_TPM_STCLEAR_FLAGS(tpmData.stclear.flags)
 +    + sizeof_TPM_PERMANENT_FLAGS(tpmData.permanent.flags) 
 +    + sizeof_TPM_STANY_FLAGS(tpmData.stany.flags) + 2
 +    + sizeof_TPM_STCLEAR_DATA(tpmData.stclear.data) 
 +    + sizeof_TPM_PERMANENT_DATA(tpmData.permanent.data)
 +    + sizeof_TPM_STANY_DATA(tpmData.stany.data);
-+  buf = ptr = tpm_malloc(buf_length);
-+  if (buf == NULL
-+      || tpm_marshal_TPM_VERSION(&ptr, &len, &tpmData.permanent.data.version)
-+      || tpm_marshal_TPM_STCLEAR_FLAGS(&ptr, &len, &tpmData.stclear.flags)
-+      || tpm_marshal_TPM_PERMANENT_FLAGS(&ptr, &len, &tpmData.permanent.flags)
+   buf = ptr = tpm_malloc(buf_length);
+   if (buf == NULL
+       || tpm_marshal_TPM_VERSION(&ptr, &len, &tpmData.permanent.data.version)
+       || tpm_marshal_TPM_STCLEAR_FLAGS(&ptr, &len, &tpmData.stclear.flags)
+       || tpm_marshal_TPM_PERMANENT_FLAGS(&ptr, &len, &tpmData.permanent.flags)
 +      || tpm_marshal_TPM_STANY_FLAGS(&ptr, &len, &tpmData.stany.flags)
-+      || tpm_marshal_BOOL(&ptr, &len, 
tpmData.permanent.flags.selfTestSucceeded)
-+      || tpm_marshal_BOOL(&ptr, &len, tpmData.permanent.flags.owned)
+       || tpm_marshal_BOOL(&ptr, &len, 
tpmData.permanent.flags.selfTestSucceeded)
+       || tpm_marshal_BOOL(&ptr, &len, tpmData.permanent.flags.owned)
+-      || tpm_marshal_TPM_PERMANENT_DATA(&ptr, &len, &tpmData.permanent.data)) 
{
 +      || tpm_marshal_TPM_STCLEAR_DATA(&ptr, &len, &tpmData.stclear.data)
 +      || tpm_marshal_TPM_PERMANENT_DATA(&ptr, &len, &tpmData.permanent.data)
 +      || tpm_marshal_TPM_STANY_DATA(&ptr, &len, &tpmData.stany.data)) {
-+    tpm_free(buf);
-+    return -1;
-+  }
-+
-+  if (write_to_file(buf, buf_length - len)) {
-+    tpm_free(buf);
-+    return -1; 
-+  }
-+  tpm_free(buf);
-+  return 0;
-+}
-+
-+int tpm_restore_permanent_data(void)
-+{
-+  uint8_t *buf, *ptr;
+     tpm_free(buf);
+     return -1;
+   }
++
+   if (write_to_file(buf, buf_length - len)) {
+     tpm_free(buf);
+     return -1; 
+@@ -244,31 +253,36 @@ int tpm_store_permanent_data(void)
+ int tpm_restore_permanent_data(void)
+ {
+   uint8_t *buf, *ptr;
+-  size_t buf_length, len;
 +  size_t buf_length;
 +  UINT32 len;
-+  TPM_VERSION ver;
-+
-+  /* read data */
-+  if (read_from_file(&buf, &buf_length)) return -1;
-+  ptr = buf;
+   TPM_VERSION ver;
+ 
+   /* read data */
+   if (read_from_file(&buf, &buf_length)) return -1;
+   ptr = buf;
+-  len = buf_length;
 +  len = (uint32_t) buf_length;
-+  /* unmarshal data */
-+  if (tpm_unmarshal_TPM_VERSION(&ptr, &len, &ver)
-+      || memcmp(&ver, &tpmData.permanent.data.version, sizeof(TPM_VERSION))
-+      || tpm_unmarshal_TPM_STCLEAR_FLAGS(&ptr, &len, &tpmData.stclear.flags)
-+      || tpm_unmarshal_TPM_PERMANENT_FLAGS(&ptr, &len, 
&tpmData.permanent.flags)
+   /* unmarshal data */
+   if (tpm_unmarshal_TPM_VERSION(&ptr, &len, &ver)
+       || memcmp(&ver, &tpmData.permanent.data.version, sizeof(TPM_VERSION))
+       || tpm_unmarshal_TPM_STCLEAR_FLAGS(&ptr, &len, &tpmData.stclear.flags)
+       || tpm_unmarshal_TPM_PERMANENT_FLAGS(&ptr, &len, 
&tpmData.permanent.flags)
 +      || tpm_unmarshal_TPM_STANY_FLAGS(&ptr, &len, &tpmData.stany.flags)
-+      || tpm_unmarshal_BOOL(&ptr, &len, 
&tpmData.permanent.flags.selfTestSucceeded)
-+      || tpm_unmarshal_BOOL(&ptr, &len, &tpmData.permanent.flags.owned)
+       || tpm_unmarshal_BOOL(&ptr, &len, 
&tpmData.permanent.flags.selfTestSucceeded)
+       || tpm_unmarshal_BOOL(&ptr, &len, &tpmData.permanent.flags.owned)
+-      || tpm_unmarshal_TPM_PERMANENT_DATA(&ptr, &len, 
&tpmData.permanent.data)) {
 +      || tpm_unmarshal_TPM_STCLEAR_DATA(&ptr, &len, &tpmData.stclear.data)
 +      || tpm_unmarshal_TPM_PERMANENT_DATA(&ptr, &len, &tpmData.permanent.data)
 +      || tpm_unmarshal_TPM_STANY_DATA(&ptr, &len, &tpmData.stany.data)) {
-+    tpm_free(buf);
-+    return -1;
-+  }
-+
-+  tpm_free(buf);
-+  return 0;
-+}
-+
-+int tpm_erase_permanent_data(void)
-+{
-+  int res = write_to_file("", 0);
-+  return res;
-+}
-+
-diff -uprN tpm_emulator-0.3-x86_64/tpm/tpm_deprecated.c 
tpm_emulator/tpm/tpm_deprecated.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_deprecated.c       2006-08-29 
15:07:21.622298456 -0700
-+++ tpm_emulator/tpm/tpm_deprecated.c  2006-08-29 15:26:17.122676160 -0700
+     tpm_free(buf);
+     return -1;
+   }
++
+   tpm_free(buf);
+   return 0;
+ }
+ 
+ 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.4/tpm/tpm_deprecated.c 
tpm_emulator/tpm/tpm_deprecated.c
+--- orig/tpm_emulator-0.4/tpm/tpm_deprecated.c 2006-06-23 03:37:07.000000000 
-0700
++++ tpm_emulator/tpm/tpm_deprecated.c  2006-07-24 14:35:35.000000000 -0700
 @@ -1,6 +1,7 @@
  /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
   * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
@@ -1265,9 +991,9 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
                          authContextSize, &contextBlob);
    if (res != TPM_SUCCESS) return res;
    len = *authContextSize;
-diff -uprN tpm_emulator-0.3-x86_64/tpm/tpm_emulator.h 
tpm_emulator/tpm/tpm_emulator.h
---- tpm_emulator-0.3-x86_64/tpm/tpm_emulator.h 2006-08-29 15:07:21.648294504 
-0700
-+++ tpm_emulator/tpm/tpm_emulator.h    2006-08-29 15:26:17.122676160 -0700
+diff -uprN orig/tpm_emulator-0.4/tpm/tpm_emulator.h 
tpm_emulator/tpm/tpm_emulator.h
+--- orig/tpm_emulator-0.4/tpm/tpm_emulator.h   2006-06-23 03:37:07.000000000 
-0700
++++ tpm_emulator/tpm/tpm_emulator.h    2006-07-24 14:35:35.000000000 -0700
 @@ -1,5 +1,6 @@
  /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
   * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
@@ -1285,45 +1011,476 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
  #undef  TPM_GENERATE_SEED_DAA
  
  #define TPM_MANUFACTURER 0x4554485A /* 'ETHZ' */        
-diff -uprN tpm_emulator-0.3-x86_64/tpm/tpm_integrity.c 
tpm_emulator/tpm/tpm_integrity.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_integrity.c        2006-08-29 
15:07:21.645294960 -0700
-+++ tpm_emulator/tpm/tpm_integrity.c   2006-08-29 15:26:17.123676008 -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 *
+diff -uprN orig/tpm_emulator-0.4/tpm/tpm_marshalling.c 
tpm_emulator/tpm/tpm_marshalling.c
+--- orig/tpm_emulator-0.4/tpm/tpm_marshalling.c        2006-06-23 
03:37:07.000000000 -0700
++++ tpm_emulator/tpm/tpm_marshalling.c 2006-07-24 14:35:35.000000000 -0700
+@@ -1312,7 +1312,7 @@ int tpm_unmarshal_TPM_STANY_FLAGS(BYTE *
+ 
+ int tpm_marshal_RSA(BYTE **ptr, UINT32 *length, rsa_private_key_t *v)
+ {
+-  UINT32 m_len, e_len, q_len;
++  size_t m_len, e_len, q_len;
+   if (*length < sizeof_RSA((*v))) return -1;
+   if (v->size > 0) {
+     rsa_export_modulus(v, &(*ptr)[6], &m_len);
+@@ -1460,6 +1460,66 @@ int tpm_unmarshal_TPM_PERMANENT_DATA(BYT
+   return 0;
+ }
+ 
++int tpm_marshal_TPM_STCLEAR_DATA(BYTE **ptr, UINT32 *length, TPM_STCLEAR_DATA 
*v)
++{
++  if (tpm_marshal_TPM_STRUCTURE_TAG(ptr, length, v->tag)
++    || tpm_marshal_TPM_NONCE(ptr, length, &v->contextNonceKey)
++    || tpm_marshal_TPM_COUNT_ID(ptr, length, v->countID) ) return -1;
++
++  return 0;
++}
++
++int tpm_unmarshal_TPM_STCLEAR_DATA(BYTE **ptr, UINT32 *length, 
TPM_STCLEAR_DATA *v)
++{
++  if (tpm_unmarshal_TPM_STRUCTURE_TAG(ptr, length, &v->tag)
++    || tpm_unmarshal_TPM_NONCE(ptr, length, &v->contextNonceKey)
++    || tpm_unmarshal_TPM_COUNT_ID(ptr, length, &v->countID) ) return -1;
++
++  return 0;
++}
++
++int tpm_marshal_TPM_STANY_DATA(BYTE **ptr, UINT32 *length, TPM_STANY_DATA *v)
++{
++  UINT32 i;
++  if (tpm_marshal_TPM_STRUCTURE_TAG(ptr, length, v->tag)
++    || tpm_marshal_TPM_NONCE(ptr, length, &v->contextNonceSession)
++    || tpm_marshal_TPM_DIGEST(ptr, length, &v->auditDigest)
++    || tpm_marshal_BOOL(ptr, length, v->auditSession)
++    || tpm_marshal_TPM_CURRENT_TICKS(ptr, length, &v->currentTicks)
++    || tpm_marshal_UINT32(ptr, length, v->contextCount)
++    || tpm_marshal_UINT32_ARRAY(ptr, length, v->contextList, 
TPM_MAX_SESSION_LIST)) return -1;
++  for (i = 0; i < TPM_MAX_SESSIONS; i++) {
++    if (tpm_marshal_TPM_SESSION_DATA(ptr, length, &v->sessions[i])) return -1;
++  }
++  for (i = 0; i < TPM_MAX_SESSIONS_DAA; i++) {
++    if (tpm_marshal_TPM_DAA_SESSION_DATA(ptr, length, &v->sessionsDAA[i])) 
return -1;
++  }
++  if (tpm_marshal_TPM_TRANSHANDLE(ptr, length, v->transExclusive)) return -1;
++
++  return 0;
++}
++
++int tpm_unmarshal_TPM_STANY_DATA(BYTE **ptr, UINT32 *length, TPM_STANY_DATA 
*v)
++{
++  UINT32 i;
++  if (tpm_unmarshal_TPM_STRUCTURE_TAG(ptr, length, &v->tag)
++    || tpm_unmarshal_TPM_NONCE(ptr, length, &v->contextNonceSession)
++    || tpm_unmarshal_TPM_DIGEST(ptr, length, &v->auditDigest)
++    || tpm_unmarshal_BOOL(ptr, length, &v->auditSession)
++    || tpm_unmarshal_TPM_CURRENT_TICKS(ptr, length, &v->currentTicks)
++    || tpm_unmarshal_UINT32(ptr, length, &v->contextCount)
++    || tpm_unmarshal_UINT32_ARRAY(ptr, length, v->contextList, 
TPM_MAX_SESSION_LIST)) return -1;
++  for (i = 0; i < TPM_MAX_SESSIONS; i++) {
++    if (tpm_unmarshal_TPM_SESSION_DATA(ptr, length, &v->sessions[i])) return 
-1;
++  }
++  for (i = 0; i < TPM_MAX_SESSIONS_DAA; i++) {
++    if (tpm_unmarshal_TPM_DAA_SESSION_DATA(ptr, length, &v->sessionsDAA[i])) 
return -1;
++  }
++  if (tpm_unmarshal_TPM_TRANSHANDLE(ptr, length, &v->transExclusive)) return 
-1;
++
++  return 0;
++}
++
+ int tpm_marshal_TPM_SESSION_DATA(BYTE **ptr, UINT32 *length, TPM_SESSION_DATA 
*v)
+ {
+   if (tpm_marshal_BYTE(ptr, length, v->type)
+diff -uprN orig/tpm_emulator-0.4/tpm/tpm_marshalling.h 
tpm_emulator/tpm/tpm_marshalling.h
+--- orig/tpm_emulator-0.4/tpm/tpm_marshalling.h        2006-06-23 
03:37:07.000000000 -0700
++++ tpm_emulator/tpm/tpm_marshalling.h 2006-07-24 14:35:35.000000000 -0700
+@@ -432,6 +432,12 @@ int tpm_unmarshal_TPM_KEY_DATA(BYTE **pt
+ int tpm_marshal_TPM_PERMANENT_DATA(BYTE **ptr, UINT32 *length, 
TPM_PERMANENT_DATA *);
+ int tpm_unmarshal_TPM_PERMANENT_DATA(BYTE **ptr, UINT32 *length, 
TPM_PERMANENT_DATA *);
+ 
++int tpm_marshal_TPM_STCLEAR_DATA(BYTE **ptr, UINT32 *length, TPM_STCLEAR_DATA 
*v);
++int tpm_unmarshal_TPM_STCLEAR_DATA(BYTE **ptr, UINT32 *length, 
TPM_STCLEAR_DATA *v);
++
++int tpm_marshal_TPM_STANY_DATA(BYTE **ptr, UINT32 *length, TPM_STANY_DATA *v);
++int tpm_unmarshal_TPM_STANY_DATA(BYTE **ptr, UINT32 *length, TPM_STANY_DATA 
*v);
++
+ int tpm_marshal_TPM_SESSION_DATA(BYTE **ptr, UINT32 *length, TPM_SESSION_DATA 
*v);
+ int tpm_unmarshal_TPM_SESSION_DATA(BYTE **ptr, UINT32 *length, 
TPM_SESSION_DATA *v);
+ 
+diff -uprN orig/tpm_emulator-0.4/tpm/tpm_owner.c tpm_emulator/tpm/tpm_owner.c
+--- orig/tpm_emulator-0.4/tpm/tpm_owner.c      2006-06-23 03:37:07.000000000 
-0700
++++ tpm_emulator/tpm/tpm_owner.c       2006-07-24 14:35:35.000000000 -0700
+@@ -108,7 +108,7 @@ TPM_RESULT TPM_TakeOwnership(TPM_PROTOCO
+   TPM_RESULT res;
+   rsa_private_key_t *ek = &tpmData.permanent.data.endorsementKey;
+   TPM_KEY_DATA *srk = &tpmData.permanent.data.srk;
+-  UINT32 buf_size = ek->size >> 3;
++  size_t buf_size = ek->size >> 3, key_length; 
+   BYTE buf[buf_size];
+ 
+   info("TPM_TakeOwnership()");
+@@ -173,7 +173,8 @@ TPM_RESULT TPM_TakeOwnership(TPM_PROTOCO
+     return TPM_FAIL;
    }
+   rsa_export_modulus(&srk->key, srkPub->pubKey.key,
+-    &srkPub->pubKey.keyLength);
++                   &key_length);
++  srkPub->pubKey.keyLength = (UINT32) key_length;
+   /* setup tpmProof and set state to owned */
+   tpm_get_random_bytes(tpmData.permanent.data.tpmProof.nonce, 
+     sizeof(tpmData.permanent.data.tpmProof.nonce));
+diff -uprN orig/tpm_emulator-0.4/tpm/tpm_startup.c 
tpm_emulator/tpm/tpm_startup.c
+--- orig/tpm_emulator-0.4/tpm/tpm_startup.c    2006-06-23 03:37:07.000000000 
-0700
++++ tpm_emulator/tpm/tpm_startup.c     2006-07-24 14:35:35.000000000 -0700
+@@ -41,26 +41,29 @@ void TPM_Init(TPM_STARTUP_TYPE startupTy
+ TPM_RESULT TPM_Startup(TPM_STARTUP_TYPE startupType)
+ {
+   int i;
++  int restore_fail;
+   info("TPM_Startup(%d)", startupType);
+   if (tpmData.stany.flags.postInitialise == FALSE) return 
TPM_INVALID_POSTINIT;
+-  /* reset STANY_FLAGS */
+-  SET_TO_ZERO(&tpmData.stany.flags);
+-  tpmData.stany.flags.tag = TPM_TAG_STANY_FLAGS;
+-  /* reset STANY_DATA (invalidates ALL sessions) */
+-  SET_TO_ZERO(&tpmData.stany.data);
+-  tpmData.stany.data.tag = TPM_TAG_STANY_DATA;
+-  /* init session-context nonce */
+-  SET_TO_RAND(&tpmData.stany.data.contextNonceSession);
++
++  /* try and restore state to get EK, SRK, etc */
++  restore_fail = tpm_restore_permanent_data();
++
+   /* set data and flags according to the given startup type */
+   if (startupType == TPM_ST_CLEAR) {
+-    /* if available, restore permanent data */
+-    tpm_restore_permanent_data();
++    /* reset STANY_FLAGS */
++    SET_TO_ZERO(&tpmData.stany.flags);
++    tpmData.stany.flags.tag = TPM_TAG_STANY_FLAGS;
++    /* reset STANY_DATA (invalidates ALL sessions) */
++    SET_TO_ZERO(&tpmData.stany.data);
++    tpmData.stany.data.tag = TPM_TAG_STANY_DATA;
++    /* init session-context nonce */
++    SET_TO_RAND(&tpmData.stany.data.contextNonceSession);
+     /* reset PCR values */
+     for (i = 0; i < TPM_NUM_PCR; i++) {
+-      if (tpmData.permanent.data.pcrAttrib[i].pcrReset)
+-        SET_TO_ZERO(tpmData.permanent.data.pcrValue[i].digest);
++      if (!tpmData.permanent.data.pcrAttrib[i].pcrReset)
++        SET_TO_ZERO(&tpmData.permanent.data.pcrValue[i].digest);
+       else
+-        SET_TO_0xFF(tpmData.permanent.data.pcrValue[i].digest);
++        SET_TO_0xFF(&tpmData.permanent.data.pcrValue[i].digest);
+     }
+     /* reset STCLEAR_FLAGS */
+     SET_TO_ZERO(&tpmData.stclear.flags);
+@@ -79,7 +82,8 @@ TPM_RESULT TPM_Startup(TPM_STARTUP_TYPE 
+     /* init key-context nonce */
+     SET_TO_RAND(&tpmData.stclear.data.contextNonceKey);
+   } else if (startupType == TPM_ST_STATE) {
+-    if (tpm_restore_permanent_data()) {
++    /* restore must have been successful for TPM_ST_STATE */
++    if (restore_fail) {
+       error("restoring permanent data failed");
+       tpmData.permanent.data.testResult = "tpm_restore_permanent_data() 
failed";
+       tpmData.permanent.flags.selfTestSucceeded = FALSE;
+diff -uprN orig/tpm_emulator-0.4/tpm/tpm_storage.c 
tpm_emulator/tpm/tpm_storage.c
+--- orig/tpm_emulator-0.4/tpm/tpm_storage.c    2006-06-23 03:37:07.000000000 
-0700
++++ tpm_emulator/tpm/tpm_storage.c     2006-07-24 14:35:35.000000000 -0700
+@@ -58,6 +58,7 @@ int encrypt_sealed_data(TPM_KEY_DATA *ke
+                         BYTE *enc, UINT32 *enc_size)
+ {
+   UINT32 len;
++  size_t enc_size32 = *enc_size;
+   BYTE *buf, *ptr;
+   rsa_public_key_t pub_key;
+   int scheme;
+@@ -72,7 +73,7 @@ int encrypt_sealed_data(TPM_KEY_DATA *ke
+   if (buf == NULL
+       || tpm_marshal_TPM_SEALED_DATA(&ptr, &len, seal)
+       || rsa_encrypt(&pub_key, scheme, buf, sizeof_TPM_SEALED_DATA((*seal)),
+-                     enc, enc_size)) {
++                     enc, &enc_size32)) {
+     tpm_free(buf);
+     rsa_release_public_key(&pub_key);
+     return -1;
+@@ -85,7 +86,8 @@ int encrypt_sealed_data(TPM_KEY_DATA *ke
+ int decrypt_sealed_data(TPM_KEY_DATA *key, BYTE *enc, UINT32 enc_size,
+                         TPM_SEALED_DATA *seal, BYTE **buf) 
+ {
+-  UINT32 len;
++  size_t len;
++  UINT32 len32;
+   BYTE *ptr;
+   int scheme;
+   switch (key->encScheme) {
+@@ -96,8 +98,12 @@ int decrypt_sealed_data(TPM_KEY_DATA *ke
+   len = enc_size;
+   *buf = ptr = tpm_malloc(len);
+   if (*buf == NULL
+-      || rsa_decrypt(&key->key, scheme, enc, enc_size, *buf, &len)
+-      || tpm_unmarshal_TPM_SEALED_DATA(&ptr, &len, seal)) {
++      || rsa_decrypt(&key->key, scheme, enc, enc_size, *buf, &len) ){
++    tpm_free(*buf);
++    return -1;
++  }
++  len32 = len;
++  if (tpm_unmarshal_TPM_SEALED_DATA(&ptr, &len32, seal)) {
+     tpm_free(*buf);
+     return -1;
+   }
+@@ -240,11 +246,12 @@ TPM_RESULT TPM_Unseal(TPM_KEY_HANDLE par
+ 
+ TPM_RESULT TPM_UnBind(TPM_KEY_HANDLE keyHandle, UINT32 inDataSize,
+                       BYTE *inData, TPM_AUTH *auth1, 
+-                      UINT32 *outDataSize, BYTE **outData)
++                      UINT32 *outDataSize32, BYTE **outData)
+ {
+   TPM_RESULT res;
+   TPM_KEY_DATA *key;
+   int scheme;
++  size_t outDataSize;
+   
+   info("TPM_UnBind()");
+   /* get key */
+@@ -262,8 +269,8 @@ TPM_RESULT TPM_UnBind(TPM_KEY_HANDLE key
+   /* the size of the input data muss be greater than zero */
+   if (inDataSize == 0) return TPM_BAD_PARAMETER;
+   /* decrypt data */
+-  *outDataSize = inDataSize;
+-  *outData = tpm_malloc(*outDataSize);
++  outDataSize = inDataSize;
++  *outData = tpm_malloc(outDataSize);
+   if (*outData == NULL) return TPM_NOSPACE;
+   switch (key->encScheme) {
+     case TPM_ES_RSAESOAEP_SHA1_MGF1: scheme = RSA_ES_OAEP_SHA1; break;
+@@ -271,20 +278,21 @@ TPM_RESULT TPM_UnBind(TPM_KEY_HANDLE key
+     default: tpm_free(*outData); return TPM_DECRYPT_ERROR;
+   }
+   if (rsa_decrypt(&key->key, scheme, inData, inDataSize, 
+-      *outData, outDataSize)) {
++      *outData, &outDataSize)) {
+     tpm_free(*outData);
+     return TPM_DECRYPT_ERROR;
+   }
+   /* verify data if it is of type TPM_BOUND_DATA */
+   if (key->encScheme == TPM_ES_RSAESOAEP_SHA1_MGF1 
+       || key->keyUsage != TPM_KEY_LEGACY) {
+-    if (*outDataSize < 5 || memcmp(*outData, "\x01\x01\00\x00\x02", 5) != 0) {
++    if (outDataSize < 5 || memcmp(*outData, "\x01\x01\00\x00\x02", 5) != 0) {
+       tpm_free(*outData);
+       return TPM_DECRYPT_ERROR;
+     }
+-    *outDataSize -= 5;
+-    memmove(*outData, &(*outData)[5], *outDataSize);
++    outDataSize -= 5;
++    memmove(*outData, &(*outData)[5], outDataSize);
+   }
++  *outDataSize32 = (UINT32) outDataSize;
    return TPM_SUCCESS;
  }
--
-diff -uprN tpm_emulator-0.3-x86_64/tpm/tpm_structures.h 
tpm_emulator/tpm/tpm_structures.h
---- tpm_emulator-0.3-x86_64/tpm/tpm_structures.h       2006-08-29 
15:08:20.545340792 -0700
-+++ tpm_emulator/tpm/tpm_structures.h  2006-08-29 15:26:17.125675704 -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"
+ 
+@@ -334,12 +342,13 @@ int compute_pubkey_digest(TPM_PUBKEY *ke
+ }
+ 
+ int encrypt_private_key(TPM_KEY_DATA *key, TPM_STORE_ASYMKEY *store,
+-                        BYTE *enc, UINT32 *enc_size)
++                        BYTE *enc, UINT32 *enc_size32)
+ {
+   UINT32 len;
+   BYTE *buf, *ptr;
+   rsa_public_key_t pub_key;
+   int scheme;
++  size_t enc_size;
+   switch (key->encScheme) {
+     case TPM_ES_RSAESOAEP_SHA1_MGF1: scheme = RSA_ES_OAEP_SHA1; break;
+     case TPM_ES_RSAESPKCSv15: scheme = RSA_ES_PKCSV15; break;
+@@ -351,11 +360,12 @@ int encrypt_private_key(TPM_KEY_DATA *ke
+   if (buf == NULL
+       || tpm_marshal_TPM_STORE_ASYMKEY(&ptr, &len, store)
+       || rsa_encrypt(&pub_key, scheme, buf, 
sizeof_TPM_STORE_ASYMKEY((*store)),
+-                     enc, enc_size)) {
++                     enc, &enc_size)) {
+     tpm_free(buf);
+     rsa_release_public_key(&pub_key);
+     return -1;
+   }
++  *enc_size32 = (UINT32) enc_size;
+   tpm_free(buf);
+   rsa_release_public_key(&pub_key);
+   return 0;
+@@ -364,7 +374,8 @@ int encrypt_private_key(TPM_KEY_DATA *ke
+ int decrypt_private_key(TPM_KEY_DATA *key, BYTE *enc, UINT32 enc_size, 
+                         TPM_STORE_ASYMKEY *store, BYTE **buf) 
+ {
+-  UINT32 len;
++  UINT32 len32;
++  size_t len;
+   BYTE *ptr;
+   int scheme;
+   switch (key->encScheme) {
+@@ -375,8 +386,12 @@ int decrypt_private_key(TPM_KEY_DATA *ke
+   len = enc_size;
+   *buf = ptr = tpm_malloc(len);
+   if (*buf == NULL
+-      || rsa_decrypt(&key->key, scheme, enc, enc_size, *buf, &len)
+-      || tpm_unmarshal_TPM_STORE_ASYMKEY(&ptr, &len, store)) {
++      || rsa_decrypt(&key->key, scheme, enc, enc_size, *buf, &len) ) {
++    tpm_free(*buf);
++    return -1;
++  }
++  len32 = (UINT32) len;
++  if (tpm_unmarshal_TPM_STORE_ASYMKEY(&ptr, &len32, store)) {  
+     tpm_free(*buf);
+     return -1;
+   }
+@@ -394,7 +409,7 @@ TPM_RESULT TPM_CreateWrapKey(TPM_KEY_HAN
+   TPM_SESSION_DATA *session;
+   TPM_STORE_ASYMKEY store;
+   rsa_private_key_t rsa;
+-  UINT32 key_length;
++  size_t key_length;
+ 
+   info("TPM_CreateWrapKey()");
+   /* get parent key */
+@@ -450,11 +465,11 @@ TPM_RESULT TPM_CreateWrapKey(TPM_KEY_HAN
+     }
+   }
+   /* generate key and store it */
+-  key_length = keyInfo->algorithmParms.parms.rsa.keyLength;
+-  if (rsa_generate_key(&rsa, key_length)) return TPM_FAIL;
+-  wrappedKey->pubKey.keyLength = key_length >> 3;
++  if (rsa_generate_key(&rsa, keyInfo->algorithmParms.parms.rsa.keyLength)) 
++    return TPM_FAIL;
++  wrappedKey->pubKey.keyLength = keyInfo->algorithmParms.parms.rsa.keyLength 
>> 3;
+   wrappedKey->pubKey.key = tpm_malloc(wrappedKey->pubKey.keyLength);
+-  store.privKey.keyLength = key_length >> 4;
++  store.privKey.keyLength = keyInfo->algorithmParms.parms.rsa.keyLength >> 4;
+   store.privKey.key = tpm_malloc(store.privKey.keyLength);
+   wrappedKey->encDataSize = parent->key.size >> 3;
+   wrappedKey->encData = tpm_malloc(wrappedKey->encDataSize);
+@@ -466,9 +481,11 @@ TPM_RESULT TPM_CreateWrapKey(TPM_KEY_HAN
+     tpm_free(wrappedKey->encData);
+     return TPM_NOSPACE;
+   }
+-  rsa_export_modulus(&rsa, wrappedKey->pubKey.key, 
+-    &wrappedKey->pubKey.keyLength);
+-  rsa_export_prime1(&rsa, store.privKey.key, &store.privKey.keyLength);
++  rsa_export_modulus(&rsa, wrappedKey->pubKey.key,
++                   &key_length);
++  wrappedKey->pubKey.keyLength = (UINT32) key_length;
++  rsa_export_prime1(&rsa, store.privKey.key, &key_length);
++  store.privKey.keyLength = (UINT32) key_length;
+   rsa_release_private_key(&rsa);
+   /* compute the digest of the wrapped key (without encData) */
+   if (compute_key_digest(wrappedKey, &store.pubDataDigest)) {
+@@ -602,6 +619,7 @@ TPM_RESULT TPM_LoadKey2(TPM_KEY_HANDLE p
+ 
+ int tpm_setup_key_parms(TPM_KEY_DATA *key, TPM_KEY_PARMS *parms)
+ {
++  size_t key_length;
+   parms->algorithmID = TPM_ALG_RSA;
+   parms->encScheme = key->encScheme;
+   parms->sigScheme = key->sigScheme;
+@@ -611,7 +629,8 @@ int tpm_setup_key_parms(TPM_KEY_DATA *ke
+   parms->parms.rsa.exponent = tpm_malloc(parms->parms.rsa.exponentSize);
+   if (parms->parms.rsa.exponent == NULL) return -1;
+   rsa_export_exponent(&key->key, parms->parms.rsa.exponent,
+-    &parms->parms.rsa.exponentSize);
++    &key_length);
++  parms->parms.rsa.exponentSize = (UINT32) key_length;
+   parms->parmSize = 12 + parms->parms.rsa.exponentSize;
+   return 0;
+ }
+@@ -622,6 +641,7 @@ TPM_RESULT TPM_GetPubKey(TPM_KEY_HANDLE 
+   TPM_RESULT res;
+   TPM_KEY_DATA *key;
+   TPM_DIGEST digest;
++  size_t key_length;
+   info("TPM_GetPubKey()");
+   /* get key */
+   if (keyHandle == TPM_KH_SRK
+@@ -650,8 +670,8 @@ TPM_RESULT TPM_GetPubKey(TPM_KEY_HANDLE 
+   pubKey->pubKey.keyLength = key->key.size >> 3;
+   pubKey->pubKey.key = tpm_malloc(pubKey->pubKey.keyLength);
+   if (pubKey->pubKey.key == NULL) return TPM_NOSPACE;
+-  rsa_export_modulus(&key->key, pubKey->pubKey.key, 
+-    &pubKey->pubKey.keyLength);
++  rsa_export_modulus(&key->key, pubKey->pubKey.key, &key_length);
++  pubKey->pubKey.keyLength = (UINT32) key_length;
+   if (tpm_setup_key_parms(key, &pubKey->algorithmParms) != 0) {
+     error("TPM_GetPubKey(): tpm_setup_key_parms() failed.");
+     tpm_free(pubKey->pubKey.key);
+diff -uprN orig/tpm_emulator-0.4/tpm/tpm_structures.h 
tpm_emulator/tpm/tpm_structures.h
+--- orig/tpm_emulator-0.4/tpm/tpm_structures.h 2006-06-23 03:37:07.000000000 
-0700
++++ tpm_emulator/tpm/tpm_structures.h  2006-07-24 14:35:35.000000000 -0700
+@@ -1958,6 +1958,7 @@ typedef struct tdTPM_DAA_ISSUER {
+   TPM_DIGEST DAA_digest_gamma;
+   BYTE DAA_generic_q[26];
+ } TPM_DAA_ISSUER;
++#define sizeof_TPM_DAA_ISSUER(s) (2 + (20 * 6) + 26 )
  
  /*
-diff -uprN tpm_emulator-0.3-x86_64/tpm/tpm_testing.c 
tpm_emulator/tpm/tpm_testing.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_testing.c  2006-08-29 15:07:21.646294808 
-0700
-+++ tpm_emulator/tpm/tpm_testing.c     2006-08-29 15:26:17.127675400 -0700
+  * TPM_DAA_TPM ([TPM_Part2], Section 22.4)
+@@ -1973,6 +1974,7 @@ typedef struct tdTPM_DAA_TPM {
+   TPM_DIGEST DAA_rekey;
+   UINT32 DAA_count;
+ } TPM_DAA_TPM;
++#define sizeof_TPM_DAA_TPM(s) (2 + (4 * 20) + 4)
+ 
+ /*
+  * TPM_DAA_CONTEXT ([TPM_Part2], Section 22.5)
+@@ -1987,6 +1989,7 @@ typedef struct tdTPM_DAA_CONTEXT {
+   BYTE DAA_scratch[256];
+   BYTE DAA_stage;
+ } TPM_DAA_CONTEXT;
++#define sizeof_TPM_DAA_CONTEXT(s) (2 + (3 * 20) + 256 + 1)
+ 
+ /*
+  * TPM_DAA_JOINDATA ([TPM_Part2], Section 22.6)
+@@ -1998,6 +2001,7 @@ typedef struct tdTPM_DAA_JOINDATA {
+   BYTE DAA_join_u1[138];
+   TPM_DIGEST DAA_digest_n0;
+ } TPM_DAA_JOINDATA;
++#define sizeof_TPM_DAA_JOINDATA(s) (1 + 1 + 20)
+ 
+ /*
+  * TPM_DAA_BLOB ([TPM_Part2], Section 22.8)
+@@ -2202,6 +2206,7 @@ typedef struct tdTPM_STCLEAR_DATA {
+   //UINT32 ownerReference;
+   //BOOL disableResetLock;
+ } TPM_STCLEAR_DATA;
++#define sizeof_TPM_STCLEAR_DATA(s) (2 + 20 + 4)
+ 
+ /*
+  * TPM_SESSION_DATA
+@@ -2238,6 +2243,11 @@ typedef struct tdTPM_DAA_SESSION_DATA {
+   TPM_DAA_JOINDATA DAA_joinSession;
+   TPM_HANDLE handle;
+ } TPM_DAA_SESSION_DATA;
++#define sizeof_TPM_DAA_SESSION_DATA(s) ( 1 \
++  + sizeof_TPM_DAA_ISSUER(s.DAA_issuerSettings) \
++  + sizeof_TPM_DAA_TPM(s.DAA_tpmSpecific) \
++  + sizeof_TPM_DAA_CONTEXT(s.DAA_session) \
++  + sizeof_TPM_DAA_JOINDATA(s.DAA_joinSession) + 4)
+ 
+ /*
+  * TPM_STANY_DATA ([TPM_Part2], Section 7.6)
+@@ -2262,6 +2272,11 @@ typedef struct tdTPM_STANY_DATA {
+   TPM_DAAHANDLE currentDAA;
+   TPM_TRANSHANDLE transExclusive;
+ } TPM_STANY_DATA;
++#define sizeof_TPM_STANY_DATA(s) (2 + 20 + 20 + 1 \
++  + sizeof_TPM_CURRENT_TICKS(s.currentTicks) \
++  + 4 + (4 * TPM_MAX_SESSION_LIST) \
++  + (sizeof_TPM_SESSION_DATA(s.sessions[0]) * TPM_MAX_SESSION_LIST) \
++  + (sizeof_TPM_DAA_SESSION_DATA(s.sessionsDAA[0]) * TPM_MAX_SESSIONS_DAA) + 
4)
+ 
+ /*
+  * TPM_DATA
+diff -uprN orig/tpm_emulator-0.4/tpm/tpm_testing.c 
tpm_emulator/tpm/tpm_testing.c
+--- orig/tpm_emulator-0.4/tpm/tpm_testing.c    2006-06-23 03:37:07.000000000 
-0700
++++ tpm_emulator/tpm/tpm_testing.c     2006-07-24 14:35:35.000000000 -0700
 @@ -1,6 +1,7 @@
  /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
   * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
@@ -1439,9 +1596,9 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
    rsa_private_key_t priv_key;
    rsa_public_key_t pub_key;
  
-diff -uprN tpm_emulator-0.3-x86_64/tpm/tpm_ticks.c tpm_emulator/tpm/tpm_ticks.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_ticks.c    2006-08-29 15:07:21.646294808 
-0700
-+++ tpm_emulator/tpm/tpm_ticks.c       2006-08-29 15:26:17.128675248 -0700
+diff -uprN orig/tpm_emulator-0.4/tpm/tpm_ticks.c tpm_emulator/tpm/tpm_ticks.c
+--- orig/tpm_emulator-0.4/tpm/tpm_ticks.c      2006-06-23 03:37:07.000000000 
-0700
++++ tpm_emulator/tpm/tpm_ticks.c       2006-07-24 14:35:35.000000000 -0700
 @@ -1,6 +1,7 @@
  /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
   * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
@@ -1450,7 +1607,7 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
   *
   * 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 
+@@ -39,9 +40,7 @@ TPM_RESULT TPM_SetTickType(TPM_TICKTYPE 
  TPM_RESULT TPM_GetTicks(TPM_CURRENT_TICKS *currentTime)
  {
    info("TPM_GetTicks()");
@@ -1461,7 +1618,7 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
  }
  
  TPM_RESULT TPM_TickStampBlob(TPM_KEY_HANDLE keyHandle, TPM_NONCE *antiReplay,
-@@ -47,61 +46,12 @@ TPM_RESULT TPM_TickStampBlob(TPM_KEY_HAN
+@@ -49,64 +48,11 @@ TPM_RESULT TPM_TickStampBlob(TPM_KEY_HAN
                               TPM_CURRENT_TICKS *currentTicks, 
                               UINT32 *sigSize, BYTE **sig)
  {
@@ -1493,7 +1650,7 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
 -  }
 -  memcpy(&info[0], "\x05\x00TSTP", 6);
 -  memcpy(&info[6], antiReplay->nonce, 20);
--  *(UINT32*)&info[26] = cpu_to_be32(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)]; 
@@ -1513,91 +1670,45 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
 -  if (tpmData.stany.data.currentTicks.tag == 0) {
 -    tpmData.stany.data.currentTicks.tag = TPM_TAG_CURRENT_TICKS;
 -    tpmData.stany.data.currentTicks.currentTicks += tpm_get_ticks();
+-/* removed since v1.2 rev 94
 -    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;
+-/* removed since v1.2 rev 94
 -    tpmData.stany.data.currentTicks.tickSecurity = TICK_SEC_NO_CHECK;
+-*/
 -  } else {
 -    tpmData.stany.data.currentTicks.currentTicks += tpm_get_ticks();   
 -  }
  }
-   
- 
-diff -uprN tpm_emulator-0.3-x86_64/tpm/tpm_transport.c 
tpm_emulator/tpm/tpm_transport.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_transport.c        2006-08-29 
15:07:21.647294656 -0700
-+++ tpm_emulator/tpm/tpm_transport.c   2006-08-29 15:26:17.129675096 -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
+ 
+diff -uprN orig/tpm_emulator-0.4/tpm/tpm_transport.c 
tpm_emulator/tpm/tpm_transport.c
+--- orig/tpm_emulator-0.4/tpm/tpm_transport.c  2006-06-23 03:37:07.000000000 
-0700
++++ tpm_emulator/tpm/tpm_transport.c   2006-07-24 14:35:35.000000000 -0700
+@@ -189,7 +189,7 @@ static void decrypt_wrapped_command(BYTE
+     sha1_init(&sha1);
+     sha1_update(&sha1, auth->nonceEven.nonce, sizeof(auth->nonceEven.nonce));
      sha1_update(&sha1, auth->nonceOdd.nonce, sizeof(auth->nonceOdd.nonce));
-     sha1_update(&sha1, "in", 2);
+-    sha1_update(&sha1, "in", 2);
++    sha1_update(&sha1, (BYTE*)"in", 2);
      sha1_update(&sha1, secret, sizeof(TPM_SECRET));
--    j = cpu_to_be32(i);
-+    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
+@@ -211,7 +211,7 @@ static void encrypt_wrapped_command(BYTE
+     sha1_init(&sha1);
+     sha1_update(&sha1, auth->nonceEven.nonce, sizeof(auth->nonceEven.nonce));
      sha1_update(&sha1, auth->nonceOdd.nonce, sizeof(auth->nonceOdd.nonce));
-     sha1_update(&sha1, "out", 3);
+-    sha1_update(&sha1, "out", 3);
++    sha1_update(&sha1, (BYTE*)"out", 3);
      sha1_update(&sha1, secret, sizeof(TPM_SECRET));
--    j = cpu_to_be32(i);
-+    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 tpm_emulator-0.3-x86_64/tpm_version.h tpm_emulator/tpm_version.h
---- tpm_emulator-0.3-x86_64/tpm_version.h      2006-08-29 15:07:21.649294352 
-0700
-+++ 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 -uprN tpm_emulator-0.3-x86_64/tpmd.c tpm_emulator/tpmd.c
---- tpm_emulator-0.3-x86_64/tpmd.c     1969-12-31 16:00:00.000000000 -0800
-+++ tpm_emulator/tpmd.c        2006-08-29 15:26:17.130674944 -0700
-@@ -0,0 +1,141 @@
+diff -uprN orig/tpm_emulator-0.4/tpmd.c tpm_emulator/tpmd.c
+--- orig/tpm_emulator-0.4/tpmd.c       1969-12-31 16:00:00.000000000 -0800
++++ tpm_emulator/tpmd.c        2006-07-24 14:35:35.000000000 -0700
+@@ -0,0 +1,156 @@
 +/* Software-Based Trusted Platform Module (TPM) Emulator for Linux
 + * Copyright (C) 2005 INTEL Corp
 + *
@@ -1624,8 +1735,8 @@ diff -uprN tpm_emulator-0.3-x86_64/tpmd.
 +
 +#include "tpm_emulator.h"
 +
-+#define TPM_RX_FNAME "/tmp/tpm_in.fifo"
-+#define TPM_TX_FNAME "/tmp/tpm_out.fifo"
++#define TPM_RX_FNAME "/var/tpm/tpm_in.fifo"
++#define TPM_TX_FNAME "/var/tpm/tpm_out.fifo"
 +
 +#define BUFFER_SIZE 2048
 +
@@ -1656,7 +1767,8 @@ diff -uprN tpm_emulator-0.3-x86_64/tpmd.
 +  uint32_t out_size;
 +  int in_size, written;
 +  int i;
-+ 
++  struct stat file_info;
++
 +  int tpm_tx_fh=-1, tpm_rx_fh=-1;
 +  if (argc < 2) {
 +    printf("Usage: tpmd clear|save|deactivated\n" );
@@ -1679,6 +1791,20 @@ diff -uprN tpm_emulator-0.3-x86_64/tpmd.
 +    return -1;
 +  }
 +
++  if ( stat(TPM_RX_FNAME, &file_info) == -1) {
++    if ( mkfifo(TPM_RX_FNAME, S_IWUSR | S_IRUSR ) ) {
++      printf("Failed to create fifo %s.\n", TPM_RX_FNAME);
++      return -1;
++    }
++  }
++
++  if ( stat(TPM_TX_FNAME, &file_info) == -1) {
++    if ( mkfifo(TPM_TX_FNAME, S_IWUSR | S_IRUSR ) ) {
++      printf("Failed to create fifo %s.\n", TPM_TX_FNAME);
++      return -1;
++    }
++  }
++
 +  while (1) {
 +abort_command:
 +    if (tpm_rx_fh < 0) {
@@ -1739,3 +1865,14 @@ diff -uprN tpm_emulator-0.3-x86_64/tpmd.
 +  close(tpm_rx_fh);
 +
 +}
+Binary files orig/tpm_emulator-0.4/tpm_emulator and tpm_emulator/tpm_emulator 
differ
+diff -uprN orig/tpm_emulator-0.4/tpm_version.h tpm_emulator/tpm_version.h
+--- orig/tpm_emulator-0.4/tpm_version.h        2006-06-23 03:37:07.000000000 
-0700
++++ tpm_emulator/tpm_version.h 2006-07-24 14:35:41.000000000 -0700
+@@ -2,5 +2,5 @@
+ #define _TPM_VERSION_H_
+ #define VERSION_MAJOR 0
+ #define VERSION_MINOR 4
+-#define VERSION_BUILD 1151058734
++#define VERSION_BUILD 1153776940
+ #endif /* _TPM_VERSION_H_ */
diff -r 7d6f0791c650 -r 6b08035e10c5 tools/vtpm/vtpm.patch
--- a/tools/vtpm/vtpm.patch     Tue Jul 25 11:19:48 2006 +0100
+++ b/tools/vtpm/vtpm.patch     Tue Jul 25 11:30:30 2006 +0100
@@ -1,478 +1,45 @@ diff -uprN tpm_emulator-0.3-x86_64/AUTHO
-diff -uprN tpm_emulator-0.3-x86_64/AUTHORS vtpm/AUTHORS
---- tpm_emulator-0.3-x86_64/AUTHORS    2006-08-29 15:07:21.618299064 -0700
-+++ vtpm/AUTHORS       2006-08-29 15:12:07.184886344 -0700
-@@ -1,2 +1,3 @@
+diff -uprN tpm_emulator/AUTHORS vtpm/AUTHORS
+--- tpm_emulator/AUTHORS       2006-07-24 14:35:35.000000000 -0700
++++ vtpm/AUTHORS       2006-07-24 14:35:35.000000000 -0700
+@@ -1,3 +1,3 @@
  Mario Strasser <mast@xxxxxxx>
  Heiko Stamer <stamer@xxxxxxxx> [DAA]
+-INTEL Corp <> [Dropped to Ring3]
 +INTEL Corp <> [VTPM Extensions]
-diff -uprN tpm_emulator-0.3-x86_64/ChangeLog vtpm/ChangeLog
---- tpm_emulator-0.3-x86_64/ChangeLog  2006-08-29 15:07:21.618299064 -0700
-+++ vtpm/ChangeLog     2006-08-29 15:12:07.185886192 -0700
-@@ -1,3 +1,7 @@
-+2005-08-16 Intel Corp
-+      * Moved module out of kernel to run as a ring 3 app
-+      * Modified save_to_file and load_from_file to call a xen backend driver 
to call a VTPM manager
-+
- 2005-12-24  Mario Strasser <mast@xxxxxxx>
-       * tpm_transport.c, tpm_marshalling.c, tpm_structures.h:
-               Transport session functionality added
-diff -uprN tpm_emulator-0.3-x86_64/Makefile vtpm/Makefile
---- tpm_emulator-0.3-x86_64/Makefile   2006-08-29 15:08:20.532342768 -0700
-+++ vtpm/Makefile      2006-08-29 15:13:53.023796384 -0700
-@@ -1,22 +1,31 @@
- # Software-Based Trusted Platform Module (TPM) Emulator for Linux
- # Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>
-+# Copyright (C) 2006 INTEL Corp.
- #
- # $Id: Makefile 69 2005-12-13 12:55:52Z mast $
- 
--# kernel settings
--KERNEL_RELEASE := $(shell uname -r)
--KERNEL_BUILD   := /lib/modules/$(KERNEL_RELEASE)/build
--MOD_SUBDIR     := misc
- COMPILE_ARCH    ?= $(shell uname -m | sed -e s/i.86/x86_32/)
- 
- # module settings
--MODULE_NAME    := tpm_emulator
-+BIN            := vtpmd
- VERSION_MAJOR  := 0
- VERSION_MINOR  := 3
- VERSION_BUILD  := $(shell date +"%s")
- 
--# 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 -I../../vtpm_manager/manager
-+
-+# 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))
--DISTSRC        := ./README ./AUTHORS ./ChangeLog ./Makefile $(SRCS)
--DISTDIR        := tpm_emulator-$(VERSION_MAJOR).$(VERSION_MINOR)
- 
--obj-m               := $(MODULE_NAME).o
--$(MODULE_NAME)-objs := $(patsubst $(src)/%.o, %.o, $(OBJS)) crypto/libgmp.a
-+obj-m               := $(BIN)
-+$(BIN)-objs := $(patsubst $(src)/%.o, %.o, $(OBJS)) crypto/libgmp.a
- 
- EXTRA_CFLAGS   += -I$(src) -I$(src)/crypto -I$(src)/tpm 
- 
- # 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
--      test -d /var/tpm || mkdir /var/tpm
--      test -c /dev/tpm || mknod /dev/tpm c 10 224
--      chmod 666 /dev/tpm
--      depmod -a
-+install: $(BIN)
-+      $(INSTALL_PROG) $(BIN) $(TOOLS_INSTALL_DIR)
- 
- clean:
--      @$(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)
--      mkdir $(DISTDIR)
--      cp --parents $(DISTSRC) $(DISTDIR)/
--      rm -f $(DISTDIR)/crypto/gmp.h 
--      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 tpm_emulator-0.3-x86_64/README vtpm/README
---- tpm_emulator-0.3-x86_64/README     2006-08-29 15:07:43.530967832 -0700
-+++ vtpm/README        2006-08-29 15:12:07.190885432 -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 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 tpm_emulator-0.3-x86_64/crypto/gmp_kernel_wrapper.c 
vtpm/crypto/gmp_kernel_wrapper.c
---- tpm_emulator-0.3-x86_64/crypto/gmp_kernel_wrapper.c        2006-08-29 
15:07:43.525968592 -0700
-+++ vtpm/crypto/gmp_kernel_wrapper.c   2006-08-29 15:12:07.186886040 -0700
+diff -uprN tpm_emulator/ChangeLog vtpm/ChangeLog
+--- tpm_emulator/ChangeLog     2006-07-24 14:35:35.000000000 -0700
++++ vtpm/ChangeLog     2006-07-24 14:35:35.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
-@@ -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 tpm_emulator-0.3-x86_64/crypto/rsa.c vtpm/crypto/rsa.c
---- tpm_emulator-0.3-x86_64/crypto/rsa.c       2006-08-29 15:07:21.618299064 
-0700
-+++ vtpm/crypto/rsa.c  2006-08-29 15:12:07.187885888 -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 tpm_emulator-0.3-x86_64/linux_module.c vtpm/linux_module.c
---- tpm_emulator-0.3-x86_64/linux_module.c     2006-08-29 15:07:43.526968440 
-0700
-+++ vtpm/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 tpm_emulator-0.3-x86_64/linux_module.h vtpm/linux_module.h
---- tpm_emulator-0.3-x86_64/linux_module.h     2006-08-29 15:07:43.527968288 
-0700
-+++ vtpm/linux_module.h        2006-08-29 15:12:07.189885584 -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
-@@ -39,34 +45,38 @@
- #define TPM_MODULE_NAME       "tpm_emulator"
- 
- /* debug and log output functions */
+ ????-??-?? Intel Corp
+       * Moved module out of kernel to run as a ring 3 app
++      * Modified save_to_file and load_from_file to call xen VTPM manager
+ 
+ 2006-06-23  Mario Strasser <mast@xxxxxxx>
+       * tpm_startup.c: behaviour of ST_CLEAR and storage of
+diff -uprN tpm_emulator/linux_module.h vtpm/linux_module.h
+--- tpm_emulator/linux_module.h        2006-07-24 14:35:35.000000000 -0700
++++ vtpm/linux_module.h        2006-07-24 14:35:35.000000000 -0700
+@@ -44,18 +44,21 @@
+ #define TPM_DEVICE_NAME   "tpm"
+ #define TPM_MODULE_NAME   "tpm_emulator"
+ 
++/* debug and log output functions */
 +extern int dmi_id; 
- 
++
  #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__)
 +#define debug(fmt, ...) printf("TPMD[%d]: %s:%d: Debug: " fmt "\n", \
 +                        dmi_id, __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__)
 +#define info(fmt, ...)  printf("TPMD[%d]: %s:%d: Info: " fmt "\n", \
 +                        dmi_id, __FILE__, __LINE__, ## __VA_ARGS__)
 +#define error(fmt, ...) printf("TPMD[%d]: %s:%d: Error: " fmt "\n", \
@@ -482,393 +49,43 @@ diff -uprN tpm_emulator-0.3-x86_64/linux
  
  /* 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 +96,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 tpm_emulator-0.3-x86_64/tpm/tpm_audit.c vtpm/tpm/tpm_audit.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_audit.c    2006-08-29 15:07:21.620298760 
-0700
-+++ vtpm/tpm/tpm_audit.c       2006-08-29 15:12:07.191885280 -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
-@@ -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 tpm_emulator-0.3-x86_64/tpm/tpm_authorization.c 
vtpm/tpm/tpm_authorization.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_authorization.c    2006-08-29 
15:07:21.620298760 -0700
-+++ vtpm/tpm/tpm_authorization.c       2006-08-29 15:12:07.192885128 -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 tpm_emulator-0.3-x86_64/tpm/tpm_capability.c 
vtpm/tpm/tpm_capability.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_capability.c       2006-08-29 
15:07:21.620298760 -0700
-+++ vtpm/tpm/tpm_capability.c  2006-08-29 15:12:07.193884976 -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 tpm_emulator-0.3-x86_64/tpm/tpm_cmd_handler.c 
vtpm/tpm/tpm_cmd_handler.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_cmd_handler.c      2006-08-29 
15:07:21.621298608 -0700
-+++ vtpm/tpm/tpm_cmd_handler.c 2006-08-29 15:12:07.197884368 -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 tpm_emulator-0.3-x86_64/tpm/tpm_crypto.c vtpm/tpm/tpm_crypto.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_crypto.c   2006-08-29 15:07:43.531967680 
-0700
-+++ vtpm/tpm/tpm_crypto.c      2006-08-29 15:12:07.198884216 -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 tpm_emulator-0.3-x86_64/tpm/tpm_daa.c vtpm/tpm/tpm_daa.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_daa.c      2006-08-29 15:07:21.622298456 
-0700
-+++ vtpm/tpm/tpm_daa.c 2006-08-29 15:12:07.203883456 -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 tpm_emulator-0.3-x86_64/tpm/tpm_data.c vtpm/tpm/tpm_data.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_data.c     2006-08-29 15:08:20.535342312 
-0700
-+++ vtpm/tpm/tpm_data.c        2006-08-29 15:12:07.206883000 -0700
+diff -uprN tpm_emulator/Makefile vtpm/Makefile
+--- tpm_emulator/Makefile      2006-07-24 14:35:35.000000000 -0700
++++ vtpm/Makefile      2006-07-24 14:35:35.000000000 -0700
+@@ -7,7 +7,7 @@
+ COMPILE_ARCH    ?= $(shell uname -m | sed -e s/i.86/x86_32/)
+ 
+ # module settings
+-BIN            := tpm_emulator
++BIN            := vtpmd
+ VERSION_MAJOR  := 0
+ VERSION_MINOR  := 4
+ VERSION_BUILD  := $(shell date +"%s")
+@@ -22,7 +22,7 @@ TOOLS_INSTALL_DIR = $(DESTDIR)/usr/bin
+ 
+ CC      := gcc
+ CFLAGS  += -g -Wall $(INCLUDE) -DDEBUG
+-CFLAGS  += -I. -Itpm
++CFLAGS  += -I. -Itpm -I../../vtpm_manager/manager
+ 
+ # Is the simulator running in it's own vm?
+ #CFLAGS += -DVTPM_MULTI_VM
+@@ -62,7 +62,6 @@ $(BIN):      $(src)/crypto/gmp.h $(src)/crypt
+ 
+ install: $(BIN)
+       $(INSTALL_PROG) $(BIN) $(TOOLS_INSTALL_DIR)
+-      @if [ ! -d "/var/tpm" ]; then mkdir /var/tpm; fi
+ 
+ clean:
+       rm -f $(src)/crypto/gmp.h $(src)/crypto/libgmp.a $(OBJS)
+@@ -98,3 +97,4 @@ version:
+       @echo "#endif /* _TPM_VERSION_H_ */" >> $(src)/tpm_version.h
+ 
+ .PHONY: all install clean dist gmp version
++
+diff -uprN tpm_emulator/tpm/tpm_data.c vtpm/tpm/tpm_data.c
+--- tpm_emulator/tpm/tpm_data.c        2006-07-24 14:35:35.000000000 -0700
++++ vtpm/tpm/tpm_data.c        2006-07-24 14:35:35.000000000 -0700
 @@ -1,6 +1,7 @@
  /* Software-Based Trusted Platform Module (TPM) Emulator for Linux
   * Copyright (C) 2004 Mario Strasser <mast@xxxxxxx>,
@@ -878,7 +95,7 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
   * This module is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published
 @@ -15,10 +16,15 @@
-  * $Id: tpm_data.c 36 2005-10-26 20:31:19Z hstamer $
+  * $Id: tpm_data.c 98 2006-05-07 14:16:29Z hstamer $
   */
  
 +#include <sys/types.h>
@@ -894,37 +111,15 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
  
  TPM_DATA tpmData;
  
-@@ -39,6 +45,7 @@ static inline void init_pcr_attr(int pcr
- 
- void tpm_init_data(void)
- {
-+#ifndef TPM_GENERATE_EK
-   /* endorsement key */
-   uint8_t ek_n[] =  "\xa8\xdb\xa9\x42\xa8\xf3\xb8\x06\x85\x90\x76\x93\xad\xf7"
-     "\x74\xec\x3f\xd3\x3d\x9d\xe8\x2e\xff\x15\xed\x0e\xce\x5f\x93"
-@@ -77,6 +84,8 @@ void tpm_init_data(void)
-     "\xd1\xc0\x8b\x5b\xa2\x2e\xa7\x15\xca\x50\x75\x10\x48\x9c\x2b"
-     "\x18\xb9\x67\x8f\x5d\x64\xc3\x28\x9f\x2f\x16\x2f\x08\xda\x47"
-     "\xec\x86\x43\x0c\x80\x99\x07\x34\x0f";
-+#endif
-+
-   int i;
-   /* reset all data to NULL, FALSE or 0 */
-   memset(&tpmData, 0, sizeof(tpmData));
-@@ -150,49 +159,235 @@ 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>
-+
+@@ -158,45 +164,232 @@ void tpm_release_data(void)
+ #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 vtpm_tx_fh=-1, vtpm_rx_fh=-1;
- 
--#define TPM_STORAGE_FILE "/var/tpm/tpm_emulator-1.2." STR(VERSION_MAJOR) "." 
STR(VERSION_MINOR) 
++
 +#ifdef VTPM_MUTLI_VM
 + #define DEV_FE "/dev/tpm"
 +#else
@@ -938,14 +133,10 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
  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;
 +  int res, out_data_size, in_header_size;
 +  BYTE *ptr, *out_data, *in_header;
@@ -1049,15 +240,14 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
  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); */
--  *data = tpm_malloc(*data_length);
--  if (*data == NULL) {
--    filp_close(fp, NULL);
+-  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;
+-  } 
 +  int res, out_data_size, in_header_size;
 +  uint8_t *ptr, *out_data, *in_header;
 +  UINT16 tag = VTPM_TAG_REQ;
@@ -1074,7 +264,11 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
 +      vtpm_tx_fh = open(VTPM_TX_FIFO, O_WRONLY);
 +#endif
 +  }
-+
+ 
+-  *data_length = file_info.st_size; 
+-  *data = tpm_malloc(*data_length);
+-  if (*data == NULL) {
+-    close(fp);
 +  if (vtpm_tx_fh < 0) {
 +              return -1;
 +  }
@@ -1101,10 +295,8 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
 +    free(out_data);
      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);
 +
 +  printf("\tSending LoadNVM command\n");
 +  res = write(vtpm_tx_fh, out_data, out_data_size);
@@ -1178,504 +370,138 @@ diff -uprN tpm_emulator-0.3-x86_64/tpm/t
  }
  
  #else
-@@ -278,7 +473,6 @@ 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 tpm_emulator-0.3-x86_64/tpm/tpm_deprecated.c 
vtpm/tpm/tpm_deprecated.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_deprecated.c       2006-08-29 
15:07:21.622298456 -0700
-+++ vtpm/tpm/tpm_deprecated.c  2006-08-29 15:12:07.207882848 -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 tpm_emulator-0.3-x86_64/tpm/tpm_emulator.h vtpm/tpm/tpm_emulator.h
---- tpm_emulator-0.3-x86_64/tpm/tpm_emulator.h 2006-08-29 15:07:21.648294504 
-0700
-+++ vtpm/tpm/tpm_emulator.h    2006-08-29 15:12:07.208882696 -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 tpm_emulator-0.3-x86_64/tpm/tpm_integrity.c vtpm/tpm/tpm_integrity.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_integrity.c        2006-08-29 
15:07:21.645294960 -0700
-+++ vtpm/tpm/tpm_integrity.c   2006-08-29 15:12:07.208882696 -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 tpm_emulator-0.3-x86_64/tpm/tpm_structures.h 
vtpm/tpm/tpm_structures.h
---- tpm_emulator-0.3-x86_64/tpm/tpm_structures.h       2006-08-29 
15:08:20.545340792 -0700
-+++ vtpm/tpm/tpm_structures.h  2006-08-29 15:12:07.211882240 -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 tpm_emulator-0.3-x86_64/tpm/tpm_testing.c vtpm/tpm/tpm_testing.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_testing.c  2006-08-29 15:07:21.646294808 
-0700
-+++ vtpm/tpm/tpm_testing.c     2006-08-29 15:12:07.213881936 -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 tpm_emulator-0.3-x86_64/tpm/tpm_ticks.c vtpm/tpm/tpm_ticks.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_ticks.c    2006-08-29 15:07:21.646294808 
-0700
-+++ vtpm/tpm/tpm_ticks.c       2006-08-29 15:12:07.235878592 -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 tpm_emulator-0.3-x86_64/tpm/tpm_transport.c vtpm/tpm/tpm_transport.c
---- tpm_emulator-0.3-x86_64/tpm/tpm_transport.c        2006-08-29 
15:07:21.647294656 -0700
-+++ vtpm/tpm/tpm_transport.c   2006-08-29 15:12:07.239877984 -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 tpm_emulator-0.3-x86_64/tpmd.c vtpm/tpmd.c
---- tpm_emulator-0.3-x86_64/tpmd.c     1969-12-31 16:00:00.000000000 -0800
-+++ vtpm/tpmd.c        2006-08-29 15:12:07.240877832 -0700
-@@ -0,0 +1,207 @@
-+/* 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"
+diff -uprN tpm_emulator/tpmd.c vtpm/tpmd.c
+--- tpm_emulator/tpmd.c        2006-07-24 14:35:35.000000000 -0700
++++ vtpm/tpmd.c        2006-07-24 14:35:35.000000000 -0700
+@@ -23,13 +23,27 @@
+ #include <sys/time.h>
+ 
+ #include "tpm_emulator.h"
 +#include "vtpm_manager.h"
-+
+ 
+-#define TPM_RX_FNAME "/var/tpm/tpm_in.fifo"
+-#define TPM_TX_FNAME "/var/tpm/tpm_out.fifo"
 +#ifdef VTPM_MULTI_VM
 + #define DEV_BE "/dev/vtpm"
 +#else
 + #define GUEST_RX_FIFO_D "/var/vtpm/fifos/tpm_cmd_to_%d.fifo"
 + #define GUEST_TX_FIFO "/var/vtpm/fifos/tpm_rsp_from_all.fifo"
 +#endif
-+
+ 
 + int dmi_id;
 +                                              
-+#define BUFFER_SIZE 2048
-+
+ #define BUFFER_SIZE 2048
+ 
 +static uint8_t ctrl_msg[] = { 0, 0, 0, 0,   // destination
 +                              1, 193,       // VTPM_TAG
 +                              0, 0, 0, 10,  // Size
 +                              0, 0, 0, 0};  // TPM_SUCCESS
 +                            
 +
-+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)
-+{
+ static int devurandom=0;
++
+         
+ void get_random_bytes(void *buf, int nbytes) {
+   
+@@ -52,18 +66,26 @@ uint64_t tpm_get_ticks(void)
+ 
+ int main(int argc, char **argv)
+ {
+-  uint8_t in[BUFFER_SIZE], *out;
 +  uint8_t in[BUFFER_SIZE], *out, *addressed_out;
-+  uint32_t out_size;
-+  int in_size, written;
+   uint32_t out_size;
+   int in_size, written;
+-  int i;
+-  struct stat file_info;
+-
+-  int tpm_tx_fh=-1, tpm_rx_fh=-1;
 +  int i, guest_id=-1;
 + 
 +  int vtpm_tx_fh=-1, vtpm_rx_fh=-1;
 +#ifdef VTPM_MULTI_VM
-+  if (argc < 2) {
-+    printf("Usage: tpmd clear|save|deactivated\n" );
+   if (argc < 2) {
+     printf("Usage: tpmd clear|save|deactivated\n" );
 +#else
 +  if (argc < 3) {
 +    printf("Usage: tpmd clear|save|deactivated vtpmid\n" );
 +#endif
-+        return -1;
-+  }
-+
+         return -1;
+   }
+ 
 +#ifndef VTPM_MULTI_VM
 +  dmi_id = atoi(argv[2]);
 +#endif
 +
-+  /* 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;
-+  }
-+
+   /* initialize TPM emulator */
+   if (!strcmp(argv[1], "clear")) {
+     printf("Initializing tpm: %s\n", argv[1]);
+@@ -80,46 +102,30 @@ int main(int argc, char **argv)
+     return -1;
+   }
+ 
+-  if ( stat(TPM_RX_FNAME, &file_info) == -1) {
+-    if ( mkfifo(TPM_RX_FNAME, S_IWUSR | S_IRUSR ) ) {
+-      printf("Failed to create fifo %s.\n", TPM_RX_FNAME);
+-      return -1;
+-    }
+-  }
+-
+-  if ( stat(TPM_TX_FNAME, &file_info) == -1) {
+-    if ( mkfifo(TPM_TX_FNAME, S_IWUSR | S_IRUSR ) ) {
+-      printf("Failed to create fifo %s.\n", TPM_TX_FNAME);
+-      return -1;
+-    }
+-  }
+-
 +  char *guest_rx_file = malloc(10 + strlen(GUEST_RX_FIFO_D));
 +  sprintf(guest_rx_file, GUEST_RX_FIFO_D, (uint32_t) dmi_id);
 +  
-+  while (1) {
-+abort_command:
+   while (1) {
+ abort_command:
+-    if (tpm_rx_fh < 0) {
+-      tpm_rx_fh = open(TPM_RX_FNAME, O_RDONLY);
 +    if (vtpm_rx_fh < 0) {
 +#ifdef VTPM_MUTLI_VM
 +        vtpm_rx_fh = open(DEV_BE, O_RDWR);
 +#else
 +      vtpm_rx_fh = open(guest_rx_file, O_RDONLY);
 +#endif
-+    }
-+    
+     }
+     
+-    if (tpm_rx_fh < 0) {
 +    if (vtpm_rx_fh < 0) {
-+      printf("ERROR: failed to open devices to listen to guest.\n");
-+      return -1;
-+    }
-+    
+       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);
 +    in_size = read(vtpm_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) {
+     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;
 +          close(vtpm_rx_fh);
 +          vtpm_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");
-+    }
-+
+           goto abort_command;
+       }
+     } else { 
+@@ -129,28 +135,73 @@ abort_command:
+       printf("\n");
+     }
+ 
+-    
+-    if (tpm_handle_command(in, in_size, &out, &out_size) != 0) { 
+-        printf("ERROR: Handler Failed.\n");
 +    if (guest_id == -1) {
 +        guest_id = *((uint32_t *) in);
 +        *((uint32_t *) ctrl_msg) = *((uint32_t *) in);
@@ -1683,8 +509,9 @@ diff -uprN tpm_emulator-0.3-x86_64/tpmd.
 +        if (guest_id != *((uint32_t *) in) ) {
 +            printf("WARNING: More than one guest attached\n");
 +        }
-+    }
-+
+     }
+ 
+-    written = write(tpm_tx_fh, out, out_size);
 +    if (vtpm_tx_fh < 0) {
 +#ifdef VTPM_MUTLI_VM
 +        vtpm_tx_fh = open(DEV_BE, O_RDWR);
@@ -1693,7 +520,11 @@ diff -uprN tpm_emulator-0.3-x86_64/tpmd.
 +      vtpm_tx_fh = open(GUEST_TX_FIFO, O_WRONLY);
 +#endif
 +    }
-+
+ 
+-    if (written != out_size ) {
+-      printf("ERROR: Part of response not written %d/%d.\nAttempt: ", 
written, out_size);
+-    } else {
+-      printf("Sent[%Zu]: ", out_size);
 +    if (vtpm_tx_fh < 0) {
 +      printf("ERROR: failed to open devices to respond to guest.\n");
 +      return -1;
@@ -1733,16 +564,34 @@ diff -uprN tpm_emulator-0.3-x86_64/tpmd.
 +      }
 +      tpm_free(out);
 +      tpm_free(addressed_out);
-+    }
-+
-+  } // loop
-+
-+  tpm_emulator_shutdown();
-+
+     }
+-    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);
 +  close(vtpm_tx_fh);
 +#ifndef VTPM_MUTLI_VM
 +  close(vtpm_rx_fh);
 +  free (guest_rx_file);
 +#endif
-+
-+}
+ 
+ }
+Binary files tpm_emulator/tpm_emulator and vtpm/tpm_emulator differ
+diff -uprN tpm_emulator/tpm_version.h vtpm/tpm_version.h
+--- tpm_emulator/tpm_version.h 2006-07-24 14:35:41.000000000 -0700
++++ vtpm/tpm_version.h 2006-07-24 14:35:35.000000000 -0700
+@@ -2,5 +2,5 @@
+ #define _TPM_VERSION_H_
+ #define VERSION_MAJOR 0
+ #define VERSION_MINOR 4
+-#define VERSION_BUILD 1153776940
++#define VERSION_BUILD 1153776935
+ #endif /* _TPM_VERSION_H_ */
+Binary files tpm_emulator/vtpmd and vtpm/vtpmd differ
diff -r 7d6f0791c650 -r 6b08035e10c5 tools/vtpm_manager/manager/dmictl.c
--- a/tools/vtpm_manager/manager/dmictl.c       Tue Jul 25 11:19:48 2006 +0100
+++ b/tools/vtpm_manager/manager/dmictl.c       Tue Jul 25 11:30:30 2006 +0100
@@ -105,6 +105,9 @@ TPM_RESULT close_dmi(VTPM_DMI_RESOURCE *
   if (dmi_res == NULL) 
     return TPM_SUCCESS;
 
+  if (dmi_res->dmi_id == VTPM_CTL_DM) 
+    return(TPM_BAD_PARAMETER);
+
   TCS_CloseContext(dmi_res->TCSContext);
   dmi_res->connected = FALSE;
 
diff -r 7d6f0791c650 -r 6b08035e10c5 
tools/vtpm_manager/manager/vtpm_manager_handler.c
--- a/tools/vtpm_manager/manager/vtpm_manager_handler.c Tue Jul 25 11:19:48 
2006 +0100
+++ b/tools/vtpm_manager/manager/vtpm_manager_handler.c Tue Jul 25 11:30:30 
2006 +0100
@@ -166,7 +166,8 @@ TPM_RESULT VTPM_Manager_Handler( vtpm_ip
          (!dmi_res->connected) ) {
       vtpmhandlerlogerror(VTPM_LOG_VTPM, "Attempted access to non-existent or 
disconnected DMI %d. Aborting...\n", dmi);
       status = TPM_BAD_PARAMETER;
-      goto abort_with_error;
+      // We have no one to reply to, they don't exist.
+      goto abort_command;
     }
 
     if (tag == VTPM_TAG_REQ) { 
diff -r 7d6f0791c650 -r 6b08035e10c5 tools/vtpm_manager/manager/vtpmd.c
--- a/tools/vtpm_manager/manager/vtpmd.c        Tue Jul 25 11:19:48 2006 +0100
+++ b/tools/vtpm_manager/manager/vtpmd.c        Tue Jul 25 11:30:30 2006 +0100
@@ -172,7 +172,7 @@ TPM_RESULT VTPM_New_DMI_Extra(VTPM_DMI_R
     } else if (pid == 0) {
       switch (startup_mode) {
       case TPM_ST_CLEAR:
-        execl (TPM_EMULATOR_PATH, "vtmpd", "clear", dmi_id_str, NULL);
+        execl (TPM_EMULATOR_PATH, "vtpmd", "clear", dmi_id_str, NULL);
         break;
       case TPM_ST_STATE:
         execl (TPM_EMULATOR_PATH, "vtpmd", "save", dmi_id_str, NULL);
diff -r 7d6f0791c650 -r 6b08035e10c5 tools/vtpm_manager/tcs/tcs.c
--- a/tools/vtpm_manager/tcs/tcs.c      Tue Jul 25 11:19:48 2006 +0100
+++ b/tools/vtpm_manager/tcs/tcs.c      Tue Jul 25 11:30:30 2006 +0100
@@ -162,8 +162,7 @@ TPM_RESULT TCS_OpenContext(TCS_CONTEXT_H
   
   vtpmloginfo(VTPM_LOG_TCS, "Calling TCS_OpenContext:\n");
   
-  // hContext must point to a null memory context handle
-  if(*hContext == HANDLE_NULL) {
+  if (hContext) {
     CONTEXT_HANDLE* pContextHandle = (CONTEXT_HANDLE *) 
malloc(sizeof(CONTEXT_HANDLE));
     if (pContextHandle == NULL) 
       return TPM_SIZE;
diff -r 7d6f0791c650 -r 6b08035e10c5 tools/vtpm_manager/tcs/transmit.c
--- a/tools/vtpm_manager/tcs/transmit.c Tue Jul 25 11:19:48 2006 +0100
+++ b/tools/vtpm_manager/tcs/transmit.c Tue Jul 25 11:30:30 2006 +0100
@@ -49,8 +49,8 @@ static int g_tx_fd = -1;              //
  #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"
+ #define TPM_TX_FNAME "/var/tpm/tpm_in.fifo"
+ #define TPM_RX_FNAME "/var/tpm/tpm_out.fifo"
  static int g_rx_fd = -1;
  static int *g_rx_fdp = &g_rx_fd;              // the fd to the TPM
 #endif
diff -r 7d6f0791c650 -r 6b08035e10c5 tools/vtpm/tpm_emulator-0.3-x86_64.patch
--- a/tools/vtpm/tpm_emulator-0.3-x86_64.patch  Tue Jul 25 11:19:48 2006 +0100
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,737 +0,0 @@
-diff -uprN orig/tpm_emulator-0.3/Makefile tpm_emulator-0.3-x86_64/Makefile
---- orig/tpm_emulator-0.3/Makefile     2006-01-10 04:21:45.000000000 -0800
-+++ tpm_emulator-0.3-x86_64/Makefile   2006-08-29 15:08:20.532342768 -0700
-@@ -7,6 +7,7 @@
- KERNEL_RELEASE := $(shell uname -r)
- KERNEL_BUILD   := /lib/modules/$(KERNEL_RELEASE)/build
- MOD_SUBDIR     := misc
-+COMPILE_ARCH    ?= $(shell uname -m | sed -e s/i.86/x86_32/)
- 
- # module settings
- MODULE_NAME    := tpm_emulator
-@@ -17,8 +18,14 @@ VERSION_BUILD  := $(shell date +"%s")
- # enable/disable DEBUG messages
- EXTRA_CFLAGS   += -Wall -DDEBUG -g  
- 
-+ifeq ($(COMPILE_ARCH),x86_64)
-+LIBDIR = lib64
-+else
-+LIBDIR = lib
-+endif
-+
- # GNU MP configuration
--GMP_LIB        := /usr/lib/libgmp.a
-+GMP_LIB        := /usr/$(LIBDIR)/libgmp.a
- GMP_HEADER     := /usr/include/gmp.h
- 
- # sources and objects
-diff -uprN orig/tpm_emulator-0.3/README tpm_emulator-0.3-x86_64/README
---- orig/tpm_emulator-0.3/README       2006-01-10 04:21:45.000000000 -0800
-+++ tpm_emulator-0.3-x86_64/README     2006-08-29 15:07:43.530967832 -0700
-@@ -43,6 +43,12 @@ Example:
- GMP_LIB        := /usr/lib/libgmp.a
- GMP_HEADER     := /usr/include/gmp.h
- 
-+GNU MP Library on 64 bit Systems
-+--------------------------------------------------------------------------
-+Some 64-bit kernels have problems with importing the user-space gmp 
-+library (/usr/lib*/libgmp.a) into kernel space.  These kernels will require
-+that the gmp library be recompiled for kernel space with -mcmodel=kernel.
-+
- Installation
- --------------------------------------------------------------------------
- The compilation and installation process uses the build environment for 
-diff -uprN orig/tpm_emulator-0.3/crypto/gmp_kernel_wrapper.c 
tpm_emulator-0.3-x86_64/crypto/gmp_kernel_wrapper.c
---- orig/tpm_emulator-0.3/crypto/gmp_kernel_wrapper.c  2006-01-10 
04:21:45.000000000 -0800
-+++ tpm_emulator-0.3-x86_64/crypto/gmp_kernel_wrapper.c        2006-08-29 
15:07:43.525968592 -0700
-@@ -79,7 +79,7 @@ void __attribute__ ((regparm(0))) *kerne
- {
-   void *ret  = (void*)kmalloc(size, GFP_KERNEL);
-   if (!ret) panic(KERN_CRIT TPM_MODULE_NAME 
--    "GMP: cannot allocate memory (size=%u)\n", size);
-+    "GMP: cannot allocate memory (size=%Zu)\n", size);
-   return ret;
- }
- 
-@@ -88,7 +88,7 @@ void __attribute__ ((regparm(0))) *kerne
- {
-   void *ret = (void*)kmalloc(new_size, GFP_KERNEL);
-   if (!ret) panic(KERN_CRIT TPM_MODULE_NAME "GMP: Cannot reallocate memory "
--    "(old_size=%u new_size=%u)\n", old_size, new_size);
-+    "(old_size=%Zu new_size=%Zu)\n", old_size, new_size);
-   memcpy(ret, oldptr, old_size);
-   kfree(oldptr);
-   return ret;
-diff -uprN orig/tpm_emulator-0.3/linux_module.c 
tpm_emulator-0.3-x86_64/linux_module.c
---- orig/tpm_emulator-0.3/linux_module.c       2006-01-10 04:21:45.000000000 
-0800
-+++ tpm_emulator-0.3-x86_64/linux_module.c     2006-08-29 15:07:43.526968440 
-0700
-@@ -72,7 +72,7 @@ static int tpm_release(struct inode *ino
- 
- static ssize_t tpm_read(struct file *file, char *buf, size_t count, loff_t 
*ppos)
- {
--  debug("%s(%d)", __FUNCTION__, count);
-+  debug("%s(%Zu)", __FUNCTION__, count);
-   down(&tpm_mutex);
-   if (tpm_response.data != NULL) {
-     count = min(count, (size_t)tpm_response.size - (size_t)*ppos);
-@@ -91,7 +91,7 @@ static ssize_t tpm_read(struct file *fil
- 
- static ssize_t tpm_write(struct file *file, const char *buf, size_t count, 
loff_t *ppos)
- {
--  debug("%s(%d)", __FUNCTION__, count);
-+  debug("%s(%Zu)", __FUNCTION__, count);
-   down(&tpm_mutex);
-   *ppos = 0;
-   if (tpm_response.data != NULL) kfree(tpm_response.data);
-diff -uprN orig/tpm_emulator-0.3/linux_module.h 
tpm_emulator-0.3-x86_64/linux_module.h
---- orig/tpm_emulator-0.3/linux_module.h       2006-01-10 04:21:45.000000000 
-0800
-+++ tpm_emulator-0.3-x86_64/linux_module.h     2006-08-29 15:07:43.527968288 
-0700
-@@ -28,8 +28,10 @@
- 
- /* module settings */
- 
-+#ifndef STR
- #define STR(s) __STR__(s)
- #define __STR__(s) #s
-+#endif
- #include "tpm_version.h"
- 
- #define TPM_DEVICE_MINOR      224
-diff -uprN orig/tpm_emulator-0.3/tpm/tpm_credentials.c 
tpm_emulator-0.3-x86_64/tpm/tpm_credentials.c
---- orig/tpm_emulator-0.3/tpm/tpm_credentials.c        2006-01-10 
04:21:45.000000000 -0800
-+++ tpm_emulator-0.3-x86_64/tpm/tpm_credentials.c      2006-08-29 
15:07:43.530967832 -0700
-@@ -47,16 +47,16 @@ int tpm_compute_pubkey_checksum(TPM_NONC
- 
- TPM_RESULT tpm_get_pubek(TPM_PUBKEY *pubEndorsementKey)
- {
--  UINT32 key_length;
-+  size_t key_length;
-   if (!tpmData.permanent.data.endorsementKey.size) return TPM_NO_ENDORSEMENT;
-   /* setup TPM_PUBKEY structure */
--  key_length = tpmData.permanent.data.endorsementKey.size;
--  pubEndorsementKey->pubKey.keyLength = key_length >> 3;
-+  pubEndorsementKey->pubKey.keyLength = 
tpmData.permanent.data.endorsementKey.size >> 3;
-   pubEndorsementKey->pubKey.key = 
tpm_malloc(pubEndorsementKey->pubKey.keyLength);
-   if (pubEndorsementKey->pubKey.key == NULL) return TPM_FAIL;
-   rsa_export_modulus(&tpmData.permanent.data.endorsementKey,
--    pubEndorsementKey->pubKey.key,
--    &pubEndorsementKey->pubKey.keyLength);
-+                   pubEndorsementKey->pubKey.key,
-+                   &key_length);
-+  pubEndorsementKey->pubKey.keyLength = key_length;
-   pubEndorsementKey->algorithmParms.algorithmID = TPM_ALG_RSA;
-   pubEndorsementKey->algorithmParms.encScheme = TPM_ES_RSAESOAEP_SHA1_MGF1;
-   pubEndorsementKey->algorithmParms.sigScheme = TPM_SS_NONE;
-@@ -175,6 +175,7 @@ TPM_RESULT TPM_OwnerReadInternalPub(TPM_
- {
-   TPM_RESULT res;
-   TPM_KEY_DATA *srk = &tpmData.permanent.data.srk;
-+  size_t key_length;
-   info("TPM_OwnerReadInternalPub()");
-   /* verify authorization */
-   res = tpm_verify_auth(auth1, tpmData.permanent.data.ownerAuth, 
TPM_KH_OWNER);
-@@ -186,7 +187,8 @@ TPM_RESULT TPM_OwnerReadInternalPub(TPM_
-     publicPortion->pubKey.key = tpm_malloc(publicPortion->pubKey.keyLength);
-     if (publicPortion->pubKey.key == NULL) return TPM_FAIL;
-     rsa_export_modulus(&srk->key, publicPortion->pubKey.key, 
--      &publicPortion->pubKey.keyLength);
-+      &key_length);
-+    publicPortion->pubKey.keyLength = key_length;
-     publicPortion->algorithmParms.algorithmID = TPM_ALG_RSA;
-     publicPortion->algorithmParms.encScheme = srk->encScheme;
-     publicPortion->algorithmParms.sigScheme = srk->sigScheme;
-diff -uprN orig/tpm_emulator-0.3/tpm/tpm_crypto.c 
tpm_emulator-0.3-x86_64/tpm/tpm_crypto.c
---- orig/tpm_emulator-0.3/tpm/tpm_crypto.c     2006-01-10 04:21:45.000000000 
-0800
-+++ tpm_emulator-0.3-x86_64/tpm/tpm_crypto.c   2006-08-29 15:07:43.531967680 
-0700
-@@ -182,7 +182,8 @@ TPM_RESULT TPM_CertifyKey(TPM_KEY_HANDLE
-   TPM_KEY_DATA *cert, *key;
-   sha1_ctx_t sha1_ctx;
-   BYTE *buf, *p;
--  UINT32 length;
-+  UINT32 length32;
-+  size_t length;
-   info("TPM_CertifyKey()");
-   /* get keys */
-   cert = tpm_get_key(certHandle);
-@@ -264,14 +265,15 @@ TPM_RESULT TPM_CertifyKey(TPM_KEY_HANDLE
-   /* compute the digest of the CERTIFY_INFO[2] structure and sign it */
-   length = sizeof_TPM_CERTIFY_INFO((*certifyInfo));
-   p = buf = tpm_malloc(length);
-+  length32=(UINT32) length;
-   if (buf == NULL
--      || tpm_marshal_TPM_CERTIFY_INFO(&p, &length, certifyInfo)) {
-+      || tpm_marshal_TPM_CERTIFY_INFO(&p, &length32, certifyInfo)) {
-     free_TPM_KEY_PARMS(certifyInfo->algorithmParms);
-     return TPM_FAIL;
-   }
-   length = sizeof_TPM_CERTIFY_INFO((*certifyInfo));
-   sha1_init(&sha1_ctx);
--  sha1_update(&sha1_ctx, buf, length);
-+  sha1_update(&sha1_ctx, buf, (size_t) length);
-   sha1_final(&sha1_ctx, buf);
-   res = tpm_sign(cert, auth1, FALSE, buf, SHA1_DIGEST_LENGTH, outData, 
outDataSize);
-   tpm_free(buf);
-@@ -292,7 +294,8 @@ TPM_RESULT TPM_CertifyKey2(TPM_KEY_HANDL
-   TPM_KEY_DATA *cert, *key;
-   sha1_ctx_t sha1_ctx;
-   BYTE *buf, *p;
--  UINT32 length;
-+  size_t length;
-+  UINT32 length32;
-   info("TPM_CertifyKey2()");
-   /* get keys */
-   cert = tpm_get_key(certHandle);
-@@ -362,8 +365,9 @@ TPM_RESULT TPM_CertifyKey2(TPM_KEY_HANDL
-   /* compute the digest of the CERTIFY_INFO[2] structure and sign it */
-   length = sizeof_TPM_CERTIFY_INFO((*certifyInfo));
-   p = buf = tpm_malloc(length);
-+  length32 = (UINT32) length;
-   if (buf == NULL
--      || tpm_marshal_TPM_CERTIFY_INFO(&p, &length, certifyInfo)) {
-+      || tpm_marshal_TPM_CERTIFY_INFO(&p, &length32, certifyInfo)) {
-     free_TPM_KEY_PARMS(certifyInfo->algorithmParms);
-     return TPM_FAIL;
-   }
-diff -uprN orig/tpm_emulator-0.3/tpm/tpm_data.c 
tpm_emulator-0.3-x86_64/tpm/tpm_data.c
---- orig/tpm_emulator-0.3/tpm/tpm_data.c       2006-01-10 04:21:45.000000000 
-0800
-+++ tpm_emulator-0.3-x86_64/tpm/tpm_data.c     2006-08-29 15:08:20.535342312 
-0700
-@@ -214,23 +214,30 @@ static int read_from_file(uint8_t **data
- int tpm_store_permanent_data(void)
- {
-   uint8_t *buf, *ptr;
--  size_t buf_length, len;
-+  UINT32 buf_length, len;
- 
-   /* marshal data */
--  buf_length = len = sizeof_TPM_STCLEAR_FLAGS(tpmData.stclear.flags)
--    + sizeof_TPM_PERMANENT_FLAGS(tpmData.permanent.flags) + 2
--    + sizeof_TPM_PERMANENT_DATA(tpmData.permanent.data);
-+  buf_length = len = 4 + sizeof_TPM_STCLEAR_FLAGS(tpmData.stclear.flags)
-+    + sizeof_TPM_PERMANENT_FLAGS(tpmData.permanent.flags) 
-+    + sizeof_TPM_STANY_FLAGS(tpmData.stany.flags) + 2
-+    + sizeof_TPM_STCLEAR_DATA(tpmData.stclear.data) 
-+    + sizeof_TPM_PERMANENT_DATA(tpmData.permanent.data)
-+    + sizeof_TPM_STANY_DATA(tpmData.stany.data);
-   buf = ptr = tpm_malloc(buf_length);
-   if (buf == NULL
-       || tpm_marshal_TPM_VERSION(&ptr, &len, &tpmData.permanent.data.version)
-       || tpm_marshal_TPM_STCLEAR_FLAGS(&ptr, &len, &tpmData.stclear.flags)
-       || tpm_marshal_TPM_PERMANENT_FLAGS(&ptr, &len, &tpmData.permanent.flags)
-+      || tpm_marshal_TPM_STANY_FLAGS(&ptr, &len, &tpmData.stany.flags)
-       || tpm_marshal_BOOL(&ptr, &len, 
tpmData.permanent.flags.selfTestSucceeded)
-       || tpm_marshal_BOOL(&ptr, &len, tpmData.permanent.flags.owned)
--      || tpm_marshal_TPM_PERMANENT_DATA(&ptr, &len, &tpmData.permanent.data)) 
{
-+      || tpm_marshal_TPM_STCLEAR_DATA(&ptr, &len, &tpmData.stclear.data)
-+      || tpm_marshal_TPM_PERMANENT_DATA(&ptr, &len, &tpmData.permanent.data)
-+      || tpm_marshal_TPM_STANY_DATA(&ptr, &len, &tpmData.stany.data)) {
-     tpm_free(buf);
-     return -1;
-   }
-+
-   if (write_to_file(buf, buf_length - len)) {
-     tpm_free(buf);
-     return -1; 
-@@ -242,24 +249,29 @@ int tpm_store_permanent_data(void)
- int tpm_restore_permanent_data(void)
- {
-   uint8_t *buf, *ptr;
--  size_t buf_length, len;
-+  size_t buf_length;
-+  UINT32 len;
-   TPM_VERSION ver;
- 
-   /* read data */
-   if (read_from_file(&buf, &buf_length)) return -1;
-   ptr = buf;
--  len = buf_length;
-+  len = (uint32_t) buf_length;
-   /* unmarshal data */
-   if (tpm_unmarshal_TPM_VERSION(&ptr, &len, &ver)
-       || memcmp(&ver, &tpmData.permanent.data.version, sizeof(TPM_VERSION))
-       || tpm_unmarshal_TPM_STCLEAR_FLAGS(&ptr, &len, &tpmData.stclear.flags)
-       || tpm_unmarshal_TPM_PERMANENT_FLAGS(&ptr, &len, 
&tpmData.permanent.flags)
-+      || tpm_unmarshal_TPM_STANY_FLAGS(&ptr, &len, &tpmData.stany.flags)
-       || tpm_unmarshal_BOOL(&ptr, &len, 
&tpmData.permanent.flags.selfTestSucceeded)
-       || tpm_unmarshal_BOOL(&ptr, &len, &tpmData.permanent.flags.owned)
--      || tpm_unmarshal_TPM_PERMANENT_DATA(&ptr, &len, 
&tpmData.permanent.data)) {
-+      || tpm_unmarshal_TPM_STCLEAR_DATA(&ptr, &len, &tpmData.stclear.data)
-+      || tpm_unmarshal_TPM_PERMANENT_DATA(&ptr, &len, &tpmData.permanent.data)
-+      || tpm_unmarshal_TPM_STANY_DATA(&ptr, &len, &tpmData.stany.data)) {
-     tpm_free(buf);
-     return -1;
-   }
-+
-   tpm_free(buf);
-   return 0;
- }
-diff -uprN orig/tpm_emulator-0.3/tpm/tpm_marshalling.c 
tpm_emulator-0.3-x86_64/tpm/tpm_marshalling.c
---- orig/tpm_emulator-0.3/tpm/tpm_marshalling.c        2006-01-10 
04:21:45.000000000 -0800
-+++ tpm_emulator-0.3-x86_64/tpm/tpm_marshalling.c      2006-08-29 
15:08:20.537342008 -0700
-@@ -1212,7 +1212,7 @@ int tpm_unmarshal_TPM_STANY_FLAGS(BYTE *
- 
- int tpm_marshal_RSA(BYTE **ptr, UINT32 *length, rsa_private_key_t *v)
- {
--  UINT32 m_len, e_len, q_len;
-+  size_t m_len, e_len, q_len;
-   if (*length < sizeof_RSA((*v))) return -1;
-   if (v->size > 0) {
-     rsa_export_modulus(v, &(*ptr)[6], &m_len);
-@@ -1356,6 +1356,66 @@ int tpm_unmarshal_TPM_PERMANENT_DATA(BYT
-   return 0;
- }
- 
-+int tpm_marshal_TPM_STCLEAR_DATA(BYTE **ptr, UINT32 *length, TPM_STCLEAR_DATA 
*v)
-+{
-+  if (tpm_marshal_TPM_STRUCTURE_TAG(ptr, length, v->tag)
-+    || tpm_marshal_TPM_NONCE(ptr, length, &v->contextNonceKey)
-+    || tpm_marshal_TPM_COUNT_ID(ptr, length, v->countID) ) return -1;
-+
-+  return 0;
-+}
-+
-+int tpm_unmarshal_TPM_STCLEAR_DATA(BYTE **ptr, UINT32 *length, 
TPM_STCLEAR_DATA *v)
-+{
-+  if (tpm_unmarshal_TPM_STRUCTURE_TAG(ptr, length, &v->tag)
-+    || tpm_unmarshal_TPM_NONCE(ptr, length, &v->contextNonceKey)
-+    || tpm_unmarshal_TPM_COUNT_ID(ptr, length, &v->countID) ) return -1;
-+
-+  return 0;
-+}
-+
-+int tpm_marshal_TPM_STANY_DATA(BYTE **ptr, UINT32 *length, TPM_STANY_DATA *v)
-+{
-+  UINT32 i;
-+  if (tpm_marshal_TPM_STRUCTURE_TAG(ptr, length, v->tag)
-+    || tpm_marshal_TPM_NONCE(ptr, length, &v->contextNonceSession)
-+    || tpm_marshal_TPM_DIGEST(ptr, length, &v->auditDigest)
-+    || tpm_marshal_BOOL(ptr, length, v->auditSession)
-+    || tpm_marshal_TPM_CURRENT_TICKS(ptr, length, &v->currentTicks)
-+    || tpm_marshal_UINT32(ptr, length, v->contextCount)
-+    || tpm_marshal_UINT32_ARRAY(ptr, length, v->contextList, 
TPM_MAX_SESSION_LIST)) return -1;
-+  for (i = 0; i < TPM_MAX_SESSIONS; i++) {
-+    if (tpm_marshal_TPM_SESSION_DATA(ptr, length, &v->sessions[i])) return -1;
-+  }
-+  for (i = 0; i < TPM_MAX_SESSIONS_DAA; i++) {
-+    if (tpm_marshal_TPM_DAA_SESSION_DATA(ptr, length, &v->sessionsDAA[i])) 
return -1;
-+  }
-+  if (tpm_marshal_TPM_TRANSHANDLE(ptr, length, v->transExclusive)) return -1;
-+
-+  return 0;
-+}
-+
-+int tpm_unmarshal_TPM_STANY_DATA(BYTE **ptr, UINT32 *length, TPM_STANY_DATA 
*v)
-+{
-+  UINT32 i;
-+  if (tpm_unmarshal_TPM_STRUCTURE_TAG(ptr, length, &v->tag)
-+    || tpm_unmarshal_TPM_NONCE(ptr, length, &v->contextNonceSession)
-+    || tpm_unmarshal_TPM_DIGEST(ptr, length, &v->auditDigest)
-+    || tpm_unmarshal_BOOL(ptr, length, &v->auditSession)
-+    || tpm_unmarshal_TPM_CURRENT_TICKS(ptr, length, &v->currentTicks)
-+    || tpm_unmarshal_UINT32(ptr, length, &v->contextCount)
-+    || tpm_unmarshal_UINT32_ARRAY(ptr, length, v->contextList, 
TPM_MAX_SESSION_LIST)) return -1;
-+  for (i = 0; i < TPM_MAX_SESSIONS; i++) {
-+    if (tpm_unmarshal_TPM_SESSION_DATA(ptr, length, &v->sessions[i])) return 
-1;
-+  }
-+  for (i = 0; i < TPM_MAX_SESSIONS_DAA; i++) {
-+    if (tpm_unmarshal_TPM_DAA_SESSION_DATA(ptr, length, &v->sessionsDAA[i])) 
return -1;
-+  }
-+  if (tpm_unmarshal_TPM_TRANSHANDLE(ptr, length, &v->transExclusive)) return 
-1;
-+
-+  return 0;
-+}
-+
- int tpm_marshal_TPM_SESSION_DATA(BYTE **ptr, UINT32 *length, TPM_SESSION_DATA 
*v)
- {
-   if (tpm_marshal_BYTE(ptr, length, v->type)
-diff -uprN orig/tpm_emulator-0.3/tpm/tpm_marshalling.h 
tpm_emulator-0.3-x86_64/tpm/tpm_marshalling.h
---- orig/tpm_emulator-0.3/tpm/tpm_marshalling.h        2006-01-10 
04:21:45.000000000 -0800
-+++ tpm_emulator-0.3-x86_64/tpm/tpm_marshalling.h      2006-08-29 
15:08:20.538341856 -0700
-@@ -420,6 +420,12 @@ int tpm_unmarshal_TPM_KEY_DATA(BYTE **pt
- int tpm_marshal_TPM_PERMANENT_DATA(BYTE **ptr, UINT32 *length, 
TPM_PERMANENT_DATA *);
- int tpm_unmarshal_TPM_PERMANENT_DATA(BYTE **ptr, UINT32 *length, 
TPM_PERMANENT_DATA *);
- 
-+int tpm_marshal_TPM_STCLEAR_DATA(BYTE **ptr, UINT32 *length, TPM_STCLEAR_DATA 
*v);
-+int tpm_unmarshal_TPM_STCLEAR_DATA(BYTE **ptr, UINT32 *length, 
TPM_STCLEAR_DATA *v);
-+
-+int tpm_marshal_TPM_STANY_DATA(BYTE **ptr, UINT32 *length, TPM_STANY_DATA *v);
-+int tpm_unmarshal_TPM_STANY_DATA(BYTE **ptr, UINT32 *length, TPM_STANY_DATA 
*v);
-+
- int tpm_marshal_TPM_SESSION_DATA(BYTE **ptr, UINT32 *length, TPM_SESSION_DATA 
*v);
- int tpm_unmarshal_TPM_SESSION_DATA(BYTE **ptr, UINT32 *length, 
TPM_SESSION_DATA *v);
- 
-diff -uprN orig/tpm_emulator-0.3/tpm/tpm_owner.c 
tpm_emulator-0.3-x86_64/tpm/tpm_owner.c
---- orig/tpm_emulator-0.3/tpm/tpm_owner.c      2006-01-10 04:21:45.000000000 
-0800
-+++ tpm_emulator-0.3-x86_64/tpm/tpm_owner.c    2006-08-29 15:07:43.535967072 
-0700
-@@ -108,7 +108,7 @@ TPM_RESULT TPM_TakeOwnership(TPM_PROTOCO
-   TPM_RESULT res;
-   rsa_private_key_t *ek = &tpmData.permanent.data.endorsementKey;
-   TPM_KEY_DATA *srk = &tpmData.permanent.data.srk;
--  UINT32 buf_size = ek->size >> 3;
-+  size_t buf_size = ek->size >> 3, key_length; 
-   BYTE buf[buf_size];
- 
-   info("TPM_TakeOwnership()");
-@@ -172,7 +172,8 @@ TPM_RESULT TPM_TakeOwnership(TPM_PROTOCO
-     return TPM_FAIL;
-   }
-   rsa_export_modulus(&srk->key, srkPub->pubKey.key,
--    &srkPub->pubKey.keyLength);
-+                   &key_length);
-+  srkPub->pubKey.keyLength = (UINT32) key_length;
-   /* setup tpmProof and set state to owned */
-   tpm_get_random_bytes(tpmData.permanent.data.tpmProof.nonce, 
-     sizeof(tpmData.permanent.data.tpmProof.nonce));
-diff -uprN orig/tpm_emulator-0.3/tpm/tpm_startup.c 
tpm_emulator-0.3-x86_64/tpm/tpm_startup.c
---- orig/tpm_emulator-0.3/tpm/tpm_startup.c    2006-01-10 04:21:45.000000000 
-0800
-+++ tpm_emulator-0.3-x86_64/tpm/tpm_startup.c  2006-08-29 15:08:20.538341856 
-0700
-@@ -41,24 +41,29 @@ void TPM_Init(TPM_STARTUP_TYPE startupTy
- TPM_RESULT TPM_Startup(TPM_STARTUP_TYPE startupType)
- {
-   int i;
-+  int restore_fail;
-   info("TPM_Startup(%d)", startupType);
-   if (tpmData.stany.flags.postInitialise == FALSE) return 
TPM_INVALID_POSTINIT;
--  /* reset STANY_FLAGS */
--  SET_TO_ZERO(&tpmData.stany.flags);
--  tpmData.stany.flags.tag = TPM_TAG_STANY_FLAGS;
--  /* reset STANY_DATA (invalidates ALL sessions) */
--  SET_TO_ZERO(&tpmData.stany.data);
--  tpmData.stany.data.tag = TPM_TAG_STANY_DATA;
--  /* init session-context nonce */
--  SET_TO_RAND(&tpmData.stany.data.contextNonceSession);
-+
-+  /* try and restore state to get EK, SRK, etc */
-+  restore_fail = tpm_restore_permanent_data();
-+
-   /* set data and flags according to the given startup type */
-   if (startupType == TPM_ST_CLEAR) {
-+    /* reset STANY_FLAGS */
-+    SET_TO_ZERO(&tpmData.stany.flags);
-+    tpmData.stany.flags.tag = TPM_TAG_STANY_FLAGS;
-+    /* reset STANY_DATA (invalidates ALL sessions) */
-+    SET_TO_ZERO(&tpmData.stany.data);
-+    tpmData.stany.data.tag = TPM_TAG_STANY_DATA;
-+    /* init session-context nonce */
-+    SET_TO_RAND(&tpmData.stany.data.contextNonceSession);
-     /* reset PCR values */
-     for (i = 0; i < TPM_NUM_PCR; i++) {
--      if (tpmData.permanent.data.pcrAttrib[i].pcrReset)
--        SET_TO_ZERO(tpmData.permanent.data.pcrValue[i].digest);
-+      if (!tpmData.permanent.data.pcrAttrib[i].pcrReset)
-+        SET_TO_ZERO(&tpmData.permanent.data.pcrValue[i].digest);
-       else
--        SET_TO_0xFF(tpmData.permanent.data.pcrValue[i].digest);
-+        SET_TO_0xFF(&tpmData.permanent.data.pcrValue[i].digest);
-     }
-     /* reset STCLEAR_FLAGS */
-     SET_TO_ZERO(&tpmData.stclear.flags);
-@@ -77,7 +82,8 @@ TPM_RESULT TPM_Startup(TPM_STARTUP_TYPE 
-     /* init key-context nonce */
-     SET_TO_RAND(&tpmData.stclear.data.contextNonceKey);
-   } else if (startupType == TPM_ST_STATE) {
--    if (tpm_restore_permanent_data()) {
-+    /* restore must have been successful for TPM_ST_STATE */
-+    if (restore_fail) {
-       error("restoring permanent data failed");
-       tpmData.permanent.data.testResult = "tpm_restore_permanent_data() 
failed";
-       tpmData.permanent.flags.selfTestSucceeded = FALSE;
-diff -uprN orig/tpm_emulator-0.3/tpm/tpm_storage.c 
tpm_emulator-0.3-x86_64/tpm/tpm_storage.c
---- orig/tpm_emulator-0.3/tpm/tpm_storage.c    2006-01-10 04:21:45.000000000 
-0800
-+++ tpm_emulator-0.3-x86_64/tpm/tpm_storage.c  2006-08-29 15:07:43.537966768 
-0700
-@@ -58,6 +58,7 @@ int encrypt_sealed_data(TPM_KEY_DATA *ke
-                         BYTE *enc, UINT32 *enc_size)
- {
-   UINT32 len;
-+  size_t enc_size32 = *enc_size;
-   BYTE *buf, *ptr;
-   rsa_public_key_t pub_key;
-   int scheme;
-@@ -72,7 +73,7 @@ int encrypt_sealed_data(TPM_KEY_DATA *ke
-   if (buf == NULL
-       || tpm_marshal_TPM_SEALED_DATA(&ptr, &len, seal)
-       || rsa_encrypt(&pub_key, scheme, buf, sizeof_TPM_SEALED_DATA((*seal)),
--                     enc, enc_size)) {
-+                     enc, &enc_size32)) {
-     tpm_free(buf);
-     rsa_release_public_key(&pub_key);
-     return -1;
-@@ -85,7 +86,8 @@ int encrypt_sealed_data(TPM_KEY_DATA *ke
- int decrypt_sealed_data(TPM_KEY_DATA *key, BYTE *enc, UINT32 enc_size,
-                         TPM_SEALED_DATA *seal, BYTE **buf) 
- {
--  UINT32 len;
-+  size_t len;
-+  UINT32 len32;
-   BYTE *ptr;
-   int scheme;
-   switch (key->encScheme) {
-@@ -96,8 +98,12 @@ int decrypt_sealed_data(TPM_KEY_DATA *ke
-   len = enc_size;
-   *buf = ptr = tpm_malloc(len);
-   if (*buf == NULL
--      || rsa_decrypt(&key->key, scheme, enc, enc_size, *buf, &len)
--      || tpm_unmarshal_TPM_SEALED_DATA(&ptr, &len, seal)) {
-+      || rsa_decrypt(&key->key, scheme, enc, enc_size, *buf, &len) ){
-+    tpm_free(*buf);
-+    return -1;
-+  }
-+  len32 = len;
-+  if (tpm_unmarshal_TPM_SEALED_DATA(&ptr, &len32, seal)) {
-     tpm_free(*buf);
-     return -1;
-   }
-@@ -237,11 +243,12 @@ TPM_RESULT TPM_Unseal(TPM_KEY_HANDLE par
- 
- TPM_RESULT TPM_UnBind(TPM_KEY_HANDLE keyHandle, UINT32 inDataSize,
-                       BYTE *inData, TPM_AUTH *auth1, 
--                      UINT32 *outDataSize, BYTE **outData)
-+                      UINT32 *outDataSize32, BYTE **outData)
- {
-   TPM_RESULT res;
-   TPM_KEY_DATA *key;
-   int scheme;
-+  size_t outDataSize;
-   info("TPM_UnBind()");
-   /* get key */
-   key = tpm_get_key(keyHandle);
-@@ -258,8 +265,8 @@ TPM_RESULT TPM_UnBind(TPM_KEY_HANDLE key
-   /* the size of the input data muss be greater than zero */
-   if (inDataSize == 0) return TPM_BAD_PARAMETER;
-   /* decrypt data */
--  *outDataSize = inDataSize;
--  *outData = tpm_malloc(*outDataSize);
-+  outDataSize = inDataSize;
-+  *outData = tpm_malloc(outDataSize);
-   if (*outData == NULL) return TPM_FAIL;
-   switch (key->encScheme) {
-     case TPM_ES_RSAESOAEP_SHA1_MGF1: scheme = RSA_ES_OAEP_SHA1; break;
-@@ -267,20 +274,21 @@ TPM_RESULT TPM_UnBind(TPM_KEY_HANDLE key
-     default: tpm_free(*outData); return TPM_DECRYPT_ERROR;
-   }
-   if (rsa_decrypt(&key->key, scheme, inData, inDataSize, 
--      *outData, outDataSize)) {
-+      *outData, &outDataSize)) {
-     tpm_free(*outData);
-     return TPM_DECRYPT_ERROR;
-   }
-   /* verify data if it is of type TPM_BOUND_DATA */
-   if (key->encScheme == TPM_ES_RSAESOAEP_SHA1_MGF1 
-       || key->keyUsage != TPM_KEY_LEGACY) {
--    if (*outDataSize < 5 || memcmp(*outData, "\x01\x01\00\x00\x02", 5) != 0) {
-+    if (outDataSize < 5 || memcmp(*outData, "\x01\x01\00\x00\x02", 5) != 0) {
-       tpm_free(*outData);
-       return TPM_DECRYPT_ERROR;
-     }
--    *outDataSize -= 5;
--    memmove(*outData, &(*outData)[5], *outDataSize);
-+    outDataSize -= 5;
-+    memmove(*outData, &(*outData)[5], outDataSize);
-   }
-+  *outDataSize32 = (UINT32) outDataSize;
-   return TPM_SUCCESS;
- }
- 
-@@ -311,12 +319,13 @@ static int verify_key_digest(TPM_KEY *ke
- }
- 
- int encrypt_private_key(TPM_KEY_DATA *key, TPM_STORE_ASYMKEY *store,
--                        BYTE *enc, UINT32 *enc_size)
-+                        BYTE *enc, UINT32 *enc_size32)
- {
-   UINT32 len;
-   BYTE *buf, *ptr;
-   rsa_public_key_t pub_key;
-   int scheme;
-+  size_t enc_size;
-   switch (key->encScheme) {
-     case TPM_ES_RSAESOAEP_SHA1_MGF1: scheme = RSA_ES_OAEP_SHA1; break;
-     case TPM_ES_RSAESPKCSv15: scheme = RSA_ES_PKCSV15; break;
-@@ -328,11 +337,12 @@ int encrypt_private_key(TPM_KEY_DATA *ke
-   if (buf == NULL
-       || tpm_marshal_TPM_STORE_ASYMKEY(&ptr, &len, store)
-       || rsa_encrypt(&pub_key, scheme, buf, 
sizeof_TPM_STORE_ASYMKEY((*store)),
--                     enc, enc_size)) {
-+                     enc, &enc_size)) {
-     tpm_free(buf);
-     rsa_release_public_key(&pub_key);
-     return -1;
-   }
-+  *enc_size32 = (UINT32) enc_size;
-   tpm_free(buf);
-   rsa_release_public_key(&pub_key);
-   return 0;
-@@ -341,7 +351,8 @@ int encrypt_private_key(TPM_KEY_DATA *ke
- int decrypt_private_key(TPM_KEY_DATA *key, BYTE *enc, UINT32 enc_size, 
-                         TPM_STORE_ASYMKEY *store, BYTE **buf) 
- {
--  UINT32 len;
-+  UINT32 len32;
-+  size_t len;
-   BYTE *ptr;
-   int scheme;
-   switch (key->encScheme) {
-@@ -352,8 +363,12 @@ int decrypt_private_key(TPM_KEY_DATA *ke
-   len = enc_size;
-   *buf = ptr = tpm_malloc(len);
-   if (*buf == NULL
--      || rsa_decrypt(&key->key, scheme, enc, enc_size, *buf, &len)
--      || tpm_unmarshal_TPM_STORE_ASYMKEY(&ptr, &len, store)) {
-+      || rsa_decrypt(&key->key, scheme, enc, enc_size, *buf, &len) ) {
-+    tpm_free(*buf);
-+    return -1;
-+  }
-+  len32 = (UINT32) len;
-+  if (tpm_unmarshal_TPM_STORE_ASYMKEY(&ptr, &len32, store)) {  
-     tpm_free(*buf);
-     return -1;
-   }
-@@ -371,7 +386,7 @@ TPM_RESULT TPM_CreateWrapKey(TPM_KEY_HAN
-   TPM_SESSION_DATA *session;
-   TPM_STORE_ASYMKEY store;
-   rsa_private_key_t rsa;
--  UINT32 key_length;
-+  size_t key_length;
- 
-   info("TPM_CreateWrapKey()");
-   /* get parent key */
-@@ -428,11 +443,11 @@ TPM_RESULT TPM_CreateWrapKey(TPM_KEY_HAN
-   }
-   if (compute_key_digest(wrappedKey, &store.pubDataDigest)) return TPM_FAIL;
-   /* generate key and store it */
--  key_length = keyInfo->algorithmParms.parms.rsa.keyLength;
--  if (rsa_generate_key(&rsa, key_length)) return TPM_FAIL;
--  wrappedKey->pubKey.keyLength = key_length >> 3;
-+  if (rsa_generate_key(&rsa, keyInfo->algorithmParms.parms.rsa.keyLength)) 
-+    return TPM_FAIL;
-+  wrappedKey->pubKey.keyLength = keyInfo->algorithmParms.parms.rsa.keyLength 
>> 3;
-   wrappedKey->pubKey.key = tpm_malloc(wrappedKey->pubKey.keyLength);
--  store.privKey.keyLength = key_length >> 4;
-+  store.privKey.keyLength = keyInfo->algorithmParms.parms.rsa.keyLength >> 4;
-   store.privKey.key = tpm_malloc(store.privKey.keyLength);
-   wrappedKey->encDataSize = parent->key.size >> 3;
-   wrappedKey->encData = tpm_malloc(wrappedKey->encDataSize);
-@@ -444,9 +459,11 @@ TPM_RESULT TPM_CreateWrapKey(TPM_KEY_HAN
-     tpm_free(wrappedKey->encData);
-     return TPM_FAIL;
-   }
--  rsa_export_modulus(&rsa, wrappedKey->pubKey.key, 
--    &wrappedKey->pubKey.keyLength);
--  rsa_export_prime1(&rsa, store.privKey.key, &store.privKey.keyLength);
-+  rsa_export_modulus(&rsa, wrappedKey->pubKey.key,
-+                   &key_length);
-+  wrappedKey->pubKey.keyLength = (UINT32) key_length;
-+  rsa_export_prime1(&rsa, store.privKey.key, &key_length);
-+  store.privKey.keyLength = (UINT32) key_length;
-   rsa_release_private_key(&rsa);
-   /* encrypt private key data */
-   if (encrypt_private_key(parent, &store, wrappedKey->encData, 
-@@ -567,6 +584,7 @@ TPM_RESULT TPM_LoadKey2(TPM_KEY_HANDLE p
- 
- int tpm_setup_key_parms(TPM_KEY_DATA *key, TPM_KEY_PARMS *parms)
- {
-+  size_t key_length;
-   parms->algorithmID = TPM_ALG_RSA;
-   parms->encScheme = key->encScheme;
-   parms->sigScheme = key->sigScheme;
-@@ -576,7 +594,8 @@ int tpm_setup_key_parms(TPM_KEY_DATA *ke
-   parms->parms.rsa.exponent = tpm_malloc(parms->parms.rsa.exponentSize);
-   if (parms->parms.rsa.exponent == NULL) return -1;
-   rsa_export_exponent(&key->key, parms->parms.rsa.exponent,
--    &parms->parms.rsa.exponentSize);
-+    &key_length);
-+  parms->parms.rsa.exponentSize = (UINT32) key_length;
-   parms->parmSize = 12 + parms->parms.rsa.exponentSize;
-   return 0;
- }
-@@ -587,6 +606,7 @@ TPM_RESULT TPM_GetPubKey(TPM_KEY_HANDLE 
-   TPM_RESULT res;
-   TPM_KEY_DATA *key;
-   TPM_DIGEST digest;
-+  size_t key_length;
-   info("TPM_GetPubKey()");
-   /* get key */
-   if (keyHandle == TPM_KH_SRK) return TPM_BAD_PARAMETER;
-@@ -614,8 +634,8 @@ TPM_RESULT TPM_GetPubKey(TPM_KEY_HANDLE 
-   pubKey->pubKey.keyLength = key->key.size >> 3;
-   pubKey->pubKey.key = tpm_malloc(pubKey->pubKey.keyLength);
-   if (pubKey->pubKey.key == NULL) return TPM_FAIL;
--  rsa_export_modulus(&key->key, pubKey->pubKey.key, 
--    &pubKey->pubKey.keyLength);
-+  rsa_export_modulus(&key->key, pubKey->pubKey.key, &key_length); 
-+  pubKey->pubKey.keyLength = (UINT32) key_length;
-   if (tpm_setup_key_parms(key, &pubKey->algorithmParms) != 0) {
-     tpm_free(pubKey->pubKey.key);
-     return TPM_FAIL;
-diff -uprN orig/tpm_emulator-0.3/tpm/tpm_structures.h 
tpm_emulator-0.3-x86_64/tpm/tpm_structures.h
---- orig/tpm_emulator-0.3/tpm/tpm_structures.h 2006-01-10 04:21:45.000000000 
-0800
-+++ tpm_emulator-0.3-x86_64/tpm/tpm_structures.h       2006-08-29 
15:08:20.545340792 -0700
-@@ -1723,6 +1723,7 @@ typedef struct tdTPM_DAA_ISSUER {
-   TPM_DIGEST DAA_digest_gamma;
-   BYTE DAA_generic_q[26];
- } TPM_DAA_ISSUER;
-+#define sizeof_TPM_DAA_ISSUER(s) (2 + (20 * 6) + 26 )
- 
- /*
-  * TPM_DAA_TPM ([TPM_Part2], Section 22.8)
-@@ -1738,6 +1739,7 @@ typedef struct tdTPM_DAA_TPM {
-   TPM_DIGEST DAA_rekey;
-   UINT32 DAA_count;
- } TPM_DAA_TPM;
-+#define sizeof_TPM_DAA_TPM(s) (2 + (4 * 20) + 4)
- 
- /*
-  * TPM_DAA_CONTEXT ([TPM_Part2], Section 22.9)
-@@ -1752,6 +1754,7 @@ typedef struct tdTPM_DAA_CONTEXT {
-   BYTE DAA_scratch[256];
-   BYTE DAA_stage;
- } TPM_DAA_CONTEXT;
-+#define sizeof_TPM_DAA_CONTEXT(s) (2 + (3 * 20) + 256 + 1)
- 
- /*
-  * TPM_DAA_JOINDATA ([TPM_Part2], Section 22.10)
-@@ -1763,6 +1766,7 @@ typedef struct tdTPM_DAA_JOINDATA {
-   BYTE DAA_join_u1[138]; /* WATCH: 138 (v1.2 rev 85) */
-   TPM_DIGEST DAA_digest_n0;
- } TPM_DAA_JOINDATA;
-+#define sizeof_TPM_DAA_JOINDATA(s) (1 + 1 + 20)
- 
- /*
-  * TPM_DAA_BLOB ([TPM_Part2], Section 22.12)
-@@ -2033,6 +2037,7 @@ typedef struct tdTPM_STCLEAR_DATA {
-   TPM_COUNT_ID countID;
-   //UINT32 ownerReference;
- } TPM_STCLEAR_DATA;
-+#define sizeof_TPM_STCLEAR_DATA(s) (2 + 20 + 4)
- 
- /*
-  * TPM_SESSION_DATA
-@@ -2069,6 +2074,11 @@ typedef struct tdTPM_DAA_SESSION_DATA {
-   TPM_DAA_JOINDATA DAA_joinSession;
-   TPM_HANDLE handle;
- } TPM_DAA_SESSION_DATA;
-+#define sizeof_TPM_DAA_SESSION_DATA(s) ( 1 \
-+  + sizeof_TPM_DAA_ISSUER(s.DAA_issuerSettings) \
-+  + sizeof_TPM_DAA_TPM(s.DAA_tpmSpecific) \
-+  + sizeof_TPM_DAA_CONTEXT(s.DAA_session) \
-+  + sizeof_TPM_DAA_JOINDATA(s.DAA_joinSession) + 4)
- 
- /*
-  * TPM_STANY_DATA ([TPM_Part2], Section 7.6)
-@@ -2095,6 +2105,17 @@ typedef struct tdTPM_STANY_DATA {
-   TPM_DAA_SESSION_DATA sessionsDAA[TPM_MAX_SESSIONS_DAA];
-   TPM_TRANSHANDLE transExclusive;
- } TPM_STANY_DATA;
-+#define sizeof_TPM_STANY_DATA(s) (2 + 20 + 20 + 1 \
-+  + sizeof_TPM_CURRENT_TICKS(s.currentTicks) \
-+  + 4 + (4 * TPM_MAX_SESSION_LIST) \
-+  + (sizeof_TPM_SESSION_DATA(s.sessions[0]) * TPM_MAX_SESSION_LIST) \
-+  + (sizeof_TPM_DAA_SESSION_DATA(s.sessionsDAA[0]) * TPM_MAX_SESSIONS_DAA) + 
4)
-+
-+#define sizeof_TPM_PERMANENT_DATA(s) (2 + 4 + 4*20 \
-+  + sizeof_RSA(s.endorsementKey) + TPM_ORD_MAX/8 \
-+  + (1+TPM_MAX_KEYS)*sizeof_TPM_KEY_DATA(s.srk) \
-+  + TPM_NUM_PCR*(sizeof_TPM_PCR_ATTRIBUTES(x)+20) \
-+  + TPM_MAX_COUNTERS*sizeof_TPM_COUNTER_VALUE2(x) + 1 + 4 + 20)
- 
- /*
-  * TPM_DATA

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.