[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |