[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH VTPM 6/9] Remove the vtpm process model
Remove the old vtpm process model. It doesn't work very well and is no longer supported. Signed-off-by: Matthew Fioravante <matthew.fioravante@xxxxxxxxxx> diff --git a/tools/Makefile b/tools/Makefile index d8c8cc0..2ca43b9 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -18,8 +18,6 @@ SUBDIRS-$(CONFIG_XCUTILS) += xcutils SUBDIRS-$(CONFIG_X86) += firmware SUBDIRS-y += console SUBDIRS-y += xenmon -SUBDIRS-$(VTPM_TOOLS) += vtpm_manager -SUBDIRS-$(VTPM_TOOLS) += vtpm SUBDIRS-y += xenstat SUBDIRS-$(CONFIG_Linux) += $(SUBDIRS-libaio) SUBDIRS-$(CONFIG_Linux) += memshr diff --git a/tools/blktap2/drivers/hashtable.c b/tools/blktap2/drivers/hashtable.c index 631306b..90a6b85 100644 --- a/tools/blktap2/drivers/hashtable.c +++ b/tools/blktap2/drivers/hashtable.c @@ -3,7 +3,6 @@ /* * There are duplicates of this code in: * - tools/xenstore/hashtable.c - * - tools/vtpm_manager/util/hashtable.c */ #include "hashtable.h" diff --git a/tools/blktap2/drivers/hashtable.h b/tools/blktap2/drivers/hashtable.h index 89aa3dc..56ca053 100644 --- a/tools/blktap2/drivers/hashtable.h +++ b/tools/blktap2/drivers/hashtable.h @@ -3,7 +3,6 @@ /* * There are duplicates of this code in: * - tools/xenstore/hashtable.h - * - tools/vtpm_manager/util/hashtable.h */ #ifndef __HASHTABLE_CWC22_H__ diff --git a/tools/blktap2/drivers/hashtable_itr.c b/tools/blktap2/drivers/hashtable_itr.c index 402e06b..731917c 100644 --- a/tools/blktap2/drivers/hashtable_itr.c +++ b/tools/blktap2/drivers/hashtable_itr.c @@ -1,10 +1,5 @@ /* Copyright (C) 2002, 2004 Christopher Clark <firstname.lastname@xxxxxxxxxxxx> */ -/* - * There are duplicates of this code in: - * - tools/vtpm_manager/util/hashtable_itr.c - */ - #include "hashtable.h" #include "hashtable_private.h" #include "hashtable_itr.h" diff --git a/tools/blktap2/drivers/hashtable_itr.h b/tools/blktap2/drivers/hashtable_itr.h index 3d80638..81da838 100644 --- a/tools/blktap2/drivers/hashtable_itr.h +++ b/tools/blktap2/drivers/hashtable_itr.h @@ -1,10 +1,5 @@ /* Copyright (C) 2002, 2004 Christopher Clark <firstname.lastname@xxxxxxxxxxxx> */ -/* - * There are duplicates of this code in: - * - tools/vtpm_manager/util/hashtable_itr.h - */ - #ifndef __HASHTABLE_ITR_CWC22__ #define __HASHTABLE_ITR_CWC22__ #include "hashtable.h" diff --git a/tools/blktap2/drivers/hashtable_private.h b/tools/blktap2/drivers/hashtable_private.h index 5a13a65..954ecc3 100644 --- a/tools/blktap2/drivers/hashtable_private.h +++ b/tools/blktap2/drivers/hashtable_private.h @@ -3,7 +3,6 @@ /* * There are duplicates of this code in: * - tools/xenstore/hashtable_private.h - * - tools/vtpm_manager/util/hashtable_private.h */ #ifndef __HASHTABLE_PRIVATE_CWC22_H__ diff --git a/tools/configure.ac b/tools/configure.ac index e708f01..586313d 100644 --- a/tools/configure.ac +++ b/tools/configure.ac @@ -40,7 +40,6 @@ m4_include([m4/fetcher.m4]) # Enable/disable options AX_ARG_DEFAULT_DISABLE([githttp], [Download GIT repositories via HTTP]) AX_ARG_DEFAULT_ENABLE([monitors], [Disable xenstat and xentop monitoring tools]) -AX_ARG_DEFAULT_DISABLE([vtpm], [Enable Virtual Trusted Platform Module]) AX_ARG_DEFAULT_DISABLE([xenapi], [Enable Xen API Bindings]) AX_ARG_DEFAULT_ENABLE([ocamltools], [Disable Ocaml tools]) AX_ARG_DEFAULT_DISABLE([miniterm], [Enable miniterm]) diff --git a/tools/examples/README b/tools/examples/README index 5b0314e..2225d5c 100644 --- a/tools/examples/README +++ b/tools/examples/README @@ -25,13 +25,7 @@ vif-bridge - virtual network start/stop script in bridged mode vif-common.sh - sourced by vif-bridge vif-nat - xen virtual network start/stop script in NAT mode vif-route - xen virtual network start/stop script in routed mode -vtpm - called by xen-backend.agent to bind/unbind vTPM devices -vtpm-common.sh - common code for vTPM handling -vtpm-delete - remove an entry from the vTPM table given the - domain's name -vtpm-hotplug-common.sh - sourced by vtpm -vtpm-migration.sh - sourced by external-device-migrate -xen-backend.agent - calls block, vif-*, vtpm scripts to add, remove, hotplug +xen-backend.agent - calls block, vif-* scripts to add, remove, hotplug devices xen-backend.rules - hotplug script rules xend-config.sxp - default xend configuration file diff --git a/tools/examples/xmexample.pv-grub b/tools/examples/xmexample.pv-grub index 85f847c..e04e6c1 100644 --- a/tools/examples/xmexample.pv-grub +++ b/tools/examples/xmexample.pv-grub @@ -105,20 +105,6 @@ disk = [ 'phy:hda1,hda1,w' ] # configured in xend-config.sxp. #---------------------------------------------------------------------------- -# Define to which TPM instance the user domain should communicate. -# The vtpm entry is of the form 'instance=INSTANCE,backend=DOM' -# where INSTANCE indicates the instance number of the TPM the VM -# should be talking to and DOM provides the domain where the backend -# is located. -# Note that no two virtual machines should try to connect to the same -# TPM instance. The handling of all TPM instances does require -# some management effort in so far that VM configration files (and thus -# a VM) should be associated with a TPM instance throughout the lifetime -# of the VM / VM configuration file. The instance number must be -# greater or equal to 1. -#vtpm = [ 'instance=1,backend=0' ] - -#---------------------------------------------------------------------------- # Configure the behaviour when a domain exits. There are three 'reasons' # for a domain to stop: poweroff, reboot, and crash. For each of these you # may specify: diff --git a/tools/examples/xmexample1 b/tools/examples/xmexample1 index 330aaf0..c951200 100644 --- a/tools/examples/xmexample1 +++ b/tools/examples/xmexample1 @@ -101,20 +101,6 @@ disk = [ 'phy:hda1,hda1,w' ] # configured in xend-config.sxp. #---------------------------------------------------------------------------- -# Define to which TPM instance the user domain should communicate. -# The vtpm entry is of the form 'instance=INSTANCE,backend=DOM' -# where INSTANCE indicates the instance number of the TPM the VM -# should be talking to and DOM provides the domain where the backend -# is located. -# Note that no two virtual machines should try to connect to the same -# TPM instance. The handling of all TPM instances does require -# some management effort in so far that VM configration files (and thus -# a VM) should be associated with a TPM instance throughout the lifetime -# of the VM / VM configuration file. The instance number must be -# greater or equal to 1. -#vtpm = [ 'instance=1,backend=0' ] - -#---------------------------------------------------------------------------- # Set the kernel command line for the new domain. # You only need to define the IP parameters and hostname if the domain's # IP config doesn't, e.g. in ifcfg-eth0 or via DHCP. diff --git a/tools/examples/xmexample2 b/tools/examples/xmexample2 index 4e5eb3d..8c5137e 100644 --- a/tools/examples/xmexample2 +++ b/tools/examples/xmexample2 @@ -137,20 +137,6 @@ disk = [ 'phy:sda%d,sda1,w' % (7+vmid), # configured in xend-config.sxp. #---------------------------------------------------------------------------- -# Define to which TPM instance the user domain should communicate. -# The vtpm entry is of the form 'instance=INSTANCE,backend=DOM' -# where INSTANCE indicates the instance number of the TPM the VM -# should be talking to and DOM provides the domain where the backend -# is located. -# Note that no two virtual machines should try to connect to the same -# TPM instance. The handling of all TPM instances does require -# some management effort in so far that VM configration files (and thus -# a VM) should be associated with a TPM instance throughout the lifetime -# of the VM / VM configuration file. The instance number must be -# greater or equal to 1. -#vtpm = ['instance=%d,backend=0' % (vmid) ] - -#---------------------------------------------------------------------------- # Set the kernel command line for the new domain. # You only need to define the IP parameters and hostname if the domain's # IP config doesn't, e.g. in ifcfg-eth0 or via DHCP. diff --git a/tools/examples/xmexample3 b/tools/examples/xmexample3 index dc22ce1..ae799f9 100644 --- a/tools/examples/xmexample3 +++ b/tools/examples/xmexample3 @@ -122,20 +122,6 @@ disk = [ 'phy:hda%d,hda1,w' % (vmid)] # configured in xend-config.sxp. #---------------------------------------------------------------------------- -# Define to which TPM instance the user domain should communicate. -# The vtpm entry is of the form 'instance=INSTANCE,backend=DOM' -# where INSTANCE indicates the instance number of the TPM the VM -# should be talking to and DOM provides the domain where the backend -# is located. -# Note that no two virtual machines should try to connect to the same -# TPM instance. The handling of all TPM instances does require -# some management effort in so far that VM configration files (and thus -# a VM) should be associated with a TPM instance throughout the lifetime -# of the VM / VM configuration file. The instance number must be -# greater or equal to 1. -#vtpm = ['instance=%d,backend=0' % (vmid) ] - -#---------------------------------------------------------------------------- # Set the kernel command line for the new domain. # You only need to define the IP parameters and hostname if the domain's # IP config doesn't, e.g. in ifcfg-eth0 or via DHCP. diff --git a/tools/hotplug/Linux/Makefile b/tools/hotplug/Linux/Makefile index 0166790..0605559 100644 --- a/tools/hotplug/Linux/Makefile +++ b/tools/hotplug/Linux/Makefile @@ -18,14 +18,12 @@ XEN_SCRIPTS += vif-setup XEN_SCRIPTS += block XEN_SCRIPTS += block-enbd block-nbd XEN_SCRIPTS += blktap -XEN_SCRIPTS += vtpm vtpm-delete XEN_SCRIPTS += xen-hotplug-cleanup XEN_SCRIPTS += external-device-migrate XEN_SCRIPTS += vscsi XEN_SCRIPT_DATA = xen-script-common.sh locking.sh logging.sh XEN_SCRIPT_DATA += xen-hotplug-common.sh xen-network-common.sh vif-common.sh -XEN_SCRIPT_DATA += block-common.sh vtpm-common.sh vtpm-hotplug-common.sh -XEN_SCRIPT_DATA += vtpm-migration.sh vtpm-impl +XEN_SCRIPT_DATA += block-common.sh UDEV_RULES_DIR = $(CONFIG_DIR)/udev UDEV_RULES = xen-backend.rules xend.rules diff --git a/tools/hotplug/Linux/vtpm b/tools/hotplug/Linux/vtpm deleted file mode 100644 index 38a4532..0000000 --- a/tools/hotplug/Linux/vtpm +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -dir=$(dirname "$0") -. "$dir/vtpm-hotplug-common.sh" - -vtpm_fatal_error=0 - -case "$command" in - add) - vtpm_create_instance - ;; - remove) - vtpm_remove_instance - ;; -esac - -if [ $vtpm_fatal_error -eq 0 ]; then - log debug "Successful vTPM operation '$command'." - success -else - fatal "Error while executing vTPM operation '$command'." -fi diff --git a/tools/hotplug/Linux/vtpm-common.sh b/tools/hotplug/Linux/vtpm-common.sh deleted file mode 100644 index d0d7935..0000000 --- a/tools/hotplug/Linux/vtpm-common.sh +++ /dev/null @@ -1,448 +0,0 @@ -# -# Copyright (c) 2005 IBM Corporation -# Copyright (c) 2005 XenSource Ltd. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General Public -# License as published by the Free Software Foundation. -# -# This library 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -dir=$(dirname "$0") -. "$dir/logging.sh" -. "$dir/locking.sh" - -VTPMDB="/var/vtpm/vtpm.db" - -#In the vtpm-impl file some commands should be defined: -# vtpm_create, vtpm_setup, vtpm_start, etc. (see below) -if [ -r "$dir/vtpm-impl.alt" ]; then - . "$dir/vtpm-impl.alt" -elif [ -r "$dir/vtpm-impl" ]; then - . "$dir/vtpm-impl" -else - function vtpm_create () { - true - } - function vtpm_setup() { - true - } - function vtpm_start() { - true - } - function vtpm_suspend() { - true - } - function vtpm_resume() { - true - } - function vtpm_delete() { - true - } - function vtpm_migrate() { - echo "Error: vTPM migration accross machines not implemented." - } - function vtpm_migrate_local() { - echo "Error: local vTPM migration not supported" - } - function vtpm_migrate_recover() { - true - } -fi - - -#Find the instance number for the vtpm given the name of the domain -# Parameters -# - vmname : the name of the vm -# Return value -# Returns '0' if instance number could not be found, otherwise -# it returns the instance number in the variable 'instance' -function vtpmdb_find_instance () { - local vmname ret instance - vmname=$1 - ret=0 - - instance=$(cat $VTPMDB | \ - awk -vvmname=$vmname \ - '{ \ - if ( 1 != index($1,"#")) { \ - if ( $1 == vmname ) { \ - print $2; \ - exit; \ - } \ - } \ - }') - if [ "$instance" != "" ]; then - ret=$instance - fi - echo "$ret" -} - - -# Check whether a particular instance number is still available -# returns "0" if it is not available, "1" otherwise. -function vtpmdb_is_free_instancenum () { - local instance instances avail i - instance=$1 - avail=1 - #Allowed instance number range: 1-255 - if [ $instance -eq 0 -o $instance -gt 255 ]; then - avail=0 - else - instances=$(cat $VTPMDB | \ - awk \ - '{ \ - if (1 != index($1,"#")) { \ - printf("%s ",$2); \ - } \ - }') - for i in $instances; do - if [ $i -eq $instance ]; then - avail=0 - break - fi - done - fi - echo "$avail" -} - - -# Get an available instance number given the database -# Returns an unused instance number -function vtpmdb_get_free_instancenum () { - local ctr instances don found - instances=$(cat $VTPMDB | \ - awk \ - '{ \ - if (1 != index($1,"#")) { \ - printf("%s ",$2); \ - } \ - }') - ctr=1 - don=0 - while [ $don -eq 0 ]; do - found=0 - for i in $instances; do - if [ $i -eq $ctr ]; then - found=1; - break; - fi - done - - if [ $found -eq 0 ]; then - don=1 - break - fi - let ctr=ctr+1 - done - echo "$ctr" -} - - -# Add a domain name and instance number to the DB file -function vtpmdb_add_instance () { - local res vmname inst - vmname=$1 - inst=$2 - - if [ ! -f $VTPMDB ]; then - echo "#Database for VM to vTPM association" > $VTPMDB - echo "#1st column: domain name" >> $VTPMDB - echo "#2nd column: TPM instance number" >> $VTPMDB - fi - res=$(vtpmdb_validate_entry $vmname $inst) - if [ $res -eq 0 ]; then - echo "$vmname $inst" >> $VTPMDB - fi -} - - -#Validate whether an entry is the same as passed to this -#function -function vtpmdb_validate_entry () { - local res rc vmname inst - rc=0 - vmname=$1 - inst=$2 - - res=$(cat $VTPMDB | \ - awk -vvmname=$vmname \ - -vinst=$inst \ - '{ \ - if ( 1 == index($1,"#")) {\ - } else \ - if ( $1 == vmname && \ - $2 == inst) { \ - printf("1"); \ - exit; \ - } else \ - if ( $1 == vmname || \ - $2 == inst) { \ - printf("2"); \ - exit; \ - } \ - }') - - if [ "$res" == "1" ]; then - rc=1 - elif [ "$res" == "2" ]; then - rc=2 - fi - echo "$rc" -} - - -#Remove an entry from the vTPM database given its domain name -#and instance number -function vtpmdb_remove_entry () { - local vmname instance VTPMDB_TMP - vmname=$1 - instance=$2 - VTPMDB_TMP="$VTPMDB".tmp - - $(cat $VTPMDB | \ - awk -vvmname=$vmname \ - '{ \ - if ( $1 != vmname ) { \ - print $0; \ - } \ - '} > $VTPMDB_TMP) - if [ -e $VTPMDB_TMP ]; then - mv -f $VTPMDB_TMP $VTPMDB - vtpm_delete $instance - else - log err "Error creating temporary file '$VTPMDB_TMP'." - fi -} - - -# Find the reason for the creation of this device: -# Returns 'resume' or 'create' -function vtpm_get_create_reason () { - local resume - resume=$(xenstore_read $XENBUS_PATH/resume) - if [ "$resume" == "True" ]; then - echo "resume" - else - echo "create" - fi -} - - -#Create a vTPM instance -# If no entry in the TPM database is found, the instance is -# created and an entry added to the database. -function vtpm_create_instance () { - local res instance domname reason uuid - uuid=$(xenstore_read "$XENBUS_PATH"/uuid) - reason=$(vtpm_get_create_reason) - - claim_lock vtpmdb - - instance="0" - - if [ "$uuid" != "" ]; then - instance=$(vtpmdb_find_instance $uuid) - fi - if [ "$instance" == "0" ]; then - domname=$(xenstore_read "$XENBUS_PATH"/domain) - instance=$(vtpmdb_find_instance $domname) - fi - - if [ "$instance" == "0" -a "$reason" != "create" ]; then - release_lock vtpmdb - return - fi - - if [ "$instance" == "0" ]; then - #Try to give the preferred instance to the domain - instance=$(xenstore_read "$XENBUS_PATH"/pref_instance) - if [ "$instance" != "" ]; then - res=$(vtpmdb_is_free_instancenum $instance) - if [ $res -eq 0 ]; then - instance=$(vtpmdb_get_free_instancenum) - fi - else - instance=$(vtpmdb_get_free_instancenum) - fi - - vtpm_create $instance - - if [ $vtpm_fatal_error -eq 0 ]; then - if [ "$uuid" != "" ]; then - vtpmdb_add_instance $uuid $instance - else - vtpmdb_add_instance $domname $instance - fi - fi - else - if [ "$reason" == "resume" ]; then - vtpm_resume $instance - else - vtpm_start $instance - fi - fi - - release_lock vtpmdb - - xenstore_write $XENBUS_PATH/instance $instance -} - - -#Remove an instance when a VM is terminating or suspending. -#Since it is assumed that the VM will appear again, the -#entry is kept in the VTPMDB file. -function vtpm_remove_instance () { - local instance reason domname uuid - #Stop script execution quietly if path does not exist (anymore) - xenstore-exists "$XENBUS_PATH"/domain - uuid=$(xenstore_read "$XENBUS_PATH"/uuid) - - claim_lock vtpmdb - - instance="0" - - if [ "$uuid" != "" ]; then - instance=$(vtpmdb_find_instance $uuid) - fi - - if [ "$instance" == "0" ]; then - domname=$(xenstore_read "$XENBUS_PATH"/domain) - instance=$(vtpmdb_find_instance $domname) - fi - - if [ "$instance" != "0" ]; then - vtpm_suspend $instance - fi - - release_lock vtpmdb -} - - -#Remove an entry in the VTPMDB file given the domain's name -#1st parameter: The name of the domain -function vtpm_delete_instance () { - local instance - - claim_lock vtpmdb - - instance=$(vtpmdb_find_instance $1) - if [ "$instance" != "0" ]; then - vtpmdb_remove_entry $1 $instance - fi - - release_lock vtpmdb -} - -# Determine whether the given address is local to this machine -# Return values: -# "-1" : the given machine name is invalid -# "0" : this is not an address of this machine -# "1" : this is an address local to this machine -function vtpm_isLocalAddress() { - local addr res - addr=$(ping $1 -c 1 | \ - awk '{ print substr($3,2,length($3)-2); exit }') - if [ "$addr" == "" ]; then - echo "-1" - return - fi - res=$(ifconfig | grep "inet addr" | \ - awk -vaddr=$addr \ - '{ \ - if ( addr == substr($2, 6)) {\ - print "1"; \ - } \ - }' \ - ) - if [ "$res" == "" ]; then - echo "0" - return - fi - echo "1" -} - -# Perform a migration step. This function differentiates between migration -# to the local host or to a remote machine. -# Parameters: -# 1st: destination host to migrate to -# 2nd: name of the domain to migrate -# 3rd: the migration step to perform -function vtpm_migration_step() { - local res=$(vtpm_isLocalAddress $1) - if [ "$res" == "0" ]; then - vtpm_migrate $1 $2 $3 - else - vtpm_migrate_local - fi -} - -# Recover from migration due to an error. This function differentiates -# between migration to the local host or to a remote machine. -# Parameters: -# 1st: destination host the migration was going to -# 2nd: name of the domain that was to be migrated -# 3rd: the last successful migration step that was done -function vtpm_recover() { - local res - res=$(vtpm_isLocalAddress $1) - if [ "$res" == "0" ]; then - vtpm_migrate_recover $1 $2 $3 - fi -} - - -#Determine the domain id given a domain's name. -#1st parameter: name of the domain -#return value: domain id or -1 if domain id could not be determined -function vtpm_domid_from_name () { - local id name ids - ids=$(xenstore-list /local/domain) - for id in $ids; do - name=$(xenstore-read /local/domain/$id/name) - if [ "$name" == "$1" ]; then - echo "$id" - return - fi - done - echo "-1" -} - -#Determine the virtual TPM's instance number using the domain ID. -#1st parm: domain ID -function vtpm_uuid_by_domid() { - echo $(xenstore-read /local/domain/0/backend/vtpm/$1/0/uuid) -} - - -# Determine the vTPM's UUID by the name of the VM -function vtpm_uuid_from_vmname() { - local domid=$(vtpm_domid_from_name $1) - if [ "$domid" != "-1" ]; then - echo $(vtpm_uuid_by_domid $domid) - return - fi - echo "" -} - -#Add a virtual TPM instance number and its associated domain name -#to the VTPMDB file and activate usage of this virtual TPM instance -#by writing the instance number into the xenstore -#1st parm: name of virtual machine -#2nd parm: instance of associated virtual TPM -function vtpm_add_and_activate() { - local domid=$(vtpm_domid_from_name $1) - local vtpm_uuid=$(vtpm_uuid_from_vmname $1) - if [ "$vtpm_uuid" != "" -a "$domid" != "-1" ]; then - vtpmdb_add_instance $vtpm_uuid $2 - xenstore-write backend/vtpm/$domid/0/instance $2 - fi -} diff --git a/tools/hotplug/Linux/vtpm-delete b/tools/hotplug/Linux/vtpm-delete deleted file mode 100644 index b75b95b..0000000 --- a/tools/hotplug/Linux/vtpm-delete +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -# This scripts must be called the following way: -# vtpm-delete <vtpm uuid> -# or -# vtpm-delete --vmname <vm name> - -dir=$(dirname "$0") -. "$dir/vtpm-common.sh" - -if [ "$1" == "--vmname" ]; then - vtpm_uuid=$(vtpm_uuid_from_vmname $2) - if [ "$vtpm_uuid" != "" ];then - vtpm_delete_instance $vtpm_uuid - fi -else - vtpm_delete_instance $1 -fi diff --git a/tools/hotplug/Linux/vtpm-hotplug-common.sh b/tools/hotplug/Linux/vtpm-hotplug-common.sh deleted file mode 100644 index 9fd35e7..0000000 --- a/tools/hotplug/Linux/vtpm-hotplug-common.sh +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (c) 2005 IBM Corporation -# Copyright (c) 2005 XenSource Ltd. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General Public -# License as published by the Free Software Foundation. -# -# This library 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -dir=$(dirname "$0") -. "$dir/xen-hotplug-common.sh" - -findCommand "$@" -if [ "$command" != "online" ] && - [ "$command" != "offline" ] && - [ "$command" != "add" ] && - [ "$command" != "remove" ] -then - log err "Invalid command: $command" - exit 1 -fi - - -XENBUS_PATH="${XENBUS_PATH:?}" - -. "$dir/vtpm-common.sh" diff --git a/tools/hotplug/Linux/vtpm-impl b/tools/hotplug/Linux/vtpm-impl deleted file mode 100644 index 4f9a1fd..0000000 --- a/tools/hotplug/Linux/vtpm-impl +++ /dev/null @@ -1,208 +0,0 @@ -#!/bin/bash -# =================================================================== -# -# Copyright (c) 2005, Intel Corp. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials provided -# with the distribution. -# * Neither the name of Intel Corporation nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. -# =================================================================== - -# | SRC | TAG | CMD SIZE | ORD |mtype|strt -TPM_CMD_OPEN=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x11\\x01\\x00\\x00\\x01\\x01\\x01 -TPM_CMD_RESM=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x11\\x01\\x00\\x00\\x01\\x01\\x02 -TPM_CMD_CLOS=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x0e\\x01\\x00\\x00\\x02 -TPM_CMD_DELE=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x0e\\x01\\x00\\x00\\x03 - -TPM_TYPE_PVM=\\x01 -TPM_TYPE_HVM=\\x02 - -TPM_SUCCESS=00000000 - -TX_VTPM_MANAGER=/var/vtpm/fifos/from_console.fifo -RX_VTPM_MANAGER=/var/vtpm/fifos/to_console.fifo - -VTPM_MIG=/usr/bin/vtpm_migrator - -# -------------------- Helpers for binary streams ----------- - -function str_to_hex32() { - printf "%0.8x" $1 -} - -function hex32_to_bin() { - local inst=$(str_to_hex32 $1); - - local n1=`echo $inst | sed 's/\(..\)....../\\\\x\1/'` - local n2=`echo $inst | sed 's/..\(..\)..../\\\\x\1/'` - local n3=`echo $inst | sed 's/....\(..\)../\\\\x\1/'` - local n4=`echo $inst | sed 's/......\(..\)/\\\\x\1/'` - - echo "$n1$n2$n3$n4" -} - -function vtpm_manager_cmd() { - local cmd=$1; - local inst=$2; - local inst_bin=$(hex32_to_bin $inst); - - claim_lock vtpm_mgr - - #send cmd to vtpm_manager - printf "$cmd$inst_bin" > $TX_VTPM_MANAGER - - #recv response - set +e - local resp_hex=`dd skip=10 bs=1 count=4 if=$RX_VTPM_MANAGER 2> /dev/null | xxd -ps` - set -e - - release_lock vtpm_mgr - - #return whether the command was successful - if [ $resp_hex -ne $TPM_SUCCESS ]; then - vtpm_fatal_error=1 - false - else - true - fi -} - -# Helper to get vm type to pass to vtpm_manager open/resume -function vtpm_get_type() { - local inst=$(xenstore_read $XENBUS_PATH/frontend-id) - local vm=$(xenstore_read /local/domain/$inst/vm) - if [ "$vm" != "" ]; then - local ostype=$(xenstore-read $vm/image/ostype) - if [ "$ostype" == "hvm" ]; then - echo $TPM_TYPE_HVM; - else - echo $TPM_TYPE_PVM; - fi - fi -} - -# ------------------ Command handlers ----------------- - -# Create new vtpm instance & set it up for use -function vtpm_create () { - # Creation is handled implicitly by the manager on first setup - # so just set it up for use - $(vtpm_start $1) -} - -# Setup vtpm instance for use. -function vtpm_start() { - local vmtype=$(vtpm_get_type); - $(vtpm_manager_cmd $TPM_CMD_OPEN$vmtype $1) -} - -function vtpm_resume() { - local vmtype=$(vtpm_get_type); - $(vtpm_manager_cmd $TPM_CMD_RESM$vmtype $1) -} - -# Reset the vtpm AKA clear PCRs -function vtpm_reset() { - #not used by current implemenation - true -} - -# Shutdown the vtpm while the vm is down -# This could be a suspend of shutdown -# we cannot distinquish, so save the state -# and decide on startup if we should keep is -function vtpm_suspend() { - $(vtpm_manager_cmd $TPM_CMD_CLOS $1) -} - - -function vtpm_delete() { - local inst=$1 - if $(vtpm_manager_cmd $TPM_CMD_DELE $inst); then - rm -f /var/vtpm/vtpm_dm_$1.data - true - else - vtpm_fatal_error=1 - false - fi -} - -# Perform a migration step. This function differentiates between migration -# to the local host or to a remote machine. -# Parameters: -# 1st: destination host to migrate to -# 2nd: name of the domain to migrate -# 3rd: the migration step to perform -function vtpm_migrate() { - local instance res - - instance=$(vtpmdb_find_instance $2) - if [ "$instance" == "" ]; then - log err "VTPM Migratoin failed. Unable to translation of domain name" - echo "Error: VTPM Migration failed while looking up instance number" - fi - - case "$3" in - 0) - #Incicate migration supported - echo "0" - ;; - - 1) - # Get Public Key from Destination - # Call vtpm_manager's migration part 1 - claim_lock vtpm_mgr - $VTPM_MIG $1 $2 $instance $3 - release_lock vtpm_mgr - ;; - - 2) - # Call manager's migration step 2 and send result to destination - # If successful remove from db - claim_lock vtpm_mgr - $VTPM_MIG $1 $2 $instance $3 - release_lock vtpm_mgr - ;; - - 3) - if `ps x | grep "$VTPM_MIG $1"`; then - log err "VTPM Migration failed to complete." - echo "Error: VTPM Migration failed to complete." - fi - ;; - esac - -} - - -function vtpm_migrate_recover() { - echo "Error: Recovery not supported yet" -} - -function vtpm_migrate_local() { - echo "Error: local vTPM migration not supported" -} diff --git a/tools/hotplug/Linux/vtpm-migration.sh b/tools/hotplug/Linux/vtpm-migration.sh deleted file mode 100644 index 7e38ae2..0000000 --- a/tools/hotplug/Linux/vtpm-migration.sh +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (c) 2005 IBM Corporation -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General Public -# License as published by the Free Software Foundation. -# -# This library 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -dir=$(dirname "$0") -. "$dir/vtpm-common.sh" diff --git a/tools/hotplug/Linux/xen-backend.rules b/tools/hotplug/Linux/xen-backend.rules index c591a3f..a0d409e 100644 --- a/tools/hotplug/Linux/xen-backend.rules +++ b/tools/hotplug/Linux/xen-backend.rules @@ -1,6 +1,5 @@ SUBSYSTEM=="xen-backend", KERNEL=="tap*", ENV{UDEV_CALL}="1", RUN+="/etc/xen/scripts/blktap $env{ACTION}" SUBSYSTEM=="xen-backend", KERNEL=="vbd*", ENV{UDEV_CALL}="1", RUN+="/etc/xen/scripts/block $env{ACTION}" -SUBSYSTEM=="xen-backend", KERNEL=="vtpm*", RUN+="/etc/xen/scripts/vtpm $env{ACTION}" SUBSYSTEM=="xen-backend", KERNEL=="vif2-*", RUN+="/etc/xen/scripts/vif2 $env{ACTION}" SUBSYSTEM=="xen-backend", KERNEL=="vif-*", ENV{UDEV_CALL}="1", ACTION=="online", RUN+="/etc/xen/scripts/vif-setup online type_if=vif" SUBSYSTEM=="xen-backend", KERNEL=="vif-*", ENV{UDEV_CALL}="1", ACTION=="offline", RUN+="/etc/xen/scripts/vif-setup offline type_if=vif" diff --git a/tools/vtpm/Makefile b/tools/vtpm/Makefile deleted file mode 100644 index 7b3efa5..0000000 --- a/tools/vtpm/Makefile +++ /dev/null @@ -1,74 +0,0 @@ -XEN_ROOT = $(CURDIR)/../.. - -# Base definitions and rules -include $(XEN_ROOT)/tools/vtpm/Rules.mk - -# Dir name for emulator (as dom0 tpm driver) -TPM_EMULATOR_DIR = tpm_emulator -# Dir name for vtpm instance -VTPM_DIR = vtpm -ORIG_DIR = orig - -# Emulator tarball name -TPM_EMULATOR_NAME = tpm_emulator-0.5.1 -TPM_EMULATOR_TARFILE = $(TPM_EMULATOR_NAME).tar.gz - -GMP_HEADER = /usr/include/gmp.h - -.PHONY: all -all: build - -.PHONY: build -build: build_sub - -.PHONY: install -install: build - $(MAKE) -C $(VTPM_DIR) install-recursive - -.PHONY: clean -clean: - @if [ -d $(TPM_EMULATOR_DIR) ]; \ - then $(MAKE) -C $(TPM_EMULATOR_DIR) clean; \ - fi - @if [ -d $(VTPM_DIR) ]; \ - then $(MAKE) -C $(VTPM_DIR) clean; \ - fi - -.PHONY: mrproper -mrproper: - 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): - wget http://download.berlios.de/tpm-emulator/$(TPM_EMULATOR_TARFILE) - -# Create vtpm dirs -$(VTPM_DIR)/tpmd/tpmd: $(TPM_EMULATOR_TARFILE) vtpm-0.5.1.patch - rm -rf $(VTPM_DIR) - tar -xzf $(TPM_EMULATOR_TARFILE) - mv $(TPM_EMULATOR_NAME) $(VTPM_DIR) - - set -e; cd $(VTPM_DIR); \ - patch -p1 < ../vtpm-0.5.1.patch; \ - patch -p1 < ../vtpm-0.5.1-LDLIBS.patch - -orig: $(TPM_EMULATOR_TARFILE) - mkdir $(ORIG_DIR); - set -e; cd $(ORIG_DIR); \ - tar -xzf ../$(TPM_EMULATOR_TARFILE); - -updatepatches: clean orig - 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: $(VTPM_DIR)/tpmd/tpmd - set -e; if [ -e $(GMP_HEADER) ]; then \ - $(MAKE) -C $(VTPM_DIR) version; \ - $(MAKE) -C $(VTPM_DIR) all-recursive; \ - else \ - echo "=== Unable to build VTPMs. libgmp could not be found."; \ - fi - diff --git a/tools/vtpm/README b/tools/vtpm/README deleted file mode 100644 index 2008cbd..0000000 --- a/tools/vtpm/README +++ /dev/null @@ -1,45 +0,0 @@ - -Directory Structure -=================== -tools/vtpm/tpm_emulator-0.2b.tar.gz -> TPM Emulator downloaded at build time that will - be patched and used for our vtpms -tools/vtpm/vtpm.patch -> patch applied to tpm_emulator to make vtpm -tools/vtpm/vtpm/ -> (created on build) tpm_emulator moved to ring 3, - listens on a pair of fifos for TPM commands, - persistent state is sent via named fifo to vtpm - manager, which encrypts it and protects it. -tools/vtpm/tpm_emulator.patch -> To allow for debugging and testing on non-TPM - platforms, this patches the emulator to allow - it to be inserted into the dom0 kernel -tools/vtpm/tpm_emulator-0.2 -> (created on build) directory containing patched emulator - -Compile Flags -=================== -VTPM_MULTI_VM -> Defined (not finished): VTPMs run in their own VMs - Not Defined (default): VTPMs are processes - -Requirements -============ -- xen-unstable -- IBM frontend/backend vtpm driver patch -- vtpm_managerd -- GNU MP Big number library (GMP) - -vtpmd Flow (for vtpm_manager. vtpmd never run by default) -============================ -- Launch the VTPM manager (vtpm_managerd) which which begins listening to the BE with one thread - and listens to a named fifo that is shared by the vtpms to commuincate with the manager. -- VTPM Manager listens to TPM BE. -- When xend launches a tpm frontend equipped VM it contacts the manager over the vtpm backend. -- When the manager receives the open message from the BE, it launches a vtpm -- Xend allows the VM to continue booting. -- When a TPM request is issued to the front end, the front end transmits the TPM request to the backend. -- The manager receives the TPM requests and uses a named fifo to forward the request to the vtpm. -- The fifo listener begins listening for the reply from vtpm for the request. -- Vtpm processes request and replies to manager over shared named fifo. -- If needed, the vtpm may send a request to the vtpm_manager at any time to save it's secrets to disk. -- Manager receives response from vtpm and passes it back to backend for forwarding to guest. - -tpm_emulator flow -================== -Read documentation in tpm_emulator-0.2 directory diff --git a/tools/vtpm/Rules.mk b/tools/vtpm/Rules.mk deleted file mode 100644 index 548cff0..0000000 --- a/tools/vtpm/Rules.mk +++ /dev/null @@ -1,26 +0,0 @@ -# Base definitions and rules (XEN_ROOT must be defined in including Makefile) -include $(XEN_ROOT)/tools/Rules.mk - -# -# Tool definitions -# - -# General compiler flags -CFLAGS = -Werror -g3 - -# Generic project files -HDRS = $(wildcard *.h) -SRCS = $(wildcard *.c) -OBJS = $(patsubst %.c,%.o,$(SRCS)) - -# Generic (non-header) dependencies -$(SRCS): Makefile $(XEN_ROOT)/tools/Rules.mk $(XEN_ROOT)/tools/vtpm/Rules.mk - -$(OBJS): $(SRCS) - --include $(DEPS) - -BUILD_EMULATOR = y - -# Make sure these are just rules -.PHONY : all build install clean diff --git a/tools/vtpm/tpm_emulator.patch b/tools/vtpm/tpm_emulator.patch deleted file mode 100644 index c34c665..0000000 --- a/tools/vtpm/tpm_emulator.patch +++ /dev/null @@ -1,1919 +0,0 @@ -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 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 @@ -+????-??-?? Intel Corp -+ * Moved module out of kernel to run as a ring 3 app -+ - 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>, -+ * 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=%u)\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 " -- "(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); - memcpy(ret, oldptr, old_size); -- kfree(oldptr); -+ free(oldptr); - return ret; - } - -@@ -99,7 +94,7 @@ void __attribute__ ((regparm(0))) kernel - /* overwrite used memory */ - if (blk_ptr != NULL) { - memset(blk_ptr, 0, blk_size); -- kfree(blk_ptr); -+ free(blk_ptr); - } - } - -diff -uprN orig/tpm_emulator-0.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>, -+ * Copyright (C) 2005 INTEL Corp - * - * This module is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published -@@ -381,7 +382,7 @@ static int encode_message(int type, uint - msg[0] = 0x00; - get_random_bytes(&msg[1], SHA1_DIGEST_LENGTH); - sha1_init(&ctx); -- sha1_update(&ctx, "TCPA", 4); -+ sha1_update(&ctx, (uint8_t *) "TCPA", 4); - sha1_final(&ctx, &msg[1 + SHA1_DIGEST_LENGTH]); - memset(&msg[1 + 2 * SHA1_DIGEST_LENGTH], 0x00, - msg_len - data_len - 2 * SHA1_DIGEST_LENGTH - 2); -@@ -429,7 +430,7 @@ static int decode_message(int type, uint - mask_generation(&msg[1], SHA1_DIGEST_LENGTH, - &msg[1 + SHA1_DIGEST_LENGTH], msg_len - SHA1_DIGEST_LENGTH - 1); - sha1_init(&ctx); -- sha1_update(&ctx, "TCPA", 4); -+ sha1_update(&ctx, (uint8_t *) "TCPA", 4); - sha1_final(&ctx, &msg[1]); - if (memcmp(&msg[1], &msg[1 + SHA1_DIGEST_LENGTH], - SHA1_DIGEST_LENGTH) != 0) return -1; -diff -uprN orig/tpm_emulator-0.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,195 +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 91 2006-03-13 13:51:41Z mast $ -- */ -- --#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 struct timespec old_time; -- --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(%d)", __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(%d)", __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; -- old_time = current_kernel_time(); -- /* 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) --{ -- struct timespec new_time = current_kernel_time(); -- 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 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>, -+ * 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,54 +18,62 @@ - #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 -+#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 */ -- - #ifdef DEBUG --#define debug(fmt, ...) printk(KERN_DEBUG "%s %s:%d: Debug: " fmt "\n", \ -- TPM_MODULE_NAME, __FILE__, __LINE__, ## __VA_ARGS__) -+#define debug(fmt, ...) printf("TPMD: %s:%d: Debug: " fmt "\n", \ -+ __FILE__, __LINE__, ## __VA_ARGS__) - #else - #define debug(fmt, ...) - #endif --#define info(fmt, ...) printk(KERN_INFO "%s %s:%d: Info: " fmt "\n", \ -- TPM_MODULE_NAME, __FILE__, __LINE__, ## __VA_ARGS__) --#define error(fmt, ...) printk(KERN_ERR "%s %s:%d: Error: " fmt "\n", \ -- TPM_MODULE_NAME, __FILE__, __LINE__, ## __VA_ARGS__) --#define alert(fmt, ...) printk(KERN_ALERT "%s %s:%d: Alert: " fmt "\n", \ -- TPM_MODULE_NAME, __FILE__, __LINE__, ## __VA_ARGS__) -+#define info(fmt, ...) printf("TPMD: %s:%d: Info: " fmt "\n", \ -+ __FILE__, __LINE__, ## __VA_ARGS__) -+#define error(fmt, ...) printf("TPMD: %s:%d: Error: " fmt "\n", \ -+ __FILE__, __LINE__, ## __VA_ARGS__) -+#define alert(fmt, ...) printf("TPMD: %s:%d: Alert: " fmt "\n", \ -+ __FILE__, __LINE__, ## __VA_ARGS__) - - /* memory allocation */ - - static inline void *tpm_malloc(size_t size) - { -- return kmalloc(size, GFP_KERNEL); -+ return malloc(size); - } - - static inline void tpm_free(const void *ptr) - { -- if (ptr != NULL) kfree(ptr); -+ if (ptr != NULL) free( (void *) ptr); - } - - /* random numbers */ - -+//FIXME; -+void get_random_bytes(void *buf, int nbytes); -+ - static inline void tpm_get_random_bytes(void *buf, int nbytes) - { - get_random_bytes(buf, nbytes); -@@ -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) --#define LE64_TO_CPU(x) __be64_to_cpu(x) -+#define LE64_TO_CPU(x) __le64_to_cpu(x) - #define BE32_TO_CPU(x) __be32_to_cpu(x) --#define LE32_TO_CPU(x) __be32_to_cpu(x) -+#define LE32_TO_CPU(x) __le32_to_cpu(x) - #define BE16_TO_CPU(x) __be16_to_cpu(x) - #define LE16_TO_CPU(x) __le16_to_cpu(x) - -diff -uprN orig/tpm_emulator-0.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_capability.c tpm_emulator/tpm/tpm_capability.c ---- orig/tpm_emulator-0.4/tpm/tpm_capability.c 2006-06-23 19:37:07.000000000 +0900 -+++ tpm_emulator/tpm/tpm_capability.c 2007-12-28 22:50:19.000000000 +0900 -@@ -701,7 +701,10 @@ TPM_RESULT TPM_GetCapabilityOwner(TPM_VE - TPM_RESULT res; - - info("TPM_GetCapabilityOwner()"); -- -+ -+ if (!tpmData.permanent.flags.owned) { -+ return TPM_NOSRK; -+ } - /* Verify owner authorization */ - res = tpm_verify_auth(auth1, tpmData.permanent.data.ownerAuth, TPM_KH_OWNER); - if (res != TPM_SUCCESS) return res; -diff -uprN orig/tpm_emulator-0.4/tpm/tpm_cmd_handler.c tpm_emulator/tpm/tpm_cmd_handler.c ---- orig/tpm_emulator-0.4/tpm/tpm_cmd_handler.c 2006-06-23 19:37:07.000000000 +0900 -+++ tpm_emulator/tpm/tpm_cmd_handler.c 2007-09-12 20:23:00.000000000 +0900 -@@ -565,7 +565,7 @@ static TPM_RESULT execute_TPM_Seal(TPM_R - if (tpm_unmarshal_TPM_KEY_HANDLE(&ptr, &len, &keyHandle) - || tpm_unmarshal_TPM_ENCAUTH(&ptr, &len, &encAuth) - || tpm_unmarshal_UINT32(&ptr, &len, &pcrInfoSize) -- || tpm_unmarshal_TPM_PCR_INFO(&ptr, &len, &pcrInfo) -+ || (pcrInfoSize >0 && tpm_unmarshal_TPM_PCR_INFO(&ptr, &len, &pcrInfo)) - || tpm_unmarshal_UINT32(&ptr, &len, &inDataSize) - || tpm_unmarshal_BLOB(&ptr, &len, &inData, inDataSize) - || len != 0) return TPM_BAD_PARAMETER; -@@ -798,7 +798,7 @@ static TPM_RESULT execute_TPM_Sealx(TPM_ - if (tpm_unmarshal_TPM_KEY_HANDLE(&ptr, &len, &keyHandle) - || tpm_unmarshal_TPM_ENCAUTH(&ptr, &len, &encAuth) - || tpm_unmarshal_UINT32(&ptr, &len, &pcrInfoSize) -- || tpm_unmarshal_TPM_PCR_INFO(&ptr, &len, &pcrInfo) -+ || (pcrInfoSize > 0 && tpm_unmarshal_TPM_PCR_INFO(&ptr, &len, &pcrInfo)) - || tpm_unmarshal_UINT32(&ptr, &len, &inDataSize) - || tpm_unmarshal_BLOB(&ptr, &len, &inData, inDataSize) - || len != 0) return TPM_BAD_PARAMETER; -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 19:37:07.000000000 +0900 -+++ tpm_emulator/tpm/tpm_credentials.c 2007-09-12 20:23:30.000000000 +0900 -@@ -47,20 +47,20 @@ 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; -- pubEndorsementKey->algorithmParms.parms.rsa.keyLength = key_length; -+ pubEndorsementKey->algorithmParms.parms.rsa.keyLength = key_length << 3; - pubEndorsementKey->algorithmParms.parms.rsa.numPrimes = 2; - pubEndorsementKey->algorithmParms.parms.rsa.exponentSize = 0; - pubEndorsementKey->algorithmParms.parms.rsa.exponent = NULL; -@@ -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; - } - 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.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)); -- 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); -@@ -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)); -- 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); -@@ -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)); -- 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); -@@ -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)); -- 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); -@@ -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)); -- 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); -@@ -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)); -- 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); -@@ -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)); -- 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); - } -@@ -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, "\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); -@@ -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)); -- 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); -@@ -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)); -- sha1_update(&sha1, "\x00", 1); -+ sha1_update(&sha1, (BYTE *) "\x00", 1); - sha1_final(&sha1, scratch); - sha1_init(&sha1); - sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_rekey, - sizeof(session->DAA_tpmSpecific.DAA_rekey)); - sha1_update(&sha1, (BYTE*) &session->DAA_tpmSpecific.DAA_count, - sizeof(session->DAA_tpmSpecific.DAA_count)); -- sha1_update(&sha1, "\x01", 1); -+ sha1_update(&sha1, (BYTE *) "\x01", 1); - sha1_final(&sha1, scratch + SHA1_DIGEST_LENGTH); - mpz_init(f), mpz_init(q); - mpz_import(f, 2 * SHA1_DIGEST_LENGTH, 1, 1, 0, 0, scratch); -diff -uprN orig/tpm_emulator-0.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 - --#include <linux/fs.h> --#include <linux/unistd.h> --#include <asm/uaccess.h> -+#include <sys/types.h> -+#include <sys/stat.h> -+#include <fcntl.h> -+#include <unistd.h> - - #define TPM_STORAGE_FILE "/var/tpm/tpm_emulator-1.2." STR(VERSION_MAJOR) "." STR(VERSION_MINOR) - - static int write_to_file(uint8_t *data, size_t data_length) - { - int res; -- struct file *fp; -- mm_segment_t old_fs = get_fs(); -- fp = filp_open(TPM_STORAGE_FILE, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR); -- if (IS_ERR(fp)) return -1; -- set_fs(get_ds()); -- res = fp->f_op->write(fp, data, data_length, &fp->f_pos); -- set_fs(old_fs); -- filp_close(fp, NULL); -+ int fp; -+ fp = open(TPM_STORAGE_FILE, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR); -+ res = write(fp, data, data_length); -+ close(fp); - return (res == data_length) ? 0 : -1; - } - - static int read_from_file(uint8_t **data, size_t *data_length) - { - int res; -- struct file *fp; -- mm_segment_t old_fs = get_fs(); -- fp = filp_open(TPM_STORAGE_FILE, O_RDONLY, 0); -- if (IS_ERR(fp)) return -1; -- *data_length = (size_t)fp->f_dentry->d_inode->i_size; -- /* *data_length = i_size_read(fp->f_dentry->d_inode); */ -+ int fp, file_status; -+ struct stat file_info; -+ fp = open(TPM_STORAGE_FILE, O_RDONLY, 0); -+ file_status = fstat(fp, &file_info); -+ if (file_status < 0) { -+ close(fp); -+ return -1; -+ } -+ -+ *data_length = file_info.st_size; - *data = tpm_malloc(*data_length); - if (*data == NULL) { -- filp_close(fp, NULL); -+ close(fp); - return -1; - } -- set_fs(get_ds()); -- res = fp->f_op->read(fp, *data, *data_length, &fp->f_pos); -- set_fs(old_fs); -- filp_close(fp, NULL); -+ res = read(fp, *data, *data_length); -+ close(fp); - if (res != *data_length) { - tpm_free(*data); - return -1; -@@ -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 */ -- 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; -@@ -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; -- 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; - } - - 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>, - * Swiss Federal Institute of Technology (ETH) Zurich -+ * Copyright (C) 2005 INTEL Corp - * - * This module is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published -@@ -50,7 +51,7 @@ TPM_RESULT TPM_SaveKeyContext(TPM_KEY_HA - BYTE *ptr; - UINT32 len; - info("TPM_SaveKeyContext()"); -- res = TPM_SaveContext(keyHandle, TPM_RT_KEY, "SaveKeyContext..", -+ res = TPM_SaveContext(keyHandle, TPM_RT_KEY, (BYTE*)"SaveKeyContext..", - keyContextSize, &contextBlob); - if (res != TPM_SUCCESS) return res; - len = *keyContextSize; -@@ -82,7 +83,7 @@ TPM_RESULT TPM_SaveAuthContext(TPM_AUTHH - BYTE *ptr; - UINT32 len; - info("TPM_SaveAuthContext()"); -- res = TPM_SaveContext(authHandle, TPM_RT_KEY, "SaveAuthContext.", -+ res = TPM_SaveContext(authHandle, TPM_RT_KEY, (BYTE*)"SaveAuthContext.", - authContextSize, &contextBlob); - if (res != TPM_SUCCESS) return res; - len = *authContextSize; -diff -uprN orig/tpm_emulator-0.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>, -+ * Copyright (C) 2005 INTEL Corp - * - * This module is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published -@@ -22,7 +23,8 @@ - /* TPM configuration */ - #define TPM_STORE_TO_FILE 1 - #undef TPM_STRONG_PERSISTENCE --#undef TPM_GENERATE_EK -+//#undef TPM_GENERATE_EK -+#define TPM_GENERATE_EK - #undef TPM_GENERATE_SEED_DAA - - #define TPM_MANUFACTURER 0x4554485A /* 'ETHZ' */ -diff -uprN orig/tpm_emulator-0.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; - } - -@@ -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 ) - - /* - * 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>, - * Swiss Federal Institute of Technology (ETH) Zurich -+ * Copyright (C) 2005 INTEL Corp - * - * This module is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published -@@ -95,24 +96,24 @@ static int tpm_test_sha1(void) - struct { - uint8_t *data; uint32_t repetitions; uint8_t *digest; - } test_cases[] = {{ -- "abc", 1, -- "\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E\x25\x71\x78\x50\xC2\x6C\x9C\xD0\xD8\x9D" -+ (uint8_t*)"abc", 1, -+ (uint8_t*)"\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E\x25\x71\x78\x50\xC2\x6C\x9C\xD0\xD8\x9D" - }, { -- "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 1, -- "\x84\x98\x3E\x44\x1C\x3B\xD2\x6E\xBA\xAE\x4A\xA1\xF9\x51\x29\xE5\xE5\x46\x70\xF1" -+ (uint8_t*)"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 1, -+ (uint8_t*)"\x84\x98\x3E\x44\x1C\x3B\xD2\x6E\xBA\xAE\x4A\xA1\xF9\x51\x29\xE5\xE5\x46\x70\xF1" - }, { -- "a", 1000000, -- "\x34\xAA\x97\x3C\xD4\xC4\xDA\xA4\xF6\x1E\xEB\x2B\xDB\xAD\x27\x31\x65\x34\x01\x6F" -+ (uint8_t*)"a", 1000000, -+ (uint8_t*)"\x34\xAA\x97\x3C\xD4\xC4\xDA\xA4\xF6\x1E\xEB\x2B\xDB\xAD\x27\x31\x65\x34\x01\x6F" - }, { -- "0123456701234567012345670123456701234567012345670123456701234567", 10, -- "\xDE\xA3\x56\xA2\xCD\xDD\x90\xC7\xA7\xEC\xED\xC5\xEB\xB5\x63\x93\x4F\x46\x04\x52" -+ (uint8_t*)"0123456701234567012345670123456701234567012345670123456701234567", 10, -+ (uint8_t*)"\xDE\xA3\x56\xA2\xCD\xDD\x90\xC7\xA7\xEC\xED\xC5\xEB\xB5\x63\x93\x4F\x46\x04\x52" - }}; - - debug("tpm_test_sha1()"); - for (i = 0; i < sizeof(test_cases) / sizeof(test_cases[0]); i++) { - sha1_init(&ctx); - for (j = 0; j < test_cases[i].repetitions; j++) -- sha1_update(&ctx, test_cases[i].data, strlen(test_cases[i].data)); -+ sha1_update(&ctx, test_cases[i].data, strlen((char*)test_cases[i].data)); - sha1_final(&ctx, digest); - if (memcmp(digest, test_cases[i].digest, SHA1_DIGEST_LENGTH) != 0) return -1; - } -@@ -128,41 +129,41 @@ static int tpm_test_hmac(void) - struct { - uint8_t *key, key_len, *data, data_len, *digest; - } test_cases[] = {{ -- "\x0b", 20, "Hi There", 8, -- "\xb6\x17\x31\x86\x55\x05\x72\x64\xe2\x8b\xc0\xb6\xfb\x37\x8c\x8e\xf1\x46\xbe\x00" -+ (uint8_t*)"\x0b", 20, (uint8_t*)"Hi There", 8, -+ (uint8_t*)"\xb6\x17\x31\x86\x55\x05\x72\x64\xe2\x8b\xc0\xb6\xfb\x37\x8c\x8e\xf1\x46\xbe\x00" - }, { -- "Jefe", 4, "what do ya want for nothing?", 28, -- "\xef\xfc\xdf\x6a\xe5\xeb\x2f\xa2\xd2\x74\x16\xd5\xf1\x84\xdf\x9c\x25\x9a\x7c\x79" -+ (uint8_t*)"Jefe", 4, (uint8_t*)"what do ya want for nothing?", 28, -+ (uint8_t*)"\xef\xfc\xdf\x6a\xe5\xeb\x2f\xa2\xd2\x74\x16\xd5\xf1\x84\xdf\x9c\x25\x9a\x7c\x79" - }, { -- "\xaa", 20, "\xdd", 50, -- "\x12\x5d\x73\x42\xb9\xac\x11\xcd\x91\xa3\x9a\xf4\x8a\xa1\x7b\x4f\x63\xf1\x75\xd3" -+ (uint8_t*)"\xaa", 20, (uint8_t*)"\xdd", 50, -+ (uint8_t*)"\x12\x5d\x73\x42\xb9\xac\x11\xcd\x91\xa3\x9a\xf4\x8a\xa1\x7b\x4f\x63\xf1\x75\xd3" - }, { -- "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14" -- "\x15\x16\x17\x18\x19", 25, "\xcd", 50, -- "\x4c\x90\x07\xf4\x02\x62\x50\xc6\xbc\x84\x14\xf9\xbf\x50\xc8\x6c\x2d\x72\x35\xda" -+ (uint8_t*)"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14" -+ "\x15\x16\x17\x18\x19", 25, (uint8_t*)"\xcd", 50, -+ (uint8_t*)"\x4c\x90\x07\xf4\x02\x62\x50\xc6\xbc\x84\x14\xf9\xbf\x50\xc8\x6c\x2d\x72\x35\xda" - }, { -- "\x0c", 20, "Test With Truncation", 20, -- "\x4c\x1a\x03\x42\x4b\x55\xe0\x7f\xe7\xf2\x7b\xe1\xd5\x8b\xb9\x32\x4a\x9a\x5a\x04" -+ (uint8_t*)"\x0c", 20, (uint8_t*)"Test With Truncation", 20, -+ (uint8_t*)"\x4c\x1a\x03\x42\x4b\x55\xe0\x7f\xe7\xf2\x7b\xe1\xd5\x8b\xb9\x32\x4a\x9a\x5a\x04" - }, { -- "\xaa", 80, "Test Using Larger Than Block-Size Key - Hash Key First", 54, -- "\xaa\x4a\xe5\xe1\x52\x72\xd0\x0e\x95\x70\x56\x37\xce\x8a\x3b\x55\xed\x40\x21\x12" -+ (uint8_t*)"\xaa", 80, (uint8_t*)"Test Using Larger Than Block-Size Key - Hash Key First", 54, -+ (uint8_t*)"\xaa\x4a\xe5\xe1\x52\x72\xd0\x0e\x95\x70\x56\x37\xce\x8a\x3b\x55\xed\x40\x21\x12" - }, { -- "\xaa", 80, -- "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data", 73, -- "\xe8\xe9\x9d\x0f\x45\x23\x7d\x78\x6d\x6b\xba\xa7\x96\x5c\x78\x08\xbb\xff\x1a\x91" -+ (uint8_t*)"\xaa", 80, -+ (uint8_t*)"Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data", 73, -+ (uint8_t*)"\xe8\xe9\x9d\x0f\x45\x23\x7d\x78\x6d\x6b\xba\xa7\x96\x5c\x78\x08\xbb\xff\x1a\x91" - }}; - - debug("tpm_test_hmac()"); - for (i = 0; i < sizeof(test_cases) / sizeof(test_cases[0]); i++) { -- if (strlen(test_cases[i].key) < test_cases[i].key_len) { -+ if (strlen((char*)test_cases[i].key) < test_cases[i].key_len) { - uint8_t key[test_cases[i].key_len]; - memset(key, test_cases[i].key[0], test_cases[i].key_len); - hmac_init(&ctx, key, test_cases[i].key_len); - } else { - hmac_init(&ctx, test_cases[i].key, test_cases[i].key_len); - } -- for (j = 0; j < test_cases[i].data_len; j += strlen(test_cases[i].data)) { -- hmac_update(&ctx, test_cases[i].data, strlen(test_cases[i].data)); -+ for (j = 0; j < test_cases[i].data_len; j += strlen((char*)test_cases[i].data)) { -+ hmac_update(&ctx, test_cases[i].data, strlen((char*)test_cases[i].data)); - } - hmac_final(&ctx, digest); - if (memcmp(digest, test_cases[i].digest, SHA1_DIGEST_LENGTH) != 0) return -1; -@@ -173,9 +174,9 @@ static int tpm_test_hmac(void) - static int tpm_test_rsa_EK(void) - { - int res = 0; -- char *data = "RSA PKCS #1 v1.5 Test-String"; -+ uint8_t *data = (uint8_t*)"RSA PKCS #1 v1.5 Test-String"; - uint8_t buf[256]; -- size_t buf_len, data_len = strlen(data); -+ size_t buf_len, data_len = strlen((char*)data); - rsa_private_key_t priv_key; - rsa_public_key_t pub_key; - -diff -uprN orig/tpm_emulator-0.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>, - * 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 -@@ -39,9 +40,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, -@@ -49,64 +48,11 @@ 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(); --/* 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 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, (BYTE*)"in", 2); - sha1_update(&sha1, secret, sizeof(TPM_SECRET)); - j = CPU_TO_BE32(i); - sha1_update(&sha1, (BYTE*)&j, 4); -@@ -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, (BYTE*)"out", 3); - sha1_update(&sha1, secret, sizeof(TPM_SECRET)); - j = CPU_TO_BE32(i); - sha1_update(&sha1, (BYTE*)&j, 4); -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 -+ * -+ * This module is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published -+ * by the Free Software Foundation; either version 2 of the License, -+ * or (at your option) any later version. -+ * -+ * This module is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <string.h> -+#include <sys/types.h> -+#include <sys/stat.h> -+#include <fcntl.h> -+#include <sys/time.h> -+ -+#include "tpm_emulator.h" -+ -+#define TPM_RX_FNAME "/var/tpm/tpm_in.fifo" -+#define TPM_TX_FNAME "/var/tpm/tpm_out.fifo" -+ -+#define BUFFER_SIZE 2048 -+ -+static int devurandom=0; -+ -+void get_random_bytes(void *buf, int nbytes) { -+ -+ if (devurandom == 0) { -+ devurandom = open("/dev/urandom", O_RDONLY); -+ } -+ -+ if (read(devurandom, buf, nbytes) != nbytes) { -+ printf("Can't get random number.\n"); -+ exit(-1); -+ } -+} -+ -+uint64_t tpm_get_ticks(void) -+{ -+ //struct timeval tv; -+ //int gettimeofday(&tv, struct timezone *tz); -+ return 0; -+} -+ -+int main(int argc, char **argv) -+{ -+ uint8_t in[BUFFER_SIZE], *out; -+ uint32_t out_size; -+ int in_size, written; -+ int i; -+ struct stat file_info; -+ -+ int tpm_tx_fh=-1, tpm_rx_fh=-1; -+ if (argc < 2) { -+ printf("Usage: tpmd clear|save|deactivated\n" ); -+ return -1; -+ } -+ -+ /* initialize TPM emulator */ -+ if (!strcmp(argv[1], "clear")) { -+ printf("Initializing tpm: %s\n", argv[1]); -+ tpm_emulator_init(1); -+ } else if (!strcmp(argv[1], "save")) { -+ printf("Initializing tpm: %s\n", argv[1]); -+ tpm_emulator_init(2); -+ } else if (!strcmp(argv[1], "deactivated")) { -+ printf("Initializing tpm: %s\n", argv[1]); -+ tpm_emulator_init(3); -+ } else { -+ printf("invalid startup mode '%s'; must be 'clear', " -+ "'save' (default) or 'deactivated", argv[1]); -+ return -1; -+ } -+ -+ 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) { -+ tpm_rx_fh = open(TPM_RX_FNAME, O_RDONLY); -+ } -+ -+ if (tpm_rx_fh < 0) { -+ printf("ERROR: failed to open devices to listen to guest.\n"); -+ return -1; -+ } -+ -+ if (tpm_tx_fh < 0) { -+ tpm_tx_fh = open(TPM_TX_FNAME, O_WRONLY); -+ } -+ -+ if (tpm_tx_fh < 0) { -+ printf("ERROR: failed to open devices to respond to guest.\n"); -+ return -1; -+ } -+ -+ in_size = read(tpm_rx_fh, in, BUFFER_SIZE); -+ if (in_size < 6) { // Magic size of minium TPM command -+ printf("Recv[%d] to small: 0x", in_size); -+ if (in_size <= 0) { -+ close(tpm_rx_fh); -+ tpm_rx_fh = -1; -+ goto abort_command; -+ } -+ } else { -+ printf("Recv[%d]: 0x", in_size); -+ for (i=0; i< in_size; i++) -+ printf("%x ", in[i]); -+ printf("\n"); -+ } -+ -+ -+ if (tpm_handle_command(in, in_size, &out, &out_size) != 0) { -+ printf("ERROR: Handler Failed.\n"); -+ } -+ -+ written = write(tpm_tx_fh, out, out_size); -+ -+ if (written != out_size ) { -+ printf("ERROR: Part of response not written %d/%d.\nAttempt: ", written, out_size); -+ } else { -+ printf("Sent[%Zu]: ", out_size); -+ } -+ for (i=0; i< out_size; i++) -+ printf("%x ", out[i]); -+ printf("\n"); -+ tpm_free(out); -+ -+ } // loop -+ -+ tpm_emulator_shutdown(); -+ -+ close(tpm_tx_fh); -+ close(tpm_rx_fh); -+ -+} -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 --git a/tools/vtpm/vtpm-0.5.1-LDLIBS.patch b/tools/vtpm/vtpm-0.5.1-LDLIBS.patch deleted file mode 100644 index 95586c1..0000000 --- a/tools/vtpm/vtpm-0.5.1-LDLIBS.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naurp tpm_emulator-0.5.1/tpmd/Makefile tpm_emulator-0.5.1/tpmd/Makefile ---- tpm_emulator-0.5.1/tpmd/Makefile -+++ tpm_emulator-0.5.1/tpmd/Makefile -@@ -8,7 +8,7 @@ WFLAGS := -Wall -Wno-unused -Wpointer-a - #WFLAGS += -Wextra -Wcast-qual -Wmissing-prototypes -Wmissing-declarations -Wstrict-aliasing - CFLAGS += $(WFLAGS) -g -I.. -I. -O2 -fno-strict-aliasing - CFLAGS += -I../../../../tools/vtpm_manager/manager --LDFLAGS += -lgmp -+LDLIBS += -lgmp - - BINDIR := /usr/bin/ - diff --git a/tools/vtpm/vtpm-0.5.1.patch b/tools/vtpm/vtpm-0.5.1.patch deleted file mode 100644 index 2aeb745..0000000 --- a/tools/vtpm/vtpm-0.5.1.patch +++ /dev/null @@ -1,766 +0,0 @@ -diff -Naurp tpm_emulator-0.5.1/Makefile tpm5-test/Makefile ---- tpm_emulator-0.5.1/Makefile 2008-02-14 03:22:48.000000000 -0500 -+++ tpm5-test/Makefile 2009-07-15 09:45:28.000000000 -0400 -@@ -10,7 +10,7 @@ VERSION_MINOR := 5 - VERSION_BUILD := $(shell date +"%s") - VERSION_SUFFIX := .1 - --SUBDIRS := tpmd tpmd_dev tddl -+SUBDIRS := tpmd - - all: version all-recursive - -@@ -48,12 +48,12 @@ user_install: user - modules_install: modules - @$(MAKE) -C tpmd_dev install || exit -1 - --DIRS := . tpm crypto tpmd tpmd_dev tddl tpmd_dev_openbsd -+DIRS := . tpm crypto tpmd - DISTSRC := $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c)) - DISTSRC += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.h)) --DIRS := . tpmd tpmd_dev tddl tpmd_dev_openbsd -+DIRS := . tpmd - DISTSRC += $(foreach dir, $(DIRS), $(dir)/Makefile) --DISTSRC += ./README ./AUTHORS ./ChangeLog tpmd_dev/tpmd_dev.rules.in -+DISTSRC += ./README ./AUTHORS ./ChangeLog - DISTDIR := tpm_emulator-$(VERSION_MAJOR).$(VERSION_MINOR)$(VERSION_SUFFIX) - - dist: $(DISTSRC) -diff -Naurp tpm_emulator-0.5.1/tpm/tpm_capability.c tpm5-test/tpm/tpm_capability.c ---- tpm_emulator-0.5.1/tpm/tpm_capability.c 2008-02-14 03:22:48.000000000 -0500 -+++ tpm5-test/tpm/tpm_capability.c 2009-07-16 12:04:20.000000000 -0400 -@@ -136,8 +136,19 @@ static TPM_RESULT cap_property(UINT32 su - - case TPM_CAP_PROP_TIS_TIMEOUT: - debug("[TPM_CAP_PROP_TIS_TIMEOUT]"); -- /* TODO: TPM_CAP_PROP_TIS_TIMEOUT */ -- return TPM_FAIL; -+ /* TODO: TPM_CAP_PROP_TIS_TIMEOUT: Measure these values and determine correct ones */ -+ UINT32 len = *respSize = 16; -+ BYTE *ptr = *resp = tpm_malloc(*respSize); -+ if (ptr == NULL || -+ tpm_marshal_UINT32(&ptr, &len, 200000) || -+ tpm_marshal_UINT32(&ptr, &len, 200000) || -+ tpm_marshal_UINT32(&ptr, &len, 200000) || -+ tpm_marshal_UINT32(&ptr, &len, 200000)) { -+ tpm_free(*resp); -+ return TPM_FAIL; -+ } -+ return TPM_SUCCESS; -+ - - case TPM_CAP_PROP_STARTUP_EFFECT: - debug("[TPM_CAP_PROP_STARTUP_EFFECT]"); -@@ -189,8 +200,12 @@ static TPM_RESULT cap_property(UINT32 su - - case TPM_CAP_PROP_DURATION: - debug("[TPM_CAP_PROP_DURATION]"); -- /* TODO: TPM_CAP_PROP_DURATION */ -- return TPM_FAIL; -+ /* TODO: TPM_CAP_PROP_DURATION: Measure these values and return accurate ones */ -+ BYTE dur[]= {0x0,0x0,0x0,0xc,0x0,0x7,0xa1,0x20,0x0,0x1e,0x84,0x80,0x11,0xe1,0xa3,0x0}; -+ *respSize = 16; -+ *resp = tpm_malloc(*respSize); -+ memcpy(*resp,dur,16); -+ - - case TPM_CAP_PROP_ACTIVE_COUNTER: - debug("[TPM_CAP_PROP_ACTIVE_COUNTER]"); -diff -Naurp tpm_emulator-0.5.1/tpmd/Makefile tpm5-test/tpmd/Makefile ---- tpm_emulator-0.5.1/tpmd/Makefile 2008-02-14 03:22:48.000000000 -0500 -+++ tpm5-test/tpmd/Makefile 2009-07-16 12:08:26.000000000 -0400 -@@ -8,9 +8,10 @@ WFLAGS := -Wall -Wno-unused -Wpointer-a - -Wwrite-strings -Wsign-compare -Wno-multichar - #WFLAGS += -Wextra -Wcast-qual -Wmissing-prototypes -Wmissing-declarations -Wstrict-aliasing - CFLAGS += $(WFLAGS) -g -I.. -I. -O2 -fno-strict-aliasing -+CFLAGS += -I../../../../tools/vtpm_manager/manager - LDFLAGS += -lgmp - --BINDIR := /usr/sbin/ -+BINDIR := /usr/bin/ - - TPMD := tpmd - DIRS := ../tpm ../crypto -@@ -18,6 +19,8 @@ SRCS := $(foreach dir, $(DIRS), $(wil - OBJS := $(patsubst %.c, %.o, $(SRCS)) - OBJS := $(foreach dir, $(DIRS), $(patsubst $(dir)/%.o, %.o, $(filter $(dir)/%.o, $(OBJS)))) - -+VTPM_BIN := vtpmd -+ - vpath %.c $(strip $(DIRS)) - - all: $(TPMD) -@@ -32,10 +35,8 @@ TPMD_GROUP ?= tss - INSTALL ?= install - - install: $(TPMD) -- $(INSTALL) -m 755 -o $(TPMD_USER) -g $(TPMD_GROUP) -d $(DESTDIR)/var/lib/tpm -- $(INSTALL) -m 755 -o $(TPMD_USER) -g $(TPMD_GROUP) -d $(DESTDIR)/var/run/tpm - $(INSTALL) -D -d $(DESTDIR)/$(BINDIR) -- $(INSTALL) -m 755 $(TPMD) $(DESTDIR)/$(BINDIR) -+ $(INSTALL) -m 755 $(TPMD) $(DESTDIR)/$(BINDIR)/$(VTPM_BIN) - - .PHONY: all clean install - -diff -Naurp tpm_emulator-0.5.1/tpmd/tpmd.c tpm5-test/tpmd/tpmd.c ---- tpm_emulator-0.5.1/tpmd/tpmd.c 2008-02-14 03:22:48.000000000 -0500 -+++ tpm5-test/tpmd/tpmd.c 2009-07-16 11:19:05.000000000 -0400 -@@ -32,6 +32,9 @@ - #include <grp.h> - #include "tpm_emulator_config.h" - #include "tpm/tpm_emulator.h" -+#include "tpm/tpm_structures.h" -+#include "tpm/tpm_marshalling.h" -+#include "vtpm_manager.h" - - #define TPM_DAEMON_NAME "tpmd" - #define TPM_CMD_BUF_SIZE 4096 -@@ -39,6 +42,24 @@ - #define TPM_RANDOM_DEVICE "/dev/urandom" - #undef TPM_MKDIRS - -+#ifdef VTPM_MULTI_VM -+ #define DEV_BE "/dev/vtpm" -+ #define DEV_FE "/dev/tpm" -+#else -+ #define PVM_RX_FIFO_D "/var/vtpm/fifos/tpm_cmd_to_%d.fifo" -+ #define PVM_TX_FIFO "/var/vtpm/fifos/tpm_rsp_from_all.fifo" -+ #define HVM_RX_FIFO_D "/var/vtpm/socks/%d.socket" -+ -+ #define VTPM_RX_FIFO_D "/var/vtpm/fifos/vtpm_rsp_to_%d.fifo" -+ #define VTPM_TX_FIFO "/var/vtpm/fifos/vtpm_cmd_from_all.fifo" -+ -+ static char *vtpm_rx_name=NULL; -+#endif -+ -+ static int vtpm_tx_fh=-1, vtpm_rx_fh=-1; -+ -+#define BUFFER_SIZE 2048 -+ - static volatile int stopflag = 0; - static int is_daemon = 0; - static int opt_debug = 0; -@@ -49,6 +70,8 @@ static const char *opt_storage_file = "/ - static uid_t opt_uid = 0; - static gid_t opt_gid = 0; - static int tpm_startup = 2; -+static int vtpm_type = VTPM_TYPE_PVM; -+int dmi_id = 0; - static int rand_fh; - - void tpm_log(int priority, const char *fmt, ...) -@@ -90,56 +113,241 @@ uint64_t tpm_get_ticks(void) - - int tpm_write_to_file(uint8_t *data, size_t data_length) - { -- int fh; -- ssize_t res; -- fh = open(opt_storage_file, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR); -- if (fh < 0) return -1; -- while (data_length > 0) { -- res = write(fh, data, data_length); -- if (res < 0) { -- close(fh); -- return -1; -- } -- data_length -= res; -- data += res; -+ int res, out_data_size, in_header_size; -+ BYTE *ptr, *out_data, *in_header; -+ UINT32 result, len, in_rsp_size; -+ UINT16 tag = VTPM_TAG_REQ; -+ -+ printf("Saving NVM\n"); -+ if (vtpm_tx_fh < 0) { -+#ifdef VTPM_MUTLI_VM -+ vtpm_tx_fh = open(DEV_FE, O_RDWR); -+#else -+ vtpm_tx_fh = open(VTPM_TX_FIFO, O_WRONLY); -+#endif -+ } -+ -+ if (vtpm_tx_fh < 0) { -+ return -1; -+ } -+ -+ // Send request to VTPM Manager to encrypt data -+#ifdef VTPM_MUTLI_VM -+ out_data_size = len = VTPM_COMMAND_HEADER_SIZE_CLT + data_length; -+#else -+ out_data_size = len = VTPM_COMMAND_HEADER_SIZE_SRV + data_length; -+#endif -+ -+ out_data = ptr = (BYTE *) malloc(len); -+ -+ if (ptr == NULL -+#ifndef VTPM_MUTLI_VM -+ || tpm_marshal_UINT32(&ptr, &len, dmi_id) -+#endif -+ || tpm_marshal_UINT16(&ptr, &len, tag) -+#ifdef VTPM_MUTLI_VM -+ || tpm_marshal_UINT32(&ptr, &len, out_data_size) -+#else -+ || tpm_marshal_UINT32(&ptr, &len, out_data_size - sizeof(uint32_t)) -+#endif -+ || tpm_marshal_UINT32(&ptr, &len, VTPM_ORD_SAVENVM) -+ || tpm_marshal_BYTE_ARRAY(&ptr, &len, data, data_length)) { -+ free(out_data); -+ return -1; -+ } -+ -+ printf("\tSending SaveNVM Command.\n"); -+ res = write(vtpm_tx_fh, out_data, out_data_size); -+ free(out_data); -+ if (res != out_data_size) return -1; -+ -+ if (vtpm_rx_fh < 0) { -+#ifdef VTPM_MUTLI_VM -+ vtpm_rx_fh = vtpm_tx_fh -+#else -+ if (vtpm_rx_name == NULL) { -+ vtpm_rx_name = malloc(10 + strlen(VTPM_RX_FIFO_D)); -+ sprintf(vtpm_rx_name, VTPM_RX_FIFO_D, (uint32_t) dmi_id); - } -- close(fh); -- return 0; -+ vtpm_rx_fh = open(vtpm_rx_name, O_RDONLY); -+#endif -+ } -+ -+ if (vtpm_rx_fh < 0) { -+ return -1; -+ } -+ -+ // Read Header of response so we can get the size & status -+#ifdef VTPM_MUTLI_VM -+ in_header_size = len = VTPM_COMMAND_HEADER_SIZE_CLT; -+#else -+ in_header_size = len = VTPM_COMMAND_HEADER_SIZE_SRV; -+#endif -+ in_header = ptr = malloc(in_header_size); -+ -+ printf("\tReading SaveNVM header.\n"); -+ res = read(vtpm_rx_fh, in_header, in_header_size); -+ -+ if ( (res != in_header_size) -+#ifndef VTPM_MUTLI_VM -+ || tpm_unmarshal_UINT32(&ptr, &len, (UINT32*)&dmi_id) -+#endif -+ || tpm_unmarshal_UINT16(&ptr, &len, &tag) -+ || tpm_unmarshal_UINT32(&ptr, &len, &in_rsp_size) -+ || tpm_unmarshal_UINT32(&ptr, &len, &result) ) { -+ free(in_header); -+ return -1; -+ } -+ free(in_header); -+ -+ if (result != VTPM_SUCCESS) { -+ return -1; -+ } -+ -+#ifdef VTPM_MUTLI_VM -+ close(vtpm_tx_fh); close(vtpm_rx_fh); -+#endif -+ -+ printf("\tFinishing up SaveNVM\n"); -+ return (0); - } - - int tpm_read_from_file(uint8_t **data, size_t *data_length) - { -- int fh; -- ssize_t res; -- size_t total_length; -- fh = open(opt_storage_file, O_RDONLY); -- if (fh < 0) return -1; -- total_length = lseek(fh, 0, SEEK_END); -- lseek(fh, 0, SEEK_SET); -- *data = tpm_malloc(total_length); -- if (*data == NULL) { -- close(fh); -- return -1; -- } -- *data_length = 0; -- while (total_length > 0) { -- res = read(fh, &(*data)[*data_length], total_length); -- if (res < 0) { -- close(fh); -- tpm_free(*data); -- return -1; -- } -- *data_length += res; -- total_length -= res; -+ int res, out_data_size, in_header_size; -+ uint8_t *ptr, *out_data, *in_header; -+ UINT16 tag = VTPM_TAG_REQ; -+ UINT32 len, in_rsp_size, result; -+#ifdef VTPM_MUTLI_VM -+ int vtpm_rx_fh, vtpm_tx_fh; -+#endif -+ -+ printf("Loading NVM.\n"); -+ if (vtpm_tx_fh < 0) { -+#ifdef VTPM_MUTLI_VM -+ vtpm_tx_fh = open(DEV_FE, O_RDWR); -+#else -+ vtpm_tx_fh = open(VTPM_TX_FIFO, O_WRONLY); -+#endif -+ } -+ -+ if (vtpm_tx_fh < 0) { -+ printf("Error in read_from_file:301\n"); -+ return -1; -+ } -+ -+ // Send request to VTPM Manager to encrypt data -+#ifdef VTPM_MUTLI_VM -+ out_data_size = len = VTPM_COMMAND_HEADER_SIZE_CLT; -+#else -+ out_data_size = len = VTPM_COMMAND_HEADER_SIZE_SRV; -+#endif -+ out_data = ptr = (BYTE *) malloc(len); -+ -+ if (ptr == NULL -+#ifndef VTPM_MUTLI_VM -+ || tpm_marshal_UINT32(&ptr, &len, dmi_id) -+#endif -+ || tpm_marshal_UINT16(&ptr, &len, tag) -+#ifdef VTPM_MUTLI_VM -+ || tpm_marshal_UINT32(&ptr, &len, out_data_size) -+#else -+ || tpm_marshal_UINT32(&ptr, &len, out_data_size - sizeof(uint32_t)) -+#endif -+ || tpm_marshal_UINT32(&ptr, &len, VTPM_ORD_LOADNVM)) { -+ free(out_data); -+ printf("Error in read_from_file:325\n"); -+ -+ return -1; -+ } -+ -+ printf("\tSending LoadNVM command\n"); -+ res = write(vtpm_tx_fh, out_data, out_data_size); -+ free(out_data); -+ if (res != out_data_size) -+ { -+ printf("Error in read_from_file:335\n"); -+ return -1; -+ } -+ -+ if (vtpm_rx_fh < 0) { -+#ifdef VTPM_MUTLI_VM -+ vtpm_rx_fh = vtpm_tx_fh; -+#else -+ if (vtpm_rx_name == NULL) { -+ vtpm_rx_name = malloc(10 + strlen(VTPM_RX_FIFO_D)); -+ sprintf(vtpm_rx_name, VTPM_RX_FIFO_D, (uint32_t) dmi_id); - } -- close(fh); -- return 0; -+ vtpm_rx_fh = open(vtpm_rx_name, O_RDONLY); -+#endif -+ } -+ -+ if (vtpm_rx_fh < 0) { -+ printf("Error in read_from_file:352\n"); -+ return -1; -+ } -+ -+ // Read Header of response so we can get the size & status -+#ifdef VTPM_MUTLI_VM -+ in_header_size = len = VTPM_COMMAND_HEADER_SIZE_CLT; -+#else -+ in_header_size = len = VTPM_COMMAND_HEADER_SIZE_SRV; -+#endif -+ in_header = ptr = malloc(in_header_size); -+ -+ printf("\tReading LoadNVM header\n"); -+ res = read(vtpm_rx_fh, in_header, in_header_size); -+ -+ if ( (res != in_header_size) -+#ifndef VTPM_MUTLI_VM -+ || tpm_unmarshal_UINT32(&ptr, &len, (UINT32*)&dmi_id) -+#endif -+ || tpm_unmarshal_UINT16(&ptr, &len, &tag) -+ || tpm_unmarshal_UINT32(&ptr, &len, &in_rsp_size) -+ || tpm_unmarshal_UINT32(&ptr, &len, &result) ) { -+ free(in_header); -+ printf("Error in read_from_file:375\n"); -+ return -1; -+ } -+ free(in_header); -+ -+ if (result != VTPM_SUCCESS) { -+ printf("Error in read_from_file:381\n"); -+ return -1; -+ } -+ -+ // Read Encrypted data from VTPM Manager -+ *data_length = in_rsp_size - VTPM_COMMAND_HEADER_SIZE_CLT; -+ *data = (uint8_t *) malloc(*data_length); -+ -+ printf("\tReading clear data from LoadNVM.\n"); -+ res = read(vtpm_rx_fh, *data, *data_length); -+#ifdef VTPM_MUTLI_VM -+ close(vtpm_rx_fh);close(vtpm_tx_fh); -+#endif -+ -+ printf("\tReturing from loading NVM\n"); -+ if (res != (int)*data_length) { -+ free(*data); -+ printf("Error in read_from_file:398\n"); -+ return -1; -+ } else { -+ return 0; -+ } -+ -+ -+ - } - - static void print_usage(char *name) - { - printf("usage: %s [-d] [-f] [-s storage file] [-u unix socket name] " -- "[-o user name] [-g group name] [-h] [startup mode]\n", name); -+ "[-o user name] [-g group name] [-h]" -+#ifdef VTPM_MULTI_VM -+ "clear|save|deactivated\n", name); -+#else -+ "clear|save|deactivated pvm|hvm vtpmid\n", name); -+#endif - printf(" d : enable debug mode\n"); - printf(" f : forces the application to run in the foreground\n"); - printf(" s : storage file to use (default: %s)\n", opt_storage_file); -@@ -205,7 +413,13 @@ static void parse_options(int argc, char - exit(EXIT_SUCCESS); - } - } -- if (optind < argc) { -+ /*Make sure we have all required options*/ -+#ifdef VTPM_MULTI_VM -+#define EXTRA_OPTS 0 -+#else -+#define EXTRA_OPTS 2 -+#endif -+ if (optind < argc - EXTRA_OPTS ) { - debug("startup mode = '%s'", argv[optind]); - if (!strcmp(argv[optind], "clear")) { - tpm_startup = 1; -@@ -219,6 +433,25 @@ static void parse_options(int argc, char - print_usage(argv[0]); - exit(EXIT_SUCCESS); - } -+#ifndef VTPM_MULTI_VM -+ ++optind; -+ if(!strcmp(argv[optind], "pvm")) { -+ vtpm_type = VTPM_TYPE_PVM; // Get commands from vTPM Manager through fifo -+ } else if (!strcmp(argv[optind], "hvm")) { -+ vtpm_type = VTPM_TYPE_HVM; // Get commands from qemu via socket -+ } else { -+ error("Invalid vm mode '%s'; must be 'pvm', " -+ "or 'hvm' ", argv[optind]); -+ print_usage(argv[0]); -+ exit(EXIT_SUCCESS); -+ } -+ ++optind; -+ dmi_id = atoi(argv[optind]); -+#endif -+ } else { -+ error("Invalid number of arguments"); -+ print_usage(argv[0]); -+ exit(EXIT_SUCCESS); - } - } - -@@ -348,93 +581,180 @@ static int init_socket(const char *name) - - static void main_loop(void) - { -- int sock, fh, res; -- int32_t in_len; -+ int32_t in_len, written; - uint32_t out_len; -- uint8_t in[TPM_CMD_BUF_SIZE], *out; -+ uint8_t in[TPM_CMD_BUF_SIZE], *out, *addressed_out; -+ int guest_id=-1; -+ int i; -+ char *vtpm_rx_file=NULL; -+ int res; -+ -+#ifndef VTPM_MULTI_VM -+ int sockfd = -1; - struct sockaddr_un addr; -- socklen_t addr_len; -- fd_set rfds; -- struct timeval tv; -+ struct sockaddr_un client_addr; -+ unsigned int client_length; -+#endif -+ -+ int vtpm_tx_fh=-1, vtpm_rx_fh=-1; -+ -+#ifndef VTPM_MULTI_VM -+ if (vtpm_type == VTPM_TYPE_PVM) { -+ vtpm_rx_file = malloc(10 + strlen(PVM_RX_FIFO_D)); -+ sprintf(vtpm_rx_file, PVM_RX_FIFO_D, (uint32_t) dmi_id); -+ } else { -+ vtpm_rx_file = malloc(10 + strlen(HVM_RX_FIFO_D)); -+ sprintf(vtpm_rx_file, HVM_RX_FIFO_D, (uint32_t) dmi_id); -+ -+ if ( (sockfd = socket(PF_UNIX,SOCK_STREAM,0)) < 0) { -+ error("Unable to create socket. errno = %d\n", errno); -+ exit (-1); -+ } -+ -+ memset(&addr, 0, sizeof(addr)); -+ addr.sun_family = AF_UNIX; -+ strcpy(addr.sun_path,vtpm_rx_file ); -+ unlink(addr.sun_path); -+ } -+#endif - - info("staring main loop"); -- /* open UNIX socket */ -- sock = init_socket(opt_socket_name); -- if (sock < 0) exit(EXIT_FAILURE); - /* init tpm emulator */ -- debug("initializing TPM emulator: %d", tpm_startup); -+#ifdef VTPM_MULTI_VM -+ debug("initializing TPM emulator: state=%d", tpm_startup); -+#else -+ debug("initializing TPM emulator: state=%d, type=%d, id=%d", tpm_startup, vtpm_type, dmi_id); -+#endif - tpm_emulator_init(tpm_startup); - /* start command processing */ - while (!stopflag) { - /* wait for incomming connections */ - debug("waiting for connections..."); -- FD_ZERO(&rfds); -- FD_SET(sock, &rfds); -- tv.tv_sec = 10; -- tv.tv_usec = 0; -- res = select(sock + 1, &rfds, NULL, NULL, &tv); -- if (res < 0) { -- error("select(sock) failed: %s", strerror(errno)); -- break; -- } else if (res == 0) { -- continue; -- } -- addr_len = sizeof(addr); -- fh = accept(sock, (struct sockaddr*)&addr, &addr_len); -- if (fh < 0) { -- error("accept() failed: %s", strerror(errno)); -- continue; -- } -+ if (vtpm_rx_fh < 0) { -+#ifdef VTPM_MUTLI_VM -+ vtpm_rx_fh = open(DEV_BE, O_RDWR); -+#else -+ if (vtpm_type == VTPM_TYPE_PVM) -+ { -+ vtpm_rx_fh = open(vtpm_rx_file, O_RDONLY); -+ } else { -+ if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { -+ error("Unable to bind(). errno = %d\n", errno); -+ exit (-1); -+ } -+ -+ if (listen(sockfd, 10) <0) { -+ error("Unable to listen(). errno = %d\n", errno); -+ exit (-1); -+ } -+ -+ memset(&client_addr, 0, sizeof(client_addr)); -+ client_length = sizeof(client_addr); -+ -+ vtpm_rx_fh = vtpm_tx_fh = accept(sockfd, (struct sockaddr *)&client_addr, &client_length); -+ } -+#endif -+ } -+ -+ /*Error Checking*/ -+ if (vtpm_rx_fh < 0) { -+ error("Failed to open devices to listen to guest.\n"); -+ exit(-1); -+ } -+ - /* receive and handle commands */ - in_len = 0; - do { - debug("waiting for commands..."); -- FD_ZERO(&rfds); -- FD_SET(fh, &rfds); -- tv.tv_sec = TPM_COMMAND_TIMEOUT; -- tv.tv_usec = 0; -- res = select(fh + 1, &rfds, NULL, NULL, &tv); -- if (res < 0) { -- error("select(fh) failed: %s", strerror(errno)); -- close(fh); -- break; -- } else if (res == 0) { --#ifdef TPMD_DISCONNECT_IDLE_CLIENTS -- info("connection closed due to inactivity"); -- close(fh); -- break; --#else -- continue; --#endif -- } -- in_len = read(fh, in, sizeof(in)); -- if (in_len > 0) { -+ -+ in_len = read(vtpm_rx_fh, in, sizeof(in)); -+ /*Magic size of minimum TPM command is 6*/ -+ //FIXME Magic size check may not be required anymore -+ if (in_len < 6) { -+ info("Recv incomplete command of %d bytes.", in_len); -+ if (in_len <= 0) { -+ close(vtpm_rx_fh); -+ vtpm_rx_fh = -1; -+ continue; -+ } -+ } else { -+ /*Debug Printouts*/ - debug("received %d bytes", in_len); -+ debug_nostop("Recv[%d]: 0x", in_len); -+ for (i=0; i< in_len; i++) -+ debug_more("%x ", in[i]); -+ debug_more("\n"); -+ /*Multiple Guest check*/ -+ if (guest_id == -1) { -+ guest_id = *((int32_t *) in); -+ } else { -+ if (guest_id != *((int32_t *) in) ) { -+ error("WARNING: More than one guest attached\n"); -+ } -+ } -+ -+ /*Open tx handle now*/ -+ if (vtpm_tx_fh < 0) { -+#ifdef VTPM_MUTLI_VM -+ vtpm_tx_fh = open(DEV_BE, O_RDWR); -+ vtpm_rx_fh = vtpm_tx_fh; -+#else -+ if (vtpm_type == VTPM_TYPE_PVM) { -+ vtpm_tx_fh = open(PVM_TX_FIFO, O_WRONLY); -+ } // No need to open the other direction for HVM -+#endif -+ } -+ if (vtpm_tx_fh < 0) { -+ error("Failed to open devices to respond to guest.\n"); -+ exit(-1); -+ } -+ -+ /*Handle the TPM command now*/ - out = NULL; -- res = tpm_handle_command(in, in_len, &out, &out_len); -+ res = tpm_handle_command(in + sizeof(uint32_t), in_len - sizeof(uint32_t), &out, &out_len); - if (res < 0) { - error("tpm_handle_command() failed"); - } else { - debug("sending %d bytes", out_len); -+ //FIXME this prepending may or may not be needed -+ /*Prepend the first 4 bytes of the in buffer.. why?*/ -+ addressed_out = (uint8_t *) tpm_malloc(sizeof(uint32_t) + out_len); -+ *(uint32_t *) addressed_out = *(uint32_t *) in; -+ memcpy(addressed_out + sizeof(uint32_t), out, out_len); -+ out_len += sizeof(uint32_t); -+ /*End Prepend*/ -+ -+ /*Perform write operation now*/ - while (out_len > 0) { -- res = write(fh, out, out_len); -+ res = write(vtpm_tx_fh, addressed_out, out_len); -+ - if (res < 0) { - error("write(%d) failed: %s", out_len, strerror(errno)); - break; -- } -+ } else { -+ debug_nostop("Sent[%Zu]: ", out_len); -+ for (i=0; (unsigned int)i< out_len; i++) -+ debug_more("%x ", addressed_out[i]); -+ debug_more("\n"); -+ } - out_len -= res; - } - tpm_free(out); -+ tpm_free(addressed_out); - } - } - } while (in_len > 0); -- close(fh); -+ //close(fh); - } -+ - /* shutdown tpm emulator */ - tpm_emulator_shutdown(); -- /* close socket */ -- close(sock); -- unlink(opt_socket_name); -+ /* Close handles */ -+ close(vtpm_tx_fh); -+#ifndef VTPM_MULTI_VM -+ close(vtpm_rx_fh); -+ free(vtpm_rx_file); -+#endif - info("main loop stopped"); - } - -@@ -450,12 +770,13 @@ int main(int argc, char **argv) - /* open random device */ - init_random(); - /* init signal handlers */ -- init_signal_handler(); -+ //init_signal_handler(); - /* unless requested otherwiese, fork and daemonize process */ -- if (!opt_foreground) daemonize(); -+ //if (!opt_foreground) daemonize(); - /* start main processing loop */ - main_loop(); - info("stopping TPM Emulator daemon"); - closelog(); - return 0; - } -+ -diff -Naurp tpm_emulator-0.5.1/tpmd/tpm_emulator_config.h tpm5-test/tpmd/tpm_emulator_config.h ---- tpm_emulator-0.5.1/tpmd/tpm_emulator_config.h 2008-02-14 03:22:48.000000000 -0500 -+++ tpm5-test/tpmd/tpm_emulator_config.h 2009-07-16 11:25:26.000000000 -0400 -@@ -29,23 +29,28 @@ - - /* TPM emulator configuration */ - --#undef TPM_STRONG_PERSISTENCE --#undef TPM_GENERATE_EK -+#define TPM_STRONG_PERSISTENCE -+#define TPM_GENERATE_EK - #undef TPM_GENERATE_SEED_DAA - #undef TPM_MEMORY_ALIGNMENT_MANDATORY - -+extern int dmi_id; -+ - /* log macros */ - - void tpm_log(int priority, const char *fmt, ...); - --#define debug(fmt, ...) tpm_log(LOG_DEBUG, "%s:%d: Debug: " fmt "\n", \ -- __FILE__, __LINE__, ## __VA_ARGS__) --#define info(fmt, ...) tpm_log(LOG_INFO, "%s:%d: Info: " fmt "\n", \ -- __FILE__, __LINE__, ## __VA_ARGS__) --#define error(fmt, ...) tpm_log(LOG_ERR, "%s:%d: Error: " fmt "\n", \ -- __FILE__, __LINE__, ## __VA_ARGS__) --#define alert(fmt, ...) tpm_log(LOG_ALERT, "%s:%d: Alert: " fmt "\n", \ -- __FILE__, __LINE__, ## __VA_ARGS__) -+#define debug(fmt, ...) tpm_log(LOG_DEBUG, "VTPMD[%d]: %s:%d: Debug: " fmt "\n", \ -+ dmi_id, __FILE__, __LINE__, ## __VA_ARGS__) -+#define info(fmt, ...) tpm_log(LOG_INFO, "VTPMD[%d]: %s:%d: Info: " fmt "\n", \ -+ dmi_id, __FILE__, __LINE__, ## __VA_ARGS__) -+#define error(fmt, ...) tpm_log(LOG_ERR, "VTPMD[%d]: %s:%d: Error: " fmt "\n", \ -+ dmi_id, __FILE__, __LINE__, ## __VA_ARGS__) -+#define alert(fmt, ...) tpm_log(LOG_ALERT, "VTPMD[%d]: %s:%d: Alert: " fmt "\n", \ -+ dmi_id, __FILE__, __LINE__, ## __VA_ARGS__) -+#define debug_nostop(fmt, ...) tpm_log(LOG_DEBUG, "VTPMD[%d]: %s:%d: Debug: " fmt, \ -+ dmi_id, __FILE__, __LINE__, ## __VA_ARGS__) -+#define debug_more(fmt, ...) tpm_log(LOG_DEBUG, fmt, ## __VA_ARGS__) - - /* min/max macros that also do strict type-checking */ - diff --git a/tools/vtpm/vtpm.patch b/tools/vtpm/vtpm.patch deleted file mode 100644 index e896b25..0000000 --- a/tools/vtpm/vtpm.patch +++ /dev/null @@ -1,716 +0,0 @@ -diff -uprN tpm_emulator/AUTHORS vtpm/AUTHORS ---- tpm_emulator/AUTHORS 2006-12-08 12:51:29.000000000 -0800 -+++ vtpm/AUTHORS 2006-12-13 16:38:52.000000000 -0800 -@@ -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/ChangeLog vtpm/ChangeLog ---- tpm_emulator/ChangeLog 2006-12-08 12:51:29.000000000 -0800 -+++ vtpm/ChangeLog 2006-12-13 16:38:52.000000000 -0800 -@@ -1,5 +1,6 @@ - ????-??-?? 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-12-08 12:51:29.000000000 -0800 -+++ vtpm/linux_module.h 2007-01-09 14:49:06.000000000 -0800 -@@ -44,18 +44,26 @@ - #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, ...) 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__) -+#define debug_nostop(fmt, ...) printf("TPMD[%d]: %s:%d: Debug: " fmt, \ -+ dmi_id, __FILE__, __LINE__, ## __VA_ARGS__) -+#define debug_more(fmt, ...) printf( fmt, ## __VA_ARGS__ ) - #else - #define debug(fmt, ...) -+#define debug_nostop(fmt, ...) -+#define debug_more(fmt, ...) - #endif --#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", \ -+ dmi_id, __FILE__, __LINE__, ## __VA_ARGS__) -+#define alert(fmt, ...) printf("TPMD[%d]: %s:%d: Alert: " fmt "\n", \ -+ dmi_id, __FILE__, __LINE__, ## __VA_ARGS__) - - /* memory allocation */ - -diff -uprN tpm_emulator/Makefile vtpm/Makefile ---- tpm_emulator/Makefile 2006-12-08 12:51:29.000000000 -0800 -+++ vtpm/Makefile 2006-12-13 16:38:52.000000000 -0800 -@@ -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_capability.c vtpm/tpm/tpm_capability.c ---- tpm_emulator/tpm/tpm_capability.c 2006-06-23 03:37:07.000000000 -0700 -+++ vtpm/tpm/tpm_capability.c 2007-01-10 10:00:49.000000000 -0800 -@@ -136,8 +136,18 @@ static TPM_RESULT cap_property(UINT32 su - - case TPM_CAP_PROP_TIS_TIMEOUT: - debug("[TPM_CAP_PROP_TIS_TIMEOUT]"); -- /* TODO: TPM_CAP_PROP_TIS_TIMEOUT */ -- return TPM_FAIL; -+ /* TODO: TPM_CAP_PROP_TIS_TIMEOUT: Measure these values and determine correct ones */ -+ UINT32 len = *respSize = 16; -+ BYTE *ptr = *resp = tpm_malloc(*respSize); -+ if (ptr == NULL || -+ tpm_marshal_UINT32(&ptr, &len, 200000) || -+ tpm_marshal_UINT32(&ptr, &len, 200000) || -+ tpm_marshal_UINT32(&ptr, &len, 200000) || -+ tpm_marshal_UINT32(&ptr, &len, 200000)) { -+ tpm_free(*resp); -+ return TPM_FAIL; -+ } -+ return TPM_SUCCESS; - - case TPM_CAP_PROP_STARTUP_EFFECT: - debug("[TPM_CAP_PROP_STARTUP_EFFECT]"); -@@ -190,7 +200,11 @@ static TPM_RESULT cap_property(UINT32 su - - case TPM_CAP_PROP_DURATION: - debug("[TPM_CAP_PROP_DURATION]"); -- /* TODO: TPM_CAP_PROP_DURATION */ -+ /* TODO: TPM_CAP_PROP_DURATION: Measure these values and return accurate ones */ -+ BYTE dur[]= {0x0,0x0,0x0,0xc,0x0,0x7,0xa1,0x20,0x0,0x1e,0x84,0x80,0x11,0xe1,0xa3,0x0}; -+ *respSize = 16; -+ *resp = tpm_malloc(*respSize); -+ memcpy(*resp,dur,16); - return TPM_FAIL; - - case TPM_CAP_PROP_ACTIVE_COUNTER: -diff -uprN tpm_emulator/tpm/tpm_cmd_handler.c vtpm/tpm/tpm_cmd_handler.c ---- tpm_emulator/tpm/tpm_cmd_handler.c 2008-02-27 16:35:41.000000000 -0500 -+++ vtpm/tpm/tpm_cmd_handler.c 2008-02-28 14:43:28.000000000 -0500 -@@ -94,12 +94,18 @@ void tpm_compute_out_param_digest(TPM_CO - sha1_ctx_t sha1; - UINT32 res = CPU_TO_BE32(rsp->result); - UINT32 ord = CPU_TO_BE32(ordinal); -+ UINT32 offset = 0; - - /* compute SHA1 hash */ - sha1_init(&sha1); - sha1_update(&sha1, (BYTE*)&res, 4); - sha1_update(&sha1, (BYTE*)&ord, 4); -- sha1_update(&sha1, rsp->param, rsp->paramSize); -+ if (ordinal == TPM_ORD_LoadKey2) { -+ offset = 4; -+ } -+ if (rsp->paramSize - offset > 0) { -+ sha1_update(&sha1, rsp->param + offset, rsp->paramSize - offset); -+ } - sha1_final(&sha1, rsp->auth1->digest); - if (rsp->auth2 != NULL) memcpy(rsp->auth2->digest, - rsp->auth1->digest, sizeof(rsp->auth1->digest)); -diff -uprN tpm_emulator/tpm/tpm_data.c vtpm/tpm/tpm_data.c ---- tpm_emulator/tpm/tpm_data.c 2008-02-27 16:35:41.000000000 -0500 -+++ vtpm/tpm/tpm_data.c 2008-02-27 16:35:40.000000000 -0500 -@@ -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 -@@ -15,10 +16,15 @@ - * $Id: tpm_data.c 98 2006-05-07 14:16:29Z hstamer $ - */ - -+#include <sys/types.h> -+#include <sys/stat.h> -+#include <fcntl.h> -+#include <unistd.h> -+ - #include "tpm_emulator.h" - #include "tpm_structures.h" - #include "tpm_marshalling.h" --#include "linux_module.h" -+#include "vtpm_manager.h" - - TPM_DATA tpmData; - -@@ -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; -+ -+#ifdef VTPM_MUTLI_VM -+ #define DEV_FE "/dev/tpm" -+#else -+ #define VTPM_RX_FIFO_D "/var/vtpm/fifos/vtpm_rsp_to_%d.fifo" -+ #define VTPM_TX_FIFO "/var/vtpm/fifos/vtpm_cmd_from_all.fifo" -+ -+ extern int dmi_id; -+ static char *vtpm_rx_name=NULL; -+#endif - - static int write_to_file(uint8_t *data, size_t data_length) - { -- int res; -- 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; -+ UINT32 result, len, in_rsp_size; -+ UINT16 tag = VTPM_TAG_REQ; -+ -+ printf("Saving NVM\n"); -+ if (vtpm_tx_fh < 0) { -+#ifdef VTPM_MUTLI_VM -+ vtpm_tx_fh = open(DEV_FE, O_RDWR); -+#else -+ vtpm_tx_fh = open(VTPM_TX_FIFO, O_WRONLY); -+#endif -+ } -+ -+ if (vtpm_tx_fh < 0) { -+ return -1; -+ } -+ -+ // Send request to VTPM Manager to encrypt data -+#ifdef VTPM_MUTLI_VM -+ out_data_size = len = VTPM_COMMAND_HEADER_SIZE_CLT + data_length; -+#else -+ out_data_size = len = VTPM_COMMAND_HEADER_SIZE_SRV + data_length; -+#endif -+ -+ out_data = ptr = (BYTE *) malloc(len); -+ -+ if (ptr == NULL -+#ifndef VTPM_MUTLI_VM -+ || tpm_marshal_UINT32(&ptr, &len, dmi_id) -+#endif -+ || tpm_marshal_UINT16(&ptr, &len, tag) -+#ifdef VTPM_MUTLI_VM -+ || tpm_marshal_UINT32(&ptr, &len, out_data_size) -+#else -+ || tpm_marshal_UINT32(&ptr, &len, out_data_size - sizeof(uint32_t)) -+#endif -+ || tpm_marshal_UINT32(&ptr, &len, VTPM_ORD_SAVENVM) -+ || tpm_marshal_BYTE_ARRAY(&ptr, &len, data, data_length)) { -+ free(out_data); -+ return -1; -+ } -+ -+ printf("\tSending SaveNVM Command.\n"); -+ res = write(vtpm_tx_fh, out_data, out_data_size); -+ free(out_data); -+ if (res != out_data_size) return -1; -+ -+ if (vtpm_rx_fh < 0) { -+#ifdef VTPM_MUTLI_VM -+ vtpm_rx_fh = vtpm_tx_fh -+#else -+ if (vtpm_rx_name == NULL) { -+ vtpm_rx_name = malloc(10 + strlen(VTPM_RX_FIFO_D)); -+ sprintf(vtpm_rx_name, VTPM_RX_FIFO_D, (uint32_t) dmi_id); -+ } -+ vtpm_rx_fh = open(vtpm_rx_name, O_RDONLY); -+#endif -+ } -+ -+ if (vtpm_rx_fh < 0) { -+ return -1; -+ } -+ -+ // Read Header of response so we can get the size & status -+#ifdef VTPM_MUTLI_VM -+ in_header_size = len = VTPM_COMMAND_HEADER_SIZE_CLT; -+#else -+ in_header_size = len = VTPM_COMMAND_HEADER_SIZE_SRV; -+#endif -+ in_header = ptr = malloc(in_header_size); -+ -+ printf("\tReading SaveNVM header.\n"); -+ res = read(vtpm_rx_fh, in_header, in_header_size); -+ -+ if ( (res != in_header_size) -+#ifndef VTPM_MUTLI_VM -+ || tpm_unmarshal_UINT32(&ptr, &len, (UINT32*)&dmi_id) -+#endif -+ || tpm_unmarshal_UINT16(&ptr, &len, &tag) -+ || tpm_unmarshal_UINT32(&ptr, &len, &in_rsp_size) -+ || tpm_unmarshal_UINT32(&ptr, &len, &result) ) { -+ free(in_header); -+ return -1; -+ } -+ free(in_header); -+ -+ if (result != VTPM_SUCCESS) { -+ return -1; -+ } -+ -+#ifdef VTPM_MUTLI_VM -+ close(vtpm_tx_fh); close(vtpm_rx_fh); -+#endif -+ -+ printf("\tFinishing up SaveNVM\n"); -+ return (0); - } - - static int read_from_file(uint8_t **data, size_t *data_length) - { -- int res; -- 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; -+ UINT32 len, in_rsp_size, result; -+#ifdef VTPM_MUTLI_VM -+ int vtpm_rx_fh, vtpm_tx_fh; -+#endif -+ -+ printf("Loading NVM.\n"); -+ if (vtpm_tx_fh < 0) { -+#ifdef VTPM_MUTLI_VM -+ vtpm_tx_fh = open(DEV_FE, O_RDWR); -+#else -+ 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; -+ } -+ -+ // Send request to VTPM Manager to encrypt data -+#ifdef VTPM_MUTLI_VM -+ out_data_size = len = VTPM_COMMAND_HEADER_SIZE_CLT; -+#else -+ out_data_size = len = VTPM_COMMAND_HEADER_SIZE_SRV; -+#endif -+ out_data = ptr = (BYTE *) malloc(len); -+ -+ if (ptr == NULL -+#ifndef VTPM_MUTLI_VM -+ || tpm_marshal_UINT32(&ptr, &len, dmi_id) -+#endif -+ || tpm_marshal_UINT16(&ptr, &len, tag) -+#ifdef VTPM_MUTLI_VM -+ || tpm_marshal_UINT32(&ptr, &len, out_data_size) -+#else -+ || tpm_marshal_UINT32(&ptr, &len, out_data_size - sizeof(uint32_t)) -+#endif -+ || tpm_marshal_UINT32(&ptr, &len, VTPM_ORD_LOADNVM)) { -+ free(out_data); - return -1; - } -- res = read(fp, *data, *data_length); -- close(fp); -+ -+ printf("\tSending LoadNVM command\n"); -+ res = write(vtpm_tx_fh, out_data, out_data_size); -+ free(out_data); -+ if (res != out_data_size) return -1; -+ -+ if (vtpm_rx_fh < 0) { -+#ifdef VTPM_MUTLI_VM -+ vtpm_rx_fh = vtpm_tx_fh; -+#else -+ if (vtpm_rx_name == NULL) { -+ vtpm_rx_name = malloc(10 + strlen(VTPM_RX_FIFO_D)); -+ sprintf(vtpm_rx_name, VTPM_RX_FIFO_D, (uint32_t) dmi_id); -+ } -+ vtpm_rx_fh = open(vtpm_rx_name, O_RDONLY); -+#endif -+ } -+ -+ if (vtpm_rx_fh < 0) { -+ return -1; -+ } -+ -+ // Read Header of response so we can get the size & status -+#ifdef VTPM_MUTLI_VM -+ in_header_size = len = VTPM_COMMAND_HEADER_SIZE_CLT; -+#else -+ in_header_size = len = VTPM_COMMAND_HEADER_SIZE_SRV; -+#endif -+ in_header = ptr = malloc(in_header_size); -+ -+ printf("\tReading LoadNVM header\n"); -+ res = read(vtpm_rx_fh, in_header, in_header_size); -+ -+ if ( (res != in_header_size) -+#ifndef VTPM_MUTLI_VM -+ || tpm_unmarshal_UINT32(&ptr, &len, (UINT32*)&dmi_id) -+#endif -+ || tpm_unmarshal_UINT16(&ptr, &len, &tag) -+ || tpm_unmarshal_UINT32(&ptr, &len, &in_rsp_size) -+ || tpm_unmarshal_UINT32(&ptr, &len, &result) ) { -+ free(in_header); -+ return -1; -+ } -+ free(in_header); -+ -+ if (result != VTPM_SUCCESS) { -+ return -1; -+ } -+ -+ // Read Encrypted data from VTPM Manager -+ *data_length = in_rsp_size - VTPM_COMMAND_HEADER_SIZE_CLT; -+ *data = (uint8_t *) malloc(*data_length); -+ -+ printf("\tReading clear data from LoadNVM.\n"); -+ res = read(vtpm_rx_fh, *data, *data_length); -+#ifdef VTPM_MUTLI_VM -+ close(vtpm_rx_fh);close(vtpm_tx_fh); -+#endif -+ -+ printf("\tReturing from loading NVM\n"); - if (res != *data_length) { -- tpm_free(*data); -- return -1; -+ free(*data); -+ return -1; -+ } else { -+ return 0; - } -- return 0; -+ - } - - #else -diff -uprN tpm_emulator/tpmd.c vtpm/tpmd.c ---- tpm_emulator/tpmd.c 2006-12-08 12:51:29.000000000 -0800 -+++ vtpm/tpmd.c 2007-01-09 14:48:56.000000000 -0800 -@@ -21,12 +21,24 @@ - #include <sys/stat.h> - #include <fcntl.h> - #include <sys/time.h> -+#include <sys/socket.h> -+#include <sys/un.h> -+#include <errno.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 PVM_RX_FIFO_D "/var/vtpm/fifos/tpm_cmd_to_%d.fifo" -+ #define PVM_TX_FIFO "/var/vtpm/fifos/tpm_rsp_from_all.fifo" - -+ #define HVM_RX_FIFO_D "/var/vtpm/socks/%d.socket" -+#endif -+ -+ int dmi_id; -+ - #define BUFFER_SIZE 2048 - - static int devurandom=0; -@@ -38,7 +50,7 @@ void get_random_bytes(void *buf, int nby - } - - if (read(devurandom, buf, nbytes) != nbytes) { -- printf("Can't get random number.\n"); -+ error("Can't get random number.\n"); - exit(-1); - } - } -@@ -52,105 +64,182 @@ uint64_t tpm_get_ticks(void) - - int main(int argc, char **argv) - { -- uint8_t in[BUFFER_SIZE], *out; -+ uint8_t type, in[BUFFER_SIZE], *out, *addressed_out; -+ char *vtpm_rx_file=NULL; - uint32_t out_size; - int in_size, written; -- int i; -- struct stat file_info; -+ int i, guest_id=-1; - -- int tpm_tx_fh=-1, tpm_rx_fh=-1; -+#ifndef VTPM_MULTI_VM -+ int sockfd = -1; -+ struct sockaddr_un addr; -+ struct sockaddr_un client_addr; -+ unsigned int client_length; -+ -+#endif -+ -+ int vtpm_tx_fh=-1, vtpm_rx_fh=-1; -+#ifdef VTPM_MULTI_VM - if (argc < 2) { -- printf("Usage: tpmd clear|save|deactivated\n" ); -+ error("Usage: tpmd clear|save|deactivated\n" ); -+#else -+ if (argc < 4) { -+ error("Usage: tpmd clear|save|deactivated pvm|hvm vtpmid\n" ); -+#endif - return -1; - } - -+#ifndef VTPM_MULTI_VM -+ /* setup type of vm */ -+ if (!strcmp(argv[2], "pvm")) { -+ type = VTPM_TYPE_PVM; // Get commands from vTPM Manager through fifo -+ } else if (!strcmp(argv[2], "hvm")) { -+ type = VTPM_TYPE_HVM; // Get commands from qemu via socket -+ } else { -+ error("invalid vTPM type '%s'.\n", argv[2]); -+ } -+ -+ dmi_id = atoi(argv[3]); -+ -+ if (type == VTPM_TYPE_PVM) { -+ vtpm_rx_file = malloc(10 + strlen(PVM_RX_FIFO_D)); -+ sprintf(vtpm_rx_file, PVM_RX_FIFO_D, (uint32_t) dmi_id); -+ } else { -+ vtpm_rx_file = malloc(10 + strlen(HVM_RX_FIFO_D)); -+ sprintf(vtpm_rx_file, HVM_RX_FIFO_D, (uint32_t) dmi_id); -+ -+ if ( (sockfd = socket(PF_UNIX,SOCK_STREAM,0)) < 0) { -+ error("Unable to create socket. errno = %d\n", errno); -+ exit (-1); -+ } -+ -+ memset(&addr, 0, sizeof(addr)); -+ addr.sun_family = AF_UNIX; -+ strcpy(addr.sun_path,vtpm_rx_file ); -+ unlink(addr.sun_path); -+ } -+#endif -+ -+#ifdef VTPM_MULTI_VM -+ info("Initializing tpm state: %s\n", argv[1]); -+#else -+ info("Initializing tpm state: %s, type: %s, id: %d\n", argv[1], argv[2], dmi_id); -+#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]); -+ } else if (!strcmp(argv[1], "save")) { - 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', " -+ error("invalid startup mode '%s'; must be 'clear', " - "'save' (default) or 'deactivated", argv[1]); - 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) { -- 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 -+ if (type == VTPM_TYPE_PVM) { -+ vtpm_rx_fh = open(vtpm_rx_file, O_RDONLY); -+ } else { -+ if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { -+ error("Unable to bind(). errno = %d\n", errno); -+ exit (-1); -+ } -+ -+ if (listen(sockfd, 10) <0) { -+ error("Unable to listen(). errno = %d\n", errno); -+ exit (-1); -+ } -+ -+ memset(&client_addr, 0, sizeof(client_addr)); -+ client_length = sizeof(client_addr); -+ -+ vtpm_rx_fh = vtpm_tx_fh = accept(sockfd, (struct sockaddr *)&client_addr, &client_length); -+ } -+#endif - } - -- if (tpm_rx_fh < 0) { -- printf("ERROR: failed to open devices to listen to guest.\n"); -+ if (vtpm_rx_fh < 0) { -+ 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); -+ info("Recv incomplete command of %d bytes.", 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); -+ debug_nostop("Recv[%d]: 0x", in_size); - for (i=0; i< in_size; i++) -- printf("%x ", in[i]); -- printf("\n"); -+ debug_more("%x ", in[i]); -+ debug_more("\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); -+ } else { -+ if (guest_id != *((uint32_t *) in) ) { -+ error("WARNING: More than one guest attached\n"); -+ } -+ } -+ -+ if (vtpm_tx_fh < 0) { -+#ifdef VTPM_MUTLI_VM -+ vtpm_tx_fh = open(DEV_BE, O_RDWR); -+ vtpm_rx_fh = vtpm_tx_fh; -+#else -+ if (type == VTPM_TYPE_PVM) { -+ vtpm_tx_fh = open(PVM_TX_FIFO, O_WRONLY); -+ } // No need to open the other direction for HVM -+#endif -+ } -+ -+ if (vtpm_tx_fh < 0) { -+ error("Failed to open devices to respond to guest.\n"); -+ return -1; -+ } -+ -+ // Handle the command, but skip the domain id header -+ if (tpm_handle_command(in + sizeof(uint32_t), in_size - sizeof(uint32_t), &out, &out_size) != 0) { -+ error("Handler Failed.\n"); - } - -- written = write(tpm_tx_fh, out, out_size); -+ addressed_out = (uint8_t *) tpm_malloc(sizeof(uint32_t) + out_size); -+ *(uint32_t *) addressed_out = *(uint32_t *) in; -+ memcpy(addressed_out + sizeof(uint32_t), out, out_size); -+ -+ written = write(vtpm_tx_fh, addressed_out, out_size + sizeof(uint32_t)); - -- if (written != out_size ) { -- printf("ERROR: Part of response not written %d/%d.\nAttempt: ", written, out_size); -+ if (written != out_size + sizeof(uint32_t)) { -+ error("Part of response not written %d/%d.\n", written, out_size); - } else { -- printf("Sent[%Zu]: ", out_size); -+ debug_nostop("Sent[%Zu]: ", out_size + sizeof(uint32_t)); -+ for (i=0; i< out_size+ sizeof(uint32_t); i++) -+ debug_more("%x ", addressed_out[i]); -+ debug_more("\n"); - } -- for (i=0; i< out_size; i++) -- printf("%x ", out[i]); -- printf("\n"); - tpm_free(out); -+ tpm_free(addressed_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 (vtpm_rx_file); -+#endif - - } diff --git a/tools/vtpm_manager/COPYING b/tools/vtpm_manager/COPYING deleted file mode 100644 index c4b86b7..0000000 --- a/tools/vtpm_manager/COPYING +++ /dev/null @@ -1,32 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== diff --git a/tools/vtpm_manager/Makefile b/tools/vtpm_manager/Makefile deleted file mode 100644 index 632f41b..0000000 --- a/tools/vtpm_manager/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -XEN_ROOT = $(CURDIR)/../.. - -# Base definitions and rules -include $(XEN_ROOT)/tools/vtpm_manager/Rules.mk - -SUBDIRS = crypto tcs util manager migration -OPENSSL_HEADER = /usr/include/openssl/crypto.h - -.PHONY: all clean install -all clean install: %: subdirs-% - -.PHONY: mrproper -mrproper: - @set -e; for subdir in $(SUBDIRS); do \ - $(MAKE) -C $$subdir $@; \ - done - - diff --git a/tools/vtpm_manager/README b/tools/vtpm_manager/README deleted file mode 100644 index f0d1e98..0000000 --- a/tools/vtpm_manager/README +++ /dev/null @@ -1,94 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== - -Directory Structure -=================== -tools/vtpm_manager/crypto -> crypto files -tools/vtpm_manager/TCS -> TCS implementation -tools/vtpm_manager/util -> Utility Library. Include disk-io and buffers. -tools/vtpm_manager/manager -> VTPM Manager - -Compile Flags -=================== -LOGGING_MODULES -> How extensive logging happens - see util/log.h for more info - -VTPM_MULTI_VM -> Defined: VTPMs run in their own VMs - Not Defined (default): VTPMs are processes - -# Debugging flags that may disappear without notice in the future - -DUMMY_BACKEND -> vtpm_manager listens on /tmp/in.fifo and - /tmp/out.fifo rather than backend - -MANUAL_DM_LAUNCH -> Must manually launch & kill VTPMs - -WELL_KNOWN_OWNER_AUTH -> Rather than randomly generating the password for the owner, - use a well known value. This is useful for debugging and for - poor bios which do not support clearing TPM if OwnerAuth is - lost. However this has no protection from malicious app - issuing a TPM_OwnerClear to wipe the TPM - -Requirements -============ -- xen-unstable -- vtpm frontend/backend driver patch -- OpenSSL Library - -Single-VM Flow -============================ -- Launch the VTPM manager (vtpm_managerd) which which begins listening to the BE with one thread - and listens to a named fifo that is shared by the vtpms to commuincate with the manager. -- VTPM Manager listens to TPM BE. -- When xend launches a tpm frontend equipped VM it contacts the manager over the vtpm backend. -- When the manager receives the open message from the BE, it launches a vtpm -- Xend allows the VM to continue booting. -- When a TPM request is issued to the front end, the front end transmits the TPM request to the backend. -- The manager receives the TPM requests and uses a named fifo to forward the request to the vtpm. -- The fifo listener begins listening for the reply from vtpm for the request. -- Vtpm processes request and replies to manager over shared named fifo. -- If needed, the vtpm may send a request to the vtpm_manager at any time to save it's secrets to disk. -- Manager receives response from vtpm and passes it back to backend for forwarding to guest. - -NOTES: -* SaveService SHOULD seal it's table before saving it to disk. However, - the current Xen infrastructure does not provide a mechanism for this to be - unsealed later. Specifically, the auth and wrapped key must be available ONLY - to the service, or it's not even worth encrypting - - In the future the vtpm manager will be protected by an early boot mechanism - that will allow for better protection of it's data. - -TODO: -- Timeout on crashed vtpms -- create lock for shared fifo for talking to vtpms. diff --git a/tools/vtpm_manager/Rules.mk b/tools/vtpm_manager/Rules.mk deleted file mode 100644 index 651772b..0000000 --- a/tools/vtpm_manager/Rules.mk +++ /dev/null @@ -1,59 +0,0 @@ -# Base definitions and rules (XEN_ROOT must be defined in including Makefile) -include $(XEN_ROOT)/tools/Rules.mk - -# -# Tool definitions -# - -# General compiler flags -CFLAGS = -Werror -g3 - -# Generic project files -HDRS = $(wildcard *.h) -SRCS = $(wildcard *.c) -OBJS = $(patsubst %.c,%.o,$(SRCS)) - -# Generic (non-header) dependencies -$(SRCS): Makefile $(XEN_ROOT)/tools/Rules.mk $(XEN_ROOT)/tools/vtpm_manager/Rules.mk - -$(OBJS): $(SRCS) - --include $(FILES) - -# Make sure these are just rules -.PHONY : all build install clean - -# -# Project-specific definitions -# - -# Need UNIX98 spec for pthread rwlocks -CFLAGS += -D_GNU_SOURCE - -# Logging Level. See utils/tools.h for usage -CFLAGS += -DLOGGING_MODULES="(BITMASK(VTPM_LOG_TCS)|BITMASK(VTPM_LOG_VTSP)|BITMASK(VTPM_LOG_VTPM))" - -# Silent Mode -#CFLAGS += -DLOGGING_MODULES=0x0 -#CFLAGS += -DLOGGING_MODULES=0xff - -# Use frontend/backend pairs between manager & DMs? -#CFLAGS += -DVTPM_MULTI_VM - -# vtpm_manager listens on fifo's rather than backend -#CFLAGS += -DDUMMY_BACKEND - -# TCS talks to fifo's rather than /dev/tpm. TPM Emulator assumed on fifos -#CFLAGS += -DDUMMY_TPM - -# Do not have manager launch DMs. -#CFLAGS += -DMANUAL_DM_LAUNCH - -# Fixed OwnerAuth -#CFLAGS += -DWELL_KNOWN_OWNER_AUTH - -# Include -CFLAGS += -I$(XEN_ROOT)/tools/vtpm_manager/crypto -CFLAGS += -I$(XEN_ROOT)/tools/vtpm_manager/util -CFLAGS += -I$(XEN_ROOT)/tools/vtpm_manager/tcs -CFLAGS += -I$(XEN_ROOT)/tools/vtpm_manager/manager diff --git a/tools/vtpm_manager/crypto/Makefile b/tools/vtpm_manager/crypto/Makefile deleted file mode 100644 index 13b61c9..0000000 --- a/tools/vtpm_manager/crypto/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -XEN_ROOT = $(CURDIR)/../../.. -include $(XEN_ROOT)/tools/vtpm_manager/Rules.mk - -BIN = libtcpaCrypto.a - -.PHONY: all -all: build - -.PHONY: build -build: $(BIN) - -.PHONY: install -install: build - -.PHONY: clean -clean: - rm -f *.a *.so *.o *.rpm $(DEP_FILES) - -.PHONY: mrproper -mrproper: clean - rm -f *~ - -$(BIN): $(OBJS) - $(AR) rcs $(BIN) $(OBJS) diff --git a/tools/vtpm_manager/crypto/crypto.c b/tools/vtpm_manager/crypto/crypto.c deleted file mode 100644 index 7dae655..0000000 --- a/tools/vtpm_manager/crypto/crypto.c +++ /dev/null @@ -1,88 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// crypto.c -// -// This file will handle all the TPM Crypto functionality -// -// ================================================================== - -#include <string.h> -#include <openssl/crypto.h> -#include <openssl/err.h> -#include <openssl/evp.h> -#include <openssl/rand.h> -#include "crypto.h" -#include "log.h" - -/** - * Initialize cryptography library - * @rand: random seed - * @size: size of @rand - */ -void Crypto_Init(const BYTE* rand, int size) { - ERR_load_crypto_strings(); - CRYPTO_malloc_init(); - OpenSSL_add_all_algorithms(); - SYM_CIPHER = EVP_aes_128_cbc(); - RAND_poll(); - if (rand == NULL) - return; - - RAND_add(rand, size, size); -} - -/** - * Shutdown cryptography library - */ -void Crypto_Exit() { - ERR_free_strings(); - ERR_remove_state(0); - EVP_cleanup(); -} - - -/** - * Get random data - * @data: (OUT) Random data - * @size: Size of @data - */ -void Crypto_GetRandom(void* data, int size) { - int result; - - result = RAND_pseudo_bytes((BYTE*) data, size); - - if (result <= 0) - vtpmlogerror (VTPM_LOG_CRYPTO, "RAND_pseudo_bytes failed: %s\n", - ERR_error_string (ERR_get_error(), NULL)); -} diff --git a/tools/vtpm_manager/crypto/crypto.h b/tools/vtpm_manager/crypto/crypto.h deleted file mode 100644 index 488d4d6..0000000 --- a/tools/vtpm_manager/crypto/crypto.h +++ /dev/null @@ -1,175 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// crypto.h -// -// This file defines the TPM Crypto API -// -// ================================================================== - -#ifndef __CRYPTO_H__ -#define __CRYPTO_H__ - -#include <stddef.h> -#include <stdint.h> -#include <stdbool.h> - -#include "tcg.h" -#include "sym_crypto.h" - -#define CRYPTO_MAX_SIG_SIZE (2048 / 8) -#define CRYPTO_MAX_RSA_KEY_SIZE (4096 / 8) //in bytes - -#define OAEP_P "TCPA" -#define OAEP_P_SIZE 4 - -// Algorithms supported by crypto. Stored in CRYPTO_INFO.algorithmID -#define CRYPTO_ALGORITH_RSA 0x01 - -// Supported Encryption Schemes CRYPTO_INFO.encScheme -#define CRYPTO_ES_NONE 0x0001 -#define CRYPTO_ES_RSAESPKCSv15 0x0002 -#define CRYPTO_ES_RSAESOAEP_SHA1_MGF1 0x0003 - -// Supported Signature schemes CRYPTO_INFO.sigScheme -#define CRYPTO_SS_NONE 0x0001 -#define CRYPTO_SS_RSASSAPKCS1v15_SHA1 0x0002 -#define CRYPTO_SS_RSASSAPKCS1v15_DER 0x0003 - -typedef struct CRYPTO_INFO { - void *keyInfo; - UINT32 algorithmID; - UINT32 encScheme; - UINT32 sigScheme; -} CRYPTO_INFO; - - -void Crypto_Init(const BYTE* rand, int size); - -void Crypto_Exit(); - -void Crypto_GetRandom(void* data, int size); - -void Crypto_HMAC( const BYTE* text, - int text_len, - const BYTE* key, - int key_len, - BYTE* digest); - -TPM_RESULT Crypto_HMAC_buf (const buffer_t * text, - const buffer_t * key, - BYTE * o_digest); /* presumably of 20 bytes */ - -void Crypto_SHA1Full( const BYTE* text, - UINT32 size, - BYTE* hash); //Complete 3part SHA1 - -// o_hash needs to be large enough to hold the digest, ie 20 bytes -TPM_RESULT Crypto_SHA1Full_buf (const buffer_t * buf, - BYTE * o_hash); - -void Crypto_SHA1Start(UINT32* maxNumBytes); -void Crypto_SHA1Update(int numBytes, const BYTE* hashData); -void Crypto_SHA1Complete( int hashDataSize, - const BYTE* hashData, - BYTE* hashValue); - -void Crypto_RSACreateKey( /*in*/ UINT32 keySize, - /*in*/ UINT32 pubExpSize, - /*in*/ BYTE *pubExp, - /*out*/ UINT32 *privExpSize, - /*out*/ BYTE *privExp, - /*out*/ UINT32 *modulusSize, - /*out*/ BYTE *modulus, - /*out*/ CRYPTO_INFO *keys); - -void Crypto_RSABuildCryptoInfo( /*[IN]*/ UINT32 pubExpSize, - /*[IN]*/ BYTE *pubExp, - /*[IN]*/ UINT32 privExpSize, - /*[IN]*/ BYTE *privExp, - /*[IN]*/ UINT32 modulusSize, - /*[IN]*/ BYTE *modulus, - /*[OUT]*/ CRYPTO_INFO* cryptoInfo); - -void Crypto_RSABuildCryptoInfoPublic( /*[IN]*/ UINT32 pubExpSize, - /*[IN]*/ BYTE *pubExp, - /*[IN]*/ UINT32 modulusSize, - /*[IN]*/ BYTE *modulus, - CRYPTO_INFO* cryptoInfo); - -// -// symmetric pack and unpack operations -// -TPM_RESULT Crypto_RSAPackCryptoInfo (const CRYPTO_INFO* cryptoInfo, - BYTE ** io_buf, UINT32 * io_buflen); - -TPM_RESULT Crypto_RSAUnpackCryptoInfo (CRYPTO_INFO * ci, - BYTE * in, UINT32 len, - UINT32 * o_lenread); - - -// return 0 on success, -1 on error -int Crypto_RSAEnc( CRYPTO_INFO *keys, - UINT32 inDataSize, - BYTE *inData, - /*out*/ UINT32 *outDataSize, - /*out*/ BYTE *outData); - -// return 0 on success, -1 on error -int Crypto_RSADec( CRYPTO_INFO *keys, - UINT32 inDataSize, - BYTE *inData, - /*out*/ UINT32 *outDataSize, - /*out*/ BYTE *outData); - -// return 0 on success, -1 on error -int Crypto_RSASign( CRYPTO_INFO *keys, - UINT32 inDataSize, - BYTE *inData, - /*out*/ UINT32 *sigSize, - /*out*/ BYTE *sig); - -bool Crypto_RSAVerify( CRYPTO_INFO *keys, - UINT32 inDataSize, - BYTE *inData, - UINT32 sigSize, - BYTE *sig); - -//private: -int RSA_verify_DER(int dtype, unsigned char *m, unsigned int m_len, - unsigned char *sigbuf, unsigned int siglen, CRYPTO_INFO *key); - -int RSA_sign_DER(int type, unsigned char *m, unsigned int m_len, - unsigned char *sigret, unsigned int *siglen, CRYPTO_INFO *key); - -#endif // __CRYPTO_H__ diff --git a/tools/vtpm_manager/crypto/hash.c b/tools/vtpm_manager/crypto/hash.c deleted file mode 100644 index c73114a..0000000 --- a/tools/vtpm_manager/crypto/hash.c +++ /dev/null @@ -1,153 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// hash.c -// -// This file will handle all the TPM Hash functionality -// -// ================================================================== - -#include <string.h> -#include <openssl/crypto.h> -#include <openssl/err.h> -#include <openssl/evp.h> -#include <openssl/rand.h> -#include <openssl/hmac.h> -#include <openssl/sha.h> -#include <openssl/bn.h> -#include <openssl/rsa.h> - -#include "tcg.h" // for TPM_SUCCESS -#include "crypto.h" - -static SHA_CTX g_shaContext; - -void Crypto_HMAC( const BYTE* text, - int text_len, - const BYTE* key, - int key_len, - BYTE* digest) { - if (text == NULL || key == NULL || text_len == 0 || key_len == 0) - return; - - HMAC(EVP_sha1(), key, key_len, text, text_len, digest, NULL); -} - -TPM_RESULT Crypto_HMAC_buf (const buffer_t * text, - const buffer_t * key, - BYTE * o_digest) { /* presumably of 20 bytes */ - - Crypto_HMAC (text->bytes, text->size, - key->bytes, key->size, - o_digest); - - return TPM_SUCCESS; -} - - -/* - * SHA1 - * (OUT) Create a SHA1 hash of text. Calls all three SHA1 steps internally - */ -void Crypto_SHA1Full( const BYTE* text, - uint32_t size, - BYTE* hash) { - - if (text == NULL || size == 0) - return; - - // Run SHA1Start + SHAUpdate (if necessary) + SHAComplete - uint32_t maxBytes; // Not used for anything - Crypto_SHA1Start(&maxBytes); - - while (size > 64){ - Crypto_SHA1Update(64, text); - size -= 64; - text += 64; - } - - Crypto_SHA1Complete(size, text, hash); -} - -// same thing using buffer_t -TPM_RESULT Crypto_SHA1Full_buf (const buffer_t * buf, - BYTE * o_digest) { - - if (buf->bytes == NULL || buf->size == 0) - return TPM_BAD_PARAMETER; - - Crypto_SHA1Full (buf->bytes, buf->size, o_digest); - - return TPM_SUCCESS; -} - - -/* - * Initialize SHA1 - * (OUT) Maximum number of bytes that can be sent to SHA1Update. - * Must be a multiple of 64 bytes. - */ -void Crypto_SHA1Start(uint32_t* maxNumBytes) { - int max = SHA_CBLOCK; - // Initialize the crypto library - SHA1_Init(&g_shaContext); - *maxNumBytes = max; -} - -/* - * Process SHA1 - * @numBytes: (IN) The number of bytes in hashData. - * Must be a multiple of 64 bytes. - * @hashData: (IN) Bytes to be hashed. - */ -void Crypto_SHA1Update(int numBytes, const BYTE* hashData) { - - if (hashData == NULL || numBytes == 0 || numBytes%64 != 0) - return; - - SHA1_Update(&g_shaContext, hashData, numBytes); -} - -/* - * Complete the SHA1 process - * @hashDataSize: (IN) Number of bytes in hashData. - * Must be a multiple of 64 bytes. - * @hashData: (IN) Final bytes to be hashed. - * @hashValue: (OUT) The output of the SHA-1 hash. - */ -void Crypto_SHA1Complete(int hashDataSize, - const BYTE* hashData, - BYTE* hashValue) { - SHA1_Update(&g_shaContext, hashData, hashDataSize); - SHA1_Final(hashValue, &g_shaContext); -} diff --git a/tools/vtpm_manager/crypto/rsa.c b/tools/vtpm_manager/crypto/rsa.c deleted file mode 100644 index 7737dc6..0000000 --- a/tools/vtpm_manager/crypto/rsa.c +++ /dev/null @@ -1,434 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// rsa.c -// -// This file will handle all the TPM RSA crypto functionality -// -// ================================================================== - -#include <string.h> -#include <openssl/crypto.h> -#include <openssl/evp.h> -#include <openssl/bn.h> -#include <openssl/rsa.h> -#include <openssl/rand.h> -#include <openssl/x509.h> - -#include <openssl/err.h> -#include <stdio.h> - -#include "tcg.h" -#include "buffer.h" -#include "crypto.h" -#include "log.h" - -void Crypto_RSACreateKey( /*in*/ UINT32 keySize, - /*in*/ UINT32 pubExpSize, - /*in*/ BYTE *pubExp, - /*out*/ UINT32 *privExpSize, - /*out*/ BYTE *privExp, - /*out*/ UINT32 *modulusSize, - /*out*/ BYTE *modulus, - /*out*/ CRYPTO_INFO *keys) { - unsigned long e_value; - - if (pubExpSize == 0) // Default e = 2^16+1 - e_value = (0x01 << 16) + 1; - else { - // This is not supported, but the following line MIGHT work - // under then assumption that the format is BigNum compatable - // Though it's not in the spec, so who knows what it is. - // Forcing the default. - //BN_bin2bn(pubExp, pubExpSize, NULL); - e_value = (0x01 << 16) + 1; - } - - RSA *rsa = RSA_generate_key(keySize, e_value, NULL, NULL); - - if (keys) { - keys->keyInfo = rsa; - keys->algorithmID = CRYPTO_ALGORITH_RSA; - } - - if (modulus) *modulusSize = BN_bn2bin(rsa->n, modulus); - if (privExp) *privExpSize = BN_bn2bin(rsa->d, privExp); -} - -// Create a CRYPTO_INFO struct from the BYTE * key parts. -// If pubExp info is NULL, use TCG default. -// If there is a remainder while calculating the privExp, return FALSE. - -void Crypto_RSABuildCryptoInfo( /*[IN]*/ UINT32 pubExpSize, - /*[IN]*/ BYTE *pubExp, - /*[IN]*/ UINT32 privExpSize, - /*[IN]*/ BYTE *privExp, - /*[IN]*/ UINT32 modulusSize, - /*[IN]*/ BYTE *modulus, - CRYPTO_INFO* cryptoInfo) { - cryptoInfo->keyInfo = RSA_new(); - RSA *rsa = (RSA *) cryptoInfo->keyInfo; - - rsa->e = BN_new(); - - if (pubExpSize == 0) { // Default e = 2^16+1 - BN_set_bit(rsa->e, 16); - BN_set_bit(rsa->e, 0); - } else { - // This is not supported, but the following line MIGHT work - // under then assumption that the format is BigNum compatable - // Though it's not in the spec, so who knows what it is. - // Forcing the default. - //BN_bin2bn(pubExp, pubExpSize, NULL); - BN_set_bit(rsa->e, 16); - BN_set_bit(rsa->e, 0); - } - - rsa->n = BN_bin2bn(modulus, modulusSize, NULL); - rsa->d = BN_bin2bn(privExp, privExpSize, NULL); -} - -// Create a CRYPTO_INFO struct from the BYTE * key parts. -// If pubExp info is NULL, use TCG default. -// If there is a remainder while calculating the privExp, return FALSE. - -void Crypto_RSABuildCryptoInfoPublic( /*[IN]*/ UINT32 pubExpSize, - /*[IN]*/ BYTE *pubExp, - /*[IN]*/ UINT32 modulusSize, - /*[IN]*/ BYTE *modulus, - CRYPTO_INFO* cryptoInfo) { - cryptoInfo->keyInfo = RSA_new(); - RSA *rsa = (RSA *) cryptoInfo->keyInfo; - - rsa->e = BN_new(); - - if (pubExpSize == 0) { // Default e = 2^16+1 - BN_set_bit(rsa->e, 16); - BN_set_bit(rsa->e, 0); - } else { - // This is not supported, but the following line MIGHT work - // under then assumption that the format is BigNum compatable - // Though it's not in the spec, so who knows what it is. - // Forcing the default. - //BN_bin2bn(pubExp, pubExpSize, NULL); - BN_set_bit(rsa->e, 16); - BN_set_bit(rsa->e, 0); - } - - rsa->n = BN_bin2bn(modulus, modulusSize, NULL); - -} - -int Crypto_RSAEnc( CRYPTO_INFO *key, - UINT32 inDataSize, - BYTE *inData, - /*out*/ UINT32 *outDataSize, - /*out*/ BYTE *outData) { - RSA *rsa = (RSA *) key->keyInfo; - UINT32 paddedDataSize = RSA_size (rsa); - BYTE *paddedData = (BYTE *)malloc(sizeof(BYTE) * paddedDataSize); - int rc; - - if (paddedData == NULL) - return -1; - - *outDataSize = 0; - - switch (key->encScheme) { - case CRYPTO_ES_RSAESPKCSv15: - if (RSA_padding_add_PKCS1_type_2(paddedData, paddedDataSize, inData, inDataSize) <= 0) { - rc = -1; - goto abort_egress; - } - break; - case CRYPTO_ES_RSAESOAEP_SHA1_MGF1: - if (RSA_padding_add_PKCS1_OAEP(paddedData,paddedDataSize,inData,inDataSize, (BYTE *) OAEP_P,OAEP_P_SIZE) <= 0 ) { - rc = -1; - goto abort_egress; - } - break; - default: - rc = -1; - goto abort_egress; - } - - rc = RSA_public_encrypt(paddedDataSize, paddedData, outData, rsa, RSA_NO_PADDING); - if (rc == -1) - goto abort_egress; - - *outDataSize = rc; - - if (rc > 0) rc = 0; - - goto egress; - - abort_egress: - egress: - - if (paddedData) - free (paddedData); - return rc; - -} - -int Crypto_RSADec( CRYPTO_INFO *key, - UINT32 inDataSize, - BYTE *inData, - /*out*/ UINT32 *outDataSize, - /*out*/ BYTE *outData) { - - RSA *rsa = (RSA *) key->keyInfo; - UINT32 paddedDataSize = RSA_size (rsa); - BYTE *paddedData = (BYTE *)malloc(sizeof(BYTE) * paddedDataSize); - int rc; - - if (paddedData == NULL) - goto abort_egress; - - rc = RSA_private_decrypt(inDataSize, inData, paddedData, rsa, RSA_NO_PADDING); - if (rc == -1) { - vtpmlogerror(VTPM_LOG_CRYPTO, "RSA_private_decrypt: %s\n", ERR_error_string(ERR_get_error(), NULL)); - goto abort_egress; - } - - paddedDataSize = rc; - - switch (key->encScheme) { - case CRYPTO_ES_RSAESPKCSv15: - rc = RSA_padding_check_PKCS1_type_2 (outData, paddedDataSize, - paddedData + 1, paddedDataSize - 1, - RSA_size(rsa)); - if (rc == -1) { - vtpmlogerror(VTPM_LOG_CRYPTO, "RSA_padding_check_PKCS1_type_2: %s\n", - ERR_error_string(ERR_get_error(), NULL)); - goto abort_egress; - } - *outDataSize = rc; - break; - case CRYPTO_ES_RSAESOAEP_SHA1_MGF1: - rc = RSA_padding_check_PKCS1_OAEP(outData, paddedDataSize, - paddedData + 1, paddedDataSize - 1, - RSA_size(rsa), - (BYTE *) OAEP_P, OAEP_P_SIZE); - if (rc == -1) { - vtpmlogerror(VTPM_LOG_CRYPTO, "RSA_padding_check_PKCS1_OAEP: %s\n", - ERR_error_string(ERR_get_error(), NULL)); - goto abort_egress; - } - *outDataSize = rc; - break; - default: - *outDataSize = 0; - } - - free(paddedData); paddedData = NULL; - goto egress; - - abort_egress: - - if (paddedData) - free (paddedData); - return -1; - - egress: - return 0; -} - -// Signs either a SHA1 digest of a message or a DER encoding of a message -// Textual messages MUST be encoded or Hashed before sending into this function -// It will NOT SHA the message. -int Crypto_RSASign( CRYPTO_INFO *key, - UINT32 inDataSize, - BYTE *inData, - /*out*/ UINT32 *sigSize, - /*out*/ BYTE *sig) { - int status; - unsigned int intSigSize; - - switch(key->sigScheme) { - case CRYPTO_SS_RSASSAPKCS1v15_SHA1: - status = RSA_sign(NID_sha1, inData, inDataSize, sig, &intSigSize, (RSA *) key->keyInfo); - break; - case CRYPTO_SS_RSASSAPKCS1v15_DER: - // status = Crypto_RSA_sign_DER(NID_md5_sha1, inData, inDataSize, sig, &intSigSize, key); - vtpmlogerror(VTPM_LOG_CRYPTO, "Crypto: Unimplemented sign type (%d)\n", key->sigScheme); - status = 0; - break; - default: - status = 0; - } - - if (status == 0) { - *sigSize = 0; - vtpmlogerror(VTPM_LOG_CRYPTO, "%s\n", ERR_error_string(ERR_get_error(), NULL)); - return -1; - } - - *sigSize = (UINT32) intSigSize; - return 0; -} - -bool Crypto_RSAVerify( CRYPTO_INFO *key, - UINT32 inDataSize, - BYTE *inData, - UINT32 sigSize, - BYTE *sig) { - int status; - - switch(key->sigScheme){ - case CRYPTO_SS_RSASSAPKCS1v15_SHA1: - status = RSA_verify(NID_sha1, inData, inDataSize, sig, sigSize, (RSA *) key->keyInfo); - break; - case CRYPTO_SS_RSASSAPKCS1v15_DER: - //status = Crypto_RSA_verify_DER(NID_md5_sha1, inData, inDataSize, sig, sigSize, key); - vtpmlogerror(VTPM_LOG_CRYPTO, "Crypto: Unimplemented sign type (%d)\n", key->sigScheme); - status = 0; - break; - default: - status = 0; - } - - if (status) - return(1); - else { - vtpmlogerror(VTPM_LOG_CRYPTO, "RSA verify: %s\n", ERR_error_string(ERR_get_error(), NULL)); - return(0); - } - -} - -// helper which packs everything into a BIO! - -// packs the parameters first, then the private key, then the public key -// if *io_buf is NULL, allocate it here as needed. otherwise its size is in -// *io_buflen -TPM_RESULT Crypto_RSAPackCryptoInfo (const CRYPTO_INFO* cryptoInfo, - BYTE ** io_buf, UINT32 * io_buflen) { - TPM_RESULT status = TPM_SUCCESS; - BYTE * buf; - long len, outlen = *io_buflen; - - const long PARAMSLEN = 3*sizeof(UINT32); - - RSA *rsa = (RSA *) cryptoInfo->keyInfo; - - BIO *mem = BIO_new(BIO_s_mem()); - - - // write the openssl keys to the BIO - if ( i2d_RSAPrivateKey_bio (mem, rsa) == 0 ) { - ERR_print_errors_fp (stderr); - ERRORDIE (TPM_SIZE); - } - if ( i2d_RSAPublicKey_bio (mem, rsa) == 0 ) { - ERR_print_errors_fp (stderr); - ERRORDIE (TPM_SIZE); - } - - // get the buffer out - len = BIO_get_mem_data (mem, &buf); - - // see if we need to allocate a return buffer - if (*io_buf == NULL) { - *io_buf = (BYTE*) malloc (PARAMSLEN + len); - if (*io_buf == NULL) - ERRORDIE (TPM_SIZE); - } else { // *io_buf is already allocated - if (outlen < len + PARAMSLEN) - ERRORDIE (TPM_SIZE); // but not large enough! - } - - // copy over the parameters (three UINT32's starting at algorithmID) - memcpy (*io_buf, &cryptoInfo->algorithmID, PARAMSLEN); - - // copy over the DER keys - memcpy (*io_buf + PARAMSLEN, buf, len); - - *io_buflen = len + PARAMSLEN; - - goto egress; - - - abort_egress: - egress: - - BIO_free (mem); - - return status; -} - - - -// sets up ci, and returns the number of bytes read in o_lenread -TPM_RESULT Crypto_RSAUnpackCryptoInfo (CRYPTO_INFO * ci, - BYTE * in, UINT32 len, - UINT32 * o_lenread) { - - TPM_RESULT status = TPM_SUCCESS; - long l; - BIO *mem; - RSA *rsa; - - // first load up the params - l = 3 * sizeof(UINT32); - memcpy (&ci->algorithmID, in, l); - len -= l; - in += l; - - // and now the openssl keys, private first - mem = BIO_new_mem_buf (in, len); - - if ( (rsa = d2i_RSAPrivateKey_bio (mem, NULL)) == NULL ) { - ERR_print_errors_fp (stderr); - ERRORDIE (TPM_BAD_PARAMETER); - } - // now use the same RSA object and fill in the private key - if ( d2i_RSAPublicKey_bio (mem, &rsa) == NULL ) { - ERR_print_errors_fp (stderr); - ERRORDIE (TPM_BAD_PARAMETER); - } - - ci->keyInfo = rsa; // needs to be freed somehow later - - // FIXME: havent figured out yet how to tell how many bytes were read in the - // above oprations! so o_lenread is not set - - goto egress; - - abort_egress: - egress: - - BIO_free (mem); - - return status; -} diff --git a/tools/vtpm_manager/crypto/sym_crypto.c b/tools/vtpm_manager/crypto/sym_crypto.c deleted file mode 100644 index 3d86e19..0000000 --- a/tools/vtpm_manager/crypto/sym_crypto.c +++ /dev/null @@ -1,237 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// sym_crypto.c -// -// Symmetric crypto portion of crypto -// -// ================================================================== - -#include <openssl/evp.h> -#include <openssl/rand.h> - -#include "tcg.h" -#include "sym_crypto.h" - -typedef enum crypt_op_type_t { - CRYPT_ENCRYPT, - CRYPT_DECRYPT -} crypt_op_type_t; - -TPM_RESULT ossl_symcrypto_op (symkey_t* key, - const buffer_t* in, - const buffer_t* iv, - buffer_t * out, - crypt_op_type_t optype); - - -// this is initialized in Crypto_Init() -const EVP_CIPHER * SYM_CIPHER = NULL; - -const BYTE ZERO_IV[EVP_MAX_IV_LENGTH] = {0}; - - -TPM_RESULT Crypto_symcrypto_initkey (symkey_t * key, const buffer_t* keybits) { - TPM_RESULT status = TPM_SUCCESS; - - EVP_CIPHER_CTX_init (&key->context); - - key->cipher = SYM_CIPHER; - - TPMTRYRETURN( buffer_init_copy (&key->key, keybits)); - - goto egress; - - abort_egress: - EVP_CIPHER_CTX_cleanup (&key->context); - - egress: - - return status; -} - - - -TPM_RESULT Crypto_symcrypto_genkey (symkey_t * key) { - int res; - TPM_RESULT status = TPM_SUCCESS; - - // hmm, EVP_CIPHER_CTX_init does not return a value - EVP_CIPHER_CTX_init (&key->context); - - key->cipher = SYM_CIPHER; - - TPMTRYRETURN( buffer_init (&key->key, EVP_CIPHER_key_length(key->cipher), NULL)) ; - - // and generate the key material - res = RAND_pseudo_bytes (key->key.bytes, key->key.size); - if (res < 0) - ERRORDIE (TPM_SHORTRANDOM); - - - goto egress; - - abort_egress: - EVP_CIPHER_CTX_cleanup (&key->context); - buffer_free (&key->key); - - egress: - return status; -} - - -TPM_RESULT Crypto_symcrypto_encrypt (symkey_t* key, - const buffer_t* clear, - buffer_t* o_cipher) { - TPM_RESULT status = TPM_SUCCESS; - - buffer_t iv, cipher_alias; - - buffer_init_const (&iv, EVP_MAX_IV_LENGTH, ZERO_IV); - - buffer_init (o_cipher, - clear->size + - EVP_CIPHER_iv_length(key->cipher) + - EVP_CIPHER_block_size (key->cipher), - 0); - - // copy the IV into the front - buffer_copy (o_cipher, &iv); - - // make an alias into which we'll put the ciphertext - buffer_init_alias (&cipher_alias, o_cipher, EVP_CIPHER_iv_length(key->cipher), 0); - - TPMTRYRETURN( ossl_symcrypto_op (key, clear, &iv, &cipher_alias, CRYPT_ENCRYPT) ); - - // set the output size correctly - o_cipher->size += cipher_alias.size; - - goto egress; - - abort_egress: - - egress: - - return status; - -} - - - -TPM_RESULT Crypto_symcrypto_decrypt (symkey_t* key, - const buffer_t* cipher, - buffer_t* o_clear) { - TPM_RESULT status = TPM_SUCCESS; - - buffer_t iv, cipher_alias; - - // alias for the IV - buffer_init_alias (&iv, cipher, 0, EVP_CIPHER_iv_length(key->cipher)); - - // make an alias to where the ciphertext is, after the IV - buffer_init_alias (&cipher_alias, cipher, EVP_CIPHER_iv_length(key->cipher), 0); - - // prepare the output buffer - TPMTRYRETURN( buffer_init (o_clear, - cipher->size - - EVP_CIPHER_iv_length(key->cipher) - + EVP_CIPHER_block_size(key->cipher), - 0) ); - - // and decrypt - TPMTRYRETURN ( ossl_symcrypto_op (key, &cipher_alias, &iv, o_clear, CRYPT_DECRYPT) ); - - goto egress; - - abort_egress: - buffer_free (o_clear); - - egress: - - return status; -} - - - -TPM_RESULT Crypto_symcrypto_freekey (symkey_t * key) { - buffer_memset (&key->key, 0); - buffer_free (&key->key); - - EVP_CIPHER_CTX_cleanup (&key->context); - - return TPM_SUCCESS; -} - - -TPM_RESULT ossl_symcrypto_op (symkey_t* key, - const buffer_t* in, - const buffer_t* iv, - buffer_t * out, - crypt_op_type_t optype) { - TPM_RESULT status = TPM_SUCCESS; - - int inlen, outlen; - tpm_size_t running; - - if ( ! EVP_CipherInit_ex (&key->context, - key->cipher, NULL, key->key.bytes, iv->bytes, - optype == CRYPT_ENCRYPT ? 1 : 0) ) - ERRORDIE (TPM_FAIL); - - - - inlen = in->size; - - outlen = 0; - running = 0; - - - if ( ! EVP_CipherUpdate (&key->context, out->bytes, &outlen, in->bytes, inlen) ) - ERRORDIE (TPM_FAIL); - - running += outlen; - - if ( ! EVP_CipherFinal_ex (&key->context, out->bytes + running, &outlen) ) - ERRORDIE (TPM_FAIL); - - running += outlen; - - out->size = running; - - goto egress; - - abort_egress: - egress: - - return status; -} diff --git a/tools/vtpm_manager/crypto/sym_crypto.h b/tools/vtpm_manager/crypto/sym_crypto.h deleted file mode 100644 index 7fb59a8..0000000 --- a/tools/vtpm_manager/crypto/sym_crypto.h +++ /dev/null @@ -1,72 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// sym_crypto.h -// -// Symmetric Crypto -// -// ================================================================== - -#ifndef _SYM_CRYPTO_H -#define _SYM_CRYPTO_H - -#include <openssl/evp.h> -#include "buffer.h" - -typedef struct symkey_t { - buffer_t key; - - EVP_CIPHER_CTX context; - const EVP_CIPHER * cipher; -} symkey_t; - -extern const EVP_CIPHER * SYM_CIPHER; - -TPM_RESULT Crypto_symcrypto_genkey (symkey_t * key); - -TPM_RESULT Crypto_symcrypto_initkey (symkey_t * key, const buffer_t* keybits); - - -// these functions will allocate their output buffers -TPM_RESULT Crypto_symcrypto_encrypt (symkey_t* key, - const buffer_t* clear, - buffer_t* o_cipher); - -TPM_RESULT Crypto_symcrypto_decrypt (symkey_t* key, - const buffer_t* cipher, - buffer_t* o_clear); - -// only free the internal parts, not the 'key' ptr -TPM_RESULT Crypto_symcrypto_freekey (symkey_t * key); - -#endif /* _SYM_CRYPTO_H */ diff --git a/tools/vtpm_manager/manager/Makefile b/tools/vtpm_manager/manager/Makefile deleted file mode 100644 index a33c18a..0000000 --- a/tools/vtpm_manager/manager/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -XEN_ROOT = $(CURDIR)/../../.. -include $(XEN_ROOT)/tools/vtpm_manager/Rules.mk - -BIN = vtpm_managerd - -.PHONY: all -all: build - -.PHONY: build -build: $(BIN) - -.PHONY: install -install: build - if [ ! -d "$(DESTDIR)/var/vtpm/fifos" ]; \ - then mkdir -p $(DESTDIR)/var/vtpm/fifos; \ - fi - if [ ! -d "$(DESTDIR)/var/vtpm/socks" ]; \ - then mkdir -p $(DESTDIR)/var/vtpm/socks; \ - fi - $(INSTALL_PROG) $(BIN) $(DESTDIR)$(BINDIR) - -.PHONY: clean -clean: - rm -f $(BIN) - rm -f *.a *.so *.o *.rpm $(DEP_FILES) - -.PHONY: mrproper -mrproper: clean - rm -f *~ - -$(BIN): $(OBJS) - $(CC) $(LDFLAGS) $^ $(LIBS) -o $@ - -# libraries -LIBS += ../tcs/libTCS.a ../util/libTCGUtils.a ../crypto/libtcpaCrypto.a -LIBS += -lcrypto $(PTHREAD_LIBS) -lm -CFLAGS += $(PTHREAD_CFLAGS) -LDFLAGS += $(PTHREAD_LDFLAGS) diff --git a/tools/vtpm_manager/manager/dmictl.c b/tools/vtpm_manager/manager/dmictl.c deleted file mode 100644 index 5c3cf7e..0000000 --- a/tools/vtpm_manager/manager/dmictl.c +++ /dev/null @@ -1,266 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// dmictl.c -// -// Functions for creating and destroying DMIs -// -// ================================================================== - -#include <stdio.h> -#include <unistd.h> -#include <string.h> - -#include "vtpmpriv.h" -#include "bsg.h" -#include "buffer.h" -#include "log.h" -#include "hashtable.h" -#include "hashtable_itr.h" -#include "vtpm_ipc.h" - -#define TPM_EMULATOR_PATH "/usr/bin/vtpmd" - -// if dmi_res is non-null, then return a pointer to new object. -// Also, this does not fill in the measurements. They should be filled by -// design dependent code or saveNVM -TPM_RESULT init_dmi(UINT32 dmi_id, BYTE dmi_type, VTPM_DMI_RESOURCE **dmi_res) { - - TPM_RESULT status=TPM_SUCCESS; - VTPM_DMI_RESOURCE *new_dmi=NULL; - UINT32 *dmi_id_key=NULL; - - if ((new_dmi = (VTPM_DMI_RESOURCE *) malloc (sizeof(VTPM_DMI_RESOURCE))) == NULL) { - status = TPM_RESOURCES; - goto abort_egress; - } - memset(new_dmi, 0, sizeof(VTPM_DMI_RESOURCE)); - new_dmi->dmi_id = dmi_id; - new_dmi->dmi_type = dmi_type; - new_dmi->connected = FALSE; - new_dmi->TCSContext = 0; - - new_dmi->NVMLocation = (char *) malloc(11 + strlen(DMI_NVM_FILE)); - sprintf(new_dmi->NVMLocation, DMI_NVM_FILE, (uint32_t) new_dmi->dmi_id); - - if ((dmi_id_key = (UINT32 *) malloc (sizeof(UINT32))) == NULL) { - status = TPM_RESOURCES; - goto abort_egress; - } - *dmi_id_key = new_dmi->dmi_id; - - // install into map - if (!hashtable_insert(vtpm_globals->dmi_map, dmi_id_key, new_dmi)){ - vtpmlogerror(VTPM_LOG_VTPM, "Failed to insert instance into table. Aborting.\n", dmi_id); - status = TPM_FAIL; - goto abort_egress; - } - - if (dmi_res) - *dmi_res = new_dmi; - - goto egress; - - abort_egress: - if (new_dmi) { - free(new_dmi->NVMLocation); - free(new_dmi); - } - free(dmi_id_key); - - egress: - return status; -} - -TPM_RESULT close_dmi(VTPM_DMI_RESOURCE *dmi_res) { - 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; - - vtpm_globals->connected_dmis--; - - return (VTPM_Close_DMI_Extra(dmi_res) ); -} - -TPM_RESULT VTPM_Handle_New_DMI(const buffer_t *param_buf) { - - VTPM_DMI_RESOURCE *new_dmi=NULL; - TPM_RESULT status=TPM_FAIL; - BYTE dmi_type, vm_type, startup_mode; - UINT32 dmi_id; - - if (param_buf == NULL) { // Assume creation of Dom 0 control - dmi_type = VTPM_TYPE_NON_MIGRATABLE; - dmi_id = VTPM_CTL_DM; - } else if (buffer_len(param_buf) != sizeof(BYTE) * 3 + sizeof(UINT32)) { - vtpmloginfo(VTPM_LOG_VTPM, "New DMI command wrong length: %d.\n", buffer_len(param_buf)); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } else { - vtpm_globals->connected_dmis++; // Put this here so we don't count Dom0 - BSG_UnpackList( param_buf->bytes, 4, - BSG_TYPE_BYTE, &dmi_type, - BSG_TYPE_BYTE, &startup_mode, - BSG_TYPE_BYTE, &vm_type, - BSG_TYPE_UINT32, &dmi_id); - } - - if ((dmi_type != VTPM_TYPE_NON_MIGRATABLE) && (dmi_type != VTPM_TYPE_MIGRATABLE)) { - vtpmlogerror(VTPM_LOG_VTPM, "Creation of VTPM with illegal type.\n"); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - new_dmi = (VTPM_DMI_RESOURCE *) hashtable_search(vtpm_globals->dmi_map, &dmi_id); - if (new_dmi == NULL) { - vtpmloginfo(VTPM_LOG_VTPM, "Creating new DMI instance %d attached.\n", dmi_id ); - // Brand New DMI. Initialize the persistent pieces - TPMTRYRETURN(init_dmi(dmi_id, dmi_type, &new_dmi) ); - } else - vtpmloginfo(VTPM_LOG_VTPM, "Re-attaching DMI instance %d.\n", dmi_id); - - if (new_dmi->connected) { - vtpmlogerror(VTPM_LOG_VTPM, "Attempt to re-attach, currently attached instance %d. Ignoring\n", dmi_id); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - if (new_dmi->dmi_type == VTPM_TYPE_MIGRATED) { - vtpmlogerror(VTPM_LOG_VTPM, "Attempt to re-attach previously migrated instance %d without recovering first. Ignoring\n", dmi_id); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - // Initialize the Non-persistent pieces - TPMTRYRETURN( TCS_OpenContext(&new_dmi->TCSContext) ); - - new_dmi->connected = TRUE; - - // Design specific new DMI code. - // Includes: create IPCs, Measuring DMI, and maybe launching DMI - TPMTRYRETURN(VTPM_New_DMI_Extra(new_dmi, vm_type, startup_mode) ); - goto egress; - - abort_egress: - vtpmlogerror(VTPM_LOG_VTPM, "Failed to create DMI id=%d due to status=%s. Cleaning.\n", dmi_id, tpm_get_error_name(status)); - close_dmi(new_dmi ); - - egress: - return status; -} - -TPM_RESULT VTPM_Handle_Close_DMI( const buffer_t *param_buf) { - - TPM_RESULT status=TPM_FAIL; - VTPM_DMI_RESOURCE *dmi_res=NULL; - UINT32 dmi_id; - - if ((param_buf == NULL) || (buffer_len(param_buf) != sizeof(UINT32)) ) { - vtpmlogerror(VTPM_LOG_VTPM, "Closing DMI has bad size."); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - BSG_UnpackList( param_buf->bytes, 1, - BSG_TYPE_UINT32, &dmi_id); - - vtpmloginfo(VTPM_LOG_VTPM, "Closing DMI %d.\n", dmi_id); - - dmi_res = (VTPM_DMI_RESOURCE *) hashtable_search(vtpm_globals->dmi_map, &dmi_id); - if (dmi_res == NULL ) { - vtpmlogerror(VTPM_LOG_VTPM, "Trying to close nonexistent DMI.\n"); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - if (!dmi_res->connected) { - vtpmlogerror(VTPM_LOG_VTPM, "Closing non-connected DMI.\n"); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - // Close Dmi - TPMTRYRETURN(close_dmi( dmi_res )); - - status=TPM_SUCCESS; - goto egress; - - abort_egress: - egress: - - return status; -} - -TPM_RESULT VTPM_Handle_Delete_DMI( const buffer_t *param_buf) { - - TPM_RESULT status=TPM_FAIL; - VTPM_DMI_RESOURCE *dmi_res=NULL; - UINT32 dmi_id; - - if ((param_buf == NULL) || (buffer_len(param_buf) != sizeof(UINT32)) ) { - vtpmlogerror(VTPM_LOG_VTPM, "Closing DMI has bad size.\n"); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - BSG_UnpackList( param_buf->bytes, 1, - BSG_TYPE_UINT32, &dmi_id); - - vtpmloginfo(VTPM_LOG_VTPM, "Deleting DMI %d.\n", dmi_id); - - dmi_res = (VTPM_DMI_RESOURCE *) hashtable_remove(vtpm_globals->dmi_map, &dmi_id); - if (dmi_res == NULL) { - vtpmlogerror(VTPM_LOG_VTPM, "Closing non-existent DMI.\n"); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - //vtpm scripts delete file dmi_res->NVMLocation for us - - // Close DMI first - TPMTRYRETURN(close_dmi( dmi_res )); - free ( dmi_res ); - - status=TPM_SUCCESS; - goto egress; - - abort_egress: - egress: - - return status; -} diff --git a/tools/vtpm_manager/manager/migration.c b/tools/vtpm_manager/manager/migration.c deleted file mode 100644 index 54da708..0000000 --- a/tools/vtpm_manager/manager/migration.c +++ /dev/null @@ -1,307 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// dmictl.c -// -// Functions for creating and destroying DMIs -// -// ================================================================== - -#include <stdio.h> -#include <unistd.h> -#include <string.h> - -#include "vtpmpriv.h" -#include "bsg.h" -#include "buffer.h" -#include "log.h" -#include "hashtable.h" - -TPM_RESULT VTPM_Handle_Migrate_In( const buffer_t *param_buf, - buffer_t *result_buf) { - - TPM_RESULT status=TPM_FAIL; - VTPM_DMI_RESOURCE *mig_dmi=NULL; - UINT32 dmi_id; - buffer_t dmi_state_abuf = NULL_BUF, enc_dmi_abuf = NULL_BUF, clear_dmi_blob = NULL_BUF; - - if (param_buf == NULL) { - vtpmlogerror(VTPM_LOG_VTPM, "Migration Out Failed due to bad parameter.\n"); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - struct pack_buf_t enc_dmi_state_pack; - - BSG_UnpackList(param_buf->bytes, 2, - BSG_TYPE_UINT32, &dmi_id, - BSG_TPM_SIZE32_DATA, &enc_dmi_state_pack) ; - - vtpmloginfo(VTPM_LOG_VTPM, "Migrating VTPM in dmi %d.\n", dmi_id); - - mig_dmi = (VTPM_DMI_RESOURCE *) hashtable_search(vtpm_globals->dmi_map, &dmi_id); - if (mig_dmi) { - vtpmlogerror(VTPM_LOG_VTPM, "Incoming VTPM claims unavailable id: %d.\n", dmi_id); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - /** UnBind Blob **/ - TPMTRYRETURN( buffer_init_alias_convert( &enc_dmi_abuf, - enc_dmi_state_pack.size, - enc_dmi_state_pack.data) ); - - TPMTRYRETURN( envelope_decrypt( &enc_dmi_abuf, - vtpm_globals->manager_tcs_handle, - vtpm_globals->storageKeyHandle, - (const TPM_AUTHDATA*)&vtpm_globals->storage_key_usage_auth, - &clear_dmi_blob) ); - - // Create new dmi - TPMTRYRETURN( init_dmi(dmi_id, VTPM_TYPE_MIGRATABLE, &mig_dmi ) ); - - /** Open Blob **/ - struct pack_buf_t dmi_state_pack; - - BSG_UnpackList(clear_dmi_blob.bytes, 2, - BSG_TPM_DIGEST, &mig_dmi->DMI_measurement, - BSG_TPM_SIZE32_DATA, &dmi_state_pack); - - TPMTRYRETURN( buffer_init_alias_convert(&dmi_state_abuf, - dmi_state_pack.size, - dmi_state_pack.data) ); - - TPMTRYRETURN( VTPM_Handle_Save_NVM(mig_dmi, &dmi_state_abuf, NULL ) ); - - status=TPM_SUCCESS; - goto egress; - - abort_egress: - vtpmlogerror(VTPM_LOG_VTPM, "VTPM Migration IN of instance %d failed because of %s.\n", dmi_id, tpm_get_error_name(status) ); - - egress: - buffer_free(&clear_dmi_blob); - buffer_free(&dmi_state_abuf); - - return status; -} - -TPM_RESULT VTPM_Handle_Migrate_Out( const buffer_t *param_buf, - buffer_t *result_buf) { - - TPM_RESULT status=TPM_FAIL; - VTPM_DMI_RESOURCE *mig_dmi; - UINT32 dmi_id; - VTPM_MIGKEY_LIST *last_mig, *mig_key; - buffer_t dmi_state=NULL_BUF, clear_dmi_blob=NULL_BUF; - - if (param_buf == NULL) { - vtpmlogerror(VTPM_LOG_VTPM, "Migration Out Failed due to bad parameter.\n"); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - struct pack_buf_t name_pack; - - BSG_UnpackList( param_buf->bytes, 2, - BSG_TYPE_UINT32, &dmi_id, - BSG_TPM_SIZE32_DATA, &name_pack); - - vtpmloginfo(VTPM_LOG_VTPM, "Migrating out dmi %d.\n", dmi_id); - - mig_dmi = (VTPM_DMI_RESOURCE *) hashtable_search(vtpm_globals->dmi_map, &dmi_id); - if (mig_dmi == NULL) { - vtpmlogerror(VTPM_LOG_VTPM, "Non-existent VTPM instance (%d) in migration.\n", dmi_id ); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - if (mig_dmi->dmi_type != VTPM_TYPE_MIGRATABLE) { - vtpmlogerror(VTPM_LOG_VTPM, "Bad VTPM type (%d) in migration of instance (%d).\n", mig_dmi->dmi_type, dmi_id ); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - /** Find migration key for dest **/ - last_mig = NULL; - mig_key = vtpm_globals->mig_keys; - while (mig_key != NULL) { - if (mig_key->name_size == name_pack.size) - if (memcmp(mig_key->name, name_pack.data, name_pack.size) == 0) { - break; - } - - last_mig = mig_key; - mig_key = mig_key->next; - } - - if (!mig_key) { - vtpmlogerror(VTPM_LOG_VTPM, "Unknown Migration target host.\n"); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - /** Mark vtpm as migrated **/ - mig_dmi->dmi_type = VTPM_TYPE_MIGRATED; - - /** Build Blob **/ - TPMTRYRETURN( VTPM_Handle_Load_NVM(mig_dmi, NULL, &dmi_state) ); - - TPMTRYRETURN( buffer_init(&clear_dmi_blob, sizeof(TPM_DIGEST) + sizeof(UINT32) + buffer_len(&dmi_state), NULL ) ); - - struct pack_constbuf_t dmi_state_pack; - - dmi_state_pack.size = buffer_len(&dmi_state); - dmi_state_pack.data = dmi_state.bytes; - - BSG_PackList(clear_dmi_blob.bytes, 2, - BSG_TPM_DIGEST, &mig_dmi->DMI_measurement, - BSG_TPM_SIZE32_DATA, &dmi_state_pack); - - /** Bind Blob **/ - TPMTRYRETURN( envelope_encrypt( &clear_dmi_blob, - &mig_key->key, - result_buf) ); - - if (last_mig) - last_mig->next = mig_key->next; - else - vtpm_globals->mig_keys = mig_key->next; - - free(mig_key->name); - free(mig_key); - - status=TPM_SUCCESS; - goto egress; - - abort_egress: - vtpmlogerror(VTPM_LOG_VTPM, "VTPM Migration OUT of instance %d failed because of %s. Migratoin recovery may be needed.\n", dmi_id, tpm_get_error_name(status) ); - - //TODO: Create and implement a policy for what happens to mig_key on failed migrations. - - egress: - - buffer_free(&clear_dmi_blob); - buffer_free(&dmi_state); - - return status; -} - - -TPM_RESULT VTPM_Handle_Get_Migration_key( const buffer_t *param_buf, - buffer_t *result_buf) { - - TPM_RESULT status=TPM_FAIL; - - vtpmloginfo(VTPM_LOG_VTPM, "Getting Migration Public Key.\n"); - - struct pack_buf_t pubkey_exp_pack, pubkey_mod_pack; - TPM_KEY mig_key; - - // Unpack/return key structure - BSG_Unpack(BSG_TPM_KEY, vtpm_globals->storageKeyWrap.bytes , &mig_key); - TPM_RSA_KEY_PARMS rsaKeyParms; - - BSG_Unpack(BSG_TPM_RSA_KEY_PARMS, - mig_key.algorithmParms.parms, - &rsaKeyParms); - - pubkey_exp_pack.size = rsaKeyParms.exponentSize; - pubkey_exp_pack.data = rsaKeyParms.exponent; - pubkey_mod_pack.size = mig_key.pubKey.keyLength; - pubkey_mod_pack.data = mig_key.pubKey.key; - - TPMTRYRETURN( buffer_init( result_buf, 2*sizeof(UINT32) + - pubkey_exp_pack.size + - pubkey_mod_pack.size, NULL ) ); - - BSG_PackList( result_buf->bytes, 2, - BSG_TPM_SIZE32_DATA, &pubkey_exp_pack, - BSG_TPM_SIZE32_DATA, &pubkey_mod_pack); - - - status=TPM_SUCCESS; - goto egress; - - abort_egress: - vtpmlogerror(VTPM_LOG_VTPM, "VTPM Get Migration Key failed because of %s.\n", tpm_get_error_name(status) ); - egress: - - return status; -} - -TPM_RESULT VTPM_Handle_Load_Migration_key( const buffer_t *param_buf, - buffer_t *result_buf) { - - TPM_RESULT status=TPM_FAIL; - VTPM_MIGKEY_LIST *mig_key; - - vtpmloginfo(VTPM_LOG_VTPM, "Loading Migration Public Key.\n"); - - //FIXME: Review all uses of unpacking pack_buf_t and ensure free. - //FIXME: Review all declarations/initializations of buffer_t that could have a goto that skips them and then tries to free them - - struct pack_buf_t name_pack, pubkey_exp_pack, pubkey_mod_pack; - - //FIXME: scan list and verify name is not already in the list - - BSG_UnpackList( param_buf->bytes, 3, - BSG_TPM_SIZE32_DATA, &name_pack, - BSG_TPM_SIZE32_DATA, &pubkey_exp_pack, - BSG_TPM_SIZE32_DATA, &pubkey_mod_pack); - - //TODO: Maintain a persistent list for pub_keys. - //TODO: Verify pub_key is trusted - - mig_key = (VTPM_MIGKEY_LIST *) malloc(sizeof(VTPM_MIGKEY_LIST)); - memset(mig_key, 0, sizeof(VTPM_MIGKEY_LIST) ); - mig_key->name_size = name_pack.size; - mig_key->name = name_pack.data; - - mig_key->key.encScheme = CRYPTO_ES_RSAESOAEP_SHA1_MGF1; - Crypto_RSABuildCryptoInfoPublic( pubkey_exp_pack.size, - pubkey_exp_pack.data, - pubkey_mod_pack.size, - pubkey_mod_pack.data, - &mig_key->key); - - - mig_key->next = vtpm_globals->mig_keys; - vtpm_globals->mig_keys = mig_key; - - // free(name_pack.data); Do not free. data is now part of mig_key. - free(pubkey_exp_pack.data); - free(pubkey_mod_pack.data); - - return TPM_SUCCESS; -} diff --git a/tools/vtpm_manager/manager/securestorage.c b/tools/vtpm_manager/manager/securestorage.c deleted file mode 100644 index d5e6ffd..0000000 --- a/tools/vtpm_manager/manager/securestorage.c +++ /dev/null @@ -1,512 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// securestorage.c -// -// Functions regarding securely storing DMI secrets. -// -// ================================================================== - -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <unistd.h> -#include <string.h> - -#include "tcg.h" -#include "vtpm_manager.h" -#include "vtpmpriv.h" -#include "vtsp.h" -#include "bsg.h" -#include "crypto.h" -#include "hashtable.h" -#include "hashtable_itr.h" -#include "buffer.h" -#include "log.h" - -TPM_RESULT envelope_encrypt(const buffer_t *inbuf, - CRYPTO_INFO *asymkey, - buffer_t *sealed_data) { - TPM_RESULT status = TPM_SUCCESS; - symkey_t symkey; - buffer_t data_cipher = NULL_BUF, - symkey_cipher = NULL_BUF; - - UINT32 i; - struct pack_constbuf_t symkey_cipher32, data_cipher32; - - vtpmloginfo(VTPM_LOG_VTPM_DEEP, "Enveloping Input[%d]: 0x", buffer_len(inbuf)); - for (i=0; i< buffer_len(inbuf); i++) - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", inbuf->bytes[i]); - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - - // Generate a sym key and encrypt state with it - TPMTRY(TPM_ENCRYPT_ERROR, Crypto_symcrypto_genkey (&symkey) ); - TPMTRY(TPM_ENCRYPT_ERROR, Crypto_symcrypto_encrypt (&symkey, inbuf, &data_cipher) ); - - // Encrypt symmetric key - TPMTRYRETURN( VTSP_Bind( asymkey, - &symkey.key, - &symkey_cipher) ); - - // Create output blob: symkey_size + symkey_cipher + state_cipher_size + state_cipher - - symkey_cipher32.size = buffer_len(&symkey_cipher); - symkey_cipher32.data = symkey_cipher.bytes; - - data_cipher32.size = buffer_len(&data_cipher); - data_cipher32.data = data_cipher.bytes; - - TPMTRYRETURN( buffer_init(sealed_data, 2 * sizeof(UINT32) + symkey_cipher32.size + data_cipher32.size, NULL)); - - BSG_PackList(sealed_data->bytes, 2, - BSG_TPM_SIZE32_DATA, &symkey_cipher32, - BSG_TPM_SIZE32_DATA, &data_cipher32); - - vtpmloginfo(VTPM_LOG_VTPM, "Saved %d bytes of E(symkey) + %d bytes of E(data)\n", buffer_len(&symkey_cipher), buffer_len(&data_cipher)); - - vtpmloginfo(VTPM_LOG_VTPM_DEEP, "Enveloping Output[%d]: 0x", buffer_len(sealed_data)); - for (i=0; i< buffer_len(sealed_data); i++) - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", sealed_data->bytes[i]); - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - - goto egress; - - abort_egress: - vtpmlogerror(VTPM_LOG_VTPM, "Failed to envelope encrypt\n."); - - egress: - - buffer_free ( &data_cipher); - buffer_free ( &symkey_cipher); - Crypto_symcrypto_freekey (&symkey); - - return status; -} - -TPM_RESULT envelope_decrypt(const buffer_t *cipher, - TCS_CONTEXT_HANDLE TCSContext, - TPM_HANDLE keyHandle, - const TPM_AUTHDATA *key_usage_auth, - buffer_t *unsealed_data) { - - TPM_RESULT status = TPM_SUCCESS; - symkey_t symkey; - buffer_t data_cipher = NULL_BUF, - symkey_clear = NULL_BUF, - symkey_cipher = NULL_BUF; - struct pack_buf_t symkey_cipher32, data_cipher32; - int i; - - memset(&symkey, 0, sizeof(symkey_t)); - - vtpmloginfo(VTPM_LOG_VTPM_DEEP, "Envelope Decrypt Input[%d]: 0x", buffer_len(cipher) ); - for (i=0; i< buffer_len(cipher); i++) - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", cipher->bytes[i]); - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - - BSG_UnpackList(cipher->bytes, 2, - BSG_TPM_SIZE32_DATA, &symkey_cipher32, - BSG_TPM_SIZE32_DATA, &data_cipher32); - - TPMTRYRETURN( buffer_init_alias_convert (&symkey_cipher, - symkey_cipher32.size, - symkey_cipher32.data) ); - - TPMTRYRETURN( buffer_init_alias_convert (&data_cipher, - data_cipher32.size, - data_cipher32.data) ); - - // Decrypt Symmetric Key - TPMTRYRETURN( VTSP_Unbind( TCSContext, - keyHandle, - &symkey_cipher, - key_usage_auth, - &symkey_clear, - &(vtpm_globals->keyAuth) ) ); - - // create symmetric key using saved bits - Crypto_symcrypto_initkey (&symkey, &symkey_clear); - - // Decrypt State - TPMTRY(TPM_DECRYPT_ERROR, Crypto_symcrypto_decrypt (&symkey, &data_cipher, unsealed_data) ); - - vtpmloginfo(VTPM_LOG_VTPM_DEEP, "Envelope Decrypte Output[%d]: 0x", buffer_len(unsealed_data)); - for (i=0; i< buffer_len(unsealed_data); i++) - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", unsealed_data->bytes[i]); - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - - goto egress; - - abort_egress: - vtpmlogerror(VTPM_LOG_VTPM, "Failed to envelope decrypt data\n."); - - egress: - buffer_free ( &data_cipher); - buffer_free ( &symkey_clear); - buffer_free ( &symkey_cipher); - Crypto_symcrypto_freekey (&symkey); - - return status; -} - -TPM_RESULT VTPM_Handle_Save_NVM(VTPM_DMI_RESOURCE *myDMI, - const buffer_t *inbuf, - buffer_t *outbuf) { - - TPM_RESULT status = TPM_SUCCESS; - int fh; - long bytes_written; - buffer_t sealed_NVM = NULL_BUF; - - vtpmloginfo(VTPM_LOG_VTPM_DEEP, "Saving %d bytes of NVM.\n", buffer_len(inbuf)); - - TPMTRYRETURN( envelope_encrypt(inbuf, - &vtpm_globals->storageKey, - &sealed_NVM) ); - - // Write sealed blob off disk from NVMLocation - // TODO: How to properly return from these. Do we care if we return failure - // after writing the file? We can't get the old one back. - // TODO: Backup old file and try and recover that way. - fh = open(myDMI->NVMLocation, O_WRONLY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE); - if ( (bytes_written = write(fh, sealed_NVM.bytes, buffer_len(&sealed_NVM) ) != (long) buffer_len(&sealed_NVM))) { - vtpmlogerror(VTPM_LOG_VTPM, "We just overwrote a DMI_NVM and failed to finish. %ld/%ld bytes.\n", bytes_written, (long)buffer_len(&sealed_NVM)); - status = TPM_IOERROR; - goto abort_egress; - } - close(fh); - - Crypto_SHA1Full (sealed_NVM.bytes, buffer_len(&sealed_NVM), (BYTE *) &myDMI->NVM_measurement); - - goto egress; - - abort_egress: - vtpmlogerror(VTPM_LOG_VTPM, "Failed to save NVM\n."); - - egress: - buffer_free(&sealed_NVM); - return status; -} - - -/* Expected Params: inbuf = null, outbuf = sealed blob size, sealed blob.*/ -TPM_RESULT VTPM_Handle_Load_NVM(VTPM_DMI_RESOURCE *myDMI, - const buffer_t *inbuf, - buffer_t *outbuf) { - - TPM_RESULT status = TPM_SUCCESS; - - buffer_t sealed_NVM = NULL_BUF; - long fh_size; - int fh, stat_ret, i; - struct stat file_stat; - TPM_DIGEST sealedNVMHash; - - if (myDMI->NVMLocation == NULL) { - vtpmlogerror(VTPM_LOG_VTPM, "Unable to load NVM because the file name NULL.\n"); - status = TPM_AUTHFAIL; - goto abort_egress; - } - - //Read sealed blob off disk from NVMLocation - fh = open(myDMI->NVMLocation, O_RDONLY); - stat_ret = fstat(fh, &file_stat); - if (stat_ret == 0) - fh_size = file_stat.st_size; - else { - status = TPM_IOERROR; - goto abort_egress; - } - - TPMTRYRETURN( buffer_init( &sealed_NVM, fh_size, NULL) ); - if (read(fh, sealed_NVM.bytes, buffer_len(&sealed_NVM)) != fh_size) { - status = TPM_IOERROR; - goto abort_egress; - } - close(fh); - - vtpmloginfo(VTPM_LOG_VTPM_DEEP, "Load_NVMing[%d],\n", buffer_len(&sealed_NVM)); - - Crypto_SHA1Full(sealed_NVM.bytes, buffer_len(&sealed_NVM), (BYTE *) &sealedNVMHash); - - // Verify measurement of sealed blob. - if (memcmp(&sealedNVMHash, &myDMI->NVM_measurement, sizeof(TPM_DIGEST)) ) { - vtpmlogerror(VTPM_LOG_VTPM, "VTPM LoadNVM NVM measurement check failed.\n"); - vtpmloginfo(VTPM_LOG_VTPM_DEEP, "Correct hash: "); - for (i=0; i< sizeof(TPM_DIGEST); i++) - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", ((BYTE*)&myDMI->NVM_measurement)[i]); - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - - vtpmloginfo(VTPM_LOG_VTPM_DEEP, "Measured hash: "); - for (i=0; i< sizeof(TPM_DIGEST); i++) - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", ((BYTE*)&sealedNVMHash)[i]); - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - - status = TPM_AUTHFAIL; - goto abort_egress; - } - - TPMTRYRETURN( envelope_decrypt(&sealed_NVM, - myDMI->TCSContext, - vtpm_globals->storageKeyHandle, - (const TPM_AUTHDATA*)&vtpm_globals->storage_key_usage_auth, - outbuf) ); - goto egress; - - abort_egress: - vtpmlogerror(VTPM_LOG_VTPM, "Failed to load NVM\n."); - - egress: - buffer_free( &sealed_NVM ); - - return status; -} - - -TPM_RESULT VTPM_SaveManagerData(void) { - TPM_RESULT status=TPM_SUCCESS; - int fh, dmis=-1; - - BYTE *flat_boot_key=NULL, *flat_dmis=NULL, *flat_enc=NULL; - buffer_t clear_flat_global=NULL_BUF, enc_flat_global=NULL_BUF; - UINT32 storageKeySize = buffer_len(&vtpm_globals->storageKeyWrap); - UINT32 bootKeySize = buffer_len(&vtpm_globals->bootKeyWrap); - struct pack_buf_t storage_key_pack = {storageKeySize, vtpm_globals->storageKeyWrap.bytes}; - struct pack_buf_t boot_key_pack = {bootKeySize, vtpm_globals->bootKeyWrap.bytes}; - BYTE vtpm_manager_gen = VTPM_MANAGER_GEN; - - struct hashtable_itr *dmi_itr; - VTPM_DMI_RESOURCE *dmi_res; - - UINT32 boot_key_size = 0, flat_dmis_size = 0; - - // Initially fill these with buffer sizes for each data type. Later fill - // in actual size, once flattened. - boot_key_size = sizeof(UINT32) + // bootkeysize - bootKeySize; // boot key - - TPMTRYRETURN(buffer_init(&clear_flat_global,sizeof(BYTE) + // manager version - 3*sizeof(TPM_DIGEST) + // Auths - sizeof(UINT32) +// storagekeysize - storageKeySize, NULL) ); // storage key - - - flat_boot_key = (BYTE *) malloc( boot_key_size ); - flat_enc = (BYTE *) malloc( sizeof(UINT32) ); - - boot_key_size = BSG_PackList(flat_boot_key, 1, - BSG_TPM_SIZE32_DATA, &boot_key_pack); - - BSG_PackList(clear_flat_global.bytes, 4, - BSG_TYPE_BYTE, &vtpm_manager_gen, - BSG_TPM_AUTHDATA, &vtpm_globals->owner_usage_auth, - BSG_TPM_SECRET, &vtpm_globals->storage_key_usage_auth, - BSG_TPM_SIZE32_DATA, &storage_key_pack); - - TPMTRYRETURN(envelope_encrypt(&clear_flat_global, - &vtpm_globals->bootKey, - &enc_flat_global) ); - - BSG_PackConst(buffer_len(&enc_flat_global), 4, flat_enc); - - // Per DMI values to be saved (if any exit) - if (hashtable_count(vtpm_globals->dmi_map) > 1) { - - flat_dmis = (BYTE *) malloc( - (hashtable_count(vtpm_globals->dmi_map) - 1) * // num DMIS (-1 for Dom0) - (sizeof(UINT32) +sizeof(BYTE) + 2*sizeof(TPM_DIGEST)) ); // Per DMI info - - dmi_itr = hashtable_iterator(vtpm_globals->dmi_map); - do { - dmi_res = (VTPM_DMI_RESOURCE *) hashtable_iterator_value(dmi_itr); - dmis++; - - // No need to save dmi0. - if (dmi_res->dmi_id == 0) - continue; - - - flat_dmis_size += BSG_PackList( flat_dmis + flat_dmis_size, 4, - BSG_TYPE_UINT32, &dmi_res->dmi_id, - BSG_TYPE_BYTE, &dmi_res->dmi_type, - BSG_TPM_DIGEST, &dmi_res->NVM_measurement, - BSG_TPM_DIGEST, &dmi_res->DMI_measurement); - - } while (hashtable_iterator_advance(dmi_itr)); - } - - fh = open(STATE_FILE, O_WRONLY | O_CREAT, S_IREAD | S_IWRITE); - if (fh == -1) { - vtpmlogerror(VTPM_LOG_VTPM, "Unable to open %s file for write.\n", STATE_FILE); - status = TPM_IOERROR; - goto abort_egress; - } - - if ( ( write(fh, flat_boot_key, boot_key_size) != boot_key_size ) || - ( write(fh, flat_enc, sizeof(UINT32)) != sizeof(UINT32) ) || - ( write(fh, enc_flat_global.bytes, buffer_len(&enc_flat_global)) != buffer_len(&enc_flat_global) ) || - ( write(fh, flat_dmis, flat_dmis_size) != flat_dmis_size ) ) { - vtpmlogerror(VTPM_LOG_VTPM, "Failed to completely write service data.\n"); - status = TPM_IOERROR; - goto abort_egress; - } - - goto egress; - - abort_egress: - egress: - - free(flat_boot_key); - free(flat_enc); - buffer_free(&enc_flat_global); - free(flat_dmis); - close(fh); - - vtpmloginfo(VTPM_LOG_VTPM, "Saved VTPM Manager state (status = %d, dmis = %d)\n", (int) status, dmis); - return status; -} - -TPM_RESULT VTPM_LoadManagerData(void) { - - TPM_RESULT status=TPM_SUCCESS; - int fh, stat_ret, dmis=0; - long fh_size = 0, step_size; - BYTE *flat_table=NULL; - buffer_t unsealed_data, enc_table_abuf; - struct pack_buf_t storage_key_pack, boot_key_pack; - UINT32 *dmi_id_key, enc_size; - BYTE vtpm_manager_gen; - - VTPM_DMI_RESOURCE *dmi_res; - UINT32 dmi_id; - BYTE dmi_type; - struct stat file_stat; - - TPM_HANDLE boot_key_handle; - TPM_AUTHDATA boot_usage_auth; - memset(&boot_usage_auth, 0, sizeof(TPM_AUTHDATA)); - - fh = open(STATE_FILE, O_RDONLY ); - stat_ret = fstat(fh, &file_stat); - if (stat_ret == 0) - fh_size = file_stat.st_size; - else { - status = TPM_IOERROR; - goto abort_egress; - } - - flat_table = (BYTE *) malloc(fh_size); - - if ((long) read(fh, flat_table, fh_size) != fh_size ) { - status = TPM_IOERROR; - goto abort_egress; - } - - // Read Boot Key - step_size = BSG_UnpackList( flat_table, 2, - BSG_TPM_SIZE32_DATA, &boot_key_pack, - BSG_TYPE_UINT32, &enc_size); - - TPMTRYRETURN(buffer_init(&vtpm_globals->bootKeyWrap, 0, 0) ); - TPMTRYRETURN(buffer_init_alias_convert(&enc_table_abuf, enc_size, flat_table + step_size) ); - TPMTRYRETURN(buffer_append_raw(&vtpm_globals->bootKeyWrap, boot_key_pack.size, boot_key_pack.data) ); - - //Load Boot Key - TPMTRYRETURN( VTSP_LoadKey( vtpm_globals->manager_tcs_handle, - TPM_SRK_KEYHANDLE, - &vtpm_globals->bootKeyWrap, - &SRK_AUTH, - &boot_key_handle, - &vtpm_globals->keyAuth, - &vtpm_globals->bootKey, - FALSE) ); - - TPMTRYRETURN( envelope_decrypt(&enc_table_abuf, - vtpm_globals->manager_tcs_handle, - boot_key_handle, - (const TPM_AUTHDATA*) &boot_usage_auth, - &unsealed_data) ); - step_size += enc_size; - - if (*unsealed_data.bytes != VTPM_MANAGER_GEN) { - // Once there is more than one gen, this will include some compatability stuff - vtpmlogerror(VTPM_LOG_VTPM, "Warning: Manager Data file is gen %d, which this manager is gen %d.\n", vtpm_manager_gen, VTPM_MANAGER_GEN); - } - - // Global Values needing to be saved - BSG_UnpackList( unsealed_data.bytes, 4, - BSG_TYPE_BYTE, &vtpm_manager_gen, - BSG_TPM_AUTHDATA, &vtpm_globals->owner_usage_auth, - BSG_TPM_SECRET, &vtpm_globals->storage_key_usage_auth, - BSG_TPM_SIZE32_DATA, &storage_key_pack); - - TPMTRYRETURN(buffer_init(&vtpm_globals->storageKeyWrap, 0, 0) ); - TPMTRYRETURN(buffer_append_raw(&vtpm_globals->storageKeyWrap, storage_key_pack.size, storage_key_pack.data) ); - - // Per DMI values to be saved - while ( step_size < fh_size ){ - if (fh_size - step_size < (long) (sizeof(UINT32) + sizeof(BYTE) + 2*sizeof(TPM_DIGEST))) { - vtpmlogerror(VTPM_LOG_VTPM, "Encountered %ld extra bytes at end of manager state.\n", fh_size-step_size); - step_size = fh_size; - } else { - step_size += BSG_UnpackList(flat_table + step_size, 2, - BSG_TYPE_UINT32, &dmi_id, - BSG_TYPE_BYTE, &dmi_type); - - //TODO: Try and gracefully recover from problems. - TPMTRYRETURN(init_dmi(dmi_id, dmi_type, &dmi_res) ); - dmis++; - - step_size += BSG_UnpackList(flat_table + step_size, 2, - BSG_TPM_DIGEST, &dmi_res->NVM_measurement, - BSG_TPM_DIGEST, &dmi_res->DMI_measurement); - } - - } - - vtpmloginfo(VTPM_LOG_VTPM, "Loaded saved state (dmis = %d).\n", dmis); - goto egress; - - abort_egress: - vtpmlogerror(VTPM_LOG_VTPM, "Failed to load service data with error = %s\n", tpm_get_error_name(status)); - egress: - - free(flat_table); - close(fh); - - // TODO: Could be nice and evict BootKey. (Need to add EvictKey to VTSP. - - return status; -} - diff --git a/tools/vtpm_manager/manager/tpmpassthrough.c b/tools/vtpm_manager/manager/tpmpassthrough.c deleted file mode 100644 index 9b1e5f8..0000000 --- a/tools/vtpm_manager/manager/tpmpassthrough.c +++ /dev/null @@ -1,110 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// tpmpassthrough.c -// -// Functions regarding passing DMI requests to HWTPM -// -// ================================================================== - -#include "tcg.h" -#include "vtpm_manager.h" -#include "vtpmpriv.h" -#include "vtsp.h" -#include "log.h" - -TPM_RESULT VTPM_Handle_TPM_Command( VTPM_DMI_RESOURCE *dmi, - buffer_t *inbuf, - buffer_t *outbuf) { - - TPM_RESULT status = TPM_SUCCESS; - TPM_COMMAND_CODE *ord; - - ord = (TPM_COMMAND_CODE *) (inbuf->bytes + sizeof(TPM_TAG) + sizeof(UINT32)); - - switch (*ord) { - - // Forbidden for DMI use - case TPM_ORD_TakeOwnership: - case TPM_ORD_ChangeAuthOwner: - case TPM_ORD_DirWriteAuth: - case TPM_ORD_DirRead: - case TPM_ORD_AuthorizeMigrationKey: - case TPM_ORD_CreateMaintenanceArchive: - case TPM_ORD_LoadMaintenanceArchive: - case TPM_ORD_KillMaintenanceFeature: - case TPM_ORD_LoadManuMaintPub: - case TPM_ORD_ReadManuMaintPub: - case TPM_ORD_SelfTestFull: - case TPM_ORD_SelfTestStartup: - case TPM_ORD_CertifySelfTest: - case TPM_ORD_ContinueSelfTest: - case TPM_ORD_GetTestResult: - case TPM_ORD_Reset: - case TPM_ORD_OwnerClear: - case TPM_ORD_DisableOwnerClear: - case TPM_ORD_ForceClear: - case TPM_ORD_DisableForceClear: - case TPM_ORD_GetCapabilityOwner: - case TPM_ORD_OwnerSetDisable: - case TPM_ORD_PhysicalEnable: - case TPM_ORD_PhysicalDisable: - case TPM_ORD_SetOwnerInstall: - case TPM_ORD_PhysicalSetDeactivated: - case TPM_ORD_SetTempDeactivated: - case TPM_ORD_CreateEndorsementKeyPair: - case TPM_ORD_GetAuditEvent: - case TPM_ORD_GetAuditEventSigned: - case TPM_ORD_GetOrdinalAuditStatus: - case TPM_ORD_SetOrdinalAuditStatus: - case TPM_ORD_SetRedirection: - case TPM_ORD_FieldUpgrade: - case TSC_ORD_PhysicalPresence: - status = TPM_DISABLED_CMD; - goto abort_egress; - break; - - } // End ORD Switch - - // Call TCS with command - - TPMTRY(TPM_IOERROR, VTSP_RawTransmit( dmi->TCSContext,inbuf, outbuf) ); - - goto egress; - - abort_egress: - vtpmloginfo(VTPM_LOG_VTPM, "TPM Command Failed in tpmpassthrough.\n"); - egress: - - return status; -} diff --git a/tools/vtpm_manager/manager/vtpm_ipc.c b/tools/vtpm_manager/manager/vtpm_ipc.c deleted file mode 100644 index 319dc83..0000000 --- a/tools/vtpm_manager/manager/vtpm_ipc.c +++ /dev/null @@ -1,141 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// vtpm_ipc.c Implements ipc routines using file io. This file can -// be replaced with other ipc types. -// -// =================================================================== - -#include <sys/stat.h> -#include "vtpm_ipc.h" -#include "vtpmpriv.h" -#include "log.h" - -int vtpm_ipc_init(vtpm_ipc_handle_t *ipc_h, char* name, int flags, BOOL create) { - ipc_h->name = name; - ipc_h->flags = flags; - ipc_h->fh = VTPM_IPC_CLOSED; - - if (create) - return(vtpm_ipc_create(ipc_h)); - else - return 0; -} - -// Create the file that needs opening. Used only for FIFOs -// FYI: This may cause problems in other file IO schemes. We'll see. -int vtpm_ipc_create(vtpm_ipc_handle_t *ipc_h) { - int fh; - struct stat file_info; - - if ((!ipc_h) || (!ipc_h->name)) - return -1; - - if ( stat(ipc_h->name, &file_info) == -1) { - if ( mkfifo(ipc_h->name, S_IWUSR | S_IRUSR ) ) { - vtpmlogerror(VTPM_LOG_VTPM, "Failed to create fifo %s.\n", ipc_h->name); - return -1; - } - } - - ipc_h->fh = VTPM_IPC_CLOSED; - - return 0; -} - - -// Read size bytes. If FH isn't open, open it. -int vtpm_ipc_read(vtpm_ipc_handle_t *ipc_h, vtpm_ipc_handle_t *alt_ipc_h, BYTE *bytes, UINT32 size){ - vtpm_ipc_handle_t *my_ipc_h; - int result; - - if (ipc_h) { - my_ipc_h = ipc_h; - } else { - my_ipc_h = alt_ipc_h; - } - - if (my_ipc_h->fh == VTPM_IPC_CLOSED) { - my_ipc_h->fh = open(my_ipc_h->name, my_ipc_h->flags); - } - - if ( my_ipc_h->fh == VTPM_IPC_CLOSED ) { - vtpmlogerror(VTPM_LOG_VTPM, "VTPM ERROR: Can't open %s for reading.\n", my_ipc_h->name); - return -1; - } - - result = read(my_ipc_h->fh, bytes, size); - if (result < 0) { - my_ipc_h->fh = VTPM_IPC_CLOSED; - } - - return (result); -} - -// Write size bytes. If FH isn't open, open it. -int vtpm_ipc_write(vtpm_ipc_handle_t *ipc_h, vtpm_ipc_handle_t *alt_ipc_h, BYTE *bytes, UINT32 size) { - vtpm_ipc_handle_t *my_ipc_h; - int result; - - if (ipc_h) { - my_ipc_h = ipc_h; - } else { - my_ipc_h = alt_ipc_h; - } - - if (my_ipc_h->fh == VTPM_IPC_CLOSED) { - my_ipc_h->fh = open(my_ipc_h->name, my_ipc_h->flags); - } - - if ( my_ipc_h->fh == VTPM_IPC_CLOSED ) { - vtpmlogerror(VTPM_LOG_VTPM, "VTPM ERROR: Can't open %s for writing.\n", my_ipc_h->name); - return -1; - } - - result = write(my_ipc_h->fh, bytes, size); - if (result < 0) { - my_ipc_h->fh = VTPM_IPC_CLOSED; - } - - return (result); -} - -// Mark file as closed and try and close it. Errors not reported. -void vtpm_ipc_close(vtpm_ipc_handle_t *ipc_h) { - - if (ipc_h) { - close(ipc_h->fh); - ipc_h->fh = VTPM_IPC_CLOSED; - } - -} diff --git a/tools/vtpm_manager/manager/vtpm_ipc.h b/tools/vtpm_manager/manager/vtpm_ipc.h deleted file mode 100644 index 529c4a2..0000000 --- a/tools/vtpm_manager/manager/vtpm_ipc.h +++ /dev/null @@ -1,71 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// vtpm_ipc.h Header for interprocess communication between VTPM manager -// and Guests or VTPMs -// -// =================================================================== - -#ifndef __VTPM_IO_H__ -#define __VTPM_IO_H__ - -#include "tcg.h" - -#define VTPM_IPC_CLOSED -1 - -// Represents an (somewhat) abstracted io handle. -typedef struct vtpm_ipc_handle_t { - int fh; // IO handle. - int flags; // Flags for opening. This may need to become - // a void *, but for now files use an int. - char *name; // Names for debugging as well as filenames - // for file-based io. -} vtpm_ipc_handle_t; - - -int vtpm_ipc_init(vtpm_ipc_handle_t *ioh, char* name, int flags, BOOL create); - -// Create the file that needs opening. Used only for FIFOs -// FYI: This may cause problems in other file IO schemes. We'll see. -int vtpm_ipc_create(vtpm_ipc_handle_t *ioh); - -// Read size bytes. If FH isn't open, open it. -int vtpm_ipc_read(vtpm_ipc_handle_t *ioh, vtpm_ipc_handle_t *alt_ioh, BYTE *bytes, UINT32 size); - -// Write size bytes. If FH isn't open, open it. -int vtpm_ipc_write(vtpm_ipc_handle_t *ioh, vtpm_ipc_handle_t *alt_ioh, BYTE *bytes, UINT32 size); - -// Mark file as closed and try and close it. Errors not reported. -void vtpm_ipc_close(vtpm_ipc_handle_t *ioh); - -#endif diff --git a/tools/vtpm_manager/manager/vtpm_lock.c b/tools/vtpm_manager/manager/vtpm_lock.c deleted file mode 100644 index e737d60..0000000 --- a/tools/vtpm_manager/manager/vtpm_lock.c +++ /dev/null @@ -1,63 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// vtpm_lock.c Provided controlled sync around access to vtpm structures -// -// =================================================================== - -#include <pthread.h> -#include "vtpm_lock.h" - -static pthread_rwlock_t vtpm_lock; - -void vtpm_lock_init() { - - pthread_rwlock_init( &vtpm_lock, NULL); -} - -void vtpm_lock_destroy(){ - pthread_rwlock_destroy(&vtpm_lock); -} - -void vtpm_lock_rdlock(){ - pthread_rwlock_rdlock(&vtpm_lock); -} - -void vtpm_lock_wrlock(){ - pthread_rwlock_wrlock(&vtpm_lock); -} - -void vtpm_lock_unlock(){ - pthread_rwlock_unlock(&vtpm_lock); -} - diff --git a/tools/vtpm_manager/manager/vtpm_lock.h b/tools/vtpm_manager/manager/vtpm_lock.h deleted file mode 100644 index 53a339d..0000000 --- a/tools/vtpm_manager/manager/vtpm_lock.h +++ /dev/null @@ -1,48 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// vtpm_lock.h Provided controlled sync around access to vtpm structures -// -// =================================================================== - -#ifndef __VTPM_LOCK_H__ -#define __VTPM_LOCK_H__ - -void vtpm_lock_init(); -void vtpm_lock_destroy(); - -void vtpm_lock_rdlock(); -void vtpm_lock_wrlock(); -void vtpm_lock_unlock(); - -#endif diff --git a/tools/vtpm_manager/manager/vtpm_manager.c b/tools/vtpm_manager/manager/vtpm_manager.c deleted file mode 100644 index e089f78..0000000 --- a/tools/vtpm_manager/manager/vtpm_manager.c +++ /dev/null @@ -1,285 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// vtpm_manager.c -// -// This file will house the main logic of the VTPM Manager -// -// ================================================================== - -#include <stdio.h> -#include <unistd.h> -#include <string.h> - -#include "vtpm_manager.h" -#include "vtpmpriv.h" -#include "vtsp.h" -#include "bsg.h" -#include "hashtable.h" -#include "hashtable_itr.h" - -#include "log.h" -#include "buffer.h" - -VTPM_GLOBALS *vtpm_globals=NULL; - -// --------------------------- Well Known Auths -------------------------- -const TPM_AUTHDATA SRK_AUTH = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - -#ifdef WELL_KNOWN_OWNER_AUTH -static BYTE FIXED_OWNER_AUTH[20] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; -#endif - - -// -------------------------- Hash table functions -------------------- - -static unsigned int hashfunc32(void *ky) { - return (* (UINT32 *) ky); -} - -static int equals32(void *k1, void *k2) { - return (*(UINT32 *) k1 == *(UINT32 *) k2); -} - -// --------------------------- Functions ------------------------------ - -TPM_RESULT VTPM_Create_Manager(){ - - TPM_RESULT status = TPM_SUCCESS; - - // Generate Auth for Owner -#ifdef WELL_KNOWN_OWNER_AUTH - memcpy(vtpm_globals->owner_usage_auth, FIXED_OWNER_AUTH, sizeof(TPM_AUTHDATA)); -#else - Crypto_GetRandom(vtpm_globals->owner_usage_auth, sizeof(TPM_AUTHDATA) ); -#endif - - // Take Owership of TPM - CRYPTO_INFO ek_cryptoInfo; - - status = VTSP_ReadPubek(vtpm_globals->manager_tcs_handle, &ek_cryptoInfo); - - // If we can read PubEK then there is no owner and we should take it. - // We use the abilty to read the pubEK to flag that the TPM is owned. - // FIXME: Change to just trying to take ownership and react to the status - if (status == TPM_SUCCESS) { - TPMTRYRETURN(VTSP_TakeOwnership(vtpm_globals->manager_tcs_handle, - (const TPM_AUTHDATA*)&vtpm_globals->owner_usage_auth, - &SRK_AUTH, - &ek_cryptoInfo, - &vtpm_globals->keyAuth)); - - TPMTRYRETURN(VTSP_DisablePubekRead(vtpm_globals->manager_tcs_handle, - (const TPM_AUTHDATA*)&vtpm_globals->owner_usage_auth, - &vtpm_globals->keyAuth)); - } else { - vtpmloginfo(VTPM_LOG_VTPM, "Failed to readEK meaning TPM has an owner. Creating Keys off existing SRK.\n"); - } - - // Generate storage key's auth - Crypto_GetRandom( &vtpm_globals->storage_key_usage_auth, - sizeof(TPM_AUTHDATA) ); - - TCS_AUTH osap; - TPM_AUTHDATA sharedsecret; - - TPMTRYRETURN( VTSP_OSAP(vtpm_globals->manager_tcs_handle, - TPM_ET_KEYHANDLE, - TPM_SRK_KEYHANDLE, - &SRK_AUTH, - &sharedsecret, - &osap) ); - - osap.fContinueAuthSession = FALSE; - - - TPMTRYRETURN( VTSP_CreateWrapKey( vtpm_globals->manager_tcs_handle, - TPM_KEY_BIND, - (const TPM_AUTHDATA*)&vtpm_globals->storage_key_usage_auth, - TPM_SRK_KEYHANDLE, - (const TPM_AUTHDATA*)&sharedsecret, - &vtpm_globals->storageKeyWrap, - &osap) ); - - // Generate boot key's auth - TPM_AUTHDATA bootKeyWrapAuth; - memset(&bootKeyWrapAuth, 0, sizeof(bootKeyWrapAuth)); - - TPMTRYRETURN( VTSP_OSAP(vtpm_globals->manager_tcs_handle, - TPM_ET_KEYHANDLE, - TPM_SRK_KEYHANDLE, - &SRK_AUTH, - &sharedsecret, - &osap) ); - - osap.fContinueAuthSession = FALSE; - - // FIXME: This key protects the global secrets on disk. It should use TPM - // PCR bindings to limit its use to legit configurations. - // Current binds are open, implying a Trusted VM contains this code. - // If this VM is not Trusted, use measurement and PCR bindings. - TPMTRYRETURN( VTSP_CreateWrapKey( vtpm_globals->manager_tcs_handle, - TPM_KEY_BIND, - (const TPM_AUTHDATA*)&bootKeyWrapAuth, - TPM_SRK_KEYHANDLE, - (const TPM_AUTHDATA*)&sharedsecret, - &vtpm_globals->bootKeyWrap, - &osap) ); - - // Populate CRYPTO_INFO vtpm_globals->bootKey. This does not load it into the TPM - TPMTRYRETURN( VTSP_LoadKey( vtpm_globals->manager_tcs_handle, - TPM_SRK_KEYHANDLE, - &vtpm_globals->bootKeyWrap, - NULL, - NULL, - NULL, - &vtpm_globals->bootKey, - TRUE ) ); - - TPMTRYRETURN( VTSP_SaveState(vtpm_globals->manager_tcs_handle) ); - goto egress; - - abort_egress: - exit(1); - - egress: - vtpmloginfo(VTPM_LOG_VTPM, "Finished initialized new VTPM manager (Status = %d).\n", status); - return status; - -} - -/////////////////////////////////////////////////////////////////////////////// -TPM_RESULT VTPM_Init_Manager() { - TPM_RESULT status = TPM_FAIL, serviceStatus; - BYTE *randomsead; - UINT32 randomsize=256; - - if ((vtpm_globals = (VTPM_GLOBALS *) malloc(sizeof(VTPM_GLOBALS))) == NULL){ - status = TPM_FAIL; - goto abort_egress; - } - memset(vtpm_globals, 0, sizeof(VTPM_GLOBALS)); - - vtpm_globals->connected_dmis = 0; - - if ((vtpm_globals->dmi_map = create_hashtable(10, hashfunc32, equals32)) == NULL){ - status = TPM_FAIL; - goto abort_egress; - } - - // Create new TCS Object - vtpm_globals->manager_tcs_handle = 0; - - TPMTRYRETURN(TCS_create()); - - // Create TCS Context for service - TPMTRYRETURN( TCS_OpenContext(&vtpm_globals->manager_tcs_handle ) ); - - TPMTRYRETURN( TCSP_GetRandom(vtpm_globals->manager_tcs_handle, - &randomsize, - &randomsead)); - - Crypto_Init(randomsead, randomsize); - TPMTRYRETURN( TCS_FreeMemory (vtpm_globals->manager_tcs_handle, randomsead)); - - // Create OIAP session for service's authorized commands - TPMTRYRETURN( VTSP_OIAP( vtpm_globals->manager_tcs_handle, - &vtpm_globals->keyAuth) ); - vtpm_globals->keyAuth.fContinueAuthSession = TRUE; - - vtpm_globals->mig_keys = NULL; - - // If fails, create new Manager. - serviceStatus = VTPM_LoadManagerData(); - if (serviceStatus == TPM_IOERROR) { - vtpmloginfo(VTPM_LOG_VTPM, "Failed to read manager file. Assuming first time initialization.\n"); - TPMTRYRETURN( VTPM_Create_Manager() ); - TPMTRYRETURN( VTPM_SaveManagerData() ); - } else if (serviceStatus != TPM_SUCCESS) { - vtpmlogerror(VTPM_LOG_VTPM, "Failed to read existing manager file"); - exit(1); - } - - //Load Storage Key - TPMTRYRETURN( VTSP_LoadKey( vtpm_globals->manager_tcs_handle, - TPM_SRK_KEYHANDLE, - &vtpm_globals->storageKeyWrap, - &SRK_AUTH, - &vtpm_globals->storageKeyHandle, - &vtpm_globals->keyAuth, - &vtpm_globals->storageKey, - FALSE ) ); - - // Create entry for Dom0 for control messages - TPMTRYRETURN( VTPM_Handle_New_DMI(NULL) ); - - goto egress; - - abort_egress: - egress: - - return(status); -} - -/////////////////////////////////////////////////////////////////////////////// -void VTPM_Stop_Manager() { - VTPM_DMI_RESOURCE *dmi_res; - struct hashtable_itr *dmi_itr; - - // Close all the TCS contexts. TCS should evict keys based on this - if (hashtable_count(vtpm_globals->dmi_map) > 0) { - dmi_itr = hashtable_iterator(vtpm_globals->dmi_map); - do { - dmi_res = (VTPM_DMI_RESOURCE *) hashtable_iterator_value(dmi_itr); - if (dmi_res->connected) - close_dmi( dmi_res ); // Not really interested in return code - - } while (hashtable_iterator_advance(dmi_itr)); - free (dmi_itr); - } - - if ( VTPM_SaveManagerData() != TPM_SUCCESS ) - vtpmlogerror(VTPM_LOG_VTPM, "Unable to save manager data.\n"); - - TCS_CloseContext(vtpm_globals->manager_tcs_handle); - TCS_destroy(); - - hashtable_destroy(vtpm_globals->dmi_map, 1); - free(vtpm_globals); - - Crypto_Exit(); - - vtpmloginfo(VTPM_LOG_VTPM, "VTPM Manager stopped.\n"); -} diff --git a/tools/vtpm_manager/manager/vtpm_manager.h b/tools/vtpm_manager/manager/vtpm_manager.h deleted file mode 100644 index a324a8f..0000000 --- a/tools/vtpm_manager/manager/vtpm_manager.h +++ /dev/null @@ -1,150 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// vtpm_manager.h -// -// Public Interface header for VTPM Manager -// -// ================================================================== - -#ifndef __VTPM_MANAGER_H__ -#define __VTPM_MANAGER_H__ - -#define VTPM_TAG_REQ 0x01c1 -#define VTPM_TAG_RSP 0x01c4 -#define COMMAND_BUFFER_SIZE 4096 - -// Header sizes. Note Header MAY include the DMI -#define VTPM_COMMAND_HEADER_SIZE_CLT ( 2 + 4 + 4) -// sizeof(TPM_TAG + UINT32 + TPM_COMMAND_CODE) -#define VTPM_COMMAND_HEADER_SIZE_SRV ( 4 + VTPM_COMMAND_HEADER_SIZE_CLT ) -// sizeof( UINT32 + VTPM_COMMAND_HEADER_SIZE_CLT) - -//************************ Command Codes **************************** -#define VTPM_ORD_BASE 0x0000 -#define VTPM_PRIV_MASK 0x01000000 // Priviledged VTPM Command -#define VTPM_PRIV_BASE (VTPM_ORD_BASE | VTPM_PRIV_MASK) - -// Non-priviledged VTPM Commands (From DMI's) -#define VTPM_ORD_SAVENVM (VTPM_ORD_BASE + 1) // DMI Saves Secrets -#define VTPM_ORD_LOADNVM (VTPM_ORD_BASE + 2) // DMI Loads Secrets -#define VTPM_ORD_TPMCOMMAND (VTPM_ORD_BASE + 3) // DMI issues HW TPM Command -#define VTPM_ORD_GET_MIG_KEY (VTPM_ORD_BASE + 4) // Get manager's migration key -#define VTPM_ORD_LOAD_MIG_KEY (VTPM_ORD_BASE + 5) // load dest migration key - -// Priviledged VTPM Commands (From management console) -#define VTPM_ORD_OPEN (VTPM_PRIV_BASE + 1) // Creates/reopens DMI -#define VTPM_ORD_CLOSE (VTPM_PRIV_BASE + 2) // Closes a DMI -#define VTPM_ORD_DELETE (VTPM_PRIV_BASE + 3) // Permemently Deletes DMI -#define VTPM_ORD_MIGRATE_IN (VTPM_PRIV_BASE + 4) // Load migrated VTPM -#define VTPM_ORD_MIGRATE_OUT (VTPM_PRIV_BASE + 5) // migrate VTPM to dest - -//************************ Return Codes **************************** -#define VTPM_TYPE_PVM 1 // Paravirtualized Domain -#define VTPM_TYPE_HVM 2 // HVM Domain - -//************************ Return Codes **************************** -#define VTPM_SUCCESS 0 -#define VTPM_FAIL 1 -#define VTPM_UNSUPPORTED 2 -#define VTPM_FORBIDDEN 3 -#define VTPM_RESTORE_CONTEXT_FAILED 4 -#define VTPM_INVALID_REQUEST 5 - -//*********************** Parameter Values ************************* -#define VTPM_TYPE_NON_MIGRATABLE 0x00 -#define VTPM_TYPE_MIGRATABLE 0x01 -#define VTPM_TYPE_MIGRATED 0xFF // VTPM has been migrated. - // VTPM can be recovered or deleted only - -/******************* Command Parameter API ************************* - -VTPM Command Format - dmi: 4 bytes // Source of message. - // WARNING: This is prepended by the channel. - // Thus it is received by VTPM Manager, - // but not sent by DMI - tpm tag: 2 bytes - command size: 4 bytes // Size of command including header but not DMI - ord: 4 bytes // Command ordinal above - parameters: size - 10 bytes // Command Parameter - -VTPM Response Format - tpm tag: 2 bytes - response_size: 4 bytes - status: 4 bytes - parameters: size - 10 bytes - - -VTPM_Open: - Input Parameters: - mig_type: 1 byte - startup_mode: 1 byte // Cold Boot = 1, resume = 2, deactive = 3 - domain type: 1 byte - instance_id: 4 bytes - Output Parameters: - None - -VTPM_Close - Input Parameters: - instance_id: 4 bytes - Output Parameters: - None - -VTPM_Delete - Input Parameters: - instance_id: 4 bytes - Output Parameters: - None - -VTPM_SaveNVM - Input Parameters: - data: n bytes (Header indicates size of data) - Output Parameters: - None - -VTPM_LoadNVM - Input Parameters: - None - Output Parameters: - data: n bytes (Header indicates size of data) - -VTPM_TPMCommand - Input Parameters: - TPM Command Byte Stream: n bytes - Output Parameters: - TPM Reponse Byte Stream: n bytes - -*********************************************************************/ - -#endif //_VTPM_MANAGER_H_ diff --git a/tools/vtpm_manager/manager/vtpm_manager_handler.c b/tools/vtpm_manager/manager/vtpm_manager_handler.c deleted file mode 100644 index 2001074..0000000 --- a/tools/vtpm_manager/manager/vtpm_manager_handler.c +++ /dev/null @@ -1,488 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// vtpm_manager_handler.c -// -// This file will house the main logic of the VTPM Manager -// -// ================================================================== - -#include <stdio.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> - -#include "vtpm_manager.h" -#include "vtpmpriv.h" -#include "vtsp.h" -#include "bsg.h" -#include "hashtable.h" -#include "hashtable_itr.h" -#include "log.h" -#include "buffer.h" - -#define vtpmhandlerloginfo(module,fmt,args...) vtpmloginfo (module, "[%s]: " fmt, thread_name, ##args ); -#define vtpmhandlerloginfomore(module,fmt,args...) vtpmloginfomore (module, fmt, ##args ); -#define vtpmhandlerlogerror(module,fmt,args...) vtpmlogerror (module, "[%s]: " fmt, thread_name, ##args ); - -// ---------------------- Prototypes ------------------- -TPM_RESULT vtpm_manager_handle_vtpm_cmd(VTPM_DMI_RESOURCE *dmi_res, - TPM_COMMAND_CODE ord, - buffer_t *command_buf, - buffer_t *result_buf, - BOOL is_priv, - char *thread_name); - -TPM_RESULT vtpm_manager_handle_tpm_cmd(vtpm_ipc_handle_t *tx_ipc_h, - vtpm_ipc_handle_t *rx_ipc_h, - VTPM_DMI_RESOURCE *dmi_res, - BYTE *cmd_header, - buffer_t *param_buf, - buffer_t *result_buf, - char *thread_name); - -TPM_RESULT VTPM_Manager_Handler( vtpm_ipc_handle_t *tx_ipc_h, - vtpm_ipc_handle_t *rx_ipc_h, - BOOL fw_tpm, // Forward TPM cmds? - vtpm_ipc_handle_t *fw_tx_ipc_h, - vtpm_ipc_handle_t *fw_rx_ipc_h, - BOOL is_priv, - char *thread_name) { - TPM_RESULT status = TPM_FAIL; // Should never return - UINT32 dmi, in_param_size, cmd_size, out_param_size, out_message_size, reply_size; - BYTE *cmd_header=NULL, *in_param=NULL, *out_message=NULL, *reply; - buffer_t *command_buf=NULL, *result_buf=NULL; - TPM_TAG tag; - TPM_COMMAND_CODE ord; - VTPM_DMI_RESOURCE *dmi_res; - int size_read, size_write, i; - BOOL add_header=TRUE; // This indicates to prepend a header on result_buf before sending - - cmd_header = (BYTE *) malloc(VTPM_COMMAND_HEADER_SIZE_SRV); - command_buf = (buffer_t *) malloc(sizeof(buffer_t)); - result_buf = (buffer_t *) malloc(sizeof(buffer_t)); - - // ------------------------ Main Loop -------------------------------- - while(1) { - - vtpmhandlerloginfo(VTPM_LOG_VTPM, "%s waiting for messages.\n", thread_name); - - // --------------------- Read Cmd from Sender ---------------- - - // Read command header - size_read = vtpm_ipc_read(rx_ipc_h, NULL, cmd_header, VTPM_COMMAND_HEADER_SIZE_SRV); - if (size_read > 0) { - vtpmhandlerloginfo(VTPM_LOG_VTPM_DEEP, "RECV[%d]: 0x", size_read); - for (i=0; i<size_read; i++) - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", cmd_header[i]); - } else { - vtpmhandlerlogerror(VTPM_LOG_VTPM, "%s can't read from ipc. Errono = %d. Aborting... \n", thread_name, errno); - goto abort_command; - } - - if (size_read < (int) VTPM_COMMAND_HEADER_SIZE_SRV) { - vtpmhandlerloginfo(VTPM_LOG_VTPM_DEEP, "\n"); - vtpmhandlerlogerror(VTPM_LOG_VTPM, "Command shorter than normal header (%d bytes). Aborting...\n", size_read); - goto abort_command; - } - - // Unpack header - BSG_UnpackList(cmd_header, 4, - BSG_TYPE_UINT32, &dmi, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, &in_param_size, - BSG_TPM_COMMAND_CODE, &ord ); - - // Using the header info, read the parameters of the command - // Note that in_param_size is in the client's context - cmd_size = in_param_size - VTPM_COMMAND_HEADER_SIZE_CLT; - if (cmd_size > 0) { - in_param = (BYTE *) malloc(cmd_size); - size_read = vtpm_ipc_read( rx_ipc_h, NULL, in_param, cmd_size); - if (size_read > 0) { - for (i=0; i<size_read; i++) - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", in_param[i]); - - } else { - vtpmhandlerlogerror(VTPM_LOG_VTPM, "%s had error reading cmd from ipc. Aborting... \n", thread_name); - goto abort_command; - } - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - - if (size_read < (int) cmd_size) { - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - vtpmhandlerlogerror(VTPM_LOG_VTPM, "Command read(%d) is shorter than header indicates(%d). Aborting...\n", size_read, cmd_size); - goto abort_command; - } - } else { - in_param = NULL; - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - } - - // Init the buffers used to handle the command and the response - if ( (buffer_init_convert(command_buf, cmd_size, in_param) != TPM_SUCCESS) || - (buffer_init(result_buf, 0, 0) != TPM_SUCCESS) ) { - vtpmhandlerlogerror(VTPM_LOG_VTPM, "Failed to setup buffers. Aborting...\n"); - goto abort_command; - } - - // -------------- Dispatch Commands to Handlers ----------- - if ((tag == VTPM_TAG_REQ) && (ord & VTPM_PRIV_MASK)) { - vtpm_lock_wrlock(); - } else { - vtpm_lock_rdlock(); - } - - if ( !(dmi_res = (VTPM_DMI_RESOURCE *) hashtable_search(vtpm_globals->dmi_map, &dmi)) || - (!dmi_res->connected) ) { - vtpmhandlerlogerror(VTPM_LOG_VTPM, "Attempted access to non-existent or disconnected DMI %d. Aborting...\n", dmi); - status = TPM_BAD_PARAMETER; - // We have no one to reply to, they don't exist. - goto abort_command; - } - - if (tag == VTPM_TAG_REQ) { - - status = vtpm_manager_handle_vtpm_cmd(dmi_res, ord, command_buf, result_buf, is_priv, thread_name); - - } else { // This is not a VTPM Command at all. - if (fw_tpm) { - status = vtpm_manager_handle_tpm_cmd(fw_tx_ipc_h, fw_rx_ipc_h, dmi_res, cmd_header, command_buf, result_buf, thread_name); - - // This means calling the DMI failed, not that the cmd failed in the DMI - // Since the return will be interpretted by a TPM app, all errors are IO_ERRORs to the app - if (status != TPM_SUCCESS) { - status = TPM_IOERROR; - goto abort_with_error; - } - // Unlike all other commands, forwarded commands yield a result_buf that includes the DMI's status. This - // should be forwarded to the caller VM - add_header = FALSE; - } else { - // We are not supposed to forward TPM commands at all. - int i; - vtpmhandlerlogerror(VTPM_LOG_VTPM, "Attempt to use unsupported direct access to TPM.\n"); - vtpmhandlerloginfo(VTPM_LOG_VTPM_DEEP, "Bad Command. dmi:%d, tag:%d, size:%d, ord:%d, Params: ", dmi, tag, in_param_size, ord); - for (i=0; i<cmd_size; i++) - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", in_param[i]); - - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - - status = TPM_FAIL; - goto abort_with_error; - } - - } // end else for is VTPM Command - - // ------------------- Respond to Sender ------------------ - - // Errors while handling responses jump here to reply with error messages - // NOTE: Currently there are no recoverable errors in multi-VM mode. If one - // is added to the code, this ifdef should be removed. - // Also note this is NOT referring to errors in commands, but rather - // this is about I/O errors and such. -#ifndef VTPM_MULTI_VM - abort_with_error: -#endif - - if (add_header) { - // Prepend VTPM header with destination DM stamped - out_param_size = buffer_len(result_buf); - out_message_size = VTPM_COMMAND_HEADER_SIZE_CLT + out_param_size; - reply_size = VTPM_COMMAND_HEADER_SIZE_SRV + out_param_size; - out_message = (BYTE *) malloc (reply_size); - reply = out_message; - - BSG_PackList(out_message, 4, - BSG_TYPE_UINT32, (BYTE *) &dmi, - BSG_TPM_TAG, (BYTE *) &tag, - BSG_TYPE_UINT32, (BYTE *) &out_message_size, - BSG_TPM_RESULT, (BYTE *) &status); - - if (buffer_len(result_buf) > 0) - memcpy(out_message + VTPM_COMMAND_HEADER_SIZE_SRV, result_buf->bytes, out_param_size); - //Note: Send message + dmi_id - } else { - reply = result_buf->bytes; - reply_size = buffer_len(result_buf); - } - size_write = vtpm_ipc_write(tx_ipc_h, (dmi_res ? dmi_res->tx_vtpm_ipc_h : NULL), reply, reply_size ); - if (size_write > 0) { - vtpmhandlerloginfo(VTPM_LOG_VTPM_DEEP, "SENT: 0x"); - for (i=0; i < reply_size; i++) - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", reply[i]); - - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - } else { - vtpmhandlerlogerror(VTPM_LOG_VTPM, "%s had error writing to ipc. Aborting... \n", thread_name); - goto abort_command; - } - free(out_message); out_message=NULL; - - if (size_write < (int)reply_size) { - vtpmhandlerlogerror(VTPM_LOG_VTPM, "%s unable to write full command to ipc (%d/%d)\n", thread_name, size_write, reply_size); - goto abort_command; - } - - // On certain failures an error message cannot be sent. - // This marks the beginning of cleanup in preperation for the next command. - abort_command: - //free buffers - bzero(cmd_header, VTPM_COMMAND_HEADER_SIZE_SRV); - //free(in_param); // This was converted to command_buf. No need to free - buffer_free(result_buf); - buffer_free(command_buf); - - // If we have a write lock, save the manager table - if ((tag == VTPM_TAG_REQ) && (ord & VTPM_PRIV_MASK) && - (VTPM_SaveManagerData() != TPM_SUCCESS) ) { - vtpmhandlerlogerror(VTPM_LOG_VTPM, "ERROR: Unable to save manager data.\n"); - } - - vtpm_lock_unlock(); - add_header = TRUE; // Reset to the default - } // End while(1) - -} - -///////////////////////////////////////////////////////////////////////// -TPM_RESULT vtpm_manager_handle_vtpm_cmd(VTPM_DMI_RESOURCE *dmi_res, - TPM_COMMAND_CODE ord, - buffer_t *command_buf, - buffer_t *result_buf, - BOOL is_priv, - char *thread_name) { - - TPM_RESULT status = TPM_FAIL; - - switch (ord) { - case VTPM_ORD_SAVENVM: - status= VTPM_Handle_Save_NVM(dmi_res, - command_buf, - result_buf); - break; - - case VTPM_ORD_LOADNVM: - status= VTPM_Handle_Load_NVM(dmi_res, - command_buf, - result_buf); - break; - - case VTPM_ORD_TPMCOMMAND: - status= VTPM_Handle_TPM_Command(dmi_res, - command_buf, - result_buf); - break; - - case VTPM_ORD_GET_MIG_KEY: - status = VTPM_Handle_Get_Migration_key(command_buf, - result_buf); - break; - - case VTPM_ORD_LOAD_MIG_KEY: - status = VTPM_Handle_Load_Migration_key(command_buf, - result_buf); - break; - - default: - // Privileged handlers can do maintanance - if (is_priv) { - switch (ord) { - case VTPM_ORD_OPEN: - status = VTPM_Handle_New_DMI(command_buf); - break; - - case VTPM_ORD_CLOSE: - status = VTPM_Handle_Close_DMI(command_buf); - break; - - case VTPM_ORD_DELETE: - status = VTPM_Handle_Delete_DMI(command_buf); - break; - - case VTPM_ORD_MIGRATE_IN: - status = VTPM_Handle_Migrate_In(command_buf, result_buf); - break; - - case VTPM_ORD_MIGRATE_OUT: - status = VTPM_Handle_Migrate_Out(command_buf, result_buf); - break; - - default: - status = TPM_BAD_ORDINAL; - } // switch - } else { // is priv command - - status = TPM_BAD_ORDINAL; - } // inner switch - } // outer switch - - return(status); -} - -///////////////////////////////////////////////////////////////////// -TPM_RESULT vtpm_manager_handle_tpm_cmd(vtpm_ipc_handle_t *tx_ipc_h, - vtpm_ipc_handle_t *rx_ipc_h, - VTPM_DMI_RESOURCE *dmi_res, - BYTE *cmd_header, - buffer_t *param_buf, - buffer_t *result_buf, - char *thread_name) { - - TPM_RESULT status = TPM_FAIL; - UINT32 dmi_dst; - TPM_COMMAND_CODE ord; - TPM_TAG tag_out; - UINT32 dmi_cmd_size, in_param_size, adj_param_size; - BYTE *dmi_cmd, *in_param; - int size_read, size_write, i; - - //// Dom0 can't talk to the BE, so this must be a broken FE/BE or badness - if (dmi_res->dmi_id == VTPM_CTL_DM) { - vtpmhandlerlogerror(VTPM_LOG_VTPM, "Illegal use of TPM command from dom0\n"); - status = TPM_FAIL; - goto abort_with_error; - } - - vtpmhandlerloginfo(VTPM_LOG_VTPM, "Forwarding command to DMI.\n"); - - //Forward TPM CMD stamped with dmi_id to DMI for handling - if (buffer_len(param_buf)) { - dmi_cmd = (BYTE *) malloc(VTPM_COMMAND_HEADER_SIZE_SRV + buffer_len(param_buf)); - dmi_cmd_size = VTPM_COMMAND_HEADER_SIZE_SRV + buffer_len(param_buf); - memcpy(dmi_cmd, cmd_header, VTPM_COMMAND_HEADER_SIZE_SRV); - memcpy(dmi_cmd + VTPM_COMMAND_HEADER_SIZE_SRV, param_buf->bytes, buffer_len(param_buf)); - size_write = vtpm_ipc_write(tx_ipc_h, dmi_res->tx_tpm_ipc_h, dmi_cmd, dmi_cmd_size); - - if (size_write > 0) { - vtpmhandlerloginfo(VTPM_LOG_VTPM_DEEP, "SENT (DMI): 0x"); - for (i=0; i<VTPM_COMMAND_HEADER_SIZE_SRV + buffer_len(param_buf); i++) { - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", dmi_cmd[i]); - } - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - } else { - vtpmhandlerlogerror(VTPM_LOG_VTPM, "Error writing to DMI. Aborting... \n"); - status = TPM_IOERROR; - goto abort_with_error; - } - free(dmi_cmd); - } else { - dmi_cmd_size = VTPM_COMMAND_HEADER_SIZE_SRV; - size_write = vtpm_ipc_write(tx_ipc_h, dmi_res->tx_tpm_ipc_h, cmd_header, VTPM_COMMAND_HEADER_SIZE_SRV ); - if (size_write > 0) { - vtpmhandlerloginfo(VTPM_LOG_VTPM_DEEP, "SENT (DMI): 0x"); - for (i=0; i<VTPM_COMMAND_HEADER_SIZE_SRV; i++) - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", cmd_header[i]); - - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - } else { - vtpmhandlerlogerror(VTPM_LOG_VTPM, "Error writing to DMI. Aborting... \n"); - status = TPM_IOERROR; - goto abort_with_error; - } - } - - if (size_write != (int) dmi_cmd_size) - vtpmhandlerlogerror(VTPM_LOG_VTPM, "Could not write entire command to DMI (%d/%d)\n", size_write, dmi_cmd_size); - - buffer_free(param_buf); - - // Read header for response to TPM command from DMI - size_read = vtpm_ipc_read( rx_ipc_h, dmi_res->rx_tpm_ipc_h, cmd_header, VTPM_COMMAND_HEADER_SIZE_SRV); - if (size_read > 0) { - vtpmhandlerloginfo(VTPM_LOG_VTPM_DEEP, "RECV (DMI): 0x"); - for (i=0; i<size_read; i++) - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", cmd_header[i]); - - } else { - vtpmhandlerlogerror(VTPM_LOG_VTPM, "Error reading from DMI. Aborting... \n"); - status = TPM_IOERROR; - goto abort_with_error; - } - - if (size_read < (int) VTPM_COMMAND_HEADER_SIZE_SRV) { - vtpmhandlerlogerror(VTPM_LOG_VTPM, "Command from DMI shorter than normal header. Aborting...\n"); - status = TPM_IOERROR; - goto abort_with_error; - } - - // Unpack response from DMI for TPM command - BSG_UnpackList(cmd_header, 4, - BSG_TYPE_UINT32, &dmi_dst, - BSG_TPM_TAG, &tag_out, - BSG_TYPE_UINT32, &in_param_size, - BSG_TPM_COMMAND_CODE, &status ); - - // If response has parameters, read them. - // Note that in_param_size is in the client's context - adj_param_size = in_param_size - VTPM_COMMAND_HEADER_SIZE_CLT; - if (adj_param_size > 0) { - in_param = (BYTE *) malloc(adj_param_size); - size_read = vtpm_ipc_read(rx_ipc_h, dmi_res->rx_tpm_ipc_h, in_param, adj_param_size); - if (size_read > 0) { - for (i=0; i<size_read; i++) - vtpmhandlerloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", in_param[i]); - - } else { - vtpmhandlerlogerror(VTPM_LOG_VTPM, "Error reading from BE. Aborting... \n"); - goto abort_with_error; - } - vtpmhandlerloginfomore(VTPM_LOG_VTPM, "\n"); - - if (size_read < (int)adj_param_size) { - vtpmhandlerloginfomore(VTPM_LOG_VTPM, "\n"); - vtpmhandlerlogerror(VTPM_LOG_VTPM, "Command read(%d) from DMI is shorter than header indicates(%d). Aborting...\n", size_read, adj_param_size); - status = TPM_IOERROR; - goto abort_with_error; - } - } else { - in_param = NULL; - vtpmhandlerloginfomore(VTPM_LOG_VTPM, "\n"); - } - - if ( (buffer_init(result_buf, VTPM_COMMAND_HEADER_SIZE_SRV, cmd_header) != TPM_SUCCESS) || - (buffer_append_raw(result_buf, adj_param_size, in_param) != TPM_SUCCESS) ) { - vtpmhandlerlogerror(VTPM_LOG_VTPM, "Failed to setup buffers. Aborting...\n"); - status = TPM_FAIL; - goto abort_with_error; - } - - vtpmhandlerloginfo(VTPM_LOG_VTPM, "Sending DMI's response to guest.\n"); - - status = TPM_SUCCESS; - - abort_with_error: - - return status; -} - diff --git a/tools/vtpm_manager/manager/vtpmd.c b/tools/vtpm_manager/manager/vtpmd.c deleted file mode 100644 index cf58ba3..0000000 --- a/tools/vtpm_manager/manager/vtpmd.c +++ /dev/null @@ -1,371 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// vtpmd.c -// -// Application -// -// =================================================================== - -#include <stdio.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <signal.h> -#include <string.h> -#include <pthread.h> -#include "vtpm_manager.h" -#include "vtpmpriv.h" -#include "tcg.h" -#include "log.h" -#include "vtpm_ipc.h" - -#define TPM_EMULATOR_PATH "/usr/bin/vtpmd" - -#define VTPM_BE_FNAME "/dev/vtpm" -#define VTPM_DUMMY_TX_BE_FNAME "/var/vtpm/fifos/dummy_out.fifo" -#define VTPM_DUMMY_RX_BE_FNAME "/var/vtpm/fifos/dummy_in.fifo" -#define VTPM_TX_TPM_FNAME "/var/vtpm/fifos/tpm_cmd_to_%d.fifo" -#define VTPM_RX_TPM_FNAME "/var/vtpm/fifos/tpm_rsp_from_all.fifo" -#define VTPM_TX_VTPM_FNAME "/var/vtpm/fifos/vtpm_rsp_to_%d.fifo" -#define VTPM_RX_VTPM_FNAME "/var/vtpm/fifos/vtpm_cmd_from_all.fifo" -#define VTPM_TX_HP_FNAME "/var/vtpm/fifos/to_console.fifo" -#define VTPM_RX_HP_FNAME "/var/vtpm/fifos/from_console.fifo" - -#define VTPM_TYPE_PVM_STRING "pvm" -#define VTPM_TYPE_HVM_STRING "hvm" - -struct vtpm_thread_params_s { - vtpm_ipc_handle_t *tx_ipc_h; - vtpm_ipc_handle_t *rx_ipc_h; - BOOL fw_tpm; - vtpm_ipc_handle_t *fw_tx_ipc_h; - vtpm_ipc_handle_t *fw_rx_ipc_h; - BOOL is_priv; - char *thread_name; -}; - -// This is needed to all extra_close_dmi to close this to prevent a -// broken pipe when no DMIs are left. -static vtpm_ipc_handle_t *g_rx_tpm_ipc_h; - -void *vtpm_manager_thread(void *arg_void) { - TPM_RESULT *status = (TPM_RESULT *) malloc(sizeof(TPM_RESULT) ); - struct vtpm_thread_params_s *arg = (struct vtpm_thread_params_s *) arg_void; - - *status = VTPM_Manager_Handler(arg->tx_ipc_h, arg->rx_ipc_h, - arg->fw_tpm, arg->fw_tx_ipc_h, arg->fw_rx_ipc_h, - arg->is_priv, arg->thread_name); - - return (status); -} - - -void signal_handler(int reason) { - if (pthread_equal(pthread_self(), vtpm_globals->master_pid)) { - vtpmloginfo(VTPM_LOG_VTPM, "VTPM Manager shutting down for signal %d.\n", reason); - } else { - // For old Linux Thread machines, signals are delivered to each thread. Deal with them. - vtpmloginfo(VTPM_LOG_VTPM, "Child shutting down\n"); - pthread_exit(NULL); - } - - VTPM_Stop_Manager(); - exit(-1); -} - -struct sigaction ctl_c_handler; - -TPM_RESULT VTPM_New_DMI_Extra(VTPM_DMI_RESOURCE *dmi_res, BYTE vm_type, BYTE startup_mode) { - - TPM_RESULT status = TPM_SUCCESS; - int fh; - char dmi_id_str[11]; // UINT32s are up to 10 digits + NULL - char *tx_vtpm_name, *tx_tpm_name, *vm_type_string; - struct stat file_info; - - if (dmi_res->dmi_id == VTPM_CTL_DM) { - dmi_res->tx_tpm_ipc_h = NULL; - dmi_res->rx_tpm_ipc_h = NULL; - dmi_res->tx_vtpm_ipc_h = NULL; - dmi_res->rx_vtpm_ipc_h = NULL; - } else { - // Create a pair of fifo pipes - dmi_res->rx_tpm_ipc_h = NULL; - dmi_res->rx_vtpm_ipc_h = NULL; - - if ( ((dmi_res->tx_tpm_ipc_h = (vtpm_ipc_handle_t *) malloc (sizeof(vtpm_ipc_handle_t))) == NULL ) || - ((dmi_res->tx_vtpm_ipc_h =(vtpm_ipc_handle_t *) malloc (sizeof(vtpm_ipc_handle_t))) == NULL ) || - ((tx_tpm_name = (char *) malloc(11 + strlen(VTPM_TX_TPM_FNAME))) == NULL ) || - ((tx_vtpm_name =(char *) malloc(11 + strlen(VTPM_TX_VTPM_FNAME))) == NULL) ) { - status =TPM_RESOURCES; - goto abort_egress; - } - - sprintf(tx_tpm_name, VTPM_TX_TPM_FNAME, (uint32_t) dmi_res->dmi_id); - sprintf(tx_vtpm_name, VTPM_TX_VTPM_FNAME, (uint32_t) dmi_res->dmi_id); - - if ( (vtpm_ipc_init(dmi_res->tx_tpm_ipc_h, tx_tpm_name, O_WRONLY | O_NONBLOCK, TRUE) != 0) || - (vtpm_ipc_init(dmi_res->tx_vtpm_ipc_h, tx_vtpm_name, O_WRONLY, TRUE) != 0) ) { //FIXME: O_NONBLOCK? - status = TPM_IOERROR; - goto abort_egress; - } - - // Measure DMI - // FIXME: This will measure DMI. Until then use a fixed DMI_Measurement value - // Also, this mechanism is specific to 1 VM architecture. - /* - fh = open(TPM_EMULATOR_PATH, O_RDONLY); - stat_ret = fstat(fh, &file_stat); - if (stat_ret == 0) - dmi_size = file_stat.st_size; - else { - vtpmlogerror(VTPM_LOG_VTPM, "Could not open vtpmd!!\n"); - status = TPM_IOERROR; - goto abort_egress; - } - dmi_buffer - */ - memset(&dmi_res->DMI_measurement, 0xcc, sizeof(TPM_DIGEST)); - - if (vm_type == VTPM_TYPE_PVM) - vm_type_string = (BYTE *)&VTPM_TYPE_PVM_STRING; - else - vm_type_string = (BYTE *)&VTPM_TYPE_HVM_STRING; - - // Launch DMI - sprintf(dmi_id_str, "%d", (int) dmi_res->dmi_id); -#ifdef MANUAL_DM_LAUNCH - vtpmlogerror(VTPM_LOG_VTPM, "Manually start VTPM with dmi=%s now.\n", dmi_id_str); - dmi_res->dmi_pid = 0; -#else - pid_t pid = fork(); - - if (pid == -1) { - vtpmlogerror(VTPM_LOG_VTPM, "Could not fork to launch vtpm\n"); - status = TPM_RESOURCES; - goto abort_egress; - } else if (pid == 0) { - switch (startup_mode) { - case TPM_ST_CLEAR: - execl (TPM_EMULATOR_PATH, "vtpmd", "clear", vm_type_string, dmi_id_str, NULL); - break; - case TPM_ST_STATE: - execl (TPM_EMULATOR_PATH, "vtpmd", "save", vm_type_string, dmi_id_str, NULL); - break; - case TPM_ST_DEACTIVATED: - execl (TPM_EMULATOR_PATH, "vtpmd", "deactivated", vm_type_string, dmi_id_str, NULL); - break; - default: - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - // Returning from these at all is an error. - vtpmlogerror(VTPM_LOG_VTPM, "Could not exec to launch vtpm\n"); - } else { - dmi_res->dmi_pid = pid; - vtpmloginfo(VTPM_LOG_VTPM, "Launching DMI on PID = %d\n", pid); - } -#endif // MANUAL_DM_LAUNCH - - } // If DMI = VTPM_CTL_DM - status = TPM_SUCCESS; - -abort_egress: - return (status); -} - -TPM_RESULT VTPM_Close_DMI_Extra(VTPM_DMI_RESOURCE *dmi_res) { - TPM_RESULT status = TPM_SUCCESS; - - if (vtpm_globals->connected_dmis == 0) { - // No more DMI's connected. Close fifo to prevent a broken pipe. - // This is hackish. Need to think of another way. - vtpm_ipc_close(g_rx_tpm_ipc_h); - } - - - if (dmi_res->dmi_id != VTPM_CTL_DM) { - vtpm_ipc_close(dmi_res->tx_tpm_ipc_h); - vtpm_ipc_close(dmi_res->tx_vtpm_ipc_h); - - free(dmi_res->tx_tpm_ipc_h->name); - free(dmi_res->tx_vtpm_ipc_h->name); - -#ifndef MANUAL_DM_LAUNCH - if (dmi_res->dmi_id != VTPM_CTL_DM) { - if (dmi_res->dmi_pid != 0) { - vtpmloginfo(VTPM_LOG_VTPM, "Killing dmi on pid %d.\n", dmi_res->dmi_pid); - if (kill(dmi_res->dmi_pid, SIGKILL) !=0) { - vtpmloginfo(VTPM_LOG_VTPM, "DMI on pid %d is already dead.\n", dmi_res->dmi_pid); - } else if (waitpid(dmi_res->dmi_pid, NULL, 0) != dmi_res->dmi_pid) { - vtpmlogerror(VTPM_LOG_VTPM, "DMI on pid %d failed to stop.\n", dmi_res->dmi_pid); - status = TPM_FAIL; - } - } else { - vtpmlogerror(VTPM_LOG_VTPM, "Could not kill dmi because it's pid was 0.\n"); - status = TPM_FAIL; - } - } -#endif - - } //endif ! dom0 - return status; -} - - -int main(int argc, char **argv) { - vtpm_ipc_handle_t *tx_be_ipc_h, *rx_be_ipc_h, rx_tpm_ipc_h, rx_vtpm_ipc_h, tx_hp_ipc_h, rx_hp_ipc_h; - struct vtpm_thread_params_s be_thread_params, dmi_thread_params, hp_thread_params; - pthread_t be_thread, dmi_thread, hp_thread; - -#ifdef DUMMY_BACKEND - vtpm_ipc_handle_t tx_dummy_ipc_h, rx_dummy_ipc_h; -#else - vtpm_ipc_handle_t real_be_ipc_h; -#endif - - vtpmloginfo(VTPM_LOG_VTPM, "Starting VTPM.\n"); - - // -------------------- Initialize Manager ----------------- - if (VTPM_Init_Manager() != TPM_SUCCESS) { - vtpmlogerror(VTPM_LOG_VTPM, "Closing vtpmd due to error during startup.\n"); - return -1; - } - - // -------------------- Setup Ctrl+C Handlers -------------- - ctl_c_handler.sa_handler = signal_handler; - sigemptyset(&ctl_c_handler.sa_mask); - ctl_c_handler.sa_flags = 0; - - if (sigaction(SIGINT, &ctl_c_handler, NULL) == -1) - vtpmlogerror(VTPM_LOG_VTPM, "Could not install SIGINT handler. Ctl+break will not stop manager gently.\n"); - - // For easier debuggin with gdb - if (sigaction(SIGHUP, &ctl_c_handler, NULL) == -1) - vtpmlogerror(VTPM_LOG_VTPM, "Could not install SIGHUP handler. Ctl+break will not stop manager gently.\n"); - - sigset_t sig_mask; - sigemptyset(&sig_mask); - sigaddset(&sig_mask, SIGPIPE); - sigprocmask(SIG_BLOCK, &sig_mask, NULL); - - // ------------------- Set up file ipc structures ---------- -#ifdef DUMMY_BACKEND - if ( (vtpm_ipc_init(&tx_dummy_ipc_h, VTPM_DUMMY_TX_BE_FNAME, O_RDWR, TRUE) != 0) || - (vtpm_ipc_init(&rx_dummy_ipc_h, VTPM_DUMMY_RX_BE_FNAME, O_RDWR, TRUE) != 0) ) { - - vtpmlogerror(VTPM_LOG_VTPM, "Unable to create Dummy BE FIFOs.\n"); - exit(-1); - } - - tx_be_ipc_h = &tx_dummy_ipc_h; - rx_be_ipc_h = &rx_dummy_ipc_h; -#else - vtpm_ipc_init(&real_be_ipc_h, VTPM_BE_FNAME, O_RDWR, FALSE); - - tx_be_ipc_h = &real_be_ipc_h; - rx_be_ipc_h = &real_be_ipc_h; -#endif - - if ( (vtpm_ipc_init(&rx_tpm_ipc_h, VTPM_RX_TPM_FNAME, O_RDONLY, TRUE) != 0) || - (vtpm_ipc_init(&rx_vtpm_ipc_h, VTPM_RX_VTPM_FNAME, O_RDWR, TRUE) != 0) || //FIXME: O_RDONLY? - (vtpm_ipc_init(&tx_hp_ipc_h, VTPM_TX_HP_FNAME, O_RDWR, TRUE) != 0) || - (vtpm_ipc_init(&rx_hp_ipc_h, VTPM_RX_HP_FNAME, O_RDWR, TRUE) != 0) ) { - vtpmlogerror(VTPM_LOG_VTPM, "Unable to create initial FIFOs.\n"); - exit(-1); - } - - g_rx_tpm_ipc_h = &rx_tpm_ipc_h; - - // -------------------- Set up thread params ------------- - - be_thread_params.tx_ipc_h = tx_be_ipc_h; - be_thread_params.rx_ipc_h = rx_be_ipc_h; - be_thread_params.fw_tpm = TRUE; - be_thread_params.fw_tx_ipc_h = NULL; - be_thread_params.fw_rx_ipc_h = &rx_tpm_ipc_h; - be_thread_params.is_priv = FALSE; - be_thread_params.thread_name = "Backend Listener"; - - dmi_thread_params.tx_ipc_h = NULL; - dmi_thread_params.rx_ipc_h = &rx_vtpm_ipc_h; - dmi_thread_params.fw_tpm = FALSE; - dmi_thread_params.fw_tx_ipc_h = NULL; - dmi_thread_params.fw_rx_ipc_h = NULL; - dmi_thread_params.is_priv = FALSE; - dmi_thread_params.thread_name = "VTPM Listener"; - - hp_thread_params.tx_ipc_h = &tx_hp_ipc_h; - hp_thread_params.rx_ipc_h = &rx_hp_ipc_h; - hp_thread_params.fw_tpm = FALSE; - hp_thread_params.fw_tx_ipc_h = NULL; - hp_thread_params.fw_rx_ipc_h = NULL; - hp_thread_params.is_priv = TRUE; - hp_thread_params.thread_name = "Hotplug Listener"; - - // --------------------- Launch Threads ----------------- - - vtpm_lock_init(); - - vtpm_globals->master_pid = pthread_self(); - - if (pthread_create(&be_thread, NULL, vtpm_manager_thread, &be_thread_params) != 0) { - vtpmlogerror(VTPM_LOG_VTPM, "Failed to launch BE Thread.\n"); - exit(-1); - } - - if (pthread_create(&dmi_thread, NULL, vtpm_manager_thread, &dmi_thread_params) != 0) { - vtpmlogerror(VTPM_LOG_VTPM, "Failed to launch DMI Thread.\n"); - exit(-1); - } - - - if (pthread_create(&hp_thread, NULL, vtpm_manager_thread, &hp_thread_params) != 0) { - vtpmlogerror(VTPM_LOG_VTPM, "Failed to launch HP Thread.\n"); - exit(-1); - } - - //Join the other threads until exit time. - pthread_join(be_thread, NULL); - pthread_join(dmi_thread, NULL); - pthread_join(hp_thread, NULL); - - vtpmlogerror(VTPM_LOG_VTPM, "VTPM Manager shut down unexpectedly.\n"); - - VTPM_Stop_Manager(); - vtpm_lock_destroy(); - return 0; -} diff --git a/tools/vtpm_manager/manager/vtpmpriv.h b/tools/vtpm_manager/manager/vtpmpriv.h deleted file mode 100644 index 41e8d2d..0000000 --- a/tools/vtpm_manager/manager/vtpmpriv.h +++ /dev/null @@ -1,186 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// vtpmpriv.h -// -// Structures and functions private to the manager -// -// ================================================================== - -#ifndef __VTPMPRIV_H__ -#define __VTPMPRIV_H__ - -#include "vtpm_manager.h" -#include "tcg.h" -#include "tcs.h" -#include "buffer.h" -#include "crypto.h" -#include "vtpm_ipc.h" - -#define VTPM_MANAGER_GEN 2 // This is incremented when the manager's table - // is changed. It's used for backwards compatability - -#define STATE_FILE "/var/vtpm/VTPM" -#define DMI_NVM_FILE "/var/vtpm/vtpm_dm_%d.data" -#define VTPM_CTL_DM 0 - -// ------------------------ Private Structures ----------------------- -typedef struct VTPM_DMI_RESOURCE_T { - // I/O info for Manager to talk to DMI's and controllers - vtpm_ipc_handle_t *tx_vtpm_ipc_h; // TX VTPM Results to DMI - vtpm_ipc_handle_t *rx_vtpm_ipc_h; // RX VTPM Commands from DMI - vtpm_ipc_handle_t *tx_tpm_ipc_h; // TX TPM Commands to DMI - vtpm_ipc_handle_t *rx_tpm_ipc_h; // RX TPM Results from DMI - -#ifndef VTPM_MULTI_VM - pid_t dmi_pid; -#endif - - // Non-persistent Information - bool connected; - UINT32 dmi_domain_id; - TCS_CONTEXT_HANDLE TCSContext; // TCS Handle - char *NVMLocation; // NULL term string indicating location - // of NVM. - // Persistent Information about DMI - UINT32 dmi_id; - BYTE dmi_type; - TPM_DIGEST NVM_measurement; // Equal to the SHA1 of the blob - TPM_DIGEST DMI_measurement; // Correct measurement of the owning DMI -} VTPM_DMI_RESOURCE; - -typedef struct tdVTPM_MIGKEY_LIST { - UINT32 name_size; - BYTE *name; // Name of destination (IP addr, domain name, etc) - CRYPTO_INFO key; - struct tdVTPM_MIGKEY_LIST *next; -} VTPM_MIGKEY_LIST; - - -typedef struct tdVTPM_GLOBALS { - // Non-persistent data -#ifndef VTPM_MULTI_VM - pid_t master_pid; -#endif - - int connected_dmis; // To close guest_rx when no dmis are connected - - struct hashtable *dmi_map; // Table of all DMI's known indexed by persistent instance # - VTPM_MIGKEY_LIST *mig_keys; // Table of migration keys - // Currently keys are loaded at migration time, - // TODO: Make VTPM man store a keys persistently - // and update script to check if key is needed - // before fetching it. - - TCS_CONTEXT_HANDLE manager_tcs_handle; // TCS Handle used by manager - TPM_HANDLE storageKeyHandle; // Key used by persistent store - CRYPTO_INFO storageKey; // For software encryption - CRYPTO_INFO bootKey; // For saving table - TCS_AUTH keyAuth; // OIAP session for storageKey - - // Persistent Data - TPM_AUTHDATA owner_usage_auth; // OwnerAuth of real TPM - buffer_t storageKeyWrap; // Wrapped copy of storageKey - TPM_AUTHDATA srk_usage_auth; - TPM_AUTHDATA storage_key_usage_auth; - - buffer_t bootKeyWrap; // Wrapped copy of boot key - -}VTPM_GLOBALS; - -// --------------------------- Global Values -------------------------- -extern VTPM_GLOBALS *vtpm_globals; // Key info and DMI states -extern const TPM_AUTHDATA SRK_AUTH; // SRK Well Known Auth Value - -// ********************** VTPM Functions ************************* -TPM_RESULT VTPM_Init_Manager(); // Start VTPM Service -void VTPM_Stop_Manager(); // Stop VTPM Service -TPM_RESULT VTPM_Manager_Handler(vtpm_ipc_handle_t *tx_ipc_h, - vtpm_ipc_handle_t *rx_ipc_h, - BOOL fw_tpm, // Should forward TPM cmds - vtpm_ipc_handle_t *fw_tx_ipc_h, - vtpm_ipc_handle_t *fw_rx_ipc_h, - BOOL is_priv, - char *client_name); - -// ********************** Command Handler Prototypes *********************** - -TPM_RESULT VTPM_Handle_Load_NVM( VTPM_DMI_RESOURCE *myDMI, - const buffer_t *inbuf, - buffer_t *outbuf); - -TPM_RESULT VTPM_Handle_Save_NVM( VTPM_DMI_RESOURCE *myDMI, - const buffer_t *inbuf, - buffer_t *outbuf); - -TPM_RESULT VTPM_Handle_TPM_Command( VTPM_DMI_RESOURCE *dmi, - buffer_t *inbuf, - buffer_t *outbuf); - -TPM_RESULT VTPM_Handle_New_DMI(const buffer_t *param_buf); - -TPM_RESULT VTPM_Handle_Close_DMI(const buffer_t *param_buf); - -TPM_RESULT VTPM_Handle_Delete_DMI(const buffer_t *param_buf); - -TPM_RESULT VTPM_Handle_Migrate_In( const buffer_t *param_buf, - buffer_t *result_buf); - -TPM_RESULT VTPM_Handle_Migrate_Out ( const buffer_t *param_buf, - buffer_t *result_buf); - -TPM_RESULT VTPM_Handle_Get_Migration_key( const buffer_t *param_buf, - buffer_t *result_buf); - -TPM_RESULT VTPM_SaveManagerData(void); -TPM_RESULT VTPM_LoadManagerData(void); - -TPM_RESULT VTPM_New_DMI_Extra(VTPM_DMI_RESOURCE *dmi_res, BYTE vm_type, BYTE startup_mode); - -TPM_RESULT VTPM_Close_DMI_Extra(VTPM_DMI_RESOURCE *dmi_res); - -// Helper functions -TPM_RESULT close_dmi(VTPM_DMI_RESOURCE *dmi_res); -TPM_RESULT init_dmi(UINT32 dmi_id, BYTE type, VTPM_DMI_RESOURCE **dmi_res); - -TPM_RESULT envelope_encrypt(const buffer_t *inbuf, - CRYPTO_INFO *asymkey, - buffer_t *sealed_data); - -TPM_RESULT envelope_decrypt(const buffer_t *cipher, - TCS_CONTEXT_HANDLE TCSContext, - TPM_HANDLE keyHandle, - const TPM_AUTHDATA *key_usage_auth, - buffer_t *unsealed_data); - -#endif // __VTPMPRIV_H__ diff --git a/tools/vtpm_manager/manager/vtsp.c b/tools/vtpm_manager/manager/vtsp.c deleted file mode 100644 index fc8a66f..0000000 --- a/tools/vtpm_manager/manager/vtsp.c +++ /dev/null @@ -1,1042 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// vtsp.c -// -// Higher level interface to TCS for use in service. -// -// ================================================================== - -#include <string.h> -#include "tcg.h" -#include "tcs.h" -#include "bsg.h" -#include "log.h" -#include "crypto.h" -#include "vtsp.h" -#include "buffer.h" - -#define RSA_KEY_SIZE 0x0800 - -/*********************************************************************************** - * GenerateAuth: Generate authorization info to be sent back to application - * - * Parameters: outParamDigestText The concatenation of output parameters to be SHA1ed - * outParamDigestTextSize Size of inParamDigestText - * HMACkey Key to be used for HMACing - * For OIAP use key.authUsage or PersistStore.ownerAuth - * For OSAP use shared secret - * pAuth Authorization information from the application - * - * Return: TPM_SUCCESS Authorization data created - * TPM_AUTHFAIL Invalid (NULL) HMACkey presented for OSAP - *************************************************************************************/ -TPM_RESULT GenerateAuth( /*[IN]*/ const BYTE *inParamDigestText, - /*[IN]*/ UINT32 inParamDigestTextSize, - /*[IN]*/ const TPM_SECRET *HMACkey, - /*[IN,OUT]*/ TCS_AUTH *auth) { - - if (inParamDigestText == NULL || auth == NULL) - return (TPM_AUTHFAIL); - else { - - //Generate new OddNonce - Crypto_GetRandom(auth->NonceOdd.nonce, sizeof(TPM_NONCE)); - - // Create SHA1 inParamDigest - TPM_DIGEST inParamDigest; - Crypto_SHA1Full(inParamDigestText, inParamDigestTextSize, (BYTE *) &inParamDigest); - - // Create HMAC text. (Concat inParamsDigest with inAuthSetupParams). - BYTE hmacText[sizeof(TPM_DIGEST) + (2 * sizeof(TPM_NONCE)) + sizeof(BOOL)]; - - BSG_PackList( hmacText, 4, - BSG_TPM_DIGEST, &inParamDigest, - BSG_TPM_NONCE, &(auth->NonceEven), - BSG_TPM_NONCE, &(auth->NonceOdd), - BSG_TYPE_BOOL, &(auth->fContinueAuthSession) ); - - Crypto_HMAC((BYTE *) hmacText, sizeof(hmacText), (BYTE *) HMACkey, sizeof(TPM_DIGEST), (BYTE *) &(auth->HMAC)); - - return(TPM_SUCCESS); - - } -} - -/*********************************************************************************** - * VerifyAuth: Verify the authdata for a command requiring authorization - * - * Parameters: inParamDigestText The concatenation of parameters to be SHA1ed - * inParamDigestTextSize Size of inParamDigestText - * authDataUsage AuthDataUsage for the Entity being used - * Key->authDataUsage or TPM_AUTH_OWNER - * HMACkey Key to be used for HMACing - * For OIAP use key.authUsage or PersistStore.ownerAuth - * For OSAP use NULL (It will be aquired from the Auth Session) - * If unknown (default), assume OIAP - * sessionAuth A TCS_AUTH info for the session - * pAuth Authorization information from the application - * hContext If specified, on failed Auth, VerifyAuth will - * generate a new OIAP session in place of themselves - * destroyed session. - * - * Return: TPM_SUCCESS Authorization Verified - * TPM_AUTHFAIL Authorization Failed - * TPM_FAIL Failure during SHA1 routines - *************************************************************************************/ -TPM_RESULT VerifyAuth( /*[IN]*/ const BYTE *outParamDigestText, - /*[IN]*/ UINT32 outParamDigestTextSize, - /*[IN]*/ const TPM_SECRET *HMACkey, - /*[IN,OUT]*/ TCS_AUTH *auth, - /*[IN]*/ TCS_CONTEXT_HANDLE hContext) { - if (outParamDigestText == NULL || auth == NULL) - return (TPM_AUTHFAIL); - - - // Create SHA1 inParamDigest - TPM_DIGEST outParamDigest; - Crypto_SHA1Full(outParamDigestText, outParamDigestTextSize, (BYTE *) &outParamDigest); - - // Create HMAC text. (Concat inParamsDigest with inAuthSetupParams). - TPM_DIGEST hm; - BYTE hmacText[sizeof(TPM_DIGEST) + (2 * sizeof(TPM_NONCE)) + sizeof(BOOL)]; - - BSG_PackList( hmacText, 4, - BSG_TPM_DIGEST, &outParamDigest, - BSG_TPM_NONCE, &(auth->NonceEven), - BSG_TPM_NONCE, &(auth->NonceOdd), - BSG_TYPE_BOOL, &(auth->fContinueAuthSession) ); - - Crypto_HMAC((BYTE *) hmacText, sizeof(hmacText), - (BYTE *) HMACkey, sizeof(TPM_DIGEST), (BYTE *) &hm); - - // Compare correct HMAC with provided one. - if (memcmp (&hm, &(auth->HMAC), sizeof(TPM_DIGEST)) == 0) { // 0 indicates equality - if (!auth->fContinueAuthSession) - vtpmloginfo(VTPM_LOG_VTSP_DEEP, "Auth Session: 0x%x closed by TPM by fContinue=0.\n", auth->AuthHandle); - - return (TPM_SUCCESS); - } else { - // If specified, reconnect the OIAP session. - // NOTE: This only works for TCS's that never have a 0 context. - if (hContext) { - vtpmloginfo(VTPM_LOG_VTSP_DEEP, "Auth Session: 0x%x closed by TPM due to failure.\n", auth->AuthHandle); - VTSP_OIAP( hContext, auth); - } - return (TPM_AUTHFAIL); - } -} - -TPM_RESULT VTSP_OIAP(const TCS_CONTEXT_HANDLE hContext, - TCS_AUTH *auth) { - - vtpmloginfo(VTPM_LOG_VTSP, "OIAP.\n"); - TPM_RESULT status = TPM_SUCCESS; - TPMTRYRETURN( TCSP_OIAP(hContext, - &auth->AuthHandle, - &auth->NonceEven) ); - - memset(&auth->HMAC, 0, sizeof(TPM_DIGEST)); - auth->fContinueAuthSession = FALSE; - - vtpmloginfo(VTPM_LOG_VTSP_DEEP, "Auth Session: 0x%x opened by TPM_OIAP.\n", auth->AuthHandle); - goto egress; - - abort_egress: - - egress: - - return status; -} - -TPM_RESULT VTSP_OSAP(const TCS_CONTEXT_HANDLE hContext, - const TPM_ENTITY_TYPE entityType, - const UINT32 entityValue, - const TPM_AUTHDATA *usageAuth, - TPM_SECRET *sharedSecret, - TCS_AUTH *auth) { - - vtpmloginfo(VTPM_LOG_VTSP, "OSAP.\n"); - TPM_RESULT status = TPM_SUCCESS; - TPM_NONCE nonceEvenOSAP, nonceOddOSAP; - - Crypto_GetRandom((BYTE *) &nonceOddOSAP, sizeof(TPM_NONCE) ); - - TPMTRYRETURN( TCSP_OSAP( hContext, - entityType, - entityValue, - nonceOddOSAP, - &auth->AuthHandle, - &auth->NonceEven, - &nonceEvenOSAP) ); - - // Calculating Session Secret - BYTE sharedSecretText[TPM_DIGEST_SIZE * 2]; - - BSG_PackList( sharedSecretText, 2, - BSG_TPM_NONCE, &nonceEvenOSAP, - BSG_TPM_NONCE, &nonceOddOSAP); - - Crypto_HMAC(sharedSecretText, sizeof(sharedSecretText), (BYTE *) usageAuth, TPM_DIGEST_SIZE, (BYTE *) sharedSecret); - - memset(&auth->HMAC, 0, sizeof(TPM_DIGEST)); - auth->fContinueAuthSession = FALSE; - - vtpmloginfo(VTPM_LOG_VTSP_DEEP, "Auth Session: 0x%x opened by TPM_OSAP.\n", auth->AuthHandle); - - goto egress; - - abort_egress: - - egress: - - return status; -} - - -TPM_RESULT VTSP_TerminateHandle(const TCS_CONTEXT_HANDLE hContext, - const TCS_AUTH *auth) { - - vtpmloginfo(VTPM_LOG_VTSP, "Terminate Handle.\n"); - TPM_RESULT status = TPM_SUCCESS; - TPMTRYRETURN( TCSP_TerminateHandle(hContext, auth->AuthHandle) ); - - vtpmloginfo(VTPM_LOG_VTSP_DEEP, "Auth Session: 0x%x closed by TPM_TerminateHandle.\n", auth->AuthHandle); - goto egress; - - abort_egress: - - egress: - - return status; -} - - -TPM_RESULT VTSP_ReadPubek( const TCS_CONTEXT_HANDLE hContext, - CRYPTO_INFO *crypto_info) { - - TPM_RESULT status; - TPM_NONCE antiReplay; - TPM_DIGEST checksum; - BYTE *pubEKtext; - UINT32 pubEKtextsize; - - vtpmloginfo(VTPM_LOG_VTSP, "Reading Public EK.\n"); - - // GenerateAuth new nonceOdd - Crypto_GetRandom(&antiReplay, sizeof(TPM_NONCE) ); - - - TPMTRYRETURN( TCSP_ReadPubek( hContext, - antiReplay, - &pubEKtextsize, - &pubEKtext, - &checksum) ); - - - // Extract the remaining output parameters - TPM_PUBKEY pubEK; - - BSG_Unpack(BSG_TPM_PUBKEY, pubEKtext, (BYTE *) &pubEK); - - // Build CryptoInfo for the bindingKey - TPM_RSA_KEY_PARMS rsaKeyParms; - - BSG_Unpack(BSG_TPM_RSA_KEY_PARMS, - pubEK.algorithmParms.parms, - &rsaKeyParms); - - Crypto_RSABuildCryptoInfoPublic(rsaKeyParms.exponentSize, - rsaKeyParms.exponent, - pubEK.pubKey.keyLength, - pubEK.pubKey.key, - crypto_info); - - // Destroy rsaKeyParms - BSG_Destroy(BSG_TPM_RSA_KEY_PARMS, &rsaKeyParms); - - // Set encryption scheme - crypto_info->encScheme = CRYPTO_ES_RSAESOAEP_SHA1_MGF1; - //crypto_info->encScheme = pubEK.algorithmParms.encScheme; - crypto_info->algorithmID = pubEK.algorithmParms.algorithmID; - - goto egress; - - abort_egress: - - egress: - - return status; -} - -TPM_RESULT VTSP_TakeOwnership( const TCS_CONTEXT_HANDLE hContext, - const TPM_AUTHDATA *ownerAuth, - const TPM_AUTHDATA *srkAuth, - CRYPTO_INFO *ek_cryptoInfo, - TCS_AUTH *auth) { - - vtpmloginfo(VTPM_LOG_VTSP, "Taking Ownership of TPM.\n"); - - TPM_RESULT status = TPM_SUCCESS; - TPM_COMMAND_CODE command = TPM_ORD_TakeOwnership; - TPM_PROTOCOL_ID proto_id = TPM_PID_OWNER; - BYTE *new_srk; - - BYTE *paramText; // Digest to make Auth. - UINT32 paramTextSize; - - // vars for srkpubkey parameter - TPM_KEY srkPub; - TPM_KEY_PARMS srkKeyInfo = {TPM_ALG_RSA, TPM_ES_RSAESOAEP_SHA1_MGF1, TPM_SS_NONE, 12, 0}; - BYTE srkRSAkeyInfo[12] = { 0x00, 0x00, (RSA_KEY_SIZE >> 8), 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}; - srkKeyInfo.parms = (BYTE *) &srkRSAkeyInfo; - - struct pack_buf_t srkText; - - //These values are accurate for an enc(AuthData). - struct pack_buf_t encOwnerAuth, encSrkAuth; - - encOwnerAuth.data = (BYTE *)malloc(sizeof(BYTE) * 256); - encSrkAuth.data = (BYTE *)malloc(sizeof(BYTE) * 256); - - if (encOwnerAuth.data == NULL || encSrkAuth.data == NULL) { - vtpmloginfo(VTPM_LOG_VTSP, "Could not malloc encrypted auths.\n"); - status = TPM_RESOURCES; - goto abort_egress; - } - - Crypto_RSAEnc(ek_cryptoInfo, sizeof(TPM_SECRET), (BYTE *) ownerAuth, &encOwnerAuth.size, encOwnerAuth.data); - Crypto_RSAEnc(ek_cryptoInfo, sizeof(TPM_SECRET), (BYTE *) srkAuth, &encSrkAuth.size, encSrkAuth.data); - - - // Build srk public key struct - srkPub.ver = TPM_STRUCT_VER_1_1; - srkPub.keyUsage = TPM_KEY_STORAGE; - srkPub.keyFlags = 0x00; - srkPub.authDataUsage = TPM_AUTH_ALWAYS; - memcpy(&srkPub.algorithmParms, &srkKeyInfo, sizeof(TPM_KEY_PARMS)); - srkPub.PCRInfoSize = 0; - srkPub.PCRInfo = 0; - srkPub.pubKey.keyLength= 0; - srkPub.encDataSize = 0; - - srkText.data = (BYTE *) malloc(sizeof(BYTE) * TCPA_MAX_BUFFER_LENGTH); - srkText.size = BSG_Pack(BSG_TPM_KEY, (BYTE *) &srkPub, srkText.data); - - paramText = (BYTE *) malloc(sizeof(BYTE) * TCPA_MAX_BUFFER_LENGTH); - - paramTextSize = BSG_PackList(paramText, 5, - BSG_TPM_COMMAND_CODE,&command, - BSG_TPM_PROTOCOL_ID, &proto_id, - BSG_TPM_SIZE32_DATA, &encOwnerAuth, - BSG_TPM_SIZE32_DATA, &encSrkAuth, - BSG_TPM_KEY, &srkPub); - - TPMTRYRETURN( GenerateAuth( paramText, paramTextSize, ownerAuth, auth) ); - - new_srk = srkText.data; - TPMTRYRETURN( TCSP_TakeOwnership ( hContext, - proto_id, - encOwnerAuth.size, - encOwnerAuth.data, - encSrkAuth.size, - encSrkAuth.data, - &srkText.size, - &new_srk, - auth ) ); - - - paramTextSize = BSG_PackList(paramText, 2, - BSG_TPM_RESULT, &status, - BSG_TPM_COMMAND_CODE, &command); - memcpy(paramText + paramTextSize, new_srk, srkText.size); - paramTextSize += srkText.size; - - - TPMTRYRETURN( VerifyAuth( paramText, paramTextSize, - ownerAuth, auth, - hContext) ); - - goto egress; - - abort_egress: - - egress: - - free(srkText.data); - free(encSrkAuth.data); - free(encOwnerAuth.data); - free(paramText); - - TCS_FreeMemory(hContext, new_srk); - - return status; -} - -TPM_RESULT VTSP_DisablePubekRead( const TCS_CONTEXT_HANDLE hContext, - const TPM_AUTHDATA *ownerAuth, - TCS_AUTH *auth) { - - vtpmloginfo(VTPM_LOG_VTSP, "Disabling Pubek Read.\n"); - - TPM_RESULT status = TPM_SUCCESS; - TPM_COMMAND_CODE command = TPM_ORD_DisablePubekRead; - - BYTE *paramText; // Digest to make Auth. - UINT32 paramTextSize; - - paramText = (BYTE *) malloc(sizeof(BYTE) * TCPA_MAX_BUFFER_LENGTH); - - paramTextSize = BSG_PackList(paramText, 1, - BSG_TPM_COMMAND_CODE, &command); - - TPMTRYRETURN( GenerateAuth( paramText, paramTextSize, - ownerAuth, auth) ); - - // Call TCS - TPMTRYRETURN( TCSP_DisablePubekRead ( hContext, // in - auth) ); - - // Verify Auth - paramTextSize = BSG_PackList(paramText, 2, - BSG_TPM_RESULT, &status, - BSG_TPM_COMMAND_CODE, &command); - - TPMTRYRETURN( VerifyAuth( paramText, paramTextSize, - ownerAuth, auth, - hContext) ); - goto egress; - - abort_egress: - egress: - free(paramText); - return status; -} - -TPM_RESULT VTSP_CreateWrapKey( const TCS_CONTEXT_HANDLE hContext, - const TPM_KEY_USAGE usage, - const TPM_AUTHDATA *newKeyAuth, - const TCS_KEY_HANDLE parentHandle, - const TPM_AUTHDATA *osapSharedSecret, - buffer_t *pubKeyBuf, - TCS_AUTH *auth) { - - int i; - TPM_RESULT status = TPM_SUCCESS; - TPM_COMMAND_CODE command = TPM_ORD_CreateWrapKey; - - vtpmloginfo(VTPM_LOG_VTSP, "Creating new key of type %d.\n", usage); - - // vars for Calculate encUsageAuth - BYTE *paramText; - UINT32 paramTextSize; - - // vars for Calculate encUsageAuth - BYTE XORbuffer[sizeof(TPM_SECRET) + sizeof(TPM_NONCE)]; - TPM_DIGEST XORKey1; - UINT32 XORbufferSize; - TPM_SECRET encUsageAuth, encMigrationAuth; - - // vars for Flatten newKey prototype - BYTE *flatKey = (BYTE *) malloc(sizeof(BYTE) * TCPA_MAX_BUFFER_LENGTH); - UINT32 flatKeySize = TCPA_MAX_BUFFER_LENGTH; - struct pack_buf_t newKeyText; - - // Fill in newKey - TPM_KEY newKey; - - BYTE RSAkeyInfo[12] = { 0x00, 0x00, (RSA_KEY_SIZE >> 8), 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}; - newKey.algorithmParms.algorithmID = TPM_ALG_RSA; - newKey.algorithmParms.parms = (BYTE *) &RSAkeyInfo; - newKey.algorithmParms.parmSize = 12; - - switch (usage) { - case TPM_KEY_SIGNING: - vtpmloginfo(VTPM_LOG_VTSP, "Creating Signing Key...\n"); - newKey.keyUsage = TPM_KEY_SIGNING; - newKey.algorithmParms.encScheme = TPM_ES_NONE; - newKey.algorithmParms.sigScheme = TPM_SS_RSASSAPKCS1v15_SHA1; - break; - case TPM_KEY_STORAGE: - vtpmloginfo(VTPM_LOG_VTSP, "Creating Storage Key...\n"); - newKey.keyUsage = TPM_KEY_STORAGE; - newKey.algorithmParms.encScheme = TPM_ES_RSAESOAEP_SHA1_MGF1; - newKey.algorithmParms.sigScheme = TPM_SS_NONE; - break; - case TPM_KEY_BIND: - vtpmloginfo(VTPM_LOG_VTSP, "Creating Binding Key...\n"); - newKey.keyUsage = TPM_KEY_BIND; - newKey.algorithmParms.encScheme = TPM_ES_RSAESOAEP_SHA1_MGF1; - newKey.algorithmParms.sigScheme = TPM_SS_NONE; - break; - default: - vtpmloginfo(VTPM_LOG_VTSP, "Cannot create key. Invalid Key Type.\n"); - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - - newKey.ver = TPM_STRUCT_VER_1_1; - - newKey.keyFlags = 0; - newKey.authDataUsage = TPM_AUTH_ALWAYS; - newKey.pubKey.keyLength= 0; - newKey.encDataSize = 0; - newKey.encData = NULL; - - // FIXME: Support PCR bindings - newKey.PCRInfoSize = 0; - newKey.PCRInfo = NULL; - - // Calculate encUsageAuth - XORbufferSize = BSG_PackList( XORbuffer, 2, - BSG_TPM_SECRET, osapSharedSecret, - BSG_TPM_NONCE, &auth->NonceEven); - Crypto_SHA1Full(XORbuffer, XORbufferSize, (BYTE *) &XORKey1); - - // FIXME: No support for migratable keys. - for (i=0; i < TPM_DIGEST_SIZE; i++) - ((BYTE *) &encUsageAuth)[i] = ((BYTE *) &XORKey1)[i] ^ ((BYTE *) newKeyAuth)[i]; - - // Flatten newKey prototype - flatKeySize = BSG_Pack(BSG_TPM_KEY, (BYTE *) &newKey, flatKey); - newKeyText.data = flatKey; - newKeyText.size = flatKeySize; - - // Generate HMAC - paramText = (BYTE *) malloc(sizeof(BYTE) * TCPA_MAX_BUFFER_LENGTH); - - paramTextSize = BSG_PackList(paramText, 3, - BSG_TPM_COMMAND_CODE, &command, - BSG_TPM_AUTHDATA, &encUsageAuth, - BSG_TPM_AUTHDATA, &encMigrationAuth); - memcpy(paramText + paramTextSize, newKeyText.data, newKeyText.size); - paramTextSize += newKeyText.size; - - - TPMTRYRETURN( GenerateAuth( paramText, paramTextSize, - osapSharedSecret, auth) ); - - // Call TCS - TPMTRYRETURN( TCSP_CreateWrapKey( hContext, - parentHandle, - encUsageAuth, - encMigrationAuth, - &newKeyText.size, - &newKeyText.data, - auth) ); - - // Verify Auth - paramTextSize = BSG_PackList(paramText, 2, - BSG_TPM_RESULT, &status, - BSG_TPM_COMMAND_CODE, &command); - memcpy(paramText + paramTextSize, newKeyText.data, newKeyText.size); - paramTextSize += newKeyText.size; - - TPMTRYRETURN( VerifyAuth( paramText, paramTextSize, - osapSharedSecret, auth, 0) ); - - // Unpack/return key structure - TPMTRYRETURN(buffer_init(pubKeyBuf, 0, 0) ); - TPMTRYRETURN(buffer_append_raw(pubKeyBuf, newKeyText.size, newKeyText.data) ); - - goto egress; - - abort_egress: - - egress: - - free(flatKey); - free(paramText); - TCS_FreeMemory(hContext, newKeyText.data); - - return status; -} - -TPM_RESULT VTSP_LoadKey(const TCS_CONTEXT_HANDLE hContext, - const TCS_KEY_HANDLE hUnwrappingKey, - const buffer_t *rgbWrappedKeyBlob, - const TPM_AUTHDATA *parentAuth, - TPM_HANDLE *newKeyHandle, - TCS_AUTH *auth, - CRYPTO_INFO *cryptoinfo, - const BOOL skipTPMLoad) { - - - vtpmloginfo(VTPM_LOG_VTSP, "Loading Key %s.\n", (!skipTPMLoad ? "into TPM" : "only into memory")); - - TPM_RESULT status = TPM_SUCCESS; - TPM_COMMAND_CODE command = TPM_ORD_LoadKey; - - BYTE *paramText=NULL; // Digest to make Auth. - UINT32 paramTextSize; - - // SkipTPMLoad stops key from being loaded into TPM, but still generates CRYPTO_INFO for it - if (! skipTPMLoad) { - - if ((rgbWrappedKeyBlob == NULL) || (parentAuth == NULL) || - (newKeyHandle==NULL) || (auth==NULL)) { - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - // Generate Extra TCS Parameters - TPM_HANDLE phKeyHMAC; - - paramText = (BYTE *) malloc(sizeof(BYTE) * TCPA_MAX_BUFFER_LENGTH); - - paramTextSize = BSG_PackList(paramText, 1, - BSG_TPM_COMMAND_CODE, &command); - - memcpy(paramText + paramTextSize, rgbWrappedKeyBlob->bytes, buffer_len(rgbWrappedKeyBlob)); - paramTextSize += buffer_len(rgbWrappedKeyBlob); - - TPMTRYRETURN( GenerateAuth( paramText, paramTextSize, - parentAuth, auth) ); - - // Call TCS - TPMTRYRETURN( TCSP_LoadKeyByBlob( hContext, - hUnwrappingKey, - buffer_len(rgbWrappedKeyBlob), - rgbWrappedKeyBlob->bytes, - auth, - newKeyHandle, - &phKeyHMAC) ); - - // Verify Auth - paramTextSize = BSG_PackList(paramText, 3, - BSG_TPM_RESULT, &status, - BSG_TPM_COMMAND_CODE, &command, - BSG_TPM_HANDLE, newKeyHandle); - - TPMTRYRETURN( VerifyAuth( paramText, paramTextSize, - parentAuth, auth, - hContext) ); - } - - // Build cryptoinfo structure for software crypto function. - if (cryptoinfo != NULL) { - TPM_KEY newKey; - - // Unpack/return key structure - BSG_Unpack(BSG_TPM_KEY, rgbWrappedKeyBlob->bytes , &newKey); - TPM_RSA_KEY_PARMS rsaKeyParms; - - BSG_Unpack(BSG_TPM_RSA_KEY_PARMS, - newKey.algorithmParms.parms, - &rsaKeyParms); - - Crypto_RSABuildCryptoInfoPublic(rsaKeyParms.exponentSize, - rsaKeyParms.exponent, - newKey.pubKey.keyLength, - newKey.pubKey.key, - cryptoinfo); - - // Destroy rsaKeyParms - BSG_Destroy(BSG_TPM_RSA_KEY_PARMS, &rsaKeyParms); - - // Set encryption scheme - cryptoinfo->encScheme = CRYPTO_ES_RSAESOAEP_SHA1_MGF1; - } - - goto egress; - - abort_egress: - - egress: - - free(paramText); - return status; -} - -TPM_RESULT VTSP_Unbind( const TCS_CONTEXT_HANDLE hContext, - const TPM_KEY_HANDLE key_handle, - const buffer_t *bound_data, - const TPM_AUTHDATA *usage_auth, - buffer_t *clear_data, - TCS_AUTH *auth) { - - vtpmloginfo(VTPM_LOG_VTSP, "Unbinding %d bytes of data.\n", buffer_len(bound_data)); - - TPM_RESULT status = TPM_SUCCESS; - TPM_COMMAND_CODE command = TPM_ORD_UnBind; - - BYTE *paramText; // Digest to make Auth. - UINT32 paramTextSize; - - // Generate Extra TCS Parameters - struct pack_buf_t clear_data32; - BYTE *clear_data_text; - UINT32 clear_data_size; - - struct pack_buf_t bound_data32 = {bound_data->size, bound_data->bytes}; - - paramText = (BYTE *) malloc(sizeof(BYTE) * TCPA_MAX_BUFFER_LENGTH); - - paramTextSize = BSG_PackList(paramText, 2, - BSG_TPM_COMMAND_CODE, &command, - BSG_TPM_SIZE32_DATA, &bound_data32); - - TPMTRYRETURN( GenerateAuth( paramText, paramTextSize, - usage_auth, auth) ); - - // Call TCS - TPMTRYRETURN( TCSP_UnBind( hContext, - key_handle, - buffer_len(bound_data), - bound_data->bytes, - auth, - &clear_data_size, - &clear_data_text) ); - - - // Verify Auth - clear_data32.size = clear_data_size; - clear_data32.data = clear_data_text; - paramTextSize = BSG_PackList(paramText, 3, - BSG_TPM_RESULT, &status, - BSG_TPM_COMMAND_CODE, &command, - BSG_TPM_SIZE32_DATA, &clear_data32); - - TPMTRYRETURN( VerifyAuth( paramText, paramTextSize, - usage_auth, auth, - hContext) ); - - // Unpack/return key structure - TPMTRYRETURN(buffer_init(clear_data, 0, 0)); - TPMTRYRETURN(buffer_append_raw (clear_data, clear_data_size, clear_data_text) ); - - goto egress; - - abort_egress: - - egress: - - free(paramText); - TCS_FreeMemory(hContext, clear_data_text); - - return status; -} - -TPM_RESULT VTSP_Bind( CRYPTO_INFO *cryptoInfo, - const buffer_t *inData, - buffer_t *outData) -{ - vtpmloginfo(VTPM_LOG_VTSP, "Binding %d bytes of data.\n", buffer_len(inData)); - TPM_RESULT status = TPM_SUCCESS; - TPM_BOUND_DATA boundData; - UINT32 i; - - // Fill boundData's accessory information - boundData.ver = TPM_STRUCT_VER_1_1; - boundData.payload = TPM_PT_BIND; - boundData.payloadData = inData->bytes; - - // Pack boundData before encryption - BYTE* flatBoundData = (BYTE *)malloc(sizeof(BYTE) * - (sizeof(TPM_VERSION) + - sizeof(TPM_PAYLOAD_TYPE) + - buffer_len(inData))); - if (flatBoundData == NULL) { - return TPM_NOSPACE; - } - UINT32 flatBoundDataSize = 0; - flatBoundDataSize = BSG_PackList( flatBoundData, 2, - BSG_TPM_VERSION, &boundData.ver, - BSG_TYPE_BYTE, &boundData.payload); - - memcpy(flatBoundData+flatBoundDataSize, inData->bytes, buffer_len(inData)); - flatBoundDataSize += buffer_len(inData); - - BYTE out_tmp[RSA_KEY_SIZE/8]; // RSAEnc does not do blocking, So this is what will come out. - UINT32 out_tmp_size; - - // Encrypt flatBoundData - TPMTRY(TPM_ENCRYPT_ERROR, Crypto_RSAEnc( cryptoInfo, - flatBoundDataSize, - flatBoundData, - &out_tmp_size, - out_tmp) ); - - if (out_tmp_size > RSA_KEY_SIZE/8) { - // The result of RSAEnc should be a fixed size based on key size. - vtpmlogerror(VTPM_LOG_VTSP, "Enc buffer just overflowed.\n"); - } - - buffer_init(outData, 0, NULL); - buffer_append_raw(outData, out_tmp_size, out_tmp); - - vtpmloginfo(VTPM_LOG_TXDATA, "Bind Generated[%d] = 0x", out_tmp_size); - for(i = 0 ; i < out_tmp_size ; i++) { - vtpmloginfomore(VTPM_LOG_TXDATA, "%2.2x ", out_tmp[i]); - } - vtpmloginfomore(VTPM_LOG_TXDATA, "\n"); - - goto egress; - abort_egress: - egress: - - // Free flatBoundData - free(flatBoundData); - - return TPM_SUCCESS; -} - -TPM_RESULT VTSP_Seal(const TCS_CONTEXT_HANDLE hContext, - const TPM_KEY_HANDLE keyHandle, - const TPM_AUTHDATA *sealDataAuth, - const TPM_PCR_COMPOSITE *pcrComp, - const buffer_t *inData, - TPM_STORED_DATA *sealedData, - const TPM_SECRET *osapSharedSecret, - TCS_AUTH *auth) { - - TPM_RESULT status = TPM_SUCCESS; - TPM_COMMAND_CODE command = TPM_ORD_Seal; - - BYTE *paramText; // Digest to make Auth. - UINT32 paramTextSize; - - // Generate PCR_Info Struct from Comp - TPM_PCR_INFO pcrInfo; - UINT32 pcrInfoSize, flatpcrSize; - BYTE flatpcr[3 + // PCR_Select = 3 1 byte banks - sizeof(UINT16) + // 2 byte UINT16 - sizeof(UINT32) + // PCR_Comp = 4 byte UINT32 - 24 * sizeof(TPM_PCRVALUE) ]; // up to 24 PCRs - - if (pcrComp != NULL) { - //printf("\n\tBinding to PCRs: "); - //for(int i = 0 ; i < pcrComp->select.sizeOfSelect ; i++) - //printf("%2.2x", pcrComp->select.pcrSelect[i]); - - memcpy(&pcrInfo.pcrSelection, &pcrComp->select, sizeof(TPM_PCR_SELECTION)); - - flatpcrSize = BSG_Pack(BSG_TPM_PCR_COMPOSITE, (BYTE *) pcrComp, flatpcr); - Crypto_SHA1Full((BYTE *) flatpcr, flatpcrSize, (BYTE *) &(pcrInfo.digestAtRelease)); - memset(&(pcrInfo.digestAtCreation), 0, sizeof(TPM_DIGEST)); - pcrInfoSize = BSG_Pack(BSG_TPM_PCR_INFO, (BYTE *) &pcrInfo, flatpcr); - } else { - //printf("\n\tBinding to no PCRS."); - pcrInfoSize = 0; - } - - // Calculate encUsageAuth - BYTE XORbuffer[sizeof(TPM_SECRET) + sizeof(TPM_NONCE)]; - UINT32 XORbufferSize = sizeof(XORbuffer); - TPM_DIGEST XORKey; - TPM_ENCAUTH encAuth; - - BSG_PackList( XORbuffer, 2, - BSG_TPM_SECRET, osapSharedSecret, - BSG_TPM_NONCE, &auth->NonceEven ); - - Crypto_SHA1Full(XORbuffer, XORbufferSize, (BYTE *) &XORKey); - - int i; - for (i=0; i < TPM_DIGEST_SIZE; i++) - ((BYTE *) &encAuth)[i] = ((BYTE *) &XORKey)[i] ^ ((BYTE *) sealDataAuth)[i]; - - // Generate Extra TCS Parameters - UINT32 inDataSize = buffer_len(inData); - struct pack_buf_t inData_pack = {inDataSize, inData->bytes}; - struct pack_buf_t pcrInfo_pack = {pcrInfoSize, flatpcr}; - - UINT32 sealedDataSize; - BYTE *flatSealedData=NULL; - - paramText = (BYTE *) malloc(sizeof(BYTE) * TCPA_MAX_BUFFER_LENGTH); - - paramTextSize = BSG_PackList(paramText, 4, - BSG_TPM_COMMAND_CODE, &command, - BSG_TPM_ENCAUTH, &encAuth, - BSG_TPM_SIZE32_DATA, &pcrInfo_pack, - BSG_TPM_SIZE32_DATA, &inData_pack); - - TPMTRYRETURN( GenerateAuth( paramText, paramTextSize, - osapSharedSecret, auth) ); - - // Call TCS - TPMTRYRETURN( TCSP_Seal( hContext, - keyHandle, - encAuth, - pcrInfoSize, - flatpcr, - inDataSize, - inData->bytes, - auth, - &sealedDataSize, - &flatSealedData) ); - - // Unpack/return key structure - BSG_Unpack( BSG_TPM_STORED_DATA, flatSealedData, sealedData ); - - paramTextSize = BSG_PackList(paramText, 3, - BSG_TPM_RESULT, &status, - BSG_TPM_COMMAND_CODE, &command, - BSG_TPM_STORED_DATA, sealedData); - - TPMTRYRETURN( VerifyAuth( paramText, paramTextSize, - osapSharedSecret, auth, - 0) ); - - - goto egress; - - abort_egress: - egress: - - if (flatSealedData) - TCS_FreeMemory( hContext, flatSealedData); - - free(paramText); - return status; -} - - -TPM_RESULT VTSP_Unseal(const TCS_CONTEXT_HANDLE hContext, - const TPM_KEY_HANDLE keyHandle, - const TPM_STORED_DATA *sealedData, - const TPM_AUTHDATA *key_usage_auth, - const TPM_AUTHDATA *data_usage_auth, - buffer_t *outData, - TCS_AUTH *auth, - TCS_AUTH *dataAuth) { - - TPM_RESULT status = TPM_SUCCESS; - TPM_COMMAND_CODE command = TPM_ORD_Unseal; - - BYTE *paramText; // Digest to make Auth. - UINT32 paramTextSize; - - // Generate Extra TCS Parameters - UINT32 sealDataSize, clearDataSize; - BYTE *flatSealedData= (BYTE *) malloc(sizeof(TPM_VERSION) + - 2 * sizeof(UINT32) + - sealedData->sealInfoSize + - sealedData->encDataSize), - *clearData=NULL; - - sealDataSize = BSG_Pack(BSG_TPM_STORED_DATA, sealedData, flatSealedData ); - - paramText = (BYTE *) malloc(sizeof(BYTE) * TCPA_MAX_BUFFER_LENGTH); - - paramTextSize = BSG_PackList(paramText, 2, - BSG_TPM_COMMAND_CODE, &command, - BSG_TPM_STORED_DATA, sealedData); - - TPMTRYRETURN( GenerateAuth( paramText, paramTextSize, - key_usage_auth, auth) ); - - TPMTRYRETURN( GenerateAuth( paramText, paramTextSize, - data_usage_auth, dataAuth) ); - // Call TCS - TPMTRYRETURN( TCSP_Unseal( hContext, - keyHandle, - sealDataSize, - flatSealedData, - auth, - dataAuth, - &clearDataSize, - &clearData) ); - - // Verify Auth - struct pack_buf_t clearData_pack = {clearDataSize, clearData}; - - paramTextSize = BSG_PackList(paramText, 3, - BSG_TPM_RESULT, &status, - BSG_TPM_COMMAND_CODE, &command, - BSG_TPM_SIZE32_DATA, &clearData_pack); - - TPMTRYRETURN( VerifyAuth( paramText, paramTextSize, - key_usage_auth, auth, - hContext) ); - - TPMTRYRETURN( VerifyAuth( paramText, paramTextSize, - data_usage_auth, dataAuth, - hContext) ); - - // Unpack/return key structure - TPMTRYRETURN( buffer_init(outData, clearDataSize, clearData) ); - - goto egress; - - abort_egress: - egress: - - if (flatSealedData) - TCS_FreeMemory( hContext, clearData); - - free(paramText); - return status; -} - -TPM_RESULT VTSP_SaveState( const TCS_CONTEXT_HANDLE hContext) { - - vtpmloginfo(VTPM_LOG_VTSP, "Calling TPM_SaveState.\n"); - - TPM_RESULT status = TPM_SUCCESS; - - // Call TCS - return ( TCSP_SaveState ( hContext ) ); - -} - - -// Function Reaches into unsupported TCS command, beware. -TPM_RESULT VTSP_RawTransmit(const TCS_CONTEXT_HANDLE hContext, - const buffer_t *inbuf, - buffer_t *outbuf ) { - - vtpmloginfo(VTPM_LOG_VTSP, "Passthrough in use.\n"); - TPM_RESULT status = TPM_SUCCESS; - - // Generate Extra TCS Parameters - BYTE *resultText = (BYTE *) malloc(sizeof(BYTE) * TCPA_MAX_BUFFER_LENGTH); - UINT32 resultTextSize = TCPA_MAX_BUFFER_LENGTH; - - // Call TCS - TPMTRYRETURN( TCSP_RawTransmitData(buffer_len(inbuf), inbuf->bytes, - &resultTextSize, resultText) ); - - // Unpack/return key structure - TPMTRYRETURN(buffer_init (outbuf, resultTextSize, resultText) ); - goto egress; - - abort_egress: - - egress: - TCS_FreeMemory(hContext, resultText); - free(resultText); - return status; -} diff --git a/tools/vtpm_manager/manager/vtsp.h b/tools/vtpm_manager/manager/vtsp.h deleted file mode 100644 index 2fb0440..0000000 --- a/tools/vtpm_manager/manager/vtsp.h +++ /dev/null @@ -1,126 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// vtsp.h -// -// Higher level interface to TCS. -// -// ================================================================== - -#ifndef __VTSP_H__ -#define __VTSP_H__ - -#include "tcg.h" -#include "tcs.h" - -#define KEY_BUFFER_SIZE 2048 - -TPM_RESULT VTSP_RawTransmit(const TCS_CONTEXT_HANDLE hContext, - const buffer_t *inbuf, - buffer_t *outbuf ); - -TPM_RESULT VTSP_OIAP( const TCS_CONTEXT_HANDLE hContext, - TCS_AUTH *auth); - -TPM_RESULT VTSP_OSAP( const TCS_CONTEXT_HANDLE hContext, - const TPM_ENTITY_TYPE entityType, - const UINT32 entityValue, - const TPM_AUTHDATA *usageAuth, - TPM_SECRET *sharedsecret, - TCS_AUTH *auth); - -TPM_RESULT VTSP_TerminateHandle(const TCS_CONTEXT_HANDLE hContext, - const TCS_AUTH *auth); - -TPM_RESULT VTSP_ReadPubek( const TCS_CONTEXT_HANDLE hContext, - CRYPTO_INFO *cypto_info); - -TPM_RESULT VTSP_TakeOwnership( const TCS_CONTEXT_HANDLE hContext, - const TPM_AUTHDATA *ownerAuth, - const TPM_AUTHDATA *srkAuth, - CRYPTO_INFO *ek_cryptoInfo, - TCS_AUTH *auth); - -TPM_RESULT VTSP_DisablePubekRead( const TCS_CONTEXT_HANDLE hContext, - const TPM_AUTHDATA *ownerAuth, - TCS_AUTH *auth); - -TPM_RESULT VTSP_CreateWrapKey( const TCS_CONTEXT_HANDLE hContext, - const TPM_KEY_USAGE usage, - const TPM_AUTHDATA *newKeyAuth, - const TCS_KEY_HANDLE parentHandle, - const TPM_AUTHDATA *osapSharedSecret, - buffer_t *pubKeyBuf, - TCS_AUTH *auth); - -TPM_RESULT VTSP_LoadKey(const TCS_CONTEXT_HANDLE hContext, - const TCS_KEY_HANDLE hUnwrappingKey, - const buffer_t *rgbWrappedKeyBlob, - const TPM_AUTHDATA *parentAuth, - TPM_HANDLE *newKeyHandle, - TCS_AUTH *pAuth, - CRYPTO_INFO *cryptoinfo, - const BOOL skipTPMLoad); - -TPM_RESULT VTSP_Unbind( const TCS_CONTEXT_HANDLE hContext, - const TPM_KEY_HANDLE key_handle, - const buffer_t *bound_data, - const TPM_AUTHDATA *usage_auth, - buffer_t *clear_data, - TCS_AUTH *auth); - -TPM_RESULT VTSP_Bind( CRYPTO_INFO *cryptoInfo, - const buffer_t *inData, - buffer_t *outData); - -TPM_RESULT VTSP_Seal(const TCS_CONTEXT_HANDLE hContext, - const TPM_KEY_HANDLE keyHandle, - const TPM_AUTHDATA *sealDataAuth, - const TPM_PCR_COMPOSITE *pcrComp, - const buffer_t *inData, - TPM_STORED_DATA *sealedData, - const TPM_SECRET *osapSharedSecret, - TCS_AUTH *auth); - -TPM_RESULT VTSP_Unseal(const TCS_CONTEXT_HANDLE hContext, - const TPM_KEY_HANDLE keyHandle, - const TPM_STORED_DATA *sealedData, - const TPM_AUTHDATA *key_usage_auth, - const TPM_AUTHDATA *data_usage_auth, - buffer_t *outData, - TCS_AUTH *auth, - TCS_AUTH *dataAuth); - -TPM_RESULT VTSP_SaveState( const TCS_CONTEXT_HANDLE hContext); - -#endif //_VTSP_H_ diff --git a/tools/vtpm_manager/migration/Makefile b/tools/vtpm_manager/migration/Makefile deleted file mode 100644 index e33ae95..0000000 --- a/tools/vtpm_manager/migration/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -XEN_ROOT = $(CURDIR)/../../.. -include $(XEN_ROOT)/tools/vtpm_manager/Rules.mk - -VPATH = ../manager - -BIND = vtpm_migratord -BINC = vtpm_migrator - -SRCSD = vtpm_manager_if.c vtpm_migratord.c vtpm_migratord_handler.c vtpm_ipc.c -SRCSC = vtpm_manager_if.c vtpm_migrator_if.c vtpm_migratorc.c vtpm_ipc.c - -OBJSD = $(patsubst %.c,%.o,$(SRCSD)) -OBJSC = $(patsubst %.c,%.o,$(SRCSC)) - -.PHONY: all -all: build - -.PHONY: build -build: $(BIND) $(BINC) - -.PHONY: install -install: build - $(INSTALL_PROG) $(BIND) $(DESTDIR)$(BINDIR) - $(INSTALL_PROG) $(BINC) $(DESTDIR)$(BINDIR) - -.PHONY: clean -clean: - rm -f $(BINC) $(BIND) - rm -f *.a *.so *.o *.rpm $(DEP_FILES) - -.PHONY: mrproper -mrproper: clean - rm -f *~ - -$(BIND): $(OBJSD) - $(CC) $(LDFLAGS) $^ $(LIBS) -o $@ - -$(BINC): $(OBJSC) - $(CC) $(LDFLAGS) $^ $(LIBS) -o $@ - -# libraries -LIBS += ../util/libTCGUtils.a diff --git a/tools/vtpm_manager/migration/vtpm_manager_if.c b/tools/vtpm_manager/migration/vtpm_manager_if.c deleted file mode 100644 index 08986f4..0000000 --- a/tools/vtpm_manager/migration/vtpm_manager_if.c +++ /dev/null @@ -1,186 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// vtpm_manager_if.c -// -// Provides functions to call local vtpm manager interface (Hotplug) -// -// ================================================================== - -#include <stdio.h> -#include <fcntl.h> -#include <malloc.h> -#include <string.h> - -#include "tcg.h" -#include "buffer.h" -#include "log.h" -#include "vtpm_ipc.h" -#include "bsg.h" -#include "vtpm_migrator.h" -#include "vtpm_manager.h" - -#define VTPM_TX_HP_FNAME "/var/vtpm/fifos/from_console.fifo" -#define VTPM_RX_HP_FNAME "/var/vtpm/fifos/to_console.fifo" - -static vtpm_ipc_handle_t tx_ipc_h, rx_ipc_h; - -TPM_RESULT vtpm_manager_open(){ - - if ( (vtpm_ipc_init(&tx_ipc_h, VTPM_TX_HP_FNAME, O_RDWR, TRUE) != 0) || //FIXME: wronly - (vtpm_ipc_init(&rx_ipc_h, VTPM_RX_HP_FNAME, O_RDWR, TRUE) != 0) ) { //FIXME: rdonly - vtpmlogerror(VTPM_LOG_VTPM, "Unable to connect to vtpm_manager.\n"); - return TPM_IOERROR; - } - - return TPM_SUCCESS; -} - -void vtpm_manager_close() { - - vtpm_ipc_close(&tx_ipc_h); - vtpm_ipc_close(&rx_ipc_h); -} - - -TPM_RESULT vtpm_manager_command(TPM_COMMAND_CODE ord, - buffer_t *command_param_buf, - TPM_RESULT *cmd_status, /* out */ - buffer_t *result_param_buf) { - - TPM_RESULT status = TPM_FAIL; - int size_read, size_write, i; - BYTE *adj_command, response_header[VTPM_COMMAND_HEADER_SIZE_SRV]; - UINT32 dmi_id=0, adj_command_size, out_param_size, adj_param_size; - TPM_TAG tag=VTPM_TAG_REQ; - - if ( (!command_param_buf) || (!result_param_buf) || (!cmd_status) ) { - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - adj_command_size = VTPM_COMMAND_HEADER_SIZE_SRV + buffer_len(command_param_buf); - adj_command = (BYTE *) malloc( adj_command_size ); - if (!adj_command) { - status = TPM_RESOURCES; - goto abort_egress; - } - - out_param_size = VTPM_COMMAND_HEADER_SIZE + buffer_len(command_param_buf); - BSG_PackList(adj_command, 4, - BSG_TYPE_UINT32, &dmi_id, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, &out_param_size, - BSG_TPM_COMMAND_CODE, &ord ); - - memcpy(adj_command + VTPM_COMMAND_HEADER_SIZE_SRV, command_param_buf->bytes, buffer_len(command_param_buf)); - - size_write = vtpm_ipc_write(&tx_ipc_h, NULL, adj_command, adj_command_size); - - if (size_write > 0) { - vtpmloginfo(VTPM_LOG_VTPM_DEEP, "SENT (MGR): 0x"); - for (i=0; i< adj_command_size; i++) { - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", adj_command[i]); - } - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - } else { - vtpmlogerror(VTPM_LOG_VTPM, "Error writing VTPM Manager console.\n"); - status = TPM_IOERROR; - goto abort_egress; - } - - if (size_write != (int) adj_command_size ) - vtpmlogerror(VTPM_LOG_VTPM, "Could not write entire command to mgr (%d/%d)\n", size_write, adj_command_size); - - // Read header for response to manager command - size_read = vtpm_ipc_read(&rx_ipc_h, NULL, response_header, VTPM_COMMAND_HEADER_SIZE_SRV); - if (size_read > 0) { - vtpmloginfo(VTPM_LOG_VTPM_DEEP, "RECV (MGR): 0x"); - for (i=0; i<size_read; i++) - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", response_header[i]); - - } else { - vtpmlogerror(VTPM_LOG_VTPM, "Error reading from vtpm manager.\n"); - status = TPM_IOERROR; - goto abort_egress; - } - - if (size_read < (int) VTPM_COMMAND_HEADER_SIZE_SRV) { - vtpmlogerror(VTPM_LOG_VTPM, "Command from vtpm_manager shorter than std header.\n"); - status = TPM_IOERROR; - goto abort_egress; - } - - // Unpack response from DMI for TPM command - BSG_UnpackList(response_header, 4, - BSG_TYPE_UINT32, &dmi_id, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, &out_param_size, - BSG_TPM_COMMAND_CODE, cmd_status ); - - // If response has parameters, read them. - // Note that out_param_size is in the client's context - adj_param_size = out_param_size - VTPM_COMMAND_HEADER_SIZE; - if (adj_param_size > 0) { - TPMTRYRETURN( buffer_init( result_param_buf, adj_param_size, NULL) ); - size_read = vtpm_ipc_read(&rx_ipc_h, NULL, result_param_buf->bytes, adj_param_size); - if (size_read > 0) { - for (i=0; i< size_read; i++) - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", result_param_buf->bytes[i]); - - } else { - vtpmlogerror(VTPM_LOG_VTPM, "Error reading from vtpm manager.\n"); - goto abort_egress; - } - vtpmloginfomore(VTPM_LOG_VTPM, "\n"); - - if (size_read < (int)adj_param_size) { - vtpmloginfomore(VTPM_LOG_VTPM, "\n"); - vtpmlogerror(VTPM_LOG_VTPM, "Command read(%d) is shorter than header indicates(%d).\n", size_read, adj_param_size); - status = TPM_IOERROR; - goto abort_egress; - } - } else { - vtpmloginfomore(VTPM_LOG_VTPM, "\n"); - } - - status=TPM_SUCCESS; - goto egress; - - abort_egress: - egress: - - return status; -} - - diff --git a/tools/vtpm_manager/migration/vtpm_migrator.h b/tools/vtpm_manager/migration/vtpm_migrator.h deleted file mode 100644 index 8d52e66..0000000 --- a/tools/vtpm_manager/migration/vtpm_migrator.h +++ /dev/null @@ -1,104 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// vtpm_migrator.h -// -// Public Interface header for VTPM Migrator -// -// ================================================================== - -#ifndef __VTPM_MIGRATOR_H__ -#define __VTPM_MIGRATOR_H__ - -#define VTPM_MTAG_REQ 0x02c1 -#define VTPM_MTAG_RSP 0x02c4 - -// Header sizes. -#define VTPM_COMMAND_HEADER_SIZE ( 2 + 4 + 4) -// sizeof(TPM_TAG + UINT32 + TPM_COMMAND_CODE) - -//*********************** Connection Info ************************** -#define VTPM_MIG_PORT 48879 - -//************************ Command Codes *************************** -#define VTPM_MORD_MIG_STEP1 0x00 -#define VTPM_MORD_MIG_STEP2 0x01 -#define VTPM_MORD_MIG_STEP3 0x02 -#define VTPM_MORD_MIG_STEP4 0x03 - -//************************ Return Codes **************************** -#define VTPM_SUCCESS 0 -#define VTPM_FAIL 1 - -/******************* Command Parameter API ************************* - -VTPM Command Format - tpm tag: 2 bytes - command size: 4 bytes // Size of command including header but not DMI - ord: 4 bytes // Command ordinal above - parameters: size - 10 bytes // Command Parameter - -VTPM Response Format - tpm tag: 2 bytes - response_size: 4 bytes - status: 4 bytes - parameters: size - 10 bytes - - -VTPM_Mig_Phase1: - Unsupported: (Handled by scripts) - -VTPM_Mig_Phase2 - Input Parameters: - domain_name_size: 4 bytes - domain_name : domain_name_size bytes - Output Parameters: - pub_exp_size: 4 bytes - pub_exp: pub_exp_size bytes - pub_mod_size: 4 bytes - pub_mod: pub_mod_size bytes - -VTPM_Mig_Phase3 - Input Parameters: - vtpm_state_size: 4 bytes - vtpm_state: vtpm_state_size bytes - Output Parameters: - none - -VTPM_Mig_Phase4 - Unsupported: (Handled by scripts) - - -*********************************************************************/ - -#endif //_VTPM_MANAGER_H_ diff --git a/tools/vtpm_manager/migration/vtpm_migrator_if.c b/tools/vtpm_manager/migration/vtpm_migrator_if.c deleted file mode 100644 index de48b2d..0000000 --- a/tools/vtpm_manager/migration/vtpm_migrator_if.c +++ /dev/null @@ -1,219 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// vtpm_migrator_if.c -// -// Provides functions to call open network connection & call -// a function on the vtpm_migratord on the destination -// -// ================================================================== - -#include <stdio.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <string.h> -#include <malloc.h> - -#include "tcg.h" -#include "buffer.h" -#include "log.h" -#include "bsg.h" -#include "vtpm_migrator.h" - -static int sock_desc; - - -TPM_RESULT vtpm_migratord_open(char *server_address){ - - TPM_RESULT status = TPM_FAIL; - - /* network variables */ - struct in_addr ip_addr; - struct sockaddr_in server_addr; - int addr_len; - struct hostent *dns_info=NULL; - - /* set up connection to server*/ - dns_info = gethostbyname(server_address); - ip_addr.s_addr = *((unsigned long *) dns_info->h_addr_list[0]); - - if(ip_addr.s_addr < 0) { - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - /* set up server variable */ - memset((char *)&server_addr, 0, sizeof(server_addr)); - server_addr.sin_family = AF_INET; - server_addr.sin_port = htons(VTPM_MIG_PORT); - server_addr.sin_addr.s_addr = ip_addr.s_addr; - - /* open socket, make connection */ - sock_desc = socket(AF_INET, SOCK_STREAM, 0); - - if (sock_desc < 0 ) { - status = TPM_IOERROR; - goto abort_egress; - } - - if (connect(sock_desc, - (struct sockaddr *)&server_addr, - sizeof(server_addr)) < 0 ) { - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - status = TPM_SUCCESS; - goto egress; - - abort_egress: - egress: - - return status; -} - -void vtpm_migratord_close() { - close(sock_desc); -} - - -TPM_RESULT vtpm_migratord_command(TPM_COMMAND_CODE ord, - buffer_t *command_param_buf, - TPM_RESULT *cmd_status, /* out */ - buffer_t *result_param_buf) { - - TPM_RESULT status = TPM_FAIL; - int size_read, size_write, i; - BYTE *command, response_header[VTPM_COMMAND_HEADER_SIZE]; - UINT32 dmi_id=0, command_size, out_param_size, adj_param_size; - TPM_TAG tag=VTPM_MTAG_REQ; - - if ( (!command_param_buf) || (!result_param_buf) || (!cmd_status) ) { - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - command_size = VTPM_COMMAND_HEADER_SIZE + buffer_len(command_param_buf); - command = (BYTE *) malloc( command_size ); - if (!command) { - status = TPM_RESOURCES; - goto abort_egress; - } - - BSG_PackList(command, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, &command_size, - BSG_TPM_COMMAND_CODE, &ord ); - - memcpy(command + VTPM_COMMAND_HEADER_SIZE, command_param_buf->bytes, buffer_len(command_param_buf)); - - size_write = write(sock_desc, command, command_size); - - if (size_write > 0) { - vtpmloginfo(VTPM_LOG_VTPM_DEEP, "SENT (MIGd): 0x"); - for (i=0; i< command_size; i++) { - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", command[i]); - } - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - } else { - vtpmlogerror(VTPM_LOG_VTPM, "Error writing to migration server via network.\n"); - status = TPM_IOERROR; - goto abort_egress; - } - - if (size_write != (int) command_size ) - vtpmlogerror(VTPM_LOG_VTPM, "Could not write entire command to migration server (%d/%d)\n", size_write, command_size); - - // Read header for response - size_read = read(sock_desc, response_header, VTPM_COMMAND_HEADER_SIZE); - if (size_read > 0) { - vtpmloginfo(VTPM_LOG_VTPM_DEEP, "RECV (MIGd): 0x"); - for (i=0; i<size_read; i++) - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", response_header[i]); - - } else { - vtpmlogerror(VTPM_LOG_VTPM, "Error reading from Migration Server.\n"); - status = TPM_IOERROR; - goto abort_egress; - } - - if (size_read < (int) VTPM_COMMAND_HEADER_SIZE) { - vtpmlogerror(VTPM_LOG_VTPM, "Command from migration server shorter than std header.\n"); - status = TPM_IOERROR; - goto abort_egress; - } - - // Unpack response from DMI for TPM command - BSG_UnpackList(response_header, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, &out_param_size, - BSG_TPM_COMMAND_CODE, cmd_status ); - - // If response has parameters, read them. - adj_param_size = out_param_size - VTPM_COMMAND_HEADER_SIZE; - if (adj_param_size > 0) { - TPMTRYRETURN( buffer_init( result_param_buf, adj_param_size, NULL) ); - size_read = read(sock_desc, result_param_buf->bytes, adj_param_size); - if (size_read > 0) { - for (i=0; i< size_read; i++) - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", result_param_buf->bytes[i]); - - } else { - vtpmlogerror(VTPM_LOG_VTPM, "Error reading from migration server.\n"); - goto abort_egress; - } - vtpmloginfomore(VTPM_LOG_VTPM, "\n"); - - if (size_read < (int)adj_param_size) { - vtpmloginfomore(VTPM_LOG_VTPM, "\n"); - vtpmlogerror(VTPM_LOG_VTPM, "Command read(%d) is shorter than header indicates(%d).\n", size_read, adj_param_size); - status = TPM_IOERROR; - goto abort_egress; - } - } else { - vtpmloginfomore(VTPM_LOG_VTPM, "\n"); - } - - status=TPM_SUCCESS; - goto egress; - - abort_egress: - egress: - - return status; -} - - diff --git a/tools/vtpm_manager/migration/vtpm_migratorc.c b/tools/vtpm_manager/migration/vtpm_migratorc.c deleted file mode 100644 index 18b3bdb..0000000 --- a/tools/vtpm_manager/migration/vtpm_migratorc.c +++ /dev/null @@ -1,211 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== - -#include <stdio.h> -#include <string.h> - -#include "tcg.h" -#include "log.h" -#include "bsg.h" -#include "buffer.h" -#include "vtpm_migrator.h" -#include "vtpm_manager.h" - -TPM_RESULT handle_vtpm_mig_step2(char *server_addr, - char *name, - UINT32 instance) { - TPM_RESULT status, cmd_status; - buffer_t out_param_buf=NULL_BUF, mig_key_buf=NULL_BUF, empty_buf=NULL_BUF; - UINT32 offset; - struct pack_buf_t addr_data32; - - //===== Get Destination's Public Migration Key ====== - TPMTRYRETURN( vtpm_migratord_open(server_addr) ); - - TPMTRYRETURN( vtpm_migratord_command(VTPM_MORD_MIG_STEP2, - &out_param_buf, - &cmd_status, - &mig_key_buf) ); - vtpm_migratord_close(); - - TPMTRYRETURN(cmd_status); - - //===== Load migration key into vtpm_manager ======== - - addr_data32.data = (BYTE *)server_addr; - addr_data32.size = strlen(server_addr) + 1; // Include the null - - TPMTRYRETURN ( buffer_init ( &out_param_buf, - sizeof(UINT32) + addr_data32.size +buffer_len(&mig_key_buf), - NULL ) ) ; - - offset = BSG_PackList(out_param_buf.bytes, 1, - BSG_TPM_SIZE32_DATA, &addr_data32); - - memcpy(out_param_buf.bytes + offset , mig_key_buf.bytes, buffer_len(&mig_key_buf) ); - - TPMTRYRETURN ( vtpm_manager_open() ); - - TPMTRYRETURN ( vtpm_manager_command(VTPM_ORD_LOAD_MIG_KEY, - &out_param_buf, - &cmd_status, - &empty_buf) ); - - vtpm_manager_close(); - - TPMTRYRETURN(cmd_status); - - goto egress; - - abort_egress: - egress: - - buffer_free(&mig_key_buf); - buffer_free(&out_param_buf); - - return status; -} - - -TPM_RESULT handle_vtpm_mig_step3(char *server_addr, - char *name, - UINT32 instance) { - TPM_RESULT status, cmd_status; - buffer_t out_param_buf=NULL_BUF, state_buf=NULL_BUF, empty_buf=NULL_BUF; - struct pack_buf_t addr_data32, name_data32, state_data32; - - //===== Get vtpm state from vtpm_manager ======== - addr_data32.data = (BYTE *)server_addr; - addr_data32.size = strlen(server_addr) + 1; // Include the null - - TPMTRYRETURN ( buffer_init ( &out_param_buf, - (2 * sizeof(UINT32)) + addr_data32.size, - NULL ) ) ; - - BSG_PackList(out_param_buf.bytes, 2, - BSG_TYPE_UINT32, &instance, - BSG_TPM_SIZE32_DATA, &addr_data32); - - TPMTRYRETURN ( vtpm_manager_open() ); - - TPMTRYRETURN ( vtpm_manager_command(VTPM_ORD_MIGRATE_OUT, - &out_param_buf, - &cmd_status, - &state_buf) ); - - vtpm_manager_close(); - - TPMTRYRETURN(cmd_status); - - TPMTRYRETURN( buffer_free( &out_param_buf ) ); - - //===== Send vtpm state to destination ====== - name_data32.data = (BYTE *)name; - name_data32.size = strlen(name) + 1; // Include the null - state_data32.data = state_buf.bytes; - state_data32.size = buffer_len(&state_buf); - - TPMTRYRETURN( buffer_init( &out_param_buf, - 2 * sizeof(UINT32) + name_data32.size + state_data32.size, - NULL ) ) ; - - BSG_PackList(out_param_buf.bytes, 2, - BSG_TPM_SIZE32_DATA, &name_data32, - BSG_TPM_SIZE32_DATA, &state_data32); - - TPMTRYRETURN( vtpm_migratord_open(server_addr) ); - - TPMTRYRETURN( vtpm_migratord_command(VTPM_MORD_MIG_STEP3, - &out_param_buf, - &cmd_status, - &empty_buf) ); - vtpm_migratord_close(); - - TPMTRYRETURN(cmd_status); - - goto egress; - - abort_egress: - egress: - - buffer_free( &out_param_buf); - buffer_free( &state_buf); - buffer_free( &empty_buf); - - return status; -} - - -// Usage vtpm_migrator addr domain_name instance step - -int main(int argc, char **argv) { - - /* variables for processing of command */ - TPM_RESULT status = TPM_FAIL; - char *server_addr, *name; - UINT32 instance, step; - - if (argc != 5) { - vtpmlogerror(VTPM_LOG_VTPM, "Usage: vtpm_migrator addr vm_name instance step\n"); - vtpmlogerror(VTPM_LOG_VTPM, " params given %d\n", argc); - status= TPM_BAD_PARAMETER; - goto abort_egress; - } - - server_addr = argv[1]; - name = argv[2]; - instance = atoi( argv[3] ); - step = atoi( argv[4] ); - - switch (step) { - case VTPM_MORD_MIG_STEP2: - status = handle_vtpm_mig_step2(server_addr, name, instance); - break; - - case VTPM_MORD_MIG_STEP3: - status = handle_vtpm_mig_step3(server_addr, name, instance); - break; - - default: - status = TPM_BAD_PARAMETER; - goto abort_egress; - break; - } - - goto egress; - abort_egress: - egress: - - return status; -} - diff --git a/tools/vtpm_manager/migration/vtpm_migratord.c b/tools/vtpm_manager/migration/vtpm_migratord.c deleted file mode 100644 index ea18c8c..0000000 --- a/tools/vtpm_manager/migration/vtpm_migratord.c +++ /dev/null @@ -1,202 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== - -#include <stdio.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <string.h> - -#include "tcg.h" -#include "log.h" -#include "bsg.h" -#include "buffer.h" -#include "vtpm_migrator.h" - -void build_error_msg( buffer_t *buf, TPM_RESULT status) { - TPM_TAG tag = VTPM_MTAG_RSP; - UINT32 out_param_size = VTPM_COMMAND_HEADER_SIZE; - - buffer_init(buf, out_param_size, NULL); - - BSG_PackList(buf->bytes, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, &out_param_size, - BSG_TPM_RESULT, &status ); -} - -int main() { - - /* network variables */ - int sock_descr, client_sock=-1, len; - struct sockaddr_in addr; - struct sockaddr_in client_addr; - unsigned int client_length; - int bytes; - - /* variables for processing of command */ - TPM_RESULT status = TPM_FAIL; - BYTE cmd_header[VTPM_COMMAND_HEADER_SIZE]; - TPM_TAG tag; - TPM_COMMAND_CODE ord; - UINT32 in_param_size, adj_param_size; - int i, size_read, size_write; - buffer_t in_param_buf=NULL_BUF, result_buf=NULL_BUF; - - - /* setup socket */ - sock_descr = socket(AF_INET, SOCK_STREAM, 0); - - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = htonl(INADDR_ANY); - addr.sin_port = htons(VTPM_MIG_PORT); - - if (bind(sock_descr, (struct sockaddr *)&addr, sizeof(addr)) == -1 ) { - vtpmlogerror(VTPM_LOG_VTPM, "Failed to bind to port %d.\n", VTPM_MIG_PORT); - return 1; - } - - listen(sock_descr, 10); - - for(;;) { - // ============ clear client info and wait for connection ========== - memset(&client_addr, 0, sizeof(client_addr)); - client_length = sizeof(client_addr); - - vtpmloginfo(VTPM_LOG_VTPM, "Waiting for incoming migrations...\n"); - client_sock=accept(sock_descr, &client_addr, &client_length); - if (client_sock == -1) { - vtpmlogerror(VTPM_LOG_VTPM, "Incoming connectionn failed.\n"); - goto abort_command; - } else { - vtpmloginfo(VTPM_LOG_VTPM, "Incoming connection accepted.\n"); - } - - // =================== Read incoming command ====================== - size_read = read( client_sock, cmd_header, VTPM_COMMAND_HEADER_SIZE); - if (size_read > 0) { - vtpmloginfo(VTPM_LOG_VTPM_DEEP, "RECV: 0x"); - for (i=0; i<size_read; i++) - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", cmd_header[i]); - - } else { - vtpmlogerror(VTPM_LOG_VTPM, "Error reading from socket.\n"); - build_error_msg(&result_buf, TPM_IOERROR); - goto abort_command_with_error; - } - - if (size_read < (int) VTPM_COMMAND_HEADER_SIZE) { - vtpmlogerror(VTPM_LOG_VTPM, "Command from socket shorter than std header.\n"); - build_error_msg(&result_buf, TPM_BAD_PARAMETER); - goto abort_command_with_error; - } - - // Unpack response from client - BSG_UnpackList(cmd_header, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, &in_param_size, - BSG_TPM_COMMAND_CODE, &ord ); - - - // If response has parameters, read them. - // Note that out_param_size is in the client's context - adj_param_size = in_param_size - VTPM_COMMAND_HEADER_SIZE; - if (adj_param_size > 0) { - buffer_init( &in_param_buf, adj_param_size, NULL); - size_read = read(client_sock, in_param_buf.bytes, adj_param_size); - if (size_read > 0) { - for (i=0; i< size_read; i++) - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", in_param_buf.bytes[i]); - - } else { - vtpmlogerror(VTPM_LOG_VTPM, "Error reading from socket.\n"); - build_error_msg(&result_buf, TPM_IOERROR); - goto abort_command_with_error; - } - vtpmloginfomore(VTPM_LOG_VTPM, "\n"); - - if (size_read < (int)adj_param_size) { - vtpmloginfomore(VTPM_LOG_VTPM, "\n"); - vtpmlogerror(VTPM_LOG_VTPM, "Command read(%d) is shorter than header indicates(%d).\n", size_read, adj_param_size); - build_error_msg(&result_buf, TPM_BAD_PARAMETER); - goto abort_command_with_error; - } - } else { - vtpmloginfomore(VTPM_LOG_VTPM, "\n"); - } - - /* Handle Command */ - switch (ord) { - case VTPM_MORD_MIG_STEP2: - handle_vtpm_mig_step2(&in_param_buf, &result_buf); - break; - - case VTPM_MORD_MIG_STEP3: - handle_vtpm_mig_step3(&in_param_buf, &result_buf); - break; - - default: - build_error_msg(&result_buf, TPM_BAD_PARAMETER); - goto abort_command_with_error; - } - - abort_command_with_error: - /* Write Response */ - size_write = write(client_sock, result_buf.bytes, buffer_len(&result_buf)); - - if (size_write > 0) { - vtpmloginfo(VTPM_LOG_VTPM_DEEP, "SENT: 0x"); - for (i=0; i< buffer_len(&result_buf); i++) { - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "%x ", result_buf.bytes[i]); - } - vtpmloginfomore(VTPM_LOG_VTPM_DEEP, "\n"); - } else { - vtpmlogerror(VTPM_LOG_VTPM, "Error writing response to client.\n"); - goto abort_command; - } - - if (size_write != (int) buffer_len(&result_buf) ) - vtpmlogerror(VTPM_LOG_VTPM, "Could not send entire response to client(%d/%d)\n", size_write, buffer_len(&result_buf)); - - abort_command: - close(client_sock); - buffer_free(&in_param_buf); - buffer_free(&result_buf); - - } // For (;;) - - return 0; -} - diff --git a/tools/vtpm_manager/migration/vtpm_migratord_handler.c b/tools/vtpm_manager/migration/vtpm_migratord_handler.c deleted file mode 100644 index 0a8a2d5..0000000 --- a/tools/vtpm_manager/migration/vtpm_migratord_handler.c +++ /dev/null @@ -1,177 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== - -#include <stdlib.h> -#include <string.h> - -#include "tcg.h" -#include "bsg.h" -#include "log.h" -#include "vtpm_migrator.h" -#include "vtpm_manager.h" - -#define VTPM_SH_CMD_HDR "bash -c \"cd /etc/xen/scripts; source /etc/xen/scripts/vtpm-common.sh;" -#define VTPM_SH_CMD_FTR "\"" -#define VTPM_SH_GETINST "vtpmdb_get_free_instancenum" -#define VTPM_SH_ADD "vtpm_add_and_activate" -#define VTPM_SH_RESUME "vtpm_resume" - -// This must be updated to the longest command name. Currently GETINST -#define VTPM_SH_CMD_SIZE (strlen(VTPM_SH_CMD_HDR) + strlen(VTPM_SH_CMD_FTR) + 1 + strlen(VTPM_SH_GETINST) + 2) - -void handle_vtpm_mig_step2(buffer_t *in_param_buf, buffer_t *result_buf) -{ - TPM_TAG tag = VTPM_TAG_RSP; - buffer_t out_param_buf= NULL_BUF, mig_key_buf=NULL_BUF; - TPM_RESULT status=TPM_SUCCESS, cmd_status; - UINT32 out_param_size; - - if ( (!in_param_buf) || (!result_buf) ) { - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - // ================= Call manager and get mig key =============== - TPMTRYRETURN( vtpm_manager_open() ); - TPMTRYRETURN( vtpm_manager_command(VTPM_ORD_GET_MIG_KEY, - &out_param_buf, // Empty - &cmd_status, - &mig_key_buf) ); - - vtpm_manager_close(); - - TPMTRYRETURN(cmd_status); - - // ==================== return the mig key ===================== - out_param_size = VTPM_COMMAND_HEADER_SIZE + buffer_len(&mig_key_buf); - - TPMTRYRETURN( buffer_init(result_buf, - out_param_size, - NULL) ); - - BSG_PackList( result_buf->bytes, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, &out_param_size, - BSG_TPM_RESULT, &status); - - memcpy(result_buf->bytes + VTPM_COMMAND_HEADER_SIZE, - mig_key_buf.bytes, buffer_len(&mig_key_buf)); - - goto egress; - - abort_egress: - buffer_free(result_buf); - build_error_msg(result_buf, status); - - egress: - return; -} - -void handle_vtpm_mig_step3(buffer_t *in_param_buf, buffer_t *result_buf) -{ - TPM_TAG tag = VTPM_TAG_RSP; - buffer_t out_param_buf= NULL_BUF, mig_key_buf=NULL_BUF, empty_buf=NULL_BUF; - TPM_RESULT status=TPM_SUCCESS, cmd_status; - UINT32 out_param_size, instance; - char *shell_cmd_str=NULL; - size_t shell_cmd_strlen; - FILE *shell_f=NULL; - - if ( (!in_param_buf) || (!result_buf) ) { - status = TPM_BAD_PARAMETER; - goto abort_egress; - } - - // ================= Read Parameters =============== - struct pack_buf_t name_data32, state_data32; - - BSG_UnpackList(in_param_buf->bytes, 2, - BSG_TPM_SIZE32_DATA, &name_data32, - BSG_TPM_SIZE32_DATA, &state_data32); - - // Before using this string, protect us from a non-null term array. - if (name_data32.data[name_data32.size -1] != 0x00) { - name_data32.data[name_data32.size -1] = 0x00; - } - - // ====== Call hotplug-script and get an instance ====== - shell_cmd_strlen = VTPM_SH_CMD_SIZE + name_data32.size + 10; - shell_cmd_str = (char *) malloc(shell_cmd_strlen); // 10 is just padding for the UINT32 - - snprintf(shell_cmd_str, shell_cmd_strlen, - VTPM_SH_CMD_HDR VTPM_SH_GETINST VTPM_SH_CMD_FTR); - - shell_f = popen(shell_cmd_str, "r"); - fscanf(shell_f, "%d", &instance); - pclose(shell_f); - - // ====== Call hotplug-script and add instance ====== - snprintf(shell_cmd_str, shell_cmd_strlen, - VTPM_SH_CMD_HDR VTPM_SH_ADD " %s %d" VTPM_SH_CMD_FTR, - name_data32.data, instance); - system(shell_cmd_str); - - // ========= Call vtpm_manager and load VTPM ======= - TPMTRYRETURN( buffer_init( &out_param_buf, - 2*sizeof(UINT32) + state_data32.size, - NULL) ); - - BSG_PackList(out_param_buf.bytes, 2, - BSG_TYPE_UINT32, &instance, - BSG_TPM_SIZE32_DATA, &state_data32); - - TPMTRYRETURN( vtpm_manager_open() ); - TPMTRYRETURN( vtpm_manager_command(VTPM_ORD_MIGRATE_IN, - &out_param_buf, - &cmd_status, - &empty_buf) ); - - vtpm_manager_close(); - - TPMTRYRETURN(cmd_status); - - // ====== Call hotplug-script and resume instance ====== - snprintf(shell_cmd_str, shell_cmd_strlen, - VTPM_SH_CMD_HDR VTPM_SH_RESUME " %d" VTPM_SH_CMD_FTR, instance); - system(shell_cmd_str); - - goto egress; - abort_egress: - egress: - free(shell_cmd_str); - - // In this case no params come back, so reuse build_error_msg even for succes. - build_error_msg(result_buf, status); - return; -} - diff --git a/tools/vtpm_manager/tcs/Makefile b/tools/vtpm_manager/tcs/Makefile deleted file mode 100644 index 11af91e..0000000 --- a/tools/vtpm_manager/tcs/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -XEN_ROOT = $(CURDIR)/../../.. -include $(XEN_ROOT)/tools/vtpm_manager/Rules.mk - -BIN = libTCS.a - -.PHONY: all -all: build - -.PHONY: build -build: $(BIN) - -.PHONY: install -install: build - -.PHONY: clean -clean: - rm -f *.a *.so *.o *.rpm $(DEP_FILES) - -.PHONY: mrproper -mrproper: clean - rm -f *~ - -$(BIN): $(OBJS) - $(AR) rcs $(BIN) $(OBJS) diff --git a/tools/vtpm_manager/tcs/contextmgr.c b/tools/vtpm_manager/tcs/contextmgr.c deleted file mode 100644 index cf3803c..0000000 --- a/tools/vtpm_manager/tcs/contextmgr.c +++ /dev/null @@ -1,224 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// contextmgr.c -// -// This file contains the context management functions for TCS. -// -// ================================================================== - -#include <stdio.h> -#include <string.h> -#include <malloc.h> -#include "tcs.h" -#include "contextmgr.h" -#include "log.h" -#include "hashtable.h" - -BYTE* AddMemBlock(CONTEXT_HANDLE* pContextHandle, // in - int BlockSize) { // in - - BLOCK* pCurrentBlock = NULL; - BLOCK* pBlock = NULL; - - // check incoming params - if (pContextHandle == NULL || BlockSize == 0) - return NULL; - - // Create New Block - pBlock = (BLOCK *)malloc(sizeof(BLOCK)); - if (pBlock == NULL) - return (0); - - pBlock->aMemory = (BYTE *)malloc(sizeof(BYTE) * BlockSize); - if (pBlock->aMemory == NULL) - return (0); - - memset(pBlock->aMemory, 0, BlockSize); - pBlock->nBlockSize = BlockSize; - pBlock->pNextBlock = NULL; - - // search for the last block created where to add the - // newly created block - if(pContextHandle->pTopBlock != NULL) { - pCurrentBlock = pContextHandle->pTopBlock; - while(pCurrentBlock->pNextBlock != NULL) - pCurrentBlock = pCurrentBlock->pNextBlock; - - - pCurrentBlock->pNextBlock= pBlock; - } else - pContextHandle->pTopBlock = pBlock; - - - pContextHandle->nBlockCount++; - - return pBlock->aMemory; -} - - -BOOL DeleteMemBlock(CONTEXT_HANDLE* pContextHandle, // in - BYTE* pTCPA_BYTEs) { // in - BLOCK* pCurrentBlock = NULL; - BLOCK* pParentBlock = NULL; - BOOL bFound = FALSE; - - if (pContextHandle == NULL) - return FALSE; - - - // Search for the Block in the context by aMemory pointer - pParentBlock = NULL; - pCurrentBlock = pContextHandle->pTopBlock; - - while(pCurrentBlock != NULL) { - // If aMemory block is found, delete it - if(pCurrentBlock->aMemory == pTCPA_BYTEs || pTCPA_BYTEs == NULL) { - // if it is the top Block, remove it from the top, - // otherwise remove it from the ParentBlock and stitch - // the NextBlock to the ParentBlock - if(pParentBlock == NULL) - pContextHandle->pTopBlock = pContextHandle->pTopBlock->pNextBlock; - else - pParentBlock->pNextBlock = pCurrentBlock->pNextBlock; - - // delete memory Block associated with pointer pTCPA_BYTEs - free(pCurrentBlock->aMemory); - pCurrentBlock->aMemory = NULL; - - free(pCurrentBlock); - pCurrentBlock = pParentBlock; - - pContextHandle->nBlockCount--; - bFound = TRUE; - } - - if(pCurrentBlock != NULL) { - pParentBlock = pCurrentBlock; - pCurrentBlock = pCurrentBlock->pNextBlock; - } - } - - return bFound; -} - -BOOL AddHandleToList(TCS_CONTEXT_HANDLE hContext, // in - TPM_RESOURCE_TYPE type, // in - TPM_HANDLE handle) { // in - HANDLE_LIST* pNewHandle = NULL; - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Adding Handle to list\n"); - CONTEXT_HANDLE* pContextHandle = LookupContext(hContext); - - if (pContextHandle == NULL) - return 0; - - pNewHandle = (HANDLE_LIST *)malloc(sizeof(HANDLE_LIST)); - - if (pNewHandle == NULL) - return (0); - - pNewHandle->handle = handle; - pNewHandle->type = type; - pNewHandle->pNextHandle = pContextHandle->pHandleList; - - pContextHandle->pHandleList = pNewHandle; - - return 1; -} - -BOOL DeleteHandleFromList( TCS_CONTEXT_HANDLE hContext, // in - TPM_HANDLE handle) { // in - - CONTEXT_HANDLE* pContextHandle = LookupContext(hContext); - - HANDLE_LIST *pCurrentHandle = pContextHandle->pHandleList, - *pLastHandle = pCurrentHandle; - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Deleting Handle from list\n"); - - if (pContextHandle == NULL) - return 0; - - while (1) { - - if (pCurrentHandle->handle == handle) { // Found element - if (pCurrentHandle == pLastHandle) { // First element in list - pContextHandle->pHandleList = pCurrentHandle->pNextHandle; - free(pCurrentHandle); - } else { // Ordinary element - pLastHandle->pNextHandle = pCurrentHandle->pNextHandle; - free(pCurrentHandle); - } - - return 1; - - } else { // Not found yet; - pLastHandle = pCurrentHandle; - pCurrentHandle = pCurrentHandle->pNextHandle; - if (pCurrentHandle == NULL) // Found end of list - return 0; - } - - } -} - -BOOL FreeHandleList( CONTEXT_HANDLE* pContextHandle) { // in - HANDLE_LIST* pCurrentHandle; - BOOL returncode = TRUE; - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Freeing all handles for context\n"); - - if (pContextHandle == NULL) - return 1; - - pCurrentHandle = pContextHandle->pHandleList; - while (pCurrentHandle != NULL) { - - switch (pCurrentHandle->type) { - case TPM_RT_KEY: - returncode = returncode && !TCSP_EvictKey(pContextHandle->handle, pCurrentHandle->handle); - break; - case TPM_RT_AUTH: - returncode = returncode && !TCSP_TerminateHandle(pContextHandle->handle, pCurrentHandle->handle); - break; - default: - returncode = FALSE; - } - - pCurrentHandle = pCurrentHandle->pNextHandle; - - } - - return 1; -} diff --git a/tools/vtpm_manager/tcs/contextmgr.h b/tools/vtpm_manager/tcs/contextmgr.h deleted file mode 100644 index e3fdf0f..0000000 --- a/tools/vtpm_manager/tcs/contextmgr.h +++ /dev/null @@ -1,82 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// contextmgr.c -// -// This file contains the context management functions for TCS. -// -// ================================================================== - -#ifndef __CONTEXTMGR_H__ -#define __CONTEXTMGR_H__ - -#include "tcg.h" - -#define BLOCK_SIZE 300 - -typedef struct block { - int nBlockSize; - BYTE* aMemory; - struct block* pNextBlock; -} BLOCK; - -typedef struct handle_List { - TPM_HANDLE handle; - TPM_RESOURCE_TYPE type; - struct handle_List* pNextHandle; -} HANDLE_LIST; - -typedef struct context_handle { - TCS_CONTEXT_HANDLE handle; - int nBlockCount; - BLOCK* pTopBlock; - HANDLE_LIST* pHandleList; -} CONTEXT_HANDLE; - -BYTE* AddMemBlock( CONTEXT_HANDLE* pContextHandle, // in - int BlockSize); // in - -BOOL DeleteMemBlock(CONTEXT_HANDLE* pContextHandle, // in - BYTE* pTCPA_BYTEs); // in - - -BOOL AddHandleToList( TCS_CONTEXT_HANDLE hContext, // in - TPM_RESOURCE_TYPE type, // in - TPM_HANDLE handle); // in - -BOOL DeleteHandleFromList( TCS_CONTEXT_HANDLE hContext, // in - TPM_HANDLE handle); // in - -BOOL FreeHandleList( CONTEXT_HANDLE* pContextHandle); // in - -#endif //_CONTEXTMGR_H_ diff --git a/tools/vtpm_manager/tcs/tcs.c b/tools/vtpm_manager/tcs/tcs.c deleted file mode 100644 index 7c1378c..0000000 --- a/tools/vtpm_manager/tcs/tcs.c +++ /dev/null @@ -1,1192 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// tcs.c -// -// This file contains the functions that implement a TCS. -// -// ================================================================== - -#include <stdio.h> -#include <string.h> -#include <malloc.h> - -#include "tcg.h" -#include "bsg.h" -#include "tcs.h" -#include "contextmgr.h" -#include "tpmddl.h" -#include "log.h" -#include "hashtable.h" -#include "hashtable_itr.h" - -// Static Global Vars for the TCS -static int TCS_m_nCount = 0; - -#define TCPA_MAX_BUFFER_LENGTH 0x2000 - -static BYTE InBuf [TCPA_MAX_BUFFER_LENGTH]; -static BYTE OutBuf[TCPA_MAX_BUFFER_LENGTH]; - -struct hashtable *context_ht; - -// -------------------------- Hash table functions -------------------- - -static unsigned int hashfunc32(void *ky) { - return (* (UINT32 *) ky); -} - -static int equals32(void *k1, void *k2) { - return (*(UINT32 *) k1 == *(UINT32 *) k2); -} - -CONTEXT_HANDLE *LookupContext( TCS_CONTEXT_HANDLE hContext) { - return( (CONTEXT_HANDLE *) hashtable_search(context_ht, &hContext) ); -} - -// --------------------------------------------------------------------------------- -// Initialization/Uninitialization SubComponent API -// --------------------------------------------------------------------------------- -TPM_RESULT TCS_create() { - TDDL_RESULT hRes = TDDL_E_FAIL; - TPM_RESULT result = TPM_FAIL; - - if (TCS_m_nCount == 0) { - vtpmloginfo(VTPM_LOG_TCS, "Constructing new TCS:\n"); - hRes = TDDL_Open(); - - context_ht = create_hashtable(10, hashfunc32, equals32); - - if ((hRes == TDDL_SUCCESS) && (context_ht != NULL)) { - result = TPM_SUCCESS; - TCS_m_nCount++; - } else { - result = TPM_IOERROR; - hashtable_destroy(context_ht, 1); - } - } else - TCS_m_nCount++; - - return(result); -} - - -void TCS_destroy() -{ - TCS_m_nCount--; - - if (TCS_m_nCount == 0) { - vtpmloginfo(VTPM_LOG_TCS, "Destructing TCS:\n"); - TDDL_Close(); - - struct hashtable_itr *context_itr; - TCS_CONTEXT_HANDLE *hContext; - - // Close all the TCS contexts. TCS should evict keys based on this - if (hashtable_count(context_ht) > 0) { - context_itr = hashtable_iterator(context_ht); - do { - hContext = (TCS_CONTEXT_HANDLE *) hashtable_iterator_key(context_itr); - if (TCS_CloseContext(*hContext) != TPM_SUCCESS) - vtpmlogerror(VTPM_LOG_TCS, "Failed to close context %d properly.\n", *hContext); - - } while (hashtable_iterator_advance(context_itr)); - free(context_itr); - } - hashtable_destroy(context_ht, 1); - } - -} - -TPM_RESULT TCS_Malloc( TCS_CONTEXT_HANDLE hContext, // in - UINT32 MemSize, // in - BYTE** ppMemPtr) {// out - - TPM_RESULT returnCode = TPM_FAIL; - CONTEXT_HANDLE* pContextHandle = LookupContext(hContext); - - if (pContextHandle != NULL && ppMemPtr != NULL) { - *ppMemPtr = (BYTE *)AddMemBlock(pContextHandle, MemSize); - returnCode = TPM_SUCCESS; - } - - return returnCode; -} - -TPM_RESULT TCS_FreeMemory( TCS_CONTEXT_HANDLE hContext, // in - BYTE* pMemory) { // in - TPM_RESULT returnCode = TPM_FAIL; - CONTEXT_HANDLE* pContextHandle = LookupContext(hContext); - - if ( (pContextHandle != NULL && pMemory != NULL) && - (DeleteMemBlock(pContextHandle, pMemory) == TRUE) ) - returnCode = TPM_SUCCESS; - - - return returnCode; -} - -TPM_RESULT TCS_OpenContext(TCS_CONTEXT_HANDLE* hContext) { // out - TPM_RESULT returnCode = TPM_FAIL; - TCS_CONTEXT_HANDLE *newContext; - - vtpmloginfo(VTPM_LOG_TCS, "Calling TCS_OpenContext:\n"); - - if (hContext) { - CONTEXT_HANDLE* pContextHandle = (CONTEXT_HANDLE *) malloc(sizeof(CONTEXT_HANDLE)); - if (pContextHandle == NULL) - return TPM_SIZE; - - // initialize to 0 - pContextHandle->nBlockCount = 0; - pContextHandle->pTopBlock = NULL; - pContextHandle->pHandleList = NULL; - - // Create New Block - AddMemBlock(pContextHandle, BLOCK_SIZE); - - newContext = (TCS_CONTEXT_HANDLE *) malloc(sizeof(TCS_CONTEXT_HANDLE)); - *newContext = (TCS_CONTEXT_HANDLE) (((uintptr_t) pContextHandle >> 2) & 0xffffffff); - - if (hashtable_search(context_ht, &newContext) !=NULL) - *newContext += 1; - - pContextHandle->handle = *newContext; - if (!hashtable_insert(context_ht, newContext, pContextHandle)) { - free(newContext); - free(pContextHandle); - returnCode = TPM_FAIL; - } else { - *hContext = *newContext; - returnCode = TPM_SUCCESS; - } - } - - return(returnCode); -} - -TPM_RESULT TCS_CloseContext(TCS_CONTEXT_HANDLE hContext) {// in - //FIXME: TCS SHOULD Track failed auths and make sure - //we don't try and re-free them here. - TPM_RESULT returnCode = TPM_FAIL; - - CONTEXT_HANDLE* pContextHandle = LookupContext(hContext); - - if(pContextHandle != NULL) { - // Print test info - vtpmloginfo(VTPM_LOG_TCS, "Calling TCS_CloseContext.\n"); - - // free memory for all the blocks - DeleteMemBlock(pContextHandle, NULL ); - pContextHandle->pTopBlock = NULL; - - FreeHandleList(pContextHandle); - if (pContextHandle->pHandleList != NULL) - vtpmlogerror(VTPM_LOG_TCS, "Not all handles evicted from TPM.\n"); - - // Release the TPM's resources - if (hashtable_remove(context_ht, &hContext) == NULL) - vtpmlogerror(VTPM_LOG_TCS, "Not all handles evicted from TPM.\n"); - - free(pContextHandle); - returnCode = TPM_SUCCESS; - } - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Finished closing context\n"); - return(returnCode); -} - -// ------------------------------------------------------------------ -// Internal Functions -// ------------------------------------------------------------------ -int packAuth(BYTE* dst, TCS_AUTH* auth) { - // CHECK: according to the command specs, the outgoing auth params are: - // nonceEven - // nonceOdd - // continueAuthSession - // auth digest for return params - // - // this is a bit different than this code... - - return BSG_PackList(dst, 4, - BSG_TYPE_UINT32, &(auth->AuthHandle), - BSG_TPM_NONCE, &(auth->NonceOdd), - BSG_TYPE_BOOL, &(auth->fContinueAuthSession), - BSG_TPM_AUTHDATA, &(auth->HMAC)); -} - -int unpackAuth(TCS_AUTH* auth, BYTE* src) { - return BSG_UnpackList(src, 3, - BSG_TPM_NONCE, &(auth->NonceEven), - BSG_TYPE_BOOL, &(auth->fContinueAuthSession), - BSG_TPM_AUTHDATA, &(auth->HMAC)); -} - -// ------------------------------------------------------------------ -// Authorization Commands -// ------------------------------------------------------------------ - -TPM_RESULT TCSP_OIAP(TCS_CONTEXT_HANDLE hContext, // in - TCS_AUTHHANDLE* authHandle, // out - TPM_NONCE* nonce0) // out -{ - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_COMMAND; - TPM_COMMAND_CODE ordinal = TPM_ORD_OIAP; - UINT32 paramSize = 0; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // check input params - if (authHandle == NULL || nonce0 == NULL) - return TPM_BAD_PARAMETER; - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal); - - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) - == TDDL_SUCCESS) { - - // unpack to get the tag, paramSize, & returnCode - int i = BSG_UnpackList( OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &returnCode); - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_COMMAND) { - // Extract the remaining output parameters - BSG_UnpackList(OutBuf+i, 2, - BSG_TYPE_UINT32, authHandle, - BSG_TPM_NONCE, nonce0); - - if (!AddHandleToList(hContext, TPM_RT_AUTH, *authHandle)) - vtpmlogerror(VTPM_LOG_TCS, "New AuthHandle not recorded\n"); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); - } else - vtpmlogerror(VTPM_LOG_TCS, "Failed with return code %s\n", tpm_get_error_name(returnCode)); - - } - - return(returnCode); -} - -TPM_RESULT TCSP_OSAP(TCS_CONTEXT_HANDLE hContext, // in - TPM_ENTITY_TYPE entityType, // in - UINT32 entityValue, // in - TPM_NONCE nonceOddOSAP, // in - TCS_AUTHHANDLE* authHandle, // out - TPM_NONCE* nonceEven, // out - TPM_NONCE* nonceEvenOSAP) // out -{ - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_COMMAND; - UINT32 paramSize = 0; - TPM_COMMAND_CODE ordinal = TPM_ORD_OSAP; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // check input params - if (authHandle == NULL || nonceEven == NULL || nonceEvenOSAP == NULL) - return TPM_BAD_PARAMETER; - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 6, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal, - BSG_TYPE_UINT16, &entityType, - BSG_TYPE_UINT32, &entityValue, - BSG_TPM_NONCE, &nonceOddOSAP); - - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) - == TDDL_SUCCESS) { - - // unpack to get the tag, paramSize, & returnCode - int i = BSG_UnpackList(OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &returnCode); - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_COMMAND) { - // Extract the remaining output parameters - BSG_UnpackList(OutBuf+i, 3, - BSG_TYPE_UINT32, authHandle, - BSG_TPM_NONCE, nonceEven, - BSG_TPM_NONCE, nonceEvenOSAP); - - if (!AddHandleToList(hContext, TPM_RT_AUTH, *authHandle)) { - vtpmlogerror(VTPM_LOG_TCS, "New AuthHandle not recorded\n"); - } - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); - } else - vtpmlogerror(VTPM_LOG_TCS, "Failed with return code %s\n", tpm_get_error_name(returnCode)); - - } - - return(returnCode); -} - -TPM_RESULT TCSP_TakeOwnership(TCS_CONTEXT_HANDLE hContext, // in - UINT16 protocolID, // in - UINT32 encOwnerAuthSize, // in - BYTE* encOwnerAuth, // in - UINT32 encSrkAuthSize, // in - BYTE* encSrkAuth, // in - UINT32* SrkSize, // in, out - BYTE** Srk, // in, out - TCS_AUTH* ownerAuth) // in, out -{ - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_AUTH1_COMMAND; - UINT32 paramSize = 0; - TPM_COMMAND_CODE ordinal = TPM_ORD_TakeOwnership; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // check input params - if (encOwnerAuth == NULL || encSrkAuth == NULL || SrkSize == NULL || *Srk == NULL) - return TPM_BAD_PARAMETER; - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 5, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal, - BSG_TYPE_UINT16, &protocolID, - BSG_TYPE_UINT32, &encOwnerAuthSize); - - memcpy(InBuf+InLength, encOwnerAuth, encOwnerAuthSize); - InLength += encOwnerAuthSize; - InLength += BSG_Pack( BSG_TYPE_UINT32, - &encSrkAuthSize, - InBuf+InLength); - memcpy(InBuf+InLength, encSrkAuth, encSrkAuthSize); - InLength += encSrkAuthSize; - memcpy(InBuf+InLength, *Srk, *SrkSize); - InLength += *SrkSize; - InLength += packAuth(InBuf+InLength, ownerAuth); - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, - &InLength, - InBuf+2); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) - == TDDL_SUCCESS){ - - // unpack to get the tag, paramSize, & returnCode - int i = BSG_UnpackList( OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &returnCode); - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_AUTH1_COMMAND) { - // Extract the remaining output parameters - TPM_KEY srkPub; - i += BSG_Unpack(BSG_TPM_KEY, OutBuf+i, &srkPub); - unpackAuth(ownerAuth, OutBuf+i); - - // fill output params - BYTE tempBuf[1024]; - *SrkSize = BSG_Pack(BSG_TPM_KEY, &srkPub, tempBuf); - if (TCS_Malloc(hContext, *SrkSize, Srk) == TPM_FAIL) { - return(TPM_SIZE); - } - memcpy(*Srk, tempBuf, *SrkSize); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d", paramSize); - } else - vtpmlogerror(VTPM_LOG_TCS, "TCSP_TakeOwnership Failed with return code %s\n", tpm_get_error_name(returnCode)); - } - - return(returnCode); -} - - -TPM_RESULT TCSP_DisablePubekRead ( TCS_CONTEXT_HANDLE hContext, // in - TCS_AUTH* ownerAuth) { // in, out - - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_AUTH1_COMMAND; - UINT32 paramSize = 0; - TPM_COMMAND_CODE ordinal = TPM_ORD_DisablePubekRead; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal); - - InLength += packAuth(InBuf+InLength, ownerAuth); - - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) - == TDDL_SUCCESS){ - - // unpack to get the tag, paramSize, & returnCode - int i = BSG_UnpackList( OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &returnCode); - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_AUTH1_COMMAND) { - // Extract the remaining output parameters - unpackAuth(ownerAuth, OutBuf+i); - } else - vtpmlogerror(VTPM_LOG_TCS, "TCSP_DisablePubekRead Failed with return code %s\n", tpm_get_error_name(returnCode)); - } - - return(returnCode); -} - - -TPM_RESULT TCSP_TerminateHandle(TCS_CONTEXT_HANDLE hContext, // in - TCS_AUTHHANDLE handle) // in -{ - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_COMMAND; - UINT32 paramSize = 0; - TPM_COMMAND_CODE ordinal = TPM_ORD_Terminate_Handle; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 4, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal, - BSG_TYPE_UINT32, &handle); - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) - == TDDL_SUCCESS) { - - // unpack to get the tag, paramSize, & returnCode - BSG_UnpackList(OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &returnCode); - - if (!DeleteHandleFromList(hContext, handle)) - vtpmlogerror(VTPM_LOG_TCS, "KeyHandle not removed from list\n"); - - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_COMMAND) { - // Print debug info - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d", paramSize); - } else - vtpmlogerror(VTPM_LOG_TCS, "TCSP_TerminateHandle Failed with return code %s\n", tpm_get_error_name(returnCode)); - - } - - return(returnCode); -} - -// TPM Mandatory -TPM_RESULT TCSP_Extend( TCS_CONTEXT_HANDLE hContext, // in - TPM_PCRINDEX pcrNum, // in - TPM_DIGEST inDigest, // in - TPM_PCRVALUE* outDigest) // out -{ - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_COMMAND; - UINT32 paramSize = 0; - TPM_COMMAND_CODE ordinal = TPM_ORD_Extend; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 5, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal, - BSG_TYPE_UINT32, &pcrNum, - BSG_TPM_DIGEST, &inDigest); - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) - == TDDL_SUCCESS) { - - // unpack to get the tag, paramSize, & returnCode - int i = BSG_UnpackList(OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &returnCode); - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_COMMAND){ - // Extract the remaining output parameters - BSG_Unpack(BSG_TPM_PCRVALUE, OutBuf+i, outDigest); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); - } else - vtpmlogerror(VTPM_LOG_TCS, "TCSP_Extend Failed with return code %s\n", tpm_get_error_name(returnCode)); - } - - return(returnCode); -} - -TPM_RESULT TCSP_Seal( TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE keyHandle, // in - TPM_ENCAUTH encAuth, // in - UINT32 pcrInfoSize, // in - BYTE* PcrInfo, // in - UINT32 inDataSize, // in - BYTE* inData, // in - TCS_AUTH* pubAuth, // in, out - UINT32* SealedDataSize, // out - BYTE** SealedData) // out -{ - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_AUTH1_COMMAND; - UINT32 paramSize = 0; - TPM_COMMAND_CODE ordinal = TPM_ORD_Seal; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // check input params - if (inData == NULL || pubAuth == NULL || SealedDataSize == NULL || SealedData == NULL) - return TPM_BAD_PARAMETER; - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 6, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal, - BSG_TYPE_UINT32, &keyHandle, - BSG_TPM_ENCAUTH, encAuth, - BSG_TYPE_UINT32, &pcrInfoSize); - memcpy(InBuf+InLength, PcrInfo, pcrInfoSize); - InLength += pcrInfoSize; - InLength += BSG_Pack(BSG_TYPE_UINT32, &inDataSize, InBuf+InLength); - memcpy(InBuf+InLength, inData, inDataSize); - InLength += inDataSize; - InLength += packAuth(InBuf+InLength, pubAuth); - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) - == TDDL_SUCCESS) { - // unpack OutBuf to get the tag, paramSize, & returnCode - int i = BSG_UnpackList(OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &returnCode); - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_AUTH1_COMMAND) { - // Extract the remaining output parameters - TPM_STORED_DATA sealedData; - - i += BSG_Unpack(BSG_TPM_STORED_DATA, OutBuf+i, &sealedData); - unpackAuth(pubAuth, OutBuf+i); - - // fill SealedData - BYTE tempBuf[1024]; - *SealedDataSize = BSG_Pack(BSG_TPM_STORED_DATA, &sealedData, tempBuf); - if (TCS_Malloc(hContext, *SealedDataSize, SealedData) == TPM_FAIL) { - return TPM_SIZE; - } - memcpy(*SealedData, tempBuf, *SealedDataSize); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); - } else - vtpmlogerror(VTPM_LOG_TCS, "TCSP_Seal Failed with return code %s\n", tpm_get_error_name(returnCode)); - } - - return(returnCode); -} - -TPM_RESULT TCSP_Unseal(TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE parentHandle, // in - UINT32 SealedDataSize, // in - BYTE* SealedData, // in - TCS_AUTH* parentAuth, // in, out - TCS_AUTH* dataAuth, // in, out - UINT32* DataSize, // out - BYTE** Data) // out -{ - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_AUTH2_COMMAND; - UINT32 paramSize = 0; - TPM_COMMAND_CODE ordinal = TPM_ORD_Unseal; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // check input params - if (SealedData == NULL || parentAuth == NULL || dataAuth == NULL || - DataSize == NULL || Data == NULL) - return TPM_BAD_PARAMETER; - - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 4, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal, - BSG_TYPE_UINT32, &parentHandle); - memcpy(InBuf+InLength, SealedData, SealedDataSize); - InLength += SealedDataSize; - InLength += packAuth(InBuf+InLength, parentAuth); - InLength += packAuth(InBuf+InLength, dataAuth); - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { - // unpack OutBuf to get the tag, paramSize, & returnCode - int i = BSG_UnpackList( OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &returnCode); - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_AUTH2_COMMAND) { - // Extract the remaining output parameters - i += BSG_Unpack(BSG_TYPE_UINT32, OutBuf+i, DataSize); - if (TCS_Malloc(hContext, *DataSize, Data) == TPM_FAIL) { - return TPM_SIZE; - } - memcpy(*Data, OutBuf+i, *DataSize); - i += *DataSize; - i += unpackAuth(parentAuth, OutBuf+i); - unpackAuth(dataAuth, OutBuf+i); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); - } else - vtpmlogerror(VTPM_LOG_TCS, "TCSP_Unseal Failed with return code %s\n", tpm_get_error_name(returnCode)); - } - - return(returnCode); -} - -TPM_RESULT TCSP_UnBind(TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE keyHandle, // in - UINT32 inDataSize, // in - BYTE* inData, // in - TCS_AUTH* privAuth, // in, out - UINT32* outDataSize, // out - BYTE** outData) // out -{ - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_AUTH1_COMMAND; - UINT32 paramSize = 0; - TPM_COMMAND_CODE ordinal = TPM_ORD_UnBind; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // check input params - if (inData == NULL || privAuth == NULL || outDataSize == NULL || outData == NULL) - return TPM_BAD_PARAMETER; - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 5, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal, - BSG_TYPE_UINT32, &keyHandle, - BSG_TYPE_UINT32, &inDataSize); - memcpy(InBuf+InLength, inData, inDataSize); - InLength += inDataSize; - InLength += packAuth(InBuf+InLength, privAuth); - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "\n\tSending paramSize = %d", InLength); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { - // unpack OutBuf to get the tag, paramSize, & returnCode - int i = BSG_UnpackList(OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &returnCode); - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_AUTH1_COMMAND) { - // Extract the remaining output parameters - i += BSG_Unpack(BSG_TYPE_UINT32, OutBuf+i, outDataSize); - if (TCS_Malloc(hContext, *outDataSize, outData) == TPM_FAIL) - return TPM_SIZE; - - memcpy(*outData, OutBuf+i, *outDataSize); - i += *outDataSize; - unpackAuth(privAuth, OutBuf+i); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); - } else - vtpmlogerror(VTPM_LOG_TCS, "TCSP_UnBind Failed with return code %s\n", tpm_get_error_name(returnCode)); - } - - return(returnCode); -} - -TPM_RESULT TCSP_CreateWrapKey(TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE hWrappingKey, // in - TPM_ENCAUTH KeyUsageAuth, // in - TPM_ENCAUTH KeyMigrationAuth, // in - UINT32* pcKeySize, // in, out - BYTE** prgbKey, // in, out - TCS_AUTH* pAuth) // in, out -{ - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_AUTH1_COMMAND; - UINT32 paramSize = 0; - TPM_COMMAND_CODE ordinal = TPM_ORD_CreateWrapKey; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // check input params - if (pcKeySize == NULL || *prgbKey == NULL || pAuth == NULL) - return TPM_BAD_PARAMETER; - - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 6, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal, - BSG_TYPE_UINT32, &hWrappingKey, - BSG_TPM_ENCAUTH, KeyUsageAuth, - BSG_TPM_ENCAUTH, KeyMigrationAuth); - memcpy(InBuf+InLength, *prgbKey, *pcKeySize); - InLength += *pcKeySize; - InLength += packAuth(InBuf+InLength, pAuth); - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { - // unpack OutBuf to get the tag, paramSize, & returnCode - int i = BSG_UnpackList(OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_RESULT, &returnCode); - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_AUTH1_COMMAND) { - // Extract the remaining output parameters - TPM_KEY wrappedKey; - - i += BSG_Unpack(BSG_TPM_KEY, OutBuf+i, &wrappedKey); - unpackAuth(pAuth, OutBuf+i); - - // Fill prgbKey - BYTE tempBuf[1024]; - *pcKeySize = BSG_Pack(BSG_TPM_KEY, &wrappedKey, tempBuf); - if (TCS_Malloc(hContext, *pcKeySize, prgbKey) == TPM_FAIL) - return TPM_SIZE; - - memcpy(*prgbKey, tempBuf, *pcKeySize); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); - } else - vtpmlogerror(VTPM_LOG_TCS, "TCSP_CreateWrapKey Failed with return code %s\n", tpm_get_error_name(returnCode)); - } - - return(returnCode); -} - -TPM_RESULT TCSP_LoadKeyByBlob(TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE hUnwrappingKey, // in - UINT32 cWrappedKeyBlobSize, // in - BYTE* rgbWrappedKeyBlob, // in - TCS_AUTH* pAuth, // in, out - TCS_KEY_HANDLE* phKeyTCSI, // out - TCS_KEY_HANDLE* phKeyHMAC) // out -{ - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_AUTH1_COMMAND; - UINT32 paramSize = 0; - TPM_COMMAND_CODE ordinal = TPM_ORD_LoadKey; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // check input params - if (rgbWrappedKeyBlob == NULL || pAuth == NULL || phKeyTCSI == NULL || phKeyHMAC == NULL) - return TPM_BAD_PARAMETER; - - *phKeyHMAC = hUnwrappingKey; // the parent key is the one that the TPM use to make the HMAC calc - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 4, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal, - BSG_TYPE_UINT32, &hUnwrappingKey); - memcpy(InBuf+InLength, rgbWrappedKeyBlob, cWrappedKeyBlobSize); - InLength += cWrappedKeyBlobSize; - InLength += packAuth(InBuf+InLength, pAuth); - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { - // unpack OutBuf to get the tag, paramSize, & returnCode - int i = BSG_UnpackList(OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &returnCode); - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_AUTH1_COMMAND) { - // Extract the remaining output parameters - i += BSG_Unpack(BSG_TYPE_UINT32, - OutBuf+i, - phKeyTCSI); - unpackAuth(pAuth, OutBuf+i); - - if (!AddHandleToList(hContext, TPM_RT_KEY, *phKeyTCSI)) { - vtpmlogerror(VTPM_LOG_TCS, "New KeyHandle not recorded\n"); - } - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); - } else - vtpmlogerror(VTPM_LOG_TCS, "TCSP_LoadKeyByBlob Failed with return code %s\n", tpm_get_error_name(returnCode)); - } - - return(returnCode); -} - -TPM_RESULT TCSP_EvictKey(TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE hKey) // in -{ - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_COMMAND; - UINT32 paramSize = 0; - TPM_COMMAND_CODE ordinal = TPM_ORD_EvictKey; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 4, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal, - BSG_TYPE_UINT32, &hKey); - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { - // unpack OutBuf to get the tag, paramSize, & returnCode - BSG_UnpackList(OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &returnCode); - - if (!DeleteHandleFromList(hContext, hKey)) { - vtpmlogerror(VTPM_LOG_TCS, "KeyHandle not removed from list\n"); - } - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_COMMAND) { - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); - } else { - vtpmlogerror(VTPM_LOG_TCS, "TCSP_EvictKey Failed with return code %s\n", tpm_get_error_name(returnCode)); - } - } - - return(returnCode); -} - -TPM_RESULT TCSP_GetRandom(TCS_CONTEXT_HANDLE hContext, // in - UINT32* bytesRequested, // in, out - BYTE** randomBytes) // out -{ - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_COMMAND; - UINT32 paramSize = 0; - TPM_COMMAND_CODE ordinal = TPM_ORD_GetRandom; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // check input params - if (bytesRequested == NULL || *randomBytes == NULL){ - return TPM_BAD_PARAMETER; - } - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 4, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal, - BSG_TYPE_UINT32, bytesRequested); - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { - // unpack OutBuf to get the tag, paramSize, & returnCode - int i = BSG_UnpackList(OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &returnCode); - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_COMMAND) { - // Extract the remaining output parameters - BSG_Unpack(BSG_TYPE_UINT32, OutBuf+i, bytesRequested); - if (TCS_Malloc(hContext, *bytesRequested, randomBytes) == TPM_FAIL) { - return TPM_SIZE; - } - memcpy(*randomBytes, OutBuf+i+sizeof(UINT32), *bytesRequested); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); - } else { - vtpmlogerror(VTPM_LOG_TCS, "TCSP_GetRandom Failed with return code %s\n", tpm_get_error_name(returnCode)); - } - } - - return(returnCode); -} - - -TPM_RESULT TCSP_ReadPubek(TCS_CONTEXT_HANDLE hContext, // in - TPM_NONCE antiReplay, // in - UINT32* pubEndorsementKeySize, // out - BYTE** pubEndorsementKey, // out - TPM_DIGEST* checksum) // out -{ - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_COMMAND; - UINT32 paramSize = 0; - TPM_COMMAND_CODE ordinal = TPM_ORD_ReadPubek; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // check input params - if (pubEndorsementKeySize == NULL || pubEndorsementKey == NULL || checksum == NULL) { - return TPM_BAD_PARAMETER; - } - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 4, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal, - BSG_TPM_NONCE, &antiReplay); - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { - // unpack OutBuf to get the tag, paramSize, & returnCode - int i = BSG_UnpackList(OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &returnCode); - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_COMMAND) { - // Extract the remaining output parameters - TPM_PUBKEY pubEK; - i += BSG_UnpackList(OutBuf+i, 2, - BSG_TPM_PUBKEY, &pubEK, - BSG_TPM_DIGEST, checksum); - - // fill EndorsementKey - BYTE tempBuf[1024]; - *pubEndorsementKeySize = BSG_Pack(BSG_TPM_PUBKEY, &pubEK, tempBuf); - if (TCS_Malloc(hContext, *pubEndorsementKeySize, pubEndorsementKey) == TPM_FAIL) { - return TPM_SIZE; - } - memcpy(*pubEndorsementKey, tempBuf, *pubEndorsementKeySize); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); - } else { - vtpmlogerror(VTPM_LOG_TCS, "TCSP_ReadPubek Failed with return code %s\n", tpm_get_error_name(returnCode)); - } - } - - return(returnCode); -} - - -TPM_RESULT TCSP_SaveState(TCS_CONTEXT_HANDLE hContext) // in -{ - // setup input/output parameters block - TPM_TAG tag = TPM_TAG_RQU_COMMAND; - UINT32 paramSize = 0; - TPM_COMMAND_CODE ordinal = TPM_ORD_SaveState; - TPM_RESULT returnCode = TPM_SUCCESS; - - // setup the TPM driver input and output buffers - TDDL_RESULT hRes = TDDL_E_FAIL; - TDDL_UINT32 InLength = TCPA_MAX_BUFFER_LENGTH; - TDDL_UINT32 OutLength = TCPA_MAX_BUFFER_LENGTH; - - // Convert Byte Input parameter in the input byte stream InBuf - InLength = BSG_PackList(InBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &ordinal); - // fill paramSize again as we now have the correct size - BSG_Pack(BSG_TYPE_UINT32, &InLength, InBuf+2); - - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Sending paramSize = %d\n", InLength); - - // call the TPM driver - if ((hRes = TDDL_TransmitData(InBuf, InLength, OutBuf, &OutLength)) == TDDL_SUCCESS) { - // unpack OutBuf to get the tag, paramSize, & returnCode - BSG_UnpackList(OutBuf, 3, - BSG_TPM_TAG, &tag, - BSG_TYPE_UINT32, ¶mSize, - BSG_TPM_COMMAND_CODE, &returnCode); - - if (returnCode == TPM_SUCCESS && tag == TPM_TAG_RSP_COMMAND) { - vtpmloginfo(VTPM_LOG_TCS_DEEP, "Received paramSize : %d\n", paramSize); - } else { - vtpmlogerror(VTPM_LOG_TCS, "TCSP_SaveState Failed with return code %s\n", tpm_get_error_name(returnCode)); - } - } - - return(returnCode); -} - - -TPM_RESULT TCSP_RawTransmitData( UINT32 inDataSize, // in - BYTE *inData, // in - UINT32 *outDataSize,// in/out - BYTE *outData) { // out - - TDDL_RESULT hRes; - - vtpmloginfo(VTPM_LOG_TCS, "Calling TransmitData directly.\n"); - //FIXME: Add Context Management - hRes = TDDL_TransmitData( inData, - inDataSize, - outData, - outDataSize); - - if (hRes == TDDL_SUCCESS) { - return TPM_SUCCESS; - } else { - vtpmlogerror(VTPM_LOG_TCS, "TCSP_RawTransmitData Failed with return code %s\n", tpm_get_error_name(TPM_IOERROR)); - return TPM_IOERROR; - } - -} diff --git a/tools/vtpm_manager/tcs/tcs.h b/tools/vtpm_manager/tcs/tcs.h deleted file mode 100644 index 83b9cd0..0000000 --- a/tools/vtpm_manager/tcs/tcs.h +++ /dev/null @@ -1,245 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// tcs.h -// -// This file declares the TCS API -// -// ================================================================== - -#ifndef __TCS_H__ -#define __TCS_H__ - -#include "tcg.h" -#include "contextmgr.h" -#include "buffer.h" - -#define HANDLE_NULL 0 - -// ------------------------------------------------------------------ -// Exposed API -// ------------------------------------------------------------------ - -TPM_RESULT TCS_create(); -void TCS_destroy(); - -TPM_RESULT TCS_OpenContext( /* OUT */ TCS_CONTEXT_HANDLE* hContext ); - -TPM_RESULT TCS_CloseContext ( /* IN */ TCS_CONTEXT_HANDLE hContext ); - -TPM_RESULT TCS_Malloc ( TCS_CONTEXT_HANDLE hContext, // in - UINT32 MemSize, // in - BYTE** ppMemPtr ); //out - -TPM_RESULT TCS_FreeMemory ( TCS_CONTEXT_HANDLE hContext, // in - BYTE* pMemory); // in - -// ------------------------------------------------------------------ -// Exposed API -// ------------------------------------------------------------------ - -// TPM v1.1B Command Set - -// Authorzation -TPM_RESULT TCSP_OIAP( TCS_CONTEXT_HANDLE hContext, // in - TCS_AUTHHANDLE* authHandle, // out - TPM_NONCE* nonce0 // out - ); - -TPM_RESULT TCSP_OSAP ( TCS_CONTEXT_HANDLE hContext, // in - TPM_ENTITY_TYPE entityType, // in - UINT32 entityValue, // in - TPM_NONCE nonceOddOSAP, // in - TCS_AUTHHANDLE* authHandle, // out - TPM_NONCE* nonceEven, // out - TPM_NONCE* nonceEvenOSAP // out - ); - -TPM_RESULT TCSP_TakeOwnership ( TCS_CONTEXT_HANDLE hContext, // in - UINT16 protocolID, // in - UINT32 encOwnerAuthSize, // in - BYTE* encOwnerAuth, // in - UINT32 encSrkAuthSize, // in - BYTE* encSrkAuth, // in - UINT32* SrkSize, // in, out - BYTE** Srk, // in, out - TCS_AUTH* ownerAuth // in, out - ); - -TPM_RESULT TCSP_DisablePubekRead ( TCS_CONTEXT_HANDLE hContext, // in - TCS_AUTH* ownerAuth // in, out - ); - -TPM_RESULT TCSP_TerminateHandle ( TCS_CONTEXT_HANDLE hContext, // in - TCS_AUTHHANDLE handle // in - ); - -TPM_RESULT TCSP_FlushSpecific ( TCS_CONTEXT_HANDLE hContext, // in - TCS_AUTHHANDLE handle, // in - TPM_RESOURCE_TYPE resourceType //in - ); - -// TPM Mandatory -TPM_RESULT TCSP_Extend ( TCS_CONTEXT_HANDLE hContext, // in - TPM_PCRINDEX pcrNum, // in - TPM_DIGEST inDigest, // in - TPM_PCRVALUE* outDigest // out - ); - -TPM_RESULT TCSP_PcrRead ( TCS_CONTEXT_HANDLE hContext, // in - TPM_PCRINDEX pcrNum, // in - TPM_PCRVALUE* outDigest // out - ); - -TPM_RESULT TCSP_Quote ( TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE keyHandle, // in - TPM_NONCE antiReplay, // in - UINT32* PcrDataSize, // in, out - BYTE** PcrData, // in, out - TCS_AUTH* privAuth, // in, out - UINT32* sigSize, // out - BYTE** sig // out - ); - -TPM_RESULT TCSP_Seal ( TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE keyHandle, // in - TPM_ENCAUTH encAuth, // in - UINT32 pcrInfoSize, // in - BYTE* PcrInfo, // in - UINT32 inDataSize, // in - BYTE* inData, // in - TCS_AUTH* pubAuth, // in, out - UINT32* SealedDataSize, // out - BYTE** SealedData // out - ); - -TPM_RESULT TCSP_Unseal ( TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE parentHandle, // in - UINT32 SealedDataSize, // in - BYTE* SealedData, // in - TCS_AUTH* parentAuth, // in, out - TCS_AUTH* dataAuth, // in, out - UINT32* DataSize, // out - BYTE** Data // out - ); - -TPM_RESULT TCSP_DirWriteAuth ( TCS_CONTEXT_HANDLE hContext, // in - TPM_DIRINDEX dirIndex, // in - TPM_DIRVALUE newContents, // in - TCS_AUTH* ownerAuth // in, out - ); - -TPM_RESULT TCSP_DirRead ( TCS_CONTEXT_HANDLE hContext, // in - TPM_DIRINDEX dirIndex, // in - TPM_DIRVALUE* dirValue // out - ); - -TPM_RESULT TCSP_UnBind ( TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE keyHandle, // in - UINT32 inDataSize, // in - BYTE* inData, // in - TCS_AUTH* privAuth, // in, out - UINT32* outDataSize, // out - BYTE** outData // out - ); - -TPM_RESULT TCSP_CreateWrapKey ( TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE hWrappingKey, // in - TPM_ENCAUTH KeyUsageAuth, // in - TPM_ENCAUTH KeyMigrationAuth, // in - UINT32* pcKeySize, // in, out - BYTE** prgbKey, // in, out - TCS_AUTH* pAuth // in, out - ); - -TPM_RESULT TCSP_LoadKeyByBlob ( TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE hUnwrappingKey, // in - UINT32 cWrappedKeyBlobSize, // in - BYTE* rgbWrappedKeyBlob, // in - TCS_AUTH* pAuth, // in, out - TCS_KEY_HANDLE* phKeyTCSI, // out - TCS_KEY_HANDLE* phKeyHMAC // out - ); - -TPM_RESULT TCSP_GetPubKey ( TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE hKey, // in - TCS_AUTH* pAuth, // in, out - UINT32* pcPubKeySize, // out - BYTE** prgbPubKey // out - ); - -TPM_RESULT TCSP_EvictKey ( TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE hKey // in - ); - -TPM_RESULT TCSP_Sign ( TCS_CONTEXT_HANDLE hContext, // in - TCS_KEY_HANDLE keyHandle, // in - UINT32 areaToSignSize, // in - BYTE* areaToSign, // in - TCS_AUTH* privAuth, // in, out - UINT32* sigSize, // out - BYTE** sig // out - ); - -TPM_RESULT TCSP_GetRandom ( TCS_CONTEXT_HANDLE hContext, // in - UINT32* bytesRequested, // in, out - BYTE** randomBytes // out - ); - -TPM_RESULT TCSP_StirRandom ( TCS_CONTEXT_HANDLE hContext, // in - UINT32 inDataSize, // in - BYTE* inData // in - ); - -TPM_RESULT TCSP_ReadPubek ( TCS_CONTEXT_HANDLE hContext, // in - TPM_NONCE antiReplay, // in - UINT32* pubEndorsementKeySize, // out - BYTE** pubEndorsementKey, // out - TPM_DIGEST* checksum // out - ); - - -// Non-Standard TCSP calls -TPM_RESULT TCSP_SaveState(TCS_CONTEXT_HANDLE hContext); // in - -//Give direct access to TransmitData. -// Key and Auth Management is done before transfering command to TDDL. -TPM_RESULT TCSP_RawTransmitData(UINT32 inDataSize, // in - BYTE *inData, // in - UINT32 *outDataSize,// in/out - BYTE *outData); // out - -///////////// Private Functions //////////////////// -CONTEXT_HANDLE* LookupContext( TCS_CONTEXT_HANDLE hContext); - -#endif //TCS_H diff --git a/tools/vtpm_manager/tcs/tpmddl.h b/tools/vtpm_manager/tcs/tpmddl.h deleted file mode 100644 index e7e54f1..0000000 --- a/tools/vtpm_manager/tcs/tpmddl.h +++ /dev/null @@ -1,69 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// tpmddl.c -// -// This file defines the TDDLI API -// -// ================================================================== - -#ifndef __TPMDDL_H__ -#define __TPMDDL_H__ - -#define TDDL_CAP_PROP_MANUFACTURER 0x0001 - -#define TDDL_E_FAIL 1 -#define TDDL_E_SUCCESS 0 -#define TDDL_SUCCESS 0 - -typedef unsigned int TDDL_UINT32; -typedef TDDL_UINT32 TDDL_RESULT; -typedef unsigned char TDDL_BYTE; - -TDDL_RESULT TDDL_Open(); -void TDDL_Close(); -TDDL_RESULT TDDL_TransmitData( TDDL_BYTE* in, - TDDL_UINT32 insize, - TDDL_BYTE* out, - TDDL_UINT32* outsize); -TDDL_RESULT TDDL_GetStatus(); -TDDL_RESULT TDDL_GetCapability( TDDL_UINT32 cap, - TDDL_UINT32 sub, - TDDL_BYTE* buffer, - TDDL_UINT32* size); -TDDL_RESULT TDDL_SetCapability( TDDL_UINT32 cap, - TDDL_UINT32 sub, - TDDL_BYTE* buffer, - TDDL_UINT32* size); - -#endif // __TPMDDL_H__ diff --git a/tools/vtpm_manager/tcs/transmit.c b/tools/vtpm_manager/tcs/transmit.c deleted file mode 100644 index 74bbdca..0000000 --- a/tools/vtpm_manager/tcs/transmit.c +++ /dev/null @@ -1,147 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== - -#include <unistd.h> -#include <stdio.h> -#include <errno.h> -#include <fcntl.h> - -#include "tcg.h" -#include "buffer.h" -#include "log.h" -#include "tpmddl.h" - -// flag to track whether TDDL has been opened -static int g_TDDL_open = 0; -static int g_tx_fd = -1; // the fd to the TPM - -#ifndef DUMMY_TPM - #define TPM_TX_FNAME "/dev/tpm0" - static int *g_rx_fdp = &g_tx_fd; -#else - #define TPM_TX_FNAME "/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 - -TPM_RESULT -TDDL_TransmitData( TDDL_BYTE* in, - TDDL_UINT32 insize, - TDDL_BYTE* out, - TDDL_UINT32* outsize) { - TPM_RESULT status = TPM_SUCCESS; - TDDL_UINT32 i; - - vtpmloginfo(VTPM_LOG_TXDATA, "Sending buffer = 0x"); - for(i = 0 ; i < insize ; i++) - vtpmloginfomore(VTPM_LOG_TXDATA, "%2.2x ", in[i]); - - vtpmloginfomore(VTPM_LOG_TXDATA, "\n"); - - ssize_t size = 0; - - // send the request - size = write (g_tx_fd, in, insize); - if (size < 0) { - vtpmlogerror(VTPM_LOG_TXDATA, "write() failed"); - ERRORDIE (TPM_IOERROR); - } - else if ((TDDL_UINT32) size < insize) { - vtpmlogerror(VTPM_LOG_TXDATA, "Wrote %d instead of %d bytes!\n", (int) size, insize); - // ... ? - } - - // read the response - size = read (*g_rx_fdp, out, TCPA_MAX_BUFFER_LENGTH); - if (size < 0) { - vtpmlogerror(VTPM_LOG_TXDATA, "read() failed"); - ERRORDIE (TPM_IOERROR); - } - - vtpmloginfo(VTPM_LOG_TXDATA, "Receiving buffer = 0x"); - for(i = 0 ; i < size ; i++) - vtpmloginfomore(VTPM_LOG_TXDATA, "%2.2x ", out[i]); - - vtpmloginfomore(VTPM_LOG_TXDATA, "\n"); - - *outsize = size; - // close connection - goto egress; - - abort_egress: - egress: - return status; -} - -TPM_RESULT TDDL_Open() { - - TDDL_RESULT status = TDDL_SUCCESS; - - if (g_TDDL_open) - return TPM_FAIL; - -#ifdef DUMMY_TPM - *g_rx_fdp = open (TPM_RX_FNAME, O_RDWR); -#endif - - g_tx_fd = open (TPM_TX_FNAME, O_RDWR); - if (g_tx_fd < 0) { - vtpmlogerror(VTPM_LOG_TXDATA, "TPM open failed"); - return TPM_IOERROR; - } - - g_TDDL_open = 1; - - return status; -} - -void TDDL_Close() { - if (! g_TDDL_open) - return; - - if (g_tx_fd>= 0) { - if (close(g_tx_fd) < 0) - vtpmlogerror(VTPM_LOG_TXDATA, "closeing tpm failed"); - g_tx_fd = -1; - } - - if (*g_rx_fdp>= 0) { - if (close(*g_rx_fdp) < 0) - vtpmlogerror(VTPM_LOG_TXDATA, "closeing tpm failed"); - *g_rx_fdp = -1; - } - - g_TDDL_open = 0; - -} diff --git a/tools/vtpm_manager/util/Makefile b/tools/vtpm_manager/util/Makefile deleted file mode 100644 index 36bc38f..0000000 --- a/tools/vtpm_manager/util/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -XEN_ROOT = $(CURDIR)/../../.. -include $(XEN_ROOT)/tools/vtpm_manager/Rules.mk - -BIN = libTCGUtils.a - -.PHONY: all -all: build - -.PHONY: build -build: $(BIN) - -.PHONY: install -install: build - -.PHONY: clean -clean: - rm -f *.a *.so *.o *.rpm $(DEP_FILES) - -.PHONY: mrproper -mrproper: clean - rm -f *~ - -$(BIN): $(OBJS) - $(AR) rcs $(BIN) $(OBJS) diff --git a/tools/vtpm_manager/util/bsg.c b/tools/vtpm_manager/util/bsg.c deleted file mode 100644 index fa36ce7..0000000 --- a/tools/vtpm_manager/util/bsg.c +++ /dev/null @@ -1,829 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// bsg.cpp -// -// This file will handle all the TPM Byte Stream functions -// -// ================================================================== - -#include <stdio.h> -#include <string.h> -#include <stdarg.h> -#include <malloc.h> -#include "tcg.h" -#include "crypto.h" -#include "bsg.h" -#include "log.h" - -static int g_log_recursion_level = 0; - -// a largest buffer size. if we get a buf size bigger than this when unpacking, -// will complain! -#define BSG_MAX_BUF_SIZE (1<<18) - -#define bsglog(fmt, ...) do { \ - int __i; \ - for (__i=0; __i < g_log_recursion_level; __i++) { \ - vtpmloginfomore (VTPM_LOG_BSG, "%s", " "); \ - } \ - vtpmloginfomore (VTPM_LOG_BSG, fmt, __VA_ARGS__); \ - } while (0) - - -// FIXME: trigger the selfcheck--need to use glibc hook to do this -//BOOL dummy1 = BSG_static_selfcheck(); - - -// Interpretting Types -// ------------------- -// -// Incoming Types are composed of two parts {format, info} squished into a -// BSG_UINT32. The first 4 bits is a format spec indicating what type of -// data it is. If the first 4 bits are zero the info corresponds to a value in -// BSG_s_fmt[]. This is a structure whose composition is described in -// BSG_s_fmt[]. If the value is non-zero, info corresponds to the size of the -// data (in bytes) being passed in. For example a UINT32 being passed in would -// have a format of (__FMT_CONST | 4). If both, the format and info are zero, -// this is interpretted as the end of the structure, and the result is returned. - -// these flags are mutually exclusive, so I'll just make them -// format values which indicate the semantics of the 'info' part and the source -// data. The above description has been accordingly adjusted. - -// format values for determining what type of data the incoming type is -// it's a 4 bit value, occupying the high 4 bits -#define __FMT_CONST (1UL << 28) // Constant sized value -#define __FMT_DATA (2UL << 28) // Believed to be raw data NOT {size,data} -#define __FMT_SIZE (3UL << 28) // A size. Used in FMT_SIZE??_DATA. -#define __FMT_HSIZE (4UL << 28) // A number of handles -#define __FMT_PACKED (5UL << 28) // 'info' is unused; the source data consists - // of {size32, data} but we're to pack only the - // data as that is already packed, and so - // can/must be unpacked without - // explicitly reading it size - -#define __FMT_MASK 0x0FFFFFFFUL // this masks out the 4-bit format -#define __FMT_MASK_SIZE(type) ((type) & __FMT_MASK) -#define __FMT_MASK_FORMAT(type) ((type) & (~__FMT_MASK)) - -// constant (8/16/32-bits) -#define FMT_U8 (__FMT_CONST | 1UL) -#define FMT_U16 (__FMT_CONST | 2UL) -#define FMT_U32 (__FMT_CONST | 4UL) - -// const with a compiler-computed size -#define FMT_SIZEOF(type) (__FMT_CONST | sizeof(type)) - -// other data (size bytes) -// Used primarily for DIGESTS -> FMT_DATA(20) -#define FMT_DATA(size) (__FMT_DATA | ((BSG_UINT32) (size) & __FMT_MASK)) - -// 16/32-bit size followed by N bytes of data -#define FMT_SIZE16_DATA (__FMT_SIZE | 2UL) -#define FMT_SIZE32_DATA (__FMT_SIZE | 4UL) - -// 16-bit size followed by N key handles -#define FMT_SIZE16_HANDLES (__FMT_HSIZE | 2UL) - -#define DIGEST_SIZE 20 -typedef BSG_UINT32 BSG_HANDLE; - -// TCPA_AUTH has 11 fields! -#define MAX_FIELDS 11 -typedef struct BSG_Format -{ - BSG_Type type; - const char* name; - BSG_UINT32 fields[MAX_FIELDS + 1]; -} BSG_Format; - -/* - * TCPA structure data formats - */ -// this has to be manually kept in sync with the -// Type enum!! the static_selfcheck() function should be used regularly! -static BSG_Format s_fmt[] = -{ - {BSG_TYPE_UINT32, "BSG_TYPE_UINT32", {FMT_U32, 0}}, - {BSG_TYPE_UINT16, "BSG_TYPE_UINT16", {FMT_U16, 0}}, - {BSG_TYPE_BYTE, "BSG_TYPE_BYTE", {FMT_U8, 0}}, - {BSG_TYPE_BOOL, "BSG_TYPE_BOOL", {FMT_U8, 0}}, - {BSG_TPM_SIZE32_DATA, "BSG_TPM_SIZE32_DATA", {FMT_SIZE32_DATA, 0}}, - {BSG_TPM_TAG, "BSG_TPM_TAG", {FMT_SIZEOF(TPM_TAG), 0}}, - {BSG_TPM_HANDLE, "BSG_TPM_HANDLE", {FMT_SIZEOF(TPM_HANDLE), 0}}, - {BSG_TPM_RESULT, "BSG_TPM_RESULT", {FMT_SIZEOF(TPM_RESULT), 0}}, - {BSG_TPM_RESOURCE_TYPE, "BSG_TPM_RESOURCE_TYPE", {FMT_SIZEOF(TPM_RESOURCE_TYPE), 0}}, - {BSG_TPM_COMMAND_CODE, "BSG_TPM_COMMAND_CODE", {FMT_U32, 0}}, - {BSG_TPM_AUTH_DATA_USAGE, "BSG_TPM_AUTH_DATA_USAGE", {FMT_U8, 0}}, - {BSG_TPM_ALGORITHM_ID, "BSG_TPM_ALGORITHM_ID", {FMT_U32, 0}}, - {BSG_TPM_PROTOCOL_ID, "BSG_TPM_PROTOCOL_ID", {FMT_SIZEOF(TPM_PROTOCOL_ID), 0}}, - {BSG_TPM_KEY_USAGE, "BSG_TPM_KEY_USAGE", {FMT_U16, 0}}, - {BSG_TPM_ENC_SCHEME, "BSG_TPM_ENC_SCHEME", {FMT_U16, 0}}, - {BSG_TPM_SIG_SCHEME, "BSG_TPM_SIG_SCHEME", {FMT_U16, 0}}, - {BSG_TPM_MIGRATE_SCHEME, "BSG_TPM_MIGRATE_SCHEME", {FMT_U16, 0}}, - {BSG_TPM_KEY_FLAGS, "BSG_TPM_KEY_FLAGS", {FMT_U32, 0}}, - - {BSG_TPM_AUTHDATA, "BSG_TPM_AUTHDATA", {FMT_DATA(DIGEST_SIZE), 0}}, - {BSG_TPM_SECRET, "BSG_TPM_SECRET", {BSG_TPM_AUTHDATA, 0}}, - {BSG_TPM_ENCAUTH, "BSG_TPM_ENCAUTH", {BSG_TPM_AUTHDATA, 0}}, - {BSG_TPM_PAYLOAD_TYPE, "BSG_TPM_PAYLOAD_TYPE", {FMT_SIZEOF(TPM_PAYLOAD_TYPE), 0}}, - - {BSG_TPM_VERSION, "BSG_TPM_VERSION", {FMT_DATA(4), 0}}, // vers 1.2 - {BSG_TPM_DIGEST, "BSG_TPM_DIGEST", {FMT_DATA(DIGEST_SIZE), 0}}, - {BSG_TPM_COMPOSITE_HASH, "BSG_TPM_COMPOSITE_HASH", {BSG_TPM_DIGEST, 0}}, - {BSG_TPM_CHOSENID_HASH, "BSG_TPM_CHOSENID_HASH", {BSG_TPM_DIGEST, 0}}, - - {BSG_TPM_NONCE, "BSG_TPM_NONCE", {FMT_DATA(DIGEST_SIZE), 0}}, - {BSG_TPM_KEY_HANDLE, "BSG_TPM_KEY_HANDLE", {FMT_SIZEOF(TPM_KEY_HANDLE), 0}}, - {BSG_TPM_KEY_HANDLE_LIST, "BSG_TPM_KEY_HANDLE_LIST", - {FMT_SIZE16_HANDLES, 0}}, - - {BSG_TPM_KEY_PARMS, "BSG_TPM_KEY_PARMS", { - BSG_TPM_ALGORITHM_ID, - BSG_TPM_ENC_SCHEME, - BSG_TPM_SIG_SCHEME, - FMT_SIZE32_DATA, - 0}}, - {BSG_TPM_RSA_KEY_PARMS, "BSG_TPM_RSA_KEY_PARMS", { - FMT_U32, FMT_U32, FMT_SIZE32_DATA, 0}}, - {BSG_TPM_STORE_PUBKEY, "BSG_TPM_STORE_PUBKEY", {FMT_SIZE32_DATA, 0}}, - {BSG_TPM_PUBKEY, "BSG_TPM_PUBKEY", {BSG_TPM_KEY_PARMS, BSG_TPM_STORE_PUBKEY, 0}}, - {BSG_TPM_KEY, "BSG_TPM_KEY", { - BSG_TPM_VERSION, - BSG_TPM_KEY_USAGE, - BSG_TPM_KEY_FLAGS, - BSG_TPM_AUTH_DATA_USAGE, - BSG_TPM_KEY_PARMS, - FMT_SIZE32_DATA, // the PCR_INFO - BSG_TPM_STORE_PUBKEY, - FMT_SIZE32_DATA, // the encrypted part - 0}}, - - {BSG_TPM_MIGRATIONKEYAUTH, "BSG_TPM_MIGRATIONKEYAUTH", { - BSG_TPM_PUBKEY, - BSG_TPM_MIGRATE_SCHEME, - BSG_TPM_DIGEST, 0}}, - - {BSG_TCPA_AUDIT_EVENT, "TCPA_AUDIT_EVENT", { - BSG_TPM_COMMAND_CODE, - BSG_TPM_RESULT, 0 }}, - - {BSG_TCPA_EVENT_CERT, "TCPA_EVENT_CERT", { - BSG_TPM_DIGEST, - BSG_TPM_DIGEST, - FMT_DATA(2), - FMT_SIZE32_DATA, 0}}, - - {BSG_TPM_PCR_SELECTION, "BSG_TPM_PCR_SELECTION", {FMT_SIZE16_DATA, 0} }, - {BSG_TPM_PCR_COMPOSITE, "BSG_TPM_PCR_COMPOSITE", { BSG_TPM_PCR_SELECTION, - FMT_SIZE32_DATA, - 0} }, - - {BSG_TPM_PCR_INFO, "BSG_TPM_PCR_INFO", { BSG_TPM_PCR_SELECTION, - BSG_TPM_COMPOSITE_HASH, - BSG_TPM_COMPOSITE_HASH, - 0} }, - - - {BSG_TPM_STORED_DATA, "BSG_TPM_STORED_DATA", { - BSG_TPM_VERSION, - FMT_SIZE32_DATA, - FMT_SIZE32_DATA, - 0}}, - {BSG_TPM_SYMMETRIC_KEY, "BSG_TPM_SYMMETRIC_KEY", { - BSG_TPM_ALGORITHM_ID, - BSG_TPM_ENC_SCHEME, - FMT_SIZE16_DATA, - 0}}, - {BSG_TPM_STORE_PRIVKEY, "BSG_TPM_STORE_PRIVKEY", {FMT_SIZE32_DATA, 0}}, - {BSG_TPM_STORE_ASYMKEY, "BSG_TPM_STORE_ASYMKEY", { - BSG_TPM_PAYLOAD_TYPE, - BSG_TPM_SECRET, - BSG_TPM_SECRET, - BSG_TPM_DIGEST, - BSG_TPM_STORE_PRIVKEY, - 0}}, - {BSG_TPM_MIGRATE_ASYMKEY, "BSG_TPM_MIGRATE_ASYMKEY", { - BSG_TPM_PAYLOAD_TYPE, - BSG_TPM_SECRET, - BSG_TPM_DIGEST, - FMT_U32, - BSG_TPM_STORE_PRIVKEY, - 0}}, - - {BSG_TPM_QUOTE_INFO, "BSG_TPM_QUOTE_INFO", { - BSG_TPM_VERSION, - FMT_DATA(4), - BSG_TPM_COMPOSITE_HASH, - BSG_TPM_NONCE, - 0}}, - - {BSG_TPM_IDENTITY_CONTENTS, "BSG_TPM_IDENTITY_CONTENTS", { - BSG_TPM_VERSION, - FMT_U32, - BSG_TPM_CHOSENID_HASH, - BSG_TPM_PUBKEY, - 0}}, - - {BSG_TPM_PCRVALUE, "BSG_TPM_PCRVALUE", {FMT_DATA(DIGEST_SIZE), 0}}, - - {BSG_TCPA_PCR_FLAGS, "TCPA_PCR_FLAGS", { - FMT_U8, - FMT_U8, - 0}}, - - {BSG_TCS_AUTH, "TCS_AUTH", { - BSG_TYPE_UINT32, - BSG_TPM_NONCE, - BSG_TPM_NONCE, - BSG_TYPE_BOOL, - BSG_TPM_AUTHDATA, - 0}}, - - {BSG_TPM_KEY_NONSENSITIVE, "BSG_TPM_KEY_NONSENSITIVE", { - BSG_TPM_VERSION, - BSG_TPM_KEY_USAGE, - BSG_TPM_KEY_FLAGS, - BSG_TPM_AUTH_DATA_USAGE, - BSG_TPM_KEY_PARMS, - FMT_SIZE32_DATA, - BSG_TPM_STORE_PUBKEY, - 0}}, - - {BSG_PACKED, "BSG_PACKED", { - __FMT_PACKED, - 0 }}, - - {BSG_TYPE_MAX, "", {0}}, -}; - - -static const BSG_Format* find_format (BSG_Type t) { - BSG_Format * f = s_fmt; - - if (t >= BSG_TYPE_MAX) { - return NULL; - } - - // WARNING: this depends on the enum and s_fmt[] array being in sync! make - // sure to run the static_selfcheck() to make sure - f = s_fmt + (t - BSG_TYPE_FIRST); - - return f; -} - -// -// a consistency-checking routine which can be run at compile time -// (ie. immediately after compilation) -// -// tasks: -// - verify that s_fmt has one entry per Type t, and that entry is at s_fmt[t] -// -// conditions: -// - need that s_fmt[0] is the first type listed in the Type enum! ie the first -// Type has value 0, not 1 -// -// FIXME: should have a function be passed in here which is called if the test -// fails. Then the caller can decide what to do: abort, notify, whatever -// -BOOL BSG_static_selfcheck () -{ - int i; - - for (i=BSG_TYPE_FIRST; i <= BSG_TYPE_MAX; i++) { - if (s_fmt[i - BSG_TYPE_FIRST].type != i) { - bsglog ("%s\n", "BSG: static_selfcheck failed!\n"); - bsglog ("failure at %i, allegedly %s\n", - i, s_fmt[i - BSG_TYPE_FIRST].name); - abort(); - return FALSE; - } - } - - bsglog ("%s\n", "BSG: static_selfcheck success!"); - return TRUE; -} - - -/** - * Flatten a TCPA structure into a buffer in big-endian format - * @type: TCPA structure type - * @src: (IN) TCPA structure (OUT) end of TCPA structure - * @dst: (OUT) flattened data - * Returns: Flattened size or -1 for unknown types - */ -// make it so that it can just run through the whole process and return -// the packed size, without packing anything. this will be done if dst is NULL. -static int BSG_Pack_private(BSG_Type type, const BSG_BYTE** src, BSG_BYTE* dst) -{ - // check incoming parameters - if (*src == NULL) - return 0; - - const BSG_BYTE* s = *src; - BSG_BYTE* d = dst; - - BSG_UINT32 size = __FMT_MASK_SIZE(type); - BSG_UINT32 format = __FMT_MASK_FORMAT(type); - - if (format == __FMT_CONST) // We are dealing with a fixed length value eg. UINT32 - { - BSG_UINT32 val = 0; - switch (size) { - case 1: val = * (BYTE*) s; break; - case 2: val = * (unsigned short*) s; break; - case 4: val = * (BSG_UINT32*) s; break; - } - if (dst) - BSG_PackConst(val, size, d); - - s += size; - d += size; - } else if (format == __FMT_DATA) { // We are dealing with raw data. Not sure when - // this is used. - - if (dst) { - bsglog ("BSG: __FMT_DATA size %d, src %p, dst %p\n", size, s, d); - memcpy(d, s, size); - } - - s += size; - d += size; - } else if (format == __FMT_SIZE || format == __FMT_HSIZE) { // It's a size, followed by that much data or handles - - BSG_UINT32 psize = 0; - switch (size) { - case 1: psize = * (BYTE*) s; break; - case 2: psize = * (unsigned short*) s; break; - case 4: psize = * (BSG_UINT32*) s; break; - } - - if (dst) - BSG_PackConst(psize, size, d); - - s += size; - d += size; - - // now 's' points to an address, so cast it to BSG_BYTE** - const BSG_BYTE* pdata = * ((BSG_BYTE**) s); - s += sizeof(BSG_BYTE*); - - if (format == __FMT_HSIZE) {// This is a list of psize Handles - if (dst) { - BSG_HANDLE* d2 = (BSG_HANDLE*) d; - BSG_HANDLE* p2 = (BSG_HANDLE*) pdata; - BSG_UINT32 i; - for (i = 0; i < psize; i++) - d2[i] = BSG_UnpackConst((BSG_BYTE*)(p2 + i), 4); - - } - d += psize * sizeof(BSG_HANDLE); - } else {// If it's not psize handles, it's psize data. - if (psize > 0) { - if (dst) { - bsglog ("BSG: __FMT_SIZE, size=%d, src=%p, dst=%p\n", - psize, pdata, d); - memcpy(d, pdata, psize); - } - } - d += psize; - } - } else if (format == __FMT_PACKED) { - // the source buffer is a pack_constbuf_t, which has a size and a - // pointer. just copy the buffer value, the size is not included in the - // output stream. - pack_constbuf_t * buf = (pack_constbuf_t*) s; - - if (dst) { - bsglog ("BSG: __FMT_PACKED, size=%d, src=%p, dst=%p\n", - buf->size, buf->data, d); - memcpy(d, buf->data, buf->size); - } - - s += buf->size; - d += buf->size; - } else if (format == 0) {// No flags are set. This is a structure & it should - // be looked up in the bsg_s_fmt[] - - const BSG_Format* x = find_format (type); - if (x == NULL) { - vtpmloginfo(VTPM_LOG_BSG, "BSG_Pack: cannot find type %d\n", type); - return -1; - } - - if (dst) - bsglog ("BSG_Pack type %s\n", x->name); - - - // iterate through the fields - const BSG_UINT32* f = x->fields; - for (; *f; f++) { - int fsize; - - g_log_recursion_level++; - fsize = BSG_Pack_private((BSG_Type) *f, &s, dst ? d : NULL); - g_log_recursion_level--; - - if (fsize <= 0) - return fsize; - - d += fsize; - } - } else { - vtpmlogerror(VTPM_LOG_BSG, "BSG_Pack(): Unknown format %d\n", format); - return -1; - } - - *src = s; - return (d - dst); -} - -/** - * Unflatten a TCPA structure from a buffer in big-endian format - * @type: TCPA structure type - * @src: flattened data - * @dst: (IN) TCPA structure (OUT) end of TCPA structure - * Returns: Flattened size - * Note: Returns flattened size NOT the unpacked structure size - */ -static int BSG_Unpack_private(BSG_Type type, const BSG_BYTE* src, BSG_BYTE** dst) { - // check incoming parameters - if (src == NULL) - return 0; - - - const BSG_BYTE* s = src; - BSG_BYTE* d = dst ? *dst:NULL; - if (dst && !d) - dst = NULL; - - BSG_UINT32 size = __FMT_MASK_SIZE(type); - BSG_UINT32 format = __FMT_MASK_FORMAT(type); - - if (format == __FMT_CONST) {// We are dealing with a fixed length value ie. UINT32 - - BSG_UINT32 val = BSG_UnpackConst(s, size); - - if (dst) { - switch (size) { - case 1: *(BYTE *) d = (BSG_BYTE) val; break; - case 2: *(unsigned short*) d = (unsigned short) val; break; - case 4: *(BSG_UINT32*) d = (BSG_UINT32) val; break; - } - } - - s += size; - d += size; - } else if (format == __FMT_DATA) {// We are dealing with raw data. Not sure when this is used. - if (dst) - memcpy(d, s, size); - - d += size; - s += size; - } else if (format == __FMT_SIZE || format == __FMT_HSIZE) {// It's a size, followed by that much data or handles - - BSG_UINT32 psize = BSG_UnpackConst(s, size); - - if (psize > BSG_MAX_BUF_SIZE) { - vtpmlogerror(VTPM_LOG_BSG, "BSG_Unpack runs into var-sized data bigger than %u bytes!!\n", - BSG_MAX_BUF_SIZE); - return -1; - } - - if (dst) { - switch (size) { - case 1: *(BYTE *) d = (BSG_BYTE) psize; break; - case 2: *(unsigned short*) d = (unsigned short) psize; break; - case 4: *(BSG_UINT32*) d = (BSG_UINT32) psize; break; - } - } - - s += size; - d += size; - - BSG_BYTE* pdata = NULL; - - if (psize) { - if (format == __FMT_HSIZE) { // This is a list of psize Handles - if (dst) { - BSG_HANDLE* s2 = (BSG_HANDLE*) s; - pdata = (BSG_BYTE *)malloc(psize * sizeof(BSG_HANDLE)); - if (!pdata) - return -1; - - BSG_HANDLE* p2 = (BSG_HANDLE*) pdata; - BSG_UINT32 i; - for (i = 0; i < psize; i++) { - BSG_PackConst(s2[i], 4, (BSG_BYTE*)(p2 + i)); - } - } - s += psize * sizeof(BSG_HANDLE); - } else { // If it's not psize handles, it's psize data. - if (dst) { - pdata = (BSG_BYTE *)malloc(sizeof(BSG_BYTE) * psize); - if (!pdata) - return -1; - memcpy(pdata, s, psize); - } - s += psize; - } - } - if (dst) - *(void**) d = pdata; - - d += sizeof(void*); - } else if (format == __FMT_PACKED) { - - // this doesn't make sense for unpacking! - vtpmlogerror(VTPM_LOG_BSG, "BSG_Unpack() called with format __FMT_PACKED. " - "This does not make sense\n"); - - return -1; - } else if (format == 0) {// No flags are set. This is a structure & it should - // be looked up in the bsg_s_fmt[] - - const BSG_Format* x = find_format (type); - if (x == NULL) { - vtpmlogerror(VTPM_LOG_BSG, "BSG_Unpack: cannot find type %d\n", type); - return -1; - } - - const BSG_UINT32* f = x->fields; - for (; *f; f++) { - int fsize = BSG_Unpack_private((BSG_Type) *f, s, dst ? &d:NULL); - if (fsize <= 0) - return fsize; - s += fsize; - } - } - - if (dst) - *dst = d; - return (s - src); -} - -/** - * Free memory associated with unpacked TCPA structure - * @type: TCPA structure type - * @src: (IN) TCPA structure (OUT) end of TCPA structure - * Note: Destroy should be called on all structures created with Unpack - * to ensure that any allocated memory is freed - */ -static void BSG_Destroy_private(BSG_Type type, BSG_BYTE** src) { - BSG_BYTE* s = *src; - - BSG_UINT32 size = __FMT_MASK_SIZE(type); - BSG_UINT32 format = __FMT_MASK_FORMAT(type); - - if ((src == NULL) || (*src == NULL)) { - vtpmlogerror(VTPM_LOG_BSG, "BSG_Destroy() called with NULL src\n"); - return; - } - - if (format == __FMT_CONST || format == __FMT_DATA) - s += size; - else if (format == __FMT_SIZE || format == __FMT_HSIZE) { - s += size; - BSG_BYTE* ptr = *(BSG_BYTE**) s; - free(ptr); - s += sizeof(void*); - } else if (format == __FMT_PACKED) { - - // this doesn't make sense for unpacking, hence also for Destroy() - vtpmlogerror(VTPM_LOG_BSG, "BSG_Destroy() called with format __FMT_PACKED. " - "This does not make sense\n"); - - return; - } else if (format == 0) { - const BSG_Format* x = find_format (type); - if (x == NULL) { - vtpmlogerror(VTPM_LOG_BSG, "BSG_Destroy: cannot find type %d\n", type); - return; - } - - const BSG_UINT32* f = x->fields; - for (; *f; f++) - BSG_Destroy_private((BSG_Type) *f, &s); - } - - *src = s; -} - -int BSG_Pack(BSG_Type type, const void* src, BSG_BYTE* dst) -{ - const BSG_BYTE* src2 = (const BSG_BYTE*) src; - return BSG_Pack_private(type, &src2, dst); -} - -int BSG_Unpack(BSG_Type type, const BSG_BYTE* src, void* dst) -{ - BSG_BYTE* dst2 = (BSG_BYTE*) dst; - return BSG_Unpack_private(type, src, dst ? &dst2:NULL); -} - -void BSG_Destroy(BSG_Type type, void* src) -{ - BSG_BYTE* src2 = (BSG_BYTE*) src; - BSG_Destroy_private(type, &src2); -} - -/** - * Pack a 8/16/32-bit constant into a buffer in big-endian format - * @val: constant value - * @size: constant size in bytes (1, 2, or 4) - * @dst: (OUT) buffer - */ -void BSG_PackConst(BSG_UINT32 val, int size, BSG_BYTE* dst) { - bsglog ("BSG: PackConst on %d of size %i into address %p\n", val, size, dst); - - switch (size) { - case 4: - dst[0] = (BSG_BYTE)((val >> 24) & 0xff); - dst[1] = (BSG_BYTE)((val >> 16) & 0xff); - dst[2] = (BSG_BYTE)((val >> 8) & 0xff); - dst[3] = (BSG_BYTE)(val & 0xff); - break; - case 2: - dst[0] = (BSG_BYTE)((val >> 8) & 0xff); - dst[1] = (BSG_BYTE)(val & 0xff); - break; - case 1: - dst[0] = (BSG_BYTE)(val & 0xff); - break; - } -} - -/** - * Unpack a 8/16/32-bit constant from a buffer in big-endian format - * @src: buffer - * @size: constant size in bytes (1, 2, or 4) - */ -BSG_UINT32 BSG_UnpackConst(const BSG_BYTE* src, int size) { - BSG_UINT32 val = 0; - - if (src == NULL) - return 0; - - switch (size) { - case 4: - val = (((BSG_UINT32) src[0]) << 24 - | ((BSG_UINT32) src[1]) << 16 - | ((BSG_UINT32) src[2]) << 8 - | (BSG_UINT32) src[3]); - break; - case 2: - val = (((BSG_UINT32) src[0]) << 8 | (BSG_UINT32) src[1]); - break; - case 1: - val = (BSG_UINT32) src[0]; - break; - } - return val; -} - -// Pack a list of parameters. Beware not to send values, but rather you must -// send a pointer to your values Instead. This includes UINT32's. -int BSG_PackList( BSG_BYTE* dst, int ParamCount, ... ) { - int ParamNumber; - BSG_Type format; - BSG_BYTE* val = NULL; - int size=0; - - va_list paramList; - va_start( paramList, ParamCount ); - - for( ParamNumber = 1; ParamNumber <= ParamCount; ParamNumber++) { - //Strangeness with int is because gcc wanted an int rather than a enum of ints. - format = (BSG_Type) va_arg( paramList, int ); - val = va_arg( paramList, BSG_BYTE* ); - size += BSG_Pack(format, val, dst == NULL ? NULL : dst + size); - } - - va_end (paramList); - - return size; -} - -// Unpack a list of parameters. -int BSG_UnpackList( const BSG_BYTE* src, int ParamCount, ... ) { - int ParamNumber = 0; - BSG_Type format; - BSG_BYTE* val = NULL; - int size = 0; - - va_list paramList; - va_start( paramList, ParamCount ); - - for( ParamNumber = 1; ParamNumber <= ParamCount; ParamNumber++) { - format = (BSG_Type) va_arg( paramList, int ); - val = va_arg( paramList, BSG_BYTE* ); - - size += BSG_Unpack(format, src + size, val); - } - - va_end( paramList ); - - return size; -} - -// Destroy any memory allocated by calls to unpack -void BSG_DestroyList(int ParamCount, ... ) { - int ParamNumber = 0; - BSG_Type argType; - BSG_BYTE* paramValue = NULL; - - va_list paramList; - va_start( paramList, ParamCount ); - - for( ParamNumber = 1; ParamNumber <= ParamCount; ParamNumber++) { - argType = (BSG_Type) va_arg( paramList, int ); - paramValue = va_arg( paramList, BSG_BYTE* ); - - BSG_Destroy(argType, paramValue); - } - - va_end( paramList ); - - return; -} - - -// and a tuple version -TPM_RESULT BSG_DestroyTuple (int numParams, pack_tuple_t params[]) { - int i; - - for (i = 0; i < numParams; i++) - BSG_Destroy (params[i].type, params[i].addr); - - return TPM_SUCCESS; -} - - -// -// wrappers of Pack and PackList which malloc the ouput buffer. to be freed -// by the caller later -// - -int BSG_PackMalloc (BSG_Type type, const void* src, BSG_BYTE** o_dst) { - int size = BSG_Pack (type, src, NULL); - BSG_BYTE * dest = (BSG_BYTE*) malloc (size); - if (dest == NULL) - return -1; - - size = BSG_Pack(type, src, dest); - *o_dst = dest; - return size; -} - - - -int BSG_PackListMalloc(BSG_BYTE** outBuffer, int ParamCount, ... ) { - va_list args; - int size; - - va_start (args, ParamCount); - size = BSG_PackList (NULL, ParamCount, args); - va_end (args); - - BSG_BYTE * dest = (BSG_BYTE*) malloc (size); - if (dest == NULL) - return -1; - - va_start (args, ParamCount); - size = BSG_PackList (dest, ParamCount, args); - va_end (args); - - *outBuffer = dest; - return size; -} diff --git a/tools/vtpm_manager/util/bsg.h b/tools/vtpm_manager/util/bsg.h deleted file mode 100644 index 0896812..0000000 --- a/tools/vtpm_manager/util/bsg.h +++ /dev/null @@ -1,166 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// bsg.h -// -// This file contains API's for the TPM Byte Stream functions -// -// ================================================================== - -#ifndef __BSG_H__ -#define __BSG_H__ - -#include <stdarg.h> -#include "buffer.h" - -typedef unsigned int BSG_UINT32; -typedef unsigned char BSG_BYTE; - -// forward decl -struct pack_const_tuple_t; - -struct pack_tuple_t; - - -/** - * Byte stream generator - */ -// this has to be manually kept in sync with the -// s_fmt array!! -// but now we have a self-check function which can make sure things are well -// (if used!) -typedef enum BSG_Type -{ - BSG_TYPE_FIRST = 1, - BSG_TYPE_UINT32 = 1, // start at 1 so that Type 0 only serves as an - // unused/special value - BSG_TYPE_UINT16, - BSG_TYPE_BYTE, - BSG_TYPE_BOOL, - BSG_TPM_SIZE32_DATA, // a 32 bit unsigned size, followed by - // a pointer to that much data. can pass a - // struct pack_buf_t as the param - BSG_TPM_TAG, - BSG_TPM_HANDLE, - BSG_TPM_RESULT, - BSG_TPM_RESOURCE_TYPE, - BSG_TPM_COMMAND_CODE, - BSG_TPM_AUTH_DATA_USAGE, - BSG_TPM_ALGORITHM_ID, - BSG_TPM_PROTOCOL_ID, - BSG_TPM_KEY_USAGE, - BSG_TPM_ENC_SCHEME, - BSG_TPM_SIG_SCHEME, - BSG_TPM_MIGRATE_SCHEME, - BSG_TPM_KEY_FLAGS, - BSG_TPM_AUTHDATA, - BSG_TPM_SECRET, - BSG_TPM_ENCAUTH, - BSG_TPM_PAYLOAD_TYPE, - - BSG_TPM_VERSION, - BSG_TPM_DIGEST, - BSG_TPM_COMPOSITE_HASH, - BSG_TPM_CHOSENID_HASH, - BSG_TPM_NONCE, - BSG_TPM_KEY_HANDLE, - BSG_TPM_KEY_HANDLE_LIST, - BSG_TPM_KEY_PARMS, - BSG_TPM_RSA_KEY_PARMS, - BSG_TPM_STORE_PUBKEY, - BSG_TPM_PUBKEY, - BSG_TPM_KEY, - - BSG_TPM_MIGRATIONKEYAUTH, - BSG_TCPA_AUDIT_EVENT, - BSG_TCPA_EVENT_CERT, - BSG_TPM_PCR_SELECTION, - BSG_TPM_PCR_COMPOSITE, - BSG_TPM_PCR_INFO, - BSG_TPM_STORED_DATA, - BSG_TPM_SYMMETRIC_KEY, - BSG_TPM_STORE_PRIVKEY, - BSG_TPM_STORE_ASYMKEY, - BSG_TPM_MIGRATE_ASYMKEY, - BSG_TPM_QUOTE_INFO, - BSG_TPM_IDENTITY_CONTENTS, - BSG_TPM_PCRVALUE, - BSG_TCPA_PCR_FLAGS, - BSG_TCS_AUTH, - - // this is the BSG_TPM_KEY struct without the encData field - BSG_TPM_KEY_NONSENSITIVE, - - BSG_PACKED, - - BSG_TYPE_MAX -} BSG_Type; - -struct pack_const_tuple_t { - BSG_Type type; - const void * addr; -}; - - -typedef struct pack_tuple_t { - BSG_Type type; - void * addr; -} pack_tuple_t; - -int BSG_Pack(BSG_Type type, const void* src, BSG_BYTE* dst); -int BSG_Unpack(BSG_Type type, const BSG_BYTE* src, void* dst); -void BSG_Destroy(BSG_Type type, void* src); - -// wrappers of Pack and PackList which malloc the ouput buffer. to be freed -// by the caller later. returns size of allocated buffer, or -1 in case -// allocation failed -int BSG_PackMalloc (BSG_Type type, const void* src, BSG_BYTE** o_dst); -int BSG_PackListMalloc (BSG_BYTE** outBuffer, int ParamCount, ... ); - -// a va_list version of PackList -int BSG_PackList(BSG_BYTE* outBuffer, int ParamCount, ... ); -int BSG_UnpackList(const BSG_BYTE* inBuffer, int ParamCount, ... ); -void BSG_DestroyList(int ParamCount, ... ); - -// wrapper of PackList which uses a buffer_t -TPM_RESULT BSG_PackListBuf (buffer_t * o_buf, int ParamCount, ...); - -// and a tuple version -TPM_RESULT BSG_DestroyTuple (int numParams, pack_tuple_t params[]); - -void BSG_PackConst(BSG_UINT32 val, int size, BSG_BYTE* dst); -BSG_UINT32 BSG_UnpackConst(const BSG_BYTE* src, int size); - -BOOL BSG_static_selfcheck (); - -#endif diff --git a/tools/vtpm_manager/util/buffer.c b/tools/vtpm_manager/util/buffer.c deleted file mode 100644 index df48bc2..0000000 --- a/tools/vtpm_manager/util/buffer.c +++ /dev/null @@ -1,226 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== - - -#include <stdarg.h> -#include <string.h> -#include <stdlib.h> -#include <stdio.h> -#include <sys/param.h> - -#include "tcg.h" -#include "bsg.h" -#include "buffer.h" - -static TPM_RESULT buffer_priv_realloc (buffer_t * buf, tpm_size_t newsize); - -// -// buffer functions! -// - -TPM_RESULT buffer_init (buffer_t * buf, tpm_size_t initsize, const BYTE* initval) { - if (initsize == 0) { - memset(buf, 0, sizeof(*buf)); - return TPM_SUCCESS; - } - - - buf->bytes = (BYTE*) malloc (initsize); - if (buf->bytes == NULL) - return TPM_RESOURCES; - - buf->size = initsize; - buf->alloc_size = initsize; - - if (initval) - memcpy (buf->bytes, initval, initsize); - - buf->is_owner = TRUE; - - return TPM_SUCCESS; -} - -TPM_RESULT buffer_init_convert (buffer_t * buf, tpm_size_t initsize, BYTE* initval) { - - buf->size = initsize; - buf->alloc_size = initsize; - buf->bytes = initval; - - buf->is_owner = TRUE; - - return TPM_SUCCESS; -} - -TPM_RESULT buffer_init_copy (buffer_t * buf, const buffer_t * src) { - TPM_RESULT status = buffer_init (buf, src->size, src->bytes); - buf->is_owner = TRUE; - - return status; -} - - - -// make an alias to a constant array -TPM_RESULT buffer_init_const (buffer_t * buf, tpm_size_t size, const BYTE* val) { - // TODO: try to enforce the const things somehow! - buf->bytes = (BYTE*) val; - buf->size = size; - buf->alloc_size = 0; // this field is now unneeded - - buf->is_owner = FALSE; - - return TPM_SUCCESS; -} - -// make an alias into buf, with given offset and length -// if len = 0, make the alias go to the end of buf -TPM_RESULT buffer_init_alias (buffer_t * buf, const buffer_t * b, - tpm_size_t offset, tpm_size_t len) { - if (offset + len > b->size) { - return TPM_NOSPACE; - } - - buf->bytes = b->bytes + offset; - buf->size = len > 0 ? len : b->size - offset; - - //VS/ buf->alloc_size = 0; - if (len ==0) - buf->alloc_size = b->alloc_size - offset; - else - buf->alloc_size = MIN(b->alloc_size - offset, len); - - - buf->is_owner = FALSE; - - return TPM_SUCCESS; -} - -// make an alias buffer_t into bytestream, with given length -TPM_RESULT buffer_init_alias_convert (buffer_t * buf, tpm_size_t size, BYTE* val) { - - buf->size = size; - buf->alloc_size = size; - buf->bytes = val; - - buf->is_owner = FALSE; - - return TPM_SUCCESS; -} - - - -// copy into the start of dest -TPM_RESULT buffer_copy (buffer_t * dest, const buffer_t* src) -{ - TPM_RESULT status = TPM_SUCCESS; - - if (dest->alloc_size < src->size) { - TPMTRYRETURN( buffer_priv_realloc (dest, src->size) ); - } - - memcpy (dest->bytes, src->bytes, src->size); - dest->size = src->size; - - //VS/ dest->is_owner = TRUE; - - abort_egress: - - return status; -} - - - -BOOL buffer_eq (const buffer_t * a, const buffer_t * b) { - return (a->size == b->size && memcmp (a->bytes, b->bytes, a->size) == 0); -} - - -void buffer_memset (buffer_t * buf, BYTE b) { - memset (buf->bytes, b, buf->size); -} - - -TPM_RESULT buffer_append_raw (buffer_t * buf, tpm_size_t len, const BYTE* bytes) { - TPM_RESULT status = TPM_SUCCESS; - - if (buf->alloc_size < buf->size + len) { - TPMTRYRETURN( buffer_priv_realloc (buf, buf->size + len) ); - } - - memcpy (buf->bytes + buf->size, bytes, len); - - buf->size += len; - - goto egress; - - abort_egress: - - egress: - - return status; -} - -tpm_size_t buffer_len (const buffer_t* buf) { - return buf->size; -} - -TPM_RESULT buffer_free (buffer_t * buf) { - if (buf && buf->is_owner && buf->bytes != NULL) { - free (buf->bytes); - buf->bytes = NULL; - buf->size = buf->alloc_size = 0; - - } - - return TPM_SUCCESS; -} - -TPM_RESULT buffer_priv_realloc (buffer_t * buf, tpm_size_t newsize) { - - // we want to realloc to twice the size, or the new size, whichever - // bigger - - BYTE * tmpbuf = NULL; - - newsize = MAX (buf->alloc_size * 2, newsize); - - tmpbuf = (BYTE*) realloc (buf->bytes, newsize); - if (tmpbuf == NULL) - return TPM_SIZE; - - - buf->bytes = tmpbuf; - buf->alloc_size = newsize; - - return TPM_SUCCESS; -} diff --git a/tools/vtpm_manager/util/buffer.h b/tools/vtpm_manager/util/buffer.h deleted file mode 100644 index d8a9abc..0000000 --- a/tools/vtpm_manager/util/buffer.h +++ /dev/null @@ -1,95 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== - -#ifndef __VTPM_BUFFER_H__ -#define __VTPM_BUFFER_H__ - -#include <stddef.h> // for pointer NULL -#include "tcg.h" - -typedef UINT32 tpm_size_t; - -// first version, probably will be expanded... - -#define NULL_BUF {0,0,0,0} - -typedef struct { - // private!! - tpm_size_t size, alloc_size; - BYTE * bytes; - - BOOL is_owner; // do we own this buffer, and need to free it? -} buffer_t; - -// allocate the buffer if initsize > 0, copying over initval if provided -TPM_RESULT buffer_init (buffer_t * buf, - tpm_size_t initsize, - const BYTE* initval); - -// Create a new buffer from a BYTE *. Use buffer_free to destroy original BYTE * -TPM_RESULT buffer_init_convert (buffer_t * buf, - tpm_size_t initsize, - BYTE* initval); - -// make an alias to a constant array, no copying -TPM_RESULT buffer_init_const (buffer_t * buf, tpm_size_t size, const BYTE* val); - -// make an alias into buf, with given offset and length -// if len = 0, make the alias go to the end of buf -TPM_RESULT buffer_init_alias (buffer_t * buf, const buffer_t * b, - tpm_size_t offset, tpm_size_t); - -// make an alias buffer into a bytestream -TPM_RESULT buffer_init_alias_convert (buffer_t * buf, - tpm_size_t size, BYTE* val); - -// "copy constructor" -TPM_RESULT buffer_init_copy (buffer_t * buf, const buffer_t * src); - - -// copy into the start of a -TPM_RESULT buffer_copy (buffer_t * dest, const buffer_t* src); - -// are they equal? -BOOL buffer_eq (const buffer_t * a, const buffer_t * b); - -// set the buffer to a constant byte -void buffer_memset (buffer_t * buf, BYTE b); - -tpm_size_t buffer_len (const buffer_t* buf); - -TPM_RESULT buffer_free (buffer_t * buf); - -TPM_RESULT buffer_append_raw (buffer_t * buf, tpm_size_t len, const BYTE* bytes); - -#endif // _TOOLS_H_ diff --git a/tools/vtpm_manager/util/hashtable.c b/tools/vtpm_manager/util/hashtable.c deleted file mode 100644 index aff0e2b..0000000 --- a/tools/vtpm_manager/util/hashtable.c +++ /dev/null @@ -1,316 +0,0 @@ -/* - * Copyright (c) 2005, Intel Corp - * Copyright (c) 2002, Christopher Clark <firstname.lastname@xxxxxxxxxxxx> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of the original author; nor the names of any contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * There are duplicates of this code in: - * - tools/xenstore/hashtable.c - * - tools/blktap2/drivers/hashtable.c - */ - -#include "hashtable.h" -#include "hashtable_private.h" -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <math.h> - -/* -Credit for primes table: Aaron Krowne - http://br.endernet.org/~akrowne/ - http://planetmath.org/encyclopedia/GoodHashTablePrimes.html -*/ -static const unsigned int primes[] = { -53, 97, 193, 389, -769, 1543, 3079, 6151, -12289, 24593, 49157, 98317, -196613, 393241, 786433, 1572869, -3145739, 6291469, 12582917, 25165843, -50331653, 100663319, 201326611, 402653189, -805306457, 1610612741 -}; -const unsigned int prime_table_length = sizeof(primes)/sizeof(primes[0]); -const float max_load_factor = 0.65; - -/*****************************************************************************/ -struct hashtable * -create_hashtable(unsigned int minsize, - unsigned int (*hashf) (void*), - int (*eqf) (void*,void*)) -{ - struct hashtable *h; - unsigned int pindex, size = primes[0]; - /* Check requested hashtable isn't too large */ - if (minsize > (1u << 30)) return NULL; - /* Enforce size as prime */ - for (pindex=0; pindex < prime_table_length; pindex++) { - if (primes[pindex] > minsize) { size = primes[pindex]; break; } - } - h = (struct hashtable *)malloc(sizeof(struct hashtable)); - if (NULL == h) return NULL; /*oom*/ - h->table = (struct entry **)malloc(sizeof(struct entry*) * size); - if (NULL == h->table) { free(h); return NULL; } /*oom*/ - memset(h->table, 0, size * sizeof(struct entry *)); - h->tablelength = size; - h->primeindex = pindex; - h->entrycount = 0; - h->hashfn = hashf; - h->eqfn = eqf; - h->loadlimit = (unsigned int) ceil(size * max_load_factor); -#ifdef HASHTABLE_THREADED - pthread_mutex_init(&h->mutex, NULL); -#endif - return h; -} - -/*****************************************************************************/ -unsigned int -hash(struct hashtable *h, void *k) -{ - unsigned int i = h->hashfn(k); - i += ~(i << 9); - i ^= ((i >> 14) | (i << 18)); /* >>> */ - i += (i << 4); - i ^= ((i >> 10) | (i << 22)); /* >>> */ - return i; -} - -/*****************************************************************************/ -static int -hashtable_expand(struct hashtable *h) -{ - /* Double the size of the table to accomodate more entries */ - struct entry **newtable; - struct entry *e; - struct entry **pE; - unsigned int newsize, i, index; - /* Check we're not hitting max capacity */ - if (h->primeindex == (prime_table_length - 1)) return 0; - newsize = primes[++(h->primeindex)]; - - newtable = (struct entry **)malloc(sizeof(struct entry*) * newsize); - if (NULL != newtable) - { - memset(newtable, 0, newsize * sizeof(struct entry *)); - /* This algorithm is not 'stable'. ie. it reverses the list - * when it transfers entries between the tables */ - for (i = 0; i < h->tablelength; i++) { - while (NULL != (e = h->table[i])) { - h->table[i] = e->next; - index = indexFor(newsize,e->h); - e->next = newtable[index]; - newtable[index] = e; - } - } - free(h->table); - h->table = newtable; - } - /* Plan B: realloc instead */ - else - { - newtable = (struct entry **) - realloc(h->table, newsize * sizeof(struct entry *)); - if (NULL == newtable) { (h->primeindex)--; return 0; } - h->table = newtable; - memset(newtable[h->tablelength], 0, newsize - h->tablelength); - for (i = 0; i < h->tablelength; i++) { - for (pE = &(newtable[i]), e = *pE; e != NULL; e = *pE) { - index = indexFor(newsize,e->h); - if (index == i) - { - pE = &(e->next); - } - else - { - *pE = e->next; - e->next = newtable[index]; - newtable[index] = e; - } - } - } - } - h->tablelength = newsize; - h->loadlimit = (unsigned int) ceil(newsize * max_load_factor); - return -1; -} - -/*****************************************************************************/ -unsigned int -hashtable_count(struct hashtable *h) -{ - unsigned int count; -#ifdef HASHTABLE_THREADED - pthread_mutex_lock(&h->mutex); -#endif - count = h->entrycount; -#ifdef HASHTABLE_THREADED - pthread_mutex_unlock(&h->mutex); -#endif - return count; -} - -/*****************************************************************************/ -int -hashtable_insert(struct hashtable *h, void *k, void *v) -{ - /* This method allows duplicate keys - but they shouldn't be used */ - unsigned int index; - struct entry *e; -#ifdef HASHTABLE_THREADED - pthread_mutex_lock(&h->mutex); -#endif - if (++(h->entrycount) > h->loadlimit) - { - /* Ignore the return value. If expand fails, we should - * still try cramming just this value into the existing table - * -- we may not have memory for a larger table, but one more - * element may be ok. Next time we insert, we'll try expanding again.*/ - hashtable_expand(h); - } - e = (struct entry *)malloc(sizeof(struct entry)); - if (NULL == e) { --(h->entrycount); return 0; } /*oom*/ - e->h = hash(h,k); - index = indexFor(h->tablelength,e->h); - e->k = k; - e->v = v; - e->next = h->table[index]; - h->table[index] = e; -#ifdef HASHTABLE_THREADED - pthread_mutex_unlock(&h->mutex); -#endif - return -1; -} - -/*****************************************************************************/ -void * /* returns value associated with key */ -hashtable_search(struct hashtable *h, void *k) -{ -#ifdef HASHTABLE_THREADED - pthread_mutex_lock(&h->mutex); -#endif - struct entry *e; - unsigned int hashvalue, index; - hashvalue = hash(h,k); - index = indexFor(h->tablelength,hashvalue); - e = h->table[index]; - while (NULL != e) - { - /* Check hash value to short circuit heavier comparison */ - if ((hashvalue == e->h) && (h->eqfn(k, e->k))) { -#ifdef HASHTABLE_THREADED - pthread_mutex_unlock(&h->mutex); -#endif - return e->v; - } - e = e->next; - } -#ifdef HASHTABLE_THREADED - pthread_mutex_unlock(&h->mutex); -#endif - return NULL; -} - -/*****************************************************************************/ -void * /* returns value associated with key */ -hashtable_remove(struct hashtable *h, void *k) -{ - /* TODO: consider compacting the table when the load factor drops enough, - * or provide a 'compact' method. */ -#ifdef HASHTABLE_THREADED - pthread_mutex_lock(&h->mutex); -#endif - struct entry *e; - struct entry **pE; - void *v; - unsigned int hashvalue, index; - - hashvalue = hash(h,k); - index = indexFor(h->tablelength,hash(h,k)); - pE = &(h->table[index]); - e = *pE; - while (NULL != e) - { - /* Check hash value to short circuit heavier comparison */ - if ((hashvalue == e->h) && (h->eqfn(k, e->k))) - { - *pE = e->next; - h->entrycount--; - v = e->v; - freekey(e->k); - free(e); - return v; - } - pE = &(e->next); - e = e->next; - } -#ifdef HASHTABLE_THREADED - pthread_mutex_unlock(&h->mutex); -#endif - return NULL; -} - -/*****************************************************************************/ -/* destroy */ -void -hashtable_destroy(struct hashtable *h, int free_values) -{ -#ifdef HASHTABLE_THREADED - pthread_mutex_lock(&h->mutex); -#endif - unsigned int i; - struct entry *e, *f; - struct entry **table = h->table; - if (free_values) - { - for (i = 0; i < h->tablelength; i++) - { - e = table[i]; - while (NULL != e) - { f = e; e = e->next; freekey(f->k); free(f->v); free(f); } - } - } - else - { - for (i = 0; i < h->tablelength; i++) - { - e = table[i]; - while (NULL != e) - { f = e; e = e->next; freekey(f->k); free(f); } - } - } - free(h->table); -#ifdef HASHTABLE_THREADED - pthread_mutex_destroy(&h->mutex); -#endif - free(h); -} diff --git a/tools/vtpm_manager/util/hashtable.h b/tools/vtpm_manager/util/hashtable.h deleted file mode 100644 index dedc60a..0000000 --- a/tools/vtpm_manager/util/hashtable.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (c) 2005, Intel Corp - * Copyright (c) 2002, Christopher Clark <firstname.lastname@xxxxxxxxxxxx> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of the original author; nor the names of any contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * There are duplicates of this code in: - * - tools/xenstore/hashtable.h - * - tools/blktap2/drivers/hashtable.h - */ - -#ifndef __HASHTABLE_CWC22_H__ -#define __HASHTABLE_CWC22_H__ - -struct hashtable; - -/* Example of use: - * - * struct hashtable *h; - * struct some_key *k; - * struct some_value *v; - * - * static unsigned int hash_from_key_fn( void *k ); - * static int keys_equal_fn ( void *key1, void *key2 ); - * - * h = create_hashtable(16, hash_from_key_fn, keys_equal_fn); - * k = (struct some_key *) malloc(sizeof(struct some_key)); - * v = (struct some_value *) malloc(sizeof(struct some_value)); - * - * (initialise k and v to suitable values) - * - * if (! hashtable_insert(h,k,v) ) - * { exit(-1); } - * - * if (NULL == (found = hashtable_search(h,k) )) - * { printf("not found!"); } - * - * if (NULL == (found = hashtable_remove(h,k) )) - * { printf("Not found\n"); } - * - */ - -/* Macros may be used to define type-safe(r) hashtable access functions, with - * methods specialized to take known key and value types as parameters. - * - * Example: - * - * Insert this at the start of your file: - * - * DEFINE_HASHTABLE_INSERT(insert_some, struct some_key, struct some_value); - * DEFINE_HASHTABLE_SEARCH(search_some, struct some_key, struct some_value); - * DEFINE_HASHTABLE_REMOVE(remove_some, struct some_key, struct some_value); - * - * This defines the functions 'insert_some', 'search_some' and 'remove_some'. - * These operate just like hashtable_insert etc., with the same parameters, - * but their function signatures have 'struct some_key *' rather than - * 'void *', and hence can generate compile time errors if your program is - * supplying incorrect data as a key (and similarly for value). - * - * Note that the hash and key equality functions passed to create_hashtable - * still take 'void *' parameters instead of 'some key *'. This shouldn't be - * a difficult issue as they're only defined and passed once, and the other - * functions will ensure that only valid keys are supplied to them. - * - * The cost for this checking is increased code size and runtime overhead - * - if performance is important, it may be worth switching back to the - * unsafe methods once your program has been debugged with the safe methods. - * This just requires switching to some simple alternative defines - eg: - * #define insert_some hashtable_insert - * - */ - -/***************************************************************************** - * create_hashtable - - * @name create_hashtable - * @param minsize minimum initial size of hashtable - * @param hashfunction function for hashing keys - * @param key_eq_fn function for determining key equality - * @return newly created hashtable or NULL on failure - */ - -struct hashtable * -create_hashtable(unsigned int minsize, - unsigned int (*hashfunction) (void*), - int (*key_eq_fn) (void*,void*)); - -/***************************************************************************** - * hashtable_insert - - * @name hashtable_insert - * @param h the hashtable to insert into - * @param k the key - hashtable claims ownership and will free on removal - * @param v the value - does not claim ownership - * @return non-zero for successful insertion - * - * This function will cause the table to expand if the insertion would take - * the ratio of entries to table size over the maximum load factor. - * - * This function does not check for repeated insertions with a duplicate key. - * The value returned when using a duplicate key is undefined -- when - * the hashtable changes size, the order of retrieval of duplicate key - * entries is reversed. - * If in doubt, remove before insert. - */ - -int -hashtable_insert(struct hashtable *h, void *k, void *v); - -#define DEFINE_HASHTABLE_INSERT(fnname, keytype, valuetype) \ -int fnname (struct hashtable *h, keytype *k, valuetype *v) \ -{ \ - return hashtable_insert(h,k,v); \ -} - -/***************************************************************************** - * hashtable_search - - * @name hashtable_search - * @param h the hashtable to search - * @param k the key to search for - does not claim ownership - * @return the value associated with the key, or NULL if none found - */ - -void * -hashtable_search(struct hashtable *h, void *k); - -#define DEFINE_HASHTABLE_SEARCH(fnname, keytype, valuetype) \ -valuetype * fnname (struct hashtable *h, keytype *k) \ -{ \ - return (valuetype *) (hashtable_search(h,k)); \ -} - -/***************************************************************************** - * hashtable_remove - - * @name hashtable_remove - * @param h the hashtable to remove the item from - * @param k the key to search for - does not claim ownership - * @return the value associated with the key, or NULL if none found - */ - -void * /* returns value */ -hashtable_remove(struct hashtable *h, void *k); - -#define DEFINE_HASHTABLE_REMOVE(fnname, keytype, valuetype) \ -valuetype * fnname (struct hashtable *h, keytype *k) \ -{ \ - return (valuetype *) (hashtable_remove(h,k)); \ -} - - -/***************************************************************************** - * hashtable_count - - * @name hashtable_count - * @param h the hashtable - * @return the number of items stored in the hashtable - */ -unsigned int -hashtable_count(struct hashtable *h); - - -/***************************************************************************** - * hashtable_destroy - - * @name hashtable_destroy - * @param h the hashtable - * @param free_values whether to call 'free' on the remaining values - */ - -void -hashtable_destroy(struct hashtable *h, int free_values); - -#endif /* __HASHTABLE_CWC22_H__ */ diff --git a/tools/vtpm_manager/util/hashtable_itr.c b/tools/vtpm_manager/util/hashtable_itr.c deleted file mode 100644 index dcf42c8..0000000 --- a/tools/vtpm_manager/util/hashtable_itr.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright (c) 2005, Intel Corp - * Copyright (c) 2002, Christopher Clark <firstname.lastname@xxxxxxxxxxxx> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of the original author; nor the names of any contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * There are duplicates of this code in: - * - tools/blktap2/drivers/hashtable_itr.c - */ - -#include "hashtable.h" -#include "hashtable_private.h" -#include "hashtable_itr.h" -#include <stdlib.h> /* defines NULL */ - -/*****************************************************************************/ -/* hashtable_iterator - iterator constructor */ - -struct hashtable_itr * -hashtable_iterator(struct hashtable *h) -{ - unsigned int i, tablelength; - struct hashtable_itr *itr = (struct hashtable_itr *) - malloc(sizeof(struct hashtable_itr)); - if (NULL == itr) return NULL; -#ifdef HASHTABLE_THREADED - pthread_mutex_lock(&h->mutex); -#endif - itr->h = h; - itr->e = NULL; - itr->parent = NULL; - tablelength = h->tablelength; - itr->index = tablelength; - if (0 == h->entrycount) { -#ifdef HASHTABLE_THREADED - pthread_mutex_unlock(&h->mutex); -#endif - return itr; - } - - for (i = 0; i < tablelength; i++) - { - if (NULL != h->table[i]) - { - itr->e = h->table[i]; - itr->index = i; - break; - } - } -#ifdef HASHTABLE_THREADED - pthread_mutex_unlock(&h->mutex); -#endif - return itr; -} - -/*****************************************************************************/ -/* key - return the key of the (key,value) pair at the current position */ -/* value - return the value of the (key,value) pair at the current position */ - -void * -hashtable_iterator_key(struct hashtable_itr *i) -{ return i->e->k; } - -void * -hashtable_iterator_value(struct hashtable_itr *i) -{ return i->e->v; } - -/*****************************************************************************/ -/* advance - advance the iterator to the next element - * returns zero if advanced to end of table */ - -int -hashtable_iterator_advance(struct hashtable_itr *itr) -{ -#ifdef HASHTABLE_THREADED - pthread_mutex_lock(&itr->h->mutex); -#endif - unsigned int j,tablelength; - struct entry **table; - struct entry *next; - int ret; - if (NULL == itr->e) { /* stupidity check */ - ret = 0; - goto egress; - } - - next = itr->e->next; - if (NULL != next) - { - itr->parent = itr->e; - itr->e = next; - ret = -1; - goto egress; - } - - tablelength = itr->h->tablelength; - itr->parent = NULL; - if (tablelength <= (j = ++(itr->index))) - { - itr->e = NULL; - ret = 0; - goto egress; - } - table = itr->h->table; - while (NULL == (next = table[j])) - { - if (++j >= tablelength) - { - itr->index = tablelength; - itr->e = NULL; - ret = 0; - goto egress; - } - } - itr->index = j; - itr->e = next; - ret = -1; - - egress: -#ifdef HASHTABLE_THREADED - pthread_mutex_unlock(&itr->h->mutex); -#endif - return ret; -} - -/*****************************************************************************/ -/* remove - remove the entry at the current iterator position - * and advance the iterator, if there is a successive - * element. - * If you want the value, read it before you remove: - * beware memory leaks if you don't. - * Returns zero if end of iteration. */ - -int -hashtable_iterator_remove(struct hashtable_itr *itr) -{ -#ifdef HASHTABLE_THREADED - pthread_mutex_lock(&itr->h->mutex); -#endif - struct entry *remember_e, *remember_parent; - int ret; - - /* Do the removal */ - if (NULL == (itr->parent)) - { - /* element is head of a chain */ - itr->h->table[itr->index] = itr->e->next; - } else { - /* element is mid-chain */ - itr->parent->next = itr->e->next; - } - /* itr->e is now outside the hashtable */ - remember_e = itr->e; - itr->h->entrycount--; - freekey(remember_e->k); - - /* Advance the iterator, correcting the parent */ - remember_parent = itr->parent; - ret = hashtable_iterator_advance(itr); - if (itr->parent == remember_e) { itr->parent = remember_parent; } - free(remember_e); -#ifdef HASHTABLE_THREADED - pthread_mutex_unlock(&itr->h->mutex); -#endif - return ret; -} - -/*****************************************************************************/ -int /* returns zero if not found */ -hashtable_iterator_search(struct hashtable_itr *itr, - struct hashtable *h, void *k) -{ -#ifdef HASHTABLE_THREADED - pthread_mutex_lock(&h->mutex); -#endif - struct entry *e, *parent; - unsigned int hashvalue, index; - int ret; - - hashvalue = hash(h,k); - index = indexFor(h->tablelength,hashvalue); - - e = h->table[index]; - parent = NULL; - while (NULL != e) - { - /* Check hash value to short circuit heavier comparison */ - if ((hashvalue == e->h) && (h->eqfn(k, e->k))) - { - itr->index = index; - itr->e = e; - itr->parent = parent; - itr->h = h; - ret= -1; - goto egress; - } - parent = e; - e = e->next; - } - ret = 0; - -egress: -#ifdef HASHTABLE_THREADED - pthread_mutex_unlock(&h->mutex); -#endif - return ret; -} diff --git a/tools/vtpm_manager/util/hashtable_itr.h b/tools/vtpm_manager/util/hashtable_itr.h deleted file mode 100644 index 35654e0..0000000 --- a/tools/vtpm_manager/util/hashtable_itr.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2005, Intel Corp - * Copyright (c) 2002, Christopher Clark <firstname.lastname@xxxxxxxxxxxx> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of the original author; nor the names of any contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * There are duplicates of this code in: - * - tools/blktap2/drivers/hashtable_itr.h - */ - - -#ifndef __HASHTABLE_ITR_CWC22__ -#define __HASHTABLE_ITR_CWC22__ -#include "hashtable.h" -#include "hashtable_private.h" /* needed to enable inlining */ - -/*****************************************************************************/ -/* This struct is only concrete here to allow the inlining of two of the - * accessor functions. */ -struct hashtable_itr -{ - struct hashtable *h; - struct entry *e; - struct entry *parent; - unsigned int index; -}; - - -/*****************************************************************************/ -/* hashtable_iterator - */ - -struct hashtable_itr * -hashtable_iterator(struct hashtable *h); - -/*****************************************************************************/ -/* hashtable_iterator_key - * - return the value of the (key,value) pair at the current position */ - -void *hashtable_iterator_key(struct hashtable_itr *i); - -/*****************************************************************************/ -/* value - return the value of the (key,value) pair at the current position */ - -void *hashtable_iterator_value(struct hashtable_itr *i); - -/*****************************************************************************/ -/* advance - advance the iterator to the next element - * returns zero if advanced to end of table */ - -int -hashtable_iterator_advance(struct hashtable_itr *itr); - -/*****************************************************************************/ -/* remove - remove current element and advance the iterator to the next element - * NB: if you need the value to free it, read it before - * removing. ie: beware memory leaks! - * returns zero if advanced to end of table */ - -int -hashtable_iterator_remove(struct hashtable_itr *itr); - -/*****************************************************************************/ -/* search - overwrite the supplied iterator, to point to the entry - * matching the supplied key. - h points to the hashtable to be searched. - * returns zero if not found. */ -int -hashtable_iterator_search(struct hashtable_itr *itr, - struct hashtable *h, void *k); - -#define DEFINE_HASHTABLE_ITERATOR_SEARCH(fnname, keytype) \ -int fnname (struct hashtable_itr *i, struct hashtable *h, keytype *k) \ -{ \ - return (hashtable_iterator_search(i,h,k)); \ -} - - - -#endif /* __HASHTABLE_ITR_CWC22__*/ diff --git a/tools/vtpm_manager/util/hashtable_private.h b/tools/vtpm_manager/util/hashtable_private.h deleted file mode 100644 index d87a7f9..0000000 --- a/tools/vtpm_manager/util/hashtable_private.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2005, Intel Corp - * Copyright (c) 2002, Christopher Clark <firstname.lastname@xxxxxxxxxxxx> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of the original author; nor the names of any contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * There are duplicates of this code in: - * - tools/xenstore/hashtable_private.h - * - tools/blktap2/drivers/hashtable_private.h - */ - -#ifndef __HASHTABLE_PRIVATE_CWC22_H__ -#define __HASHTABLE_PRIVATE_CWC22_H__ - -#include "hashtable.h" -#ifdef HASHTABLE_THREADED -#include <pthread.h> -#endif - -/*****************************************************************************/ -struct entry -{ - void *k, *v; - unsigned int h; - struct entry *next; -}; - -struct hashtable { - unsigned int tablelength; - struct entry **table; - unsigned int entrycount; - unsigned int loadlimit; - unsigned int primeindex; - unsigned int (*hashfn) (void *k); - int (*eqfn) (void *k1, void *k2); -#ifdef HASHTABLE_THREADED - pthread_mutex_t mutex; -#endif -}; - -/*****************************************************************************/ -unsigned int -hash(struct hashtable *h, void *k); - -/*****************************************************************************/ -/* indexFor */ -static inline unsigned int -indexFor(unsigned int tablelength, unsigned int hashvalue) { - return (hashvalue % tablelength); -}; - -/* Only works if tablelength == 2^N */ -/*static inline unsigned int -indexFor(unsigned int tablelength, unsigned int hashvalue) -{ - return (hashvalue & (tablelength - 1u)); -} -*/ - -/*****************************************************************************/ -#define freekey(X) free(X) -/*define freekey(X) ; */ - - -/*****************************************************************************/ - -#endif /* __HASHTABLE_PRIVATE_CWC22_H__*/ diff --git a/tools/vtpm_manager/util/log.c b/tools/vtpm_manager/util/log.c deleted file mode 100644 index 75fe91a..0000000 --- a/tools/vtpm_manager/util/log.c +++ /dev/null @@ -1,142 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> - -#include "buffer.h" -#include "tcg.h" - -// Helper code for the consts, eg. to produce messages for error codes. - -typedef struct error_code_entry_t { - TPM_RESULT code; - char * code_name; - char * msg; -} error_code_entry_t; - -static const error_code_entry_t error_msgs [] = { - { TPM_SUCCESS, "TPM_SUCCESS", "Successful completion of the operation" }, - { TPM_AUTHFAIL, "TPM_AUTHFAIL", "Authentication failed" }, - { TPM_BADINDEX, "TPM_BADINDEX", "The index to a PCR, DIR or other register is incorrect" }, - { TPM_BAD_PARAMETER, "TPM_BAD_PARAMETER", "One or more parameter is bad" }, - { TPM_AUDITFAILURE, "TPM_AUDITFAILURE", "An operation completed successfully but the auditing of that operation failed." }, - { TPM_CLEAR_DISABLED, "TPM_CLEAR_DISABLED", "The clear disable flag is set and all clear operations now require physical access" }, - { TPM_DEACTIVATED, "TPM_DEACTIVATED", "The TPM is deactivated" }, - { TPM_DISABLED, "TPM_DISABLED", "The TPM is disabled" }, - { TPM_DISABLED_CMD, "TPM_DISABLED_CMD", "The target command has been disabled" }, - { TPM_FAIL, "TPM_FAIL", "The operation failed" }, - { TPM_BAD_ORDINAL, "TPM_BAD_ORDINAL", "The ordinal was unknown or inconsistent" }, - { TPM_INSTALL_DISABLED, "TPM_INSTALL_DISABLED", "The ability to install an owner is disabled" }, - { TPM_INVALID_KEYHANDLE, "TPM_INVALID_KEYHANDLE", "The key handle presented was invalid" }, - { TPM_KEYNOTFOUND, "TPM_KEYNOTFOUND", "The target key was not found" }, - { TPM_INAPPROPRIATE_ENC, "TPM_INAPPROPRIATE_ENC", "Unacceptable encryption scheme" }, - { TPM_MIGRATEFAIL, "TPM_MIGRATEFAIL", "Migration authorization failed" }, - { TPM_INVALID_PCR_INFO, "TPM_INVALID_PCR_INFO", "PCR information could not be interpreted" }, - { TPM_NOSPACE, "TPM_NOSPACE", "No room to load key." }, - { TPM_NOSRK, "TPM_NOSRK", "There is no SRK set" }, - { TPM_NOTSEALED_BLOB, "TPM_NOTSEALED_BLOB", "An encrypted blob is invalid or was not created by this TPM" }, - { TPM_OWNER_SET, "TPM_OWNER_SET", "There is already an Owner" }, - { TPM_RESOURCES, "TPM_RESOURCES", "The TPM has insufficient internal resources to perform the requested action." }, - { TPM_SHORTRANDOM, "TPM_SHORTRANDOM", "A random string was too short" }, - { TPM_SIZE, "TPM_SIZE", "The TPM does not have the space to perform the operation." }, - { TPM_WRONGPCRVAL, "TPM_WRONGPCRVAL", "The named PCR value does not match the current PCR value." }, - { TPM_BAD_PARAM_SIZE, "TPM_BAD_PARAM_SIZE", "The paramSize argument to the command has the incorrect value" }, - { TPM_SHA_THREAD, "TPM_SHA_THREAD", "There is no existing SHA-1 thread." }, - { TPM_SHA_ERROR, "TPM_SHA_ERROR", "The calculation is unable to proceed because the existing SHA-1 thread has already encountered an error." }, - { TPM_FAILEDSELFTEST, "TPM_FAILEDSELFTEST", "Self-test has failed and the TPM has shutdown." }, - { TPM_AUTH2FAIL, "TPM_AUTH2FAIL", "The authorization for the second key in a 2 key function failed authorization" }, - { TPM_BADTAG, "TPM_BADTAG", "The tag value sent to for a command is invalid" }, - { TPM_IOERROR, "TPM_IOERROR", "An IO error occurred transmitting information to the TPM" }, - { TPM_ENCRYPT_ERROR, "TPM_ENCRYPT_ERROR", "The encryption process had a problem." }, - { TPM_DECRYPT_ERROR, "TPM_DECRYPT_ERROR", "The decryption process did not complete." }, - { TPM_INVALID_AUTHHANDLE, "TPM_INVALID_AUTHHANDLE", "An invalid handle was used." }, - { TPM_NO_ENDORSEMENT, "TPM_NO_ENDORSEMENT", "The TPM does not a EK installed" }, - { TPM_INVALID_KEYUSAGE, "TPM_INVALID_KEYUSAGE", "The usage of a key is not allowed" }, - { TPM_WRONG_ENTITYTYPE, "TPM_WRONG_ENTITYTYPE", "The submitted entity type is not allowed" }, - { TPM_INVALID_POSTINIT, "TPM_INVALID_POSTINIT", "The command was received in the wrong sequence relative to TPM_Init and a subsequent TPM_Startup" }, - { TPM_INAPPROPRIATE_SIG, "TPM_INAPPROPRIATE_SIG", "Signed data cannot include additional DER information" }, - { TPM_BAD_KEY_PROPERTY, "TPM_BAD_KEY_PROPERTY", "The key properties in TPM_KEY_PARMs are not supported by this TPM" }, - - { TPM_BAD_MIGRATION, "TPM_BAD_MIGRATION", "The migration properties of this key are incorrect." }, - { TPM_BAD_SCHEME, "TPM_BAD_SCHEME", "The signature or encryption scheme for this key is incorrect or not permitted in this situation." }, - { TPM_BAD_DATASIZE, "TPM_BAD_DATASIZE", "The size of the data (or blob) parameter is bad or inconsistent with the referenced key" }, - { TPM_BAD_MODE, "TPM_BAD_MODE", "A mode parameter is bad, such as capArea or subCapArea for TPM_GetCapability, phsicalPresence parameter for TPM_PhysicalPresence, or migrationType for TPM_CreateMigrationBlob." }, - { TPM_BAD_PRESENCE, "TPM_BAD_PRESENCE", "Either the physicalPresence or physicalPresenceLock bits have the wrong value" }, - { TPM_BAD_VERSION, "TPM_BAD_VERSION", "The TPM cannot perform this version of the capability" }, - { TPM_NO_WRAP_TRANSPORT, "TPM_NO_WRAP_TRANSPORT", "The TPM does not allow for wrapped transport sessions" }, - { TPM_AUDITFAIL_UNSUCCESSFUL, "TPM_AUDITFAIL_UNSUCCESSFUL", "TPM audit construction failed and the underlying command was returning a failure code also" }, - { TPM_AUDITFAIL_SUCCESSFUL, "TPM_AUDITFAIL_SUCCESSFUL", "TPM audit construction failed and the underlying command was returning success" }, - { TPM_NOTRESETABLE, "TPM_NOTRESETABLE", "Attempt to reset a PCR register that does not have the resettable attribute" }, - { TPM_NOTLOCAL, "TPM_NOTLOCAL", "Attempt to reset a PCR register that requires locality and locality modifier not part of command transport" }, - { TPM_BAD_TYPE, "TPM_BAD_TYPE", "Make identity blob not properly typed" }, - { TPM_INVALID_RESOURCE, "TPM_INVALID_RESOURCE", "When saving context identified resource type does not match actual resource" }, - { TPM_NOTFIPS, "TPM_NOTFIPS", "The TPM is attempting to execute a command only available when in FIPS mode" }, - { TPM_INVALID_FAMILY, "TPM_INVALID_FAMILY", "The command is attempting to use an invalid family ID" }, - { TPM_NO_NV_PERMISSION, "TPM_NO_NV_PERMISSION", "The permission to manipulate the NV storage is not available" }, - { TPM_REQUIRES_SIGN, "TPM_REQUIRES_SIGN", "The operation requires a signed command" }, - { TPM_KEY_NOTSUPPORTED, "TPM_KEY_NOTSUPPORTED", "Wrong operation to load an NV key" }, - { TPM_AUTH_CONFLICT, "TPM_AUTH_CONFLICT", "NV_LoadKey blob requires both owner and blob authorization" }, - { TPM_AREA_LOCKED, "TPM_AREA_LOCKED", "The NV area is locked and not writtable" }, - { TPM_BAD_LOCALITY, "TPM_BAD_LOCALITY", "The locality is incorrect for the attempted operation" }, - { TPM_READ_ONLY, "TPM_READ_ONLY", "The NV area is read only and can't be written to" }, - { TPM_PER_NOWRITE, "TPM_PER_NOWRITE", "There is no protection on the write to the NV area" }, - { TPM_FAMILYCOUNT, "TPM_FAMILYCOUNT", "The family count value does not match" }, - { TPM_WRITE_LOCKED, "TPM_WRITE_LOCKED", "The NV area has already been written to" }, - { TPM_BAD_ATTRIBUTES, "TPM_BAD_ATTRIBUTES", "The NV area attributes conflict" }, - { TPM_INVALID_STRUCTURE, "TPM_INVALID_STRUCTURE", "The structure tag and version are invalid or inconsistent" }, - { TPM_KEY_OWNER_CONTROL, "TPM_KEY_OWNER_CONTROL", "The key is under control of the TPM Owner and can only be evicted by the TPM Owner." }, - { TPM_BAD_COUNTER, "TPM_BAD_COUNTER", "The counter handle is incorrect" }, - { TPM_NOT_FULLWRITE, "TPM_NOT_FULLWRITE", "The write is not a complete write of the area" }, - { TPM_CONTEXT_GAP, "TPM_CONTEXT_GAP", "The gap between saved context counts is too large" }, - { TPM_MAXNVWRITES, "TPM_MAXNVWRITES", "The maximum number of NV writes without an owner has been exceeded" }, - { TPM_NOOPERATOR, "TPM_NOOPERATOR", "No operator authorization value is set" }, - { TPM_RESOURCEMISSING, "TPM_RESOURCEMISSING", "The resource pointed to by context is not loaded" }, - { TPM_DELEGATE_LOCK, "TPM_DELEGATE_LOCK", "The delegate administration is locked" }, - { TPM_DELEGATE_FAMILY, "TPM_DELEGATE_FAMILY", "Attempt to manage a family other then the delegated family" }, - { TPM_DELEGATE_ADMIN, "TPM_DELEGATE_ADMIN", "Delegation table management not enabled" }, - { TPM_TRANSPORT_EXCLUSIVE, "TPM_TRANSPORT_EXCLUSIVE", "There was a command executed outside of an exclusive transport session" }, -}; - - -// helper function for the error codes: -const char* tpm_get_error_name (TPM_RESULT code) { - // just do a linear scan for now - unsigned i; - for (i = 0; i < sizeof(error_msgs)/sizeof(error_msgs[0]); i++) - if (code == error_msgs[i].code) - return error_msgs[i].code_name; - - return("Unknown Error Code"); -} diff --git a/tools/vtpm_manager/util/log.h b/tools/vtpm_manager/util/log.h deleted file mode 100644 index 1f15f5b..0000000 --- a/tools/vtpm_manager/util/log.h +++ /dev/null @@ -1,94 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== - -#ifndef __VTPM_LOG_H__ -#define __VTPM_LOG_H__ - -#include <stdint.h> // for uint32_t -#include <stddef.h> // for pointer NULL - -// =========================== LOGGING ============================== - -// the logging module numbers -#define VTPM_LOG_CRYPTO 1 -#define VTPM_LOG_BSG 2 -#define VTPM_LOG_TXDATA 3 -#define VTPM_LOG_TCS 4 -#define VTPM_LOG_TCS_DEEP 5 -#define VTPM_LOG_VTSP 6 -#define VTPM_LOG_VTPM 7 -#define VTPM_LOG_VTPM_DEEP 8 -#define VTPM_LOG_VTSP_DEEP 9 - -static char *module_names[] = { "", - "CRYPTO", - "BSG", - "TXDATA", - "TCS", - "TCS", - "VTSP", - "VTPM", - "VTPM", - "VTSP" - }; - -// Default to standard logging -#ifndef LOGGING_MODULES -#define LOGGING_MODULES (BITMASK(VTPM_LOG_VTPM)) -#endif - -// bit-access macros -#define BITMASK(idx) ( 1U << (idx) ) -#define GETBIT(num,idx) ( ((num) & BITMASK(idx)) >> idx ) -#define SETBIT(num,idx) (num) |= BITMASK(idx) -#define CLEARBIT(num,idx) (num) &= ( ~ BITMASK(idx) ) - -#define vtpmloginfo(module, fmt, args...) \ - if (GETBIT (LOGGING_MODULES, module) == 1) { \ - fprintf (stdout, "INFO[%s]: " fmt, module_names[module], ##args); \ - } - -#define vtpmloginfomore(module, fmt, args...) \ - if (GETBIT (LOGGING_MODULES, module) == 1) { \ - fprintf (stdout, fmt,##args); \ - } - -#define vtpmlogerror(module, fmt, args...) \ - fprintf (stderr, "ERROR[%s]: " fmt, module_names[module], ##args); - -//typedef UINT32 tpm_size_t; - -// helper function for the error codes: -const char* tpm_get_error_name (TPM_RESULT code); - -#endif // _VTPM_LOG_H_ diff --git a/tools/vtpm_manager/util/tcg.h b/tools/vtpm_manager/util/tcg.h deleted file mode 100644 index 5c42913..0000000 --- a/tools/vtpm_manager/util/tcg.h +++ /dev/null @@ -1,503 +0,0 @@ -// =================================================================== -// -// Copyright (c) 2005, Intel Corp. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Intel Corporation nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -// OF THE POSSIBILITY OF SUCH DAMAGE. -// =================================================================== -// -// tcg.h -// -// This file contains all the structure and type definitions -// -// ================================================================== - -#ifndef __TCG_H__ -#define __TCG_H__ - -// This pragma is used to disallow structure padding -#pragma pack(push, 1) - -// *************************** TYPEDEFS ********************************* -typedef unsigned char BYTE; -typedef unsigned char BOOL; -typedef unsigned short UINT16; -typedef unsigned int UINT32; -typedef unsigned long long UINT64; - -typedef UINT32 TPM_RESULT; -typedef UINT32 TPM_PCRINDEX; -typedef UINT32 TPM_DIRINDEX; -typedef UINT32 TPM_HANDLE; -typedef TPM_HANDLE TPM_AUTHHANDLE; -typedef TPM_HANDLE TCPA_HASHHANDLE; -typedef TPM_HANDLE TCPA_HMACHANDLE; -typedef TPM_HANDLE TCPA_ENCHANDLE; -typedef TPM_HANDLE TPM_KEY_HANDLE; -typedef TPM_HANDLE TCPA_ENTITYHANDLE; -typedef UINT32 TPM_RESOURCE_TYPE; -typedef UINT32 TPM_COMMAND_CODE; -typedef UINT16 TPM_PROTOCOL_ID; -typedef BYTE TPM_AUTH_DATA_USAGE; -typedef UINT16 TPM_ENTITY_TYPE; -typedef UINT32 TPM_ALGORITHM_ID; -typedef UINT16 TPM_KEY_USAGE; -typedef UINT16 TPM_STARTUP_TYPE; -typedef UINT32 TPM_CAPABILITY_AREA; -typedef UINT16 TPM_ENC_SCHEME; -typedef UINT16 TPM_SIG_SCHEME; -typedef UINT16 TPM_MIGRATE_SCHEME; -typedef UINT16 TPM_PHYSICAL_PRESENCE; -typedef UINT32 TPM_KEY_FLAGS; - -#define TPM_DIGEST_SIZE 20 // Don't change this -typedef BYTE TPM_AUTHDATA[TPM_DIGEST_SIZE]; -typedef TPM_AUTHDATA TPM_SECRET; -typedef TPM_AUTHDATA TPM_ENCAUTH; -typedef BYTE TPM_PAYLOAD_TYPE; -typedef UINT16 TPM_TAG; - -// Data Types of the TCS -typedef UINT32 TCS_AUTHHANDLE; // Handle addressing a authorization session -typedef UINT32 TCS_CONTEXT_HANDLE; // Basic context handle -typedef UINT32 TCS_KEY_HANDLE; // Basic key handle - -// ************************* STRUCTURES ********************************** - -typedef struct TPM_VERSION { - BYTE major; - BYTE minor; - BYTE revMajor; - BYTE revMinor; -} TPM_VERSION; - -static const TPM_VERSION TPM_STRUCT_VER_1_1 = { 1,1,0,0 }; - -typedef struct TPM_DIGEST { - BYTE digest[TPM_DIGEST_SIZE]; -} TPM_DIGEST; - -typedef TPM_DIGEST TPM_PCRVALUE; -typedef TPM_DIGEST TPM_COMPOSITE_HASH; -typedef TPM_DIGEST TPM_DIRVALUE; -typedef TPM_DIGEST TPM_HMAC; -typedef TPM_DIGEST TPM_CHOSENID_HASH; - -typedef struct TPM_NONCE { - BYTE nonce[TPM_DIGEST_SIZE]; -} TPM_NONCE; - -typedef struct TPM_KEY_PARMS { - TPM_ALGORITHM_ID algorithmID; - TPM_ENC_SCHEME encScheme; - TPM_SIG_SCHEME sigScheme; - UINT32 parmSize; - BYTE* parms; -} TPM_KEY_PARMS; - -typedef struct TPM_RSA_KEY_PARMS { - UINT32 keyLength; - UINT32 numPrimes; - UINT32 exponentSize; - BYTE* exponent; -} TPM_RSA_KEY_PARMS; - -typedef struct TPM_STORE_PUBKEY { - UINT32 keyLength; - BYTE* key; -} TPM_STORE_PUBKEY; - -typedef struct TPM_PUBKEY { - TPM_KEY_PARMS algorithmParms; - TPM_STORE_PUBKEY pubKey; -} TPM_PUBKEY; - -typedef struct TPM_KEY { - TPM_VERSION ver; - TPM_KEY_USAGE keyUsage; - TPM_KEY_FLAGS keyFlags; - TPM_AUTH_DATA_USAGE authDataUsage; - TPM_KEY_PARMS algorithmParms; - UINT32 PCRInfoSize; - BYTE* PCRInfo; // this should be a TPM_PCR_INFO, or NULL - TPM_STORE_PUBKEY pubKey; - UINT32 encDataSize; - BYTE* encData; -} TPM_KEY; - -typedef struct TPM_PCR_SELECTION { - UINT16 sizeOfSelect; /// in bytes - BYTE* pcrSelect; -} TPM_PCR_SELECTION; - -typedef struct TPM_PCR_COMPOSITE { - TPM_PCR_SELECTION select; - UINT32 valueSize; - TPM_PCRVALUE* pcrValue; -} TPM_PCR_COMPOSITE; - - -typedef struct TPM_PCR_INFO { - TPM_PCR_SELECTION pcrSelection; - TPM_COMPOSITE_HASH digestAtRelease; - TPM_COMPOSITE_HASH digestAtCreation; -} TPM_PCR_INFO; - - -typedef struct TPM_BOUND_DATA { - TPM_VERSION ver; - TPM_PAYLOAD_TYPE payload; - BYTE* payloadData; -} TPM_BOUND_DATA; - -typedef struct TPM_STORED_DATA { - TPM_VERSION ver; - UINT32 sealInfoSize; - BYTE* sealInfo; - UINT32 encDataSize; - BYTE* encData; -} TPM_STORED_DATA; - -typedef struct TCS_AUTH { - TCS_AUTHHANDLE AuthHandle; - TPM_NONCE NonceOdd; // system - TPM_NONCE NonceEven; // TPM - BOOL fContinueAuthSession; - TPM_AUTHDATA HMAC; -} TCS_AUTH; - -// structures for dealing with sizes followed by buffers in all the -// TCG structure. -typedef struct pack_buf_t { - UINT32 size; - BYTE * data; -} pack_buf_t; - -typedef struct pack_constbuf_t { - UINT32 size; - const BYTE* data; -} pack_constbuf_t; - - - -// **************************** CONSTANTS ********************************* - -// BOOL values -#define TRUE 0x01 -#define FALSE 0x00 - -#define TCPA_MAX_BUFFER_LENGTH 0x2000 - -// -// TPM_COMMAND_CODE values -#define TPM_PROTECTED_ORDINAL 0x00000000UL -#define TPM_UNPROTECTED_ORDINAL 0x80000000UL -#define TPM_CONNECTION_ORDINAL 0x40000000UL -#define TPM_VENDOR_ORDINAL 0x20000000UL - -#define TPM_ORD_OIAP (10UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_OSAP (11UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_ChangeAuth (12UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_TakeOwnership (13UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_ChangeAuthAsymStart (14UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_ChangeAuthAsymFinish (15UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_ChangeAuthOwner (16UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_Extend (20UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_PcrRead (21UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_Quote (22UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_Seal (23UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_Unseal (24UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_DirWriteAuth (25UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_DirRead (26UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_UnBind (30UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_CreateWrapKey (31UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_LoadKey (32UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_GetPubKey (33UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_EvictKey (34UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_CreateMigrationBlob (40UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_ReWrapKey (41UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_ConvertMigrationBlob (42UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_AuthorizeMigrationKey (43UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_CreateMaintenanceArchive (44UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_LoadMaintenanceArchive (45UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_KillMaintenanceFeature (46UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_LoadManuMaintPub (47UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_ReadManuMaintPub (48UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_CertifyKey (50UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_Sign (60UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_GetRandom (70UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_StirRandom (71UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_SelfTestFull (80UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_SelfTestStartup (81UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_CertifySelfTest (82UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_ContinueSelfTest (83UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_GetTestResult (84UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_Reset (90UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_OwnerClear (91UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_DisableOwnerClear (92UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_ForceClear (93UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_DisableForceClear (94UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_GetCapabilitySigned (100UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_GetCapability (101UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_GetCapabilityOwner (102UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_OwnerSetDisable (110UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_PhysicalEnable (111UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_PhysicalDisable (112UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_SetOwnerInstall (113UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_PhysicalSetDeactivated (114UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_SetTempDeactivated (115UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_CreateEndorsementKeyPair (120UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_MakeIdentity (121UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_ActivateIdentity (122UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_ReadPubek (124UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_OwnerReadPubek (125UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_DisablePubekRead (126UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_GetAuditEvent (130UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_GetAuditEventSigned (131UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_GetOrdinalAuditStatus (140UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_SetOrdinalAuditStatus (141UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_Terminate_Handle (150UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_Init (151UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_SaveState (152UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_Startup (153UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_SetRedirection (154UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_SHA1Start (160UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_SHA1Update (161UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_SHA1Complete (162UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_SHA1CompleteExtend (163UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_FieldUpgrade (170UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_SaveKeyContext (180UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_LoadKeyContext (181UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_SaveAuthContext (182UL + TPM_PROTECTED_ORDINAL) -#define TPM_ORD_LoadAuthContext (183UL + TPM_PROTECTED_ORDINAL) -#define TSC_ORD_PhysicalPresence (10UL + TPM_CONNECTION_ORDINAL) - - - -// -// TPM_RESULT values -// -// just put in the whole table from spec 1.2 - -#define TPM_BASE 0x0 // The start of TPM return codes -#define TPM_VENDOR_ERROR 0x00000400 // Mask to indicate that the error code is vendor specific for vendor specific commands -#define TPM_NON_FATAL 0x00000800 // Mask to indicate that the error code is a non-fatal failure. - -#define TPM_SUCCESS TPM_BASE // Successful completion of the operation -#define TPM_AUTHFAIL TPM_BASE + 1 // Authentication failed -#define TPM_BADINDEX TPM_BASE + 2 // The index to a PCR, DIR or other register is incorrect -#define TPM_BAD_PARAMETER TPM_BASE + 3 // One or more parameter is bad -#define TPM_AUDITFAILURE TPM_BASE + 4 // An operation completed successfully but the auditing of that operation failed. -#define TPM_CLEAR_DISABLED TPM_BASE + 5 // The clear disable flag is set and all clear operations now require physical access -#define TPM_DEACTIVATED TPM_BASE + 6 // The TPM is deactivated -#define TPM_DISABLED TPM_BASE + 7 // The TPM is disabled -#define TPM_DISABLED_CMD TPM_BASE + 8 // The target command has been disabled -#define TPM_FAIL TPM_BASE + 9 // The operation failed -#define TPM_BAD_ORDINAL TPM_BASE + 10 // The ordinal was unknown or inconsistent -#define TPM_INSTALL_DISABLED TPM_BASE + 11 // The ability to install an owner is disabled -#define TPM_INVALID_KEYHANDLE TPM_BASE + 12 // The key handle presented was invalid -#define TPM_KEYNOTFOUND TPM_BASE + 13 // The target key was not found -#define TPM_INAPPROPRIATE_ENC TPM_BASE + 14 // Unacceptable encryption scheme -#define TPM_MIGRATEFAIL TPM_BASE + 15 // Migration authorization failed -#define TPM_INVALID_PCR_INFO TPM_BASE + 16 // PCR information could not be interpreted -#define TPM_NOSPACE TPM_BASE + 17 // No room to load key. -#define TPM_NOSRK TPM_BASE + 18 // There is no SRK set -#define TPM_NOTSEALED_BLOB TPM_BASE + 19 // An encrypted blob is invalid or was not created by this TPM -#define TPM_OWNER_SET TPM_BASE + 20 // There is already an Owner -#define TPM_RESOURCES TPM_BASE + 21 // The TPM has insufficient internal resources to perform the requested action. -#define TPM_SHORTRANDOM TPM_BASE + 22 // A random string was too short -#define TPM_SIZE TPM_BASE + 23 // The TPM does not have the space to perform the operation. -#define TPM_WRONGPCRVAL TPM_BASE + 24 // The named PCR value does not match the current PCR value. -#define TPM_BAD_PARAM_SIZE TPM_BASE + 25 // The paramSize argument to the command has the incorrect value -#define TPM_SHA_THREAD TPM_BASE + 26 // There is no existing SHA-1 thread. -#define TPM_SHA_ERROR TPM_BASE + 27 // The calculation is unable to proceed because the existing SHA-1 thread has already encountered an error. -#define TPM_FAILEDSELFTEST TPM_BASE + 28 // Self-test has failed and the TPM has shutdown. -#define TPM_AUTH2FAIL TPM_BASE + 29 // The authorization for the second key in a 2 key function failed authorization -#define TPM_BADTAG TPM_BASE + 30 // The tag value sent to for a command is invalid -#define TPM_IOERROR TPM_BASE + 31 // An IO error occurred transmitting information to the TPM -#define TPM_ENCRYPT_ERROR TPM_BASE + 32 // The encryption process had a problem. -#define TPM_DECRYPT_ERROR TPM_BASE + 33 // The decryption process did not complete. -#define TPM_INVALID_AUTHHANDLE TPM_BASE + 34 // An invalid handle was used. -#define TPM_NO_ENDORSEMENT TPM_BASE + 35 // The TPM does not a EK installed -#define TPM_INVALID_KEYUSAGE TPM_BASE + 36 // The usage of a key is not allowed -#define TPM_WRONG_ENTITYTYPE TPM_BASE + 37 // The submitted entity type is not allowed -#define TPM_INVALID_POSTINIT TPM_BASE + 38 // The command was received in the wrong sequence relative to TPM_Init and a subsequent TPM_Startup -#define TPM_INAPPROPRIATE_SIG TPM_BASE + 39 // Signed data cannot include additional DER information -#define TPM_BAD_KEY_PROPERTY TPM_BASE + 40 // The key properties in TPM_KEY_PARMs are not supported by this TPM - -#define TPM_BAD_MIGRATION TPM_BASE + 41 // The migration properties of this key are incorrect. -#define TPM_BAD_SCHEME TPM_BASE + 42 // The signature or encryption scheme for this key is incorrect or not permitted in this situation. -#define TPM_BAD_DATASIZE TPM_BASE + 43 // The size of the data (or blob) parameter is bad or inconsistent with the referenced key -#define TPM_BAD_MODE TPM_BASE + 44 // A mode parameter is bad, such as capArea or subCapArea for TPM_GetCapability, phsicalPresence parameter for TPM_PhysicalPresence, or migrationType for TPM_CreateMigrationBlob. -#define TPM_BAD_PRESENCE TPM_BASE + 45 // Either the physicalPresence or physicalPresenceLock bits have the wrong value -#define TPM_BAD_VERSION TPM_BASE + 46 // The TPM cannot perform this version of the capability -#define TPM_NO_WRAP_TRANSPORT TPM_BASE + 47 // The TPM does not allow for wrapped transport sessions -#define TPM_AUDITFAIL_UNSUCCESSFUL TPM_BASE + 48 // TPM audit construction failed and the underlying command was returning a failure code also -#define TPM_AUDITFAIL_SUCCESSFUL TPM_BASE + 49 // TPM audit construction failed and the underlying command was returning success -#define TPM_NOTRESETABLE TPM_BASE + 50 // Attempt to reset a PCR register that does not have the resettable attribute -#define TPM_NOTLOCAL TPM_BASE + 51 // Attempt to reset a PCR register that requires locality and locality modifier not part of command transport -#define TPM_BAD_TYPE TPM_BASE + 52 // Make identity blob not properly typed -#define TPM_INVALID_RESOURCE TPM_BASE + 53 // When saving context identified resource type does not match actual resource -#define TPM_NOTFIPS TPM_BASE + 54 // The TPM is attempting to execute a command only available when in FIPS mode -#define TPM_INVALID_FAMILY TPM_BASE + 55 // The command is attempting to use an invalid family ID -#define TPM_NO_NV_PERMISSION TPM_BASE + 56 // The permission to manipulate the NV storage is not available -#define TPM_REQUIRES_SIGN TPM_BASE + 57 // The operation requires a signed command -#define TPM_KEY_NOTSUPPORTED TPM_BASE + 58 // Wrong operation to load an NV key -#define TPM_AUTH_CONFLICT TPM_BASE + 59 // NV_LoadKey blob requires both owner and blob authorization -#define TPM_AREA_LOCKED TPM_BASE + 60 // The NV area is locked and not writtable -#define TPM_BAD_LOCALITY TPM_BASE + 61 // The locality is incorrect for the attempted operation -#define TPM_READ_ONLY TPM_BASE + 62 // The NV area is read only and can't be written to -#define TPM_PER_NOWRITE TPM_BASE + 63 // There is no protection on the write to the NV area -#define TPM_FAMILYCOUNT TPM_BASE + 64 // The family count value does not match -#define TPM_WRITE_LOCKED TPM_BASE + 65 // The NV area has already been written to -#define TPM_BAD_ATTRIBUTES TPM_BASE + 66 // The NV area attributes conflict -#define TPM_INVALID_STRUCTURE TPM_BASE + 67 // The structure tag and version are invalid or inconsistent -#define TPM_KEY_OWNER_CONTROL TPM_BASE + 68 // The key is under control of the TPM Owner and can only be evicted by the TPM Owner. -#define TPM_BAD_COUNTER TPM_BASE + 69 // The counter handle is incorrect -#define TPM_NOT_FULLWRITE TPM_BASE + 70 // The write is not a complete write of the area -#define TPM_CONTEXT_GAP TPM_BASE + 71 // The gap between saved context counts is too large -#define TPM_MAXNVWRITES TPM_BASE + 72 // The maximum number of NV writes without an owner has been exceeded -#define TPM_NOOPERATOR TPM_BASE + 73 // No operator authorization value is set -#define TPM_RESOURCEMISSING TPM_BASE + 74 // The resource pointed to by context is not loaded -#define TPM_DELEGATE_LOCK TPM_BASE + 75 // The delegate administration is locked -#define TPM_DELEGATE_FAMILY TPM_BASE + 76 // Attempt to manage a family other then the delegated family -#define TPM_DELEGATE_ADMIN TPM_BASE + 77 // Delegation table management not enabled -#define TPM_TRANSPORT_EXCLUSIVE TPM_BASE + 78 // There was a command executed outside of an exclusive transport session - -// TPM_STARTUP_TYPE values -#define TPM_ST_CLEAR 0x0001 -#define TPM_ST_STATE 0x0002 -#define TPM_ST_DEACTIVATED 0x003 - -// TPM_TAG values -#define TPM_TAG_RQU_COMMAND 0x00c1 -#define TPM_TAG_RQU_AUTH1_COMMAND 0x00c2 -#define TPM_TAG_RQU_AUTH2_COMMAND 0x00c3 -#define TPM_TAG_RSP_COMMAND 0x00c4 -#define TPM_TAG_RSP_AUTH1_COMMAND 0x00c5 -#define TPM_TAG_RSP_AUTH2_COMMAND 0x00c6 - -// TPM_PAYLOAD_TYPE values -#define TPM_PT_ASYM 0x01 -#define TPM_PT_BIND 0x02 -#define TPM_PT_MIGRATE 0x03 -#define TPM_PT_MAINT 0x04 -#define TPM_PT_SEAL 0x05 - -// TPM_ENTITY_TYPE values -#define TPM_ET_KEYHANDLE 0x0001 -#define TPM_ET_OWNER 0x0002 -#define TPM_ET_DATA 0x0003 -#define TPM_ET_SRK 0x0004 -#define TPM_ET_KEY 0x0005 - -/// TPM_ResourceTypes -#define TPM_RT_KEY 0x00000001 -#define TPM_RT_AUTH 0x00000002 -#define TPM_RT_TRANS 0x00000004 -#define TPM_RT_CONTEXT 0x00000005 - -// TPM_PROTOCOL_ID values -#define TPM_PID_OIAP 0x0001 -#define TPM_PID_OSAP 0x0002 -#define TPM_PID_ADIP 0x0003 -#define TPM_PID_ADCP 0x0004 -#define TPM_PID_OWNER 0x0005 - -// TPM_ALGORITHM_ID values -#define TPM_ALG_RSA 0x00000001 -#define TPM_ALG_DES 0x00000002 -#define TPM_ALG_3DES 0X00000003 -#define TPM_ALG_SHA 0x00000004 -#define TPM_ALG_HMAC 0x00000005 -#define TCPA_ALG_AES 0x00000006 - -// TPM_ENC_SCHEME values -#define TPM_ES_NONE 0x0001 -#define TPM_ES_RSAESPKCSv15 0x0002 -#define TPM_ES_RSAESOAEP_SHA1_MGF1 0x0003 - -// TPM_SIG_SCHEME values -#define TPM_SS_NONE 0x0001 -#define TPM_SS_RSASSAPKCS1v15_SHA1 0x0002 -#define TPM_SS_RSASSAPKCS1v15_DER 0x0003 - -// TPM_KEY_USAGE values -#define TPM_KEY_EK 0x0000 -#define TPM_KEY_SIGNING 0x0010 -#define TPM_KEY_STORAGE 0x0011 -#define TPM_KEY_IDENTITY 0x0012 -#define TPM_KEY_AUTHCHANGE 0X0013 -#define TPM_KEY_BIND 0x0014 -#define TPM_KEY_LEGACY 0x0015 - -// TPM_AUTH_DATA_USAGE values -#define TPM_AUTH_NEVER 0x00 -#define TPM_AUTH_ALWAYS 0x01 - -// Key Handle of owner and srk -#define TPM_OWNER_KEYHANDLE 0x40000001 -#define TPM_SRK_KEYHANDLE 0x40000000 - -// ---------------------- Functions for checking TPM_RESULTs ----------------- - -#include <stdio.h> - -// FIXME: Review use of these and delete unneeded ones. - -// these are really badly dependent on local structure: -// DEPENDS: local var 'status' of type TPM_RESULT -// DEPENDS: label 'abort_egress' which cleans up and returns the status -#define ERRORDIE(s) do { status = s; \ - fprintf (stderr, "*** ERRORDIE in %s at %s: %i\n", __func__, __FILE__, __LINE__); \ - goto abort_egress; } \ - while (0) - -// DEPENDS: local var 'status' of type TPM_RESULT -// DEPENDS: label 'abort_egress' which cleans up and returns the status -// Try command c. If it fails, set status to s and goto abort. -#define TPMTRY(s,c) if (c != TPM_SUCCESS) { \ - status = s; \ - printf("ERROR in %s at %s:%i code: %s.\n", __func__, __FILE__, __LINE__, tpm_get_error_name(status)); \ - goto abort_egress; \ - } else {\ - status = c; \ - } - -// Try command c. If it fails, print error message, set status to actual return code. Goto abort -#define TPMTRYRETURN(c) do { status = c; \ - if (status != TPM_SUCCESS) { \ - fprintf(stderr, "ERROR in %s at %s:%i code: %s.\n", __func__, __FILE__, __LINE__, tpm_get_error_name(status)); \ - goto abort_egress; \ - } \ - } while(0) - - -#pragma pack(pop) - -#endif //__TCPA_H__ diff --git a/tools/xenstore/hashtable.c b/tools/xenstore/hashtable.c index 3b89223..0ba1d55 100644 --- a/tools/xenstore/hashtable.c +++ b/tools/xenstore/hashtable.c @@ -3,7 +3,6 @@ /* * There are duplicates of this code in: * - tools/blktap2/drivers/hashtable.c - * - tools/vtpm_manager/util/hashtable.c */ #include "hashtable.h" diff --git a/tools/xenstore/hashtable.h b/tools/xenstore/hashtable.h index 8e6bb5b..4d68223 100644 --- a/tools/xenstore/hashtable.h +++ b/tools/xenstore/hashtable.h @@ -3,7 +3,6 @@ /* * There are duplicates of this code in: * - tools/blktap2/drivers/hashtable.h - * - tools/vtpm_manager/util/hashtable.h */ #ifndef __HASHTABLE_CWC22_H__ diff --git a/tools/xenstore/hashtable_private.h b/tools/xenstore/hashtable_private.h index cabaffe..a08559d 100644 --- a/tools/xenstore/hashtable_private.h +++ b/tools/xenstore/hashtable_private.h @@ -3,7 +3,6 @@ /* * There are duplicates of this code in: * - tools/blktap2/drivers/hashtable_private.h - * - tools/vtpm_manager/util/hashtable_private.h */ #ifndef __HASHTABLE_PRIVATE_CWC22_H__ diff --git a/tools/xm-test/configure.ac b/tools/xm-test/configure.ac index ad1eb78..c142140 100644 --- a/tools/xm-test/configure.ac +++ b/tools/xm-test/configure.ac @@ -143,7 +143,6 @@ AC_CONFIG_FILES([ tests/unpause/Makefile tests/vcpu-pin/Makefile tests/vcpu-disable/Makefile - tests/vtpm/Makefile tests/xapi/Makefile tests/enforce_dom0_cpus/Makefile tests/cpupool/Makefile diff --git a/tools/xm-test/grouptest/default b/tools/xm-test/grouptest/default index f0516b2..e04591b 100644 --- a/tools/xm-test/grouptest/default +++ b/tools/xm-test/grouptest/default @@ -27,5 +27,4 @@ sysrq unpause vcpu-disable vcpu-pin -vtpm xapi diff --git a/tools/xm-test/grouptest/medium b/tools/xm-test/grouptest/medium index bafc988..5c3e1b1 100644 --- a/tools/xm-test/grouptest/medium +++ b/tools/xm-test/grouptest/medium @@ -22,4 +22,3 @@ sysrq 01_sysrq_basic_neg.test 02_sysrq_sync_pos.test unpause vcpu-disable vcpu-pin -vtpm diff --git a/tools/xm-test/grouptest/xapi b/tools/xm-test/grouptest/xapi index 3b04921..7a08b77 100644 --- a/tools/xm-test/grouptest/xapi +++ b/tools/xm-test/grouptest/xapi @@ -1,2 +1 @@ xapi -vtpm 09_vtpm-xapi.test diff --git a/tools/xm-test/lib/XmTestLib/XenDomain.py b/tools/xm-test/lib/XmTestLib/XenDomain.py index ae8c550..3ba7433 100644 --- a/tools/xm-test/lib/XmTestLib/XenDomain.py +++ b/tools/xm-test/lib/XmTestLib/XenDomain.py @@ -59,7 +59,6 @@ class XenConfig: # These options need to be lists self.defaultOpts["disk"] = [] self.defaultOpts["vif"] = [] - self.defaultOpts["vtpm"] = [] self.opts = self.defaultOpts diff --git a/tools/xm-test/tests/Makefile.am b/tools/xm-test/tests/Makefile.am index 8d673ed..455f50c 100644 --- a/tools/xm-test/tests/Makefile.am +++ b/tools/xm-test/tests/Makefile.am @@ -25,7 +25,6 @@ SUBDIRS = \ unpause \ vcpu-disable \ vcpu-pin \ - vtpm \ enforce_dom0_cpus \ save restore migrate \ cpupool diff --git a/tools/xm-test/tests/vtpm/01_vtpm-list_pos.py b/tools/xm-test/tests/vtpm/01_vtpm-list_pos.py deleted file mode 100644 index dfd1227..0000000 --- a/tools/xm-test/tests/vtpm/01_vtpm-list_pos.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/python - -# Copyright (C) International Business Machines Corp., 2006 -# Author: Stefan Berger <stefanb@xxxxxxxxxx> - -# Positive Test: create domain with virtual TPM attached at build time, -# verify list - - -from XmTestLib import * -from vtpm_utils import * -import commands -import os -import atexit - -config = {"vtpm":"instance=1,backend=0"} -domain = XmTestDomain(extraConfig=config) - -try: - domain.start(noConsole=True) -except DomainError, e: - if verbose: - print e.extra - vtpm_cleanup(domain.getName()) - FAIL("Unable to create domain") - - -domName = domain.getName() - -atexit.register(vtpm_cleanup, vtpm_get_uuid(domid(domName))) - -status, output = traceCommand("xm vtpm-list %s" % domain.getId()) -eyecatcher = "/local/domain/0/backend/vtpm" -where = output.find(eyecatcher) -if status != 0: - FAIL("xm vtpm-list returned bad status, expected 0, status is %i" % status) -elif where < 0: - FAIL("Fail to list virtual TPM device") - -domain.stop() diff --git a/tools/xm-test/tests/vtpm/02_vtpm-cat_pcrs.py b/tools/xm-test/tests/vtpm/02_vtpm-cat_pcrs.py deleted file mode 100644 index a18cbab..0000000 --- a/tools/xm-test/tests/vtpm/02_vtpm-cat_pcrs.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/python - -# Copyright (C) International Business Machines Corp., 2006 -# Author: Stefan Berger <stefanb@xxxxxxxxxx> - -# Positive Test: create domain with virtual TPM attached at build time, -# check list of pcrs - -from XmTestLib import * -from vtpm_utils import * -import commands -import os -import os.path -import atexit - -config = {"vtpm":"instance=1,backend=0"} -domain = XmTestDomain(extraConfig=config) -domName = domain.getName() - -try: - console = domain.start() -except DomainError, e: - if verbose: - print e.extra - FAIL("Unable to create domain (%s)" % domName) - -atexit.register(vtpm_cleanup, vtpm_get_uuid(domid(domName))) - -try: - console.sendInput("input") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL(str(e)) - -try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("No result from dumping the PCRs") - -if re.search("No such file",run["output"]): - FAIL("TPM frontend support not compiled into (domU?) kernel") - -domain.closeConsole() - -domain.stop() - -if not re.search("PCR-00:",run["output"]): - FAIL("Virtual TPM is not working correctly on /dev/vtpm on backend side") diff --git a/tools/xm-test/tests/vtpm/03_vtpm-susp_res.py b/tools/xm-test/tests/vtpm/03_vtpm-susp_res.py deleted file mode 100644 index b863f27..0000000 --- a/tools/xm-test/tests/vtpm/03_vtpm-susp_res.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/python - -# Copyright (C) International Business Machines Corp., 2006 -# Author: Stefan Berger <stefanb@xxxxxxxxxx> - -# Positive Test: create domain with virtual TPM attached at build time, -# check list of pcrs; suspend and resume the domain and -# check list of pcrs again - -from XmTestLib import * -from vtpm_utils import * -import commands -import os -import os.path -import atexit - -config = {"vtpm":"instance=1,backend=0"} -domain = XmTestDomain(extraConfig=config) -domName = domain.getName() -consoleHistory = "" - -try: - console = domain.start() -except DomainError, e: - if verbose: - print e.extra - FAIL("Unable to create domain (%s)" % domName) - -atexit.register(vtpm_cleanup, vtpm_get_uuid(domid(domName))) - -try: - console.sendInput("input") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL(str(e)) - -try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("No result from dumping the PCRs") - -if re.search("No such file",run["output"]): - FAIL("TPM frontend support not compiled into (domU?) kernel") - -consoleHistory = console.getHistory() -domain.closeConsole() - -loop = 0 -while loop < 3: - try: - status, ouptut = traceCommand("xm save %s %s.save" % - (domName, domName), - timeout=30) - - except TimeoutError, e: - saveLog(consoleHistory) - FAIL(str(e)) - - if status != 0: - saveLog(consoleHistory) - FAIL("xm save did not succeed") - - try: - status, ouptut = traceCommand("xm restore %s.save" % - (domName), - timeout=30) - except TimeoutError, e: - os.remove("%s.save" % domName) - saveLog(consoleHistory) - FAIL(str(e)) - - os.remove("%s.save" % domName) - - if status != 0: - saveLog(consoleHistory) - FAIL("xm restore did not succeed") - - try: - console = domain.getConsole() - except ConsoleError, e: - FAIL(str(e)) - - try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") - except ConsoleError, e: - saveLog(console.getHistory()) - FAIL(str(e)) - - if not re.search("PCR-00:",run["output"]): - saveLog(console.getHistory()) - FAIL("Virtual TPM is not working correctly on /dev/vtpm on backend side") - - loop += 1 - -domain.closeConsole() - -domain.stop() - diff --git a/tools/xm-test/tests/vtpm/04_vtpm-loc_migr.py b/tools/xm-test/tests/vtpm/04_vtpm-loc_migr.py deleted file mode 100644 index ccc8b73..0000000 --- a/tools/xm-test/tests/vtpm/04_vtpm-loc_migr.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/python - -# Copyright (C) International Business Machines Corp., 2006 -# Author: Stefan Berger <stefanb@xxxxxxxxxx> - -# Positive Test: create domain with virtual TPM attached at build time, -# check list of pcrs; locally migrate the domain and -# check list of pcrs again -# This test does local live migration. - -from XmTestLib import * -from vtpm_utils import * -import commands -import os -import os.path -import atexit - -config = {"vtpm":"instance=1,backend=0"} -domain = XmTestDomain(extraConfig=config) -domName = domain.getName() -consoleHistory = "" - -try: - console = domain.start() -except DomainError, e: - if verbose: - print e.extra - FAIL("Unable to create domain (%s)" % domName) - -atexit.register(vtpm_cleanup, vtpm_get_uuid(domid(domName))) - -try: - console.sendInput("input") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL(str(e)) - -try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("No result from dumping the PCRs") - -if re.search("No such file",run["output"]): - FAIL("TPM frontend support not compiled into (domU?) kernel") - -consoleHistory = console.getHistory() -domain.closeConsole() - -old_domid = domid(domName) - -loop = 0 -while loop < 3: - try: - status, ouptut = traceCommand("xm migrate -l %s localhost" % - domName, - timeout=90) - except TimeoutError, e: - saveLog(consoleHistory) - FAIL(str(e)) - - if status != 0: - saveLog(consoleHistory) - FAIL("xm migrate did not succeed. External device migration activated?") - - - domName = domain.getName() - new_domid = domid(domName) - - if (old_domid == new_domid): - FAIL("xm migrate failed, domain id is still %s (loop=%d)" % - (old_domid,loop)) - - try: - console = domain.getConsole() - except ConsoleError, e: - FAIL(str(e)) - - try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") - except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("No result from dumping the PCRs") - - if not re.search("PCR-00:",run["output"]): - saveLog(console.getHistory()) - FAIL("Virtual TPM is not working correctly on /dev/vtpm on backend side") - - loop += 1 - -domain.closeConsole() - -domain.stop() diff --git a/tools/xm-test/tests/vtpm/05_vtpm-loc_migr.py b/tools/xm-test/tests/vtpm/05_vtpm-loc_migr.py deleted file mode 100644 index 57b87df..0000000 --- a/tools/xm-test/tests/vtpm/05_vtpm-loc_migr.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/python - -# Copyright (C) International Business Machines Corp., 2006 -# Author: Stefan Berger <stefanb@xxxxxxxxxx> - -# Positive Test: create domain with virtual TPM attached at build time, -# check list of pcrs; locally migrate the domain and -# check list of pcrs again -# This test does local (non-live) migration. - -from XmTestLib import * -from vtpm_utils import * -import commands -import os -import os.path -import atexit - -config = {"vtpm":"instance=1,backend=0"} -domain = XmTestDomain(extraConfig=config) -domName = domain.getName() -consoleHistory = "" - -try: - console = domain.start() -except DomainError, e: - if verbose: - print e.extra - FAIL("Unable to create domain (%s)" % domName) - -atexit.register(vtpm_cleanup, vtpm_get_uuid(domid(domName))) - -try: - console.sendInput("input") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL(str(e)) - -try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("No result from dumping the PCRs") - -if re.search("No such file",run["output"]): - FAIL("TPM frontend support not compiled into (domU?) kernel") - -consoleHistory = console.getHistory() -domain.closeConsole() - -old_domid = domid(domName) - -loop = 0 -while loop < 3: - try: - status, ouptut = traceCommand("xm migrate %s localhost" % - domName, - timeout=90) - except TimeoutError, e: - saveLog(consoleHistory) - FAIL(str(e)) - - if status != 0: - saveLog(consoleHistory) - FAIL("xm migrate did not succeed. External device migration activated?") - - - domName = domain.getName() - new_domid = domid(domName) - - if (old_domid == new_domid): - FAIL("xm migrate failed, domain id is still %s (loop=%d)" % - (old_domid,loop)) - - try: - console = domain.getConsole() - except ConsoleError, e: - FAIL(str(e)) - - try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") - except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("No result from dumping the PCRs") - - if not re.search("PCR-00:",run["output"]): - saveLog(console.getHistory()) - FAIL("Virtual TPM is not working correctly on /dev/vtpm on backend side") - - loop += 1 - -domain.closeConsole() - -domain.stop() diff --git a/tools/xm-test/tests/vtpm/06_vtpm-susp_res_pcrs.py b/tools/xm-test/tests/vtpm/06_vtpm-susp_res_pcrs.py deleted file mode 100644 index c70691d..0000000 --- a/tools/xm-test/tests/vtpm/06_vtpm-susp_res_pcrs.py +++ /dev/null @@ -1,125 +0,0 @@ -#!/usr/bin/python - -# Copyright (C) International Business Machines Corp., 2006 -# Author: Stefan Berger <stefanb@xxxxxxxxxx> - -# Positive Test: create domain with virtual TPM attached at build time, -# extend a pcr -# check list of pcrs; suspend and resume the domain and -# check list of pcrs again and validate extended pcr - -from XmTestLib import * -from vtpm_utils import * -import commands -import os -import os.path -import atexit - -config = {"vtpm":"instance=1,backend=0"} -domain = XmTestDomain(extraConfig=config) -domName = domain.getName() -consoleHistory = "" - -try: - console = domain.start() -except DomainError, e: - if verbose: - print e.extra - FAIL("Unable to create domain (%s)" % domName) - -atexit.register(vtpm_cleanup, vtpm_get_uuid(domid(domName))) - -try: - console.sendInput("input") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL(str(e)) - -try: - run = console.runCmd("mknod /dev/tpm0 c 10 224") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("Error while creating /dev/tpm0") - -try: - run = console.runCmd("echo -ne \"\\x00\\xc1\\x00\\x00\\x00\\x22\\x00\\x00\\x00\\x14\\x00\\x00\\x00\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\0xf\\x10\\x11\\x12\\x13\\x14\" > seq; cat seq > /dev/tpm0") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("Error while extending PCR 0") - -try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("No result from dumping the PCRs") - - -if re.search("No such file",run["output"]): - FAIL("TPM frontend support not compiled into (domU?) kernel") - -if not re.search("PCR-00:",run["output"]): - saveLog(console.getHistory()) - FAIL("Virtual TPM is not working correctly on /dev/vtpm on backend side: \n%s" % run["output"]) - -if not re.search("PCR-00: 1E A7 BD",run["output"]): - saveLog(console.getHistory()) - FAIL("Extend did not lead to expected result (1E A7 BD ...): \n%s" % run["output"]) - -consoleHistory = console.getHistory() -domain.closeConsole() - -loop = 0 -while loop < 3: - try: - status, ouptut = traceCommand("xm save %s %s.save" % - (domName, domName), - timeout=30) - - except TimeoutError, e: - saveLog(consoleHistory) - FAIL(str(e)) - - if status != 0: - saveLog(consoleHistory) - FAIL("xm save did not succeed") - - try: - status, ouptut = traceCommand("xm restore %s.save" % - (domName), - timeout=30) - except TimeoutError, e: - os.remove("%s.save" % domName) - saveLog(consoleHistory) - FAIL(str(e)) - - os.remove("%s.save" % domName) - - if status != 0: - saveLog(consoleHistory) - FAIL("xm restore did not succeed") - - try: - console = domain.getConsole() - except ConsoleError, e: - FAIL(str(e)) - - try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") - except ConsoleError, e: - saveLog(console.getHistory()) - FAIL(str(e)) - - if not re.search("PCR-00:",run["output"]): - saveLog(console.getHistory()) - FAIL("Virtual TPM is not working correctly on /dev/vtpm on backend side") - - if not re.search("PCR-00: 1E A7 BD",run["output"]): - saveLog(console.getHistory()) - FAIL("Virtual TPM lost PCR 0 value: \n%s" % run["output"]) - - loop += 1 - -domain.closeConsole() - -domain.stop() - diff --git a/tools/xm-test/tests/vtpm/07_vtpm-mig_pcrs.py b/tools/xm-test/tests/vtpm/07_vtpm-mig_pcrs.py deleted file mode 100644 index 4ff3360..0000000 --- a/tools/xm-test/tests/vtpm/07_vtpm-mig_pcrs.py +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/python - -# Copyright (C) International Business Machines Corp., 2006 -# Author: Stefan Berger <stefanb@xxxxxxxxxx> - -# Positive Test: create domain with virtual TPM attached at build time, -# extend a pcr -# check list of pcrs; locally migrate the domain and -# check list of pcrs again and validate extended pcr -# This test does local live migration. - -from XmTestLib import * -from vtpm_utils import * -import commands -import os -import os.path -import atexit - -config = {"vtpm":"instance=1,backend=0"} -domain = XmTestDomain(extraConfig=config) -domName = domain.getName() -consoleHistory = "" - -try: - console = domain.start() -except DomainError, e: - if verbose: - print e.extra - FAIL("Unable to create domain (%s)" % domName) - -atexit.register(vtpm_cleanup, vtpm_get_uuid(domid(domName))) - -try: - console.sendInput("input") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL(str(e)) - -try: - run = console.runCmd("mknod /dev/tpm0 c 10 224") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("Error while creating /dev/tpm0") - -try: - run = console.runCmd("echo -ne \"\\x00\\xc1\\x00\\x00\\x00\\x22\\x00\\x00\\x00\\x14\\x00\\x00\\x00\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\0xf\\x10\\x11\\x12\\x13\\x14\" > seq; cat seq > /dev/tpm0") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("Error while extending PCR 0") - -try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("No result from dumping the PCRs") - - -if re.search("No such file",run["output"]): - FAIL("TPM frontend support not compiled into (domU?) kernel") - -if not re.search("PCR-00:",run["output"]): - saveLog(console.getHistory()) - FAIL("Virtual TPM is not working correctly on /dev/vtpm on backend side: \n%s" % run["output"]) - -if not re.search("PCR-00: 1E A7 BD",run["output"]): - saveLog(console.getHistory()) - FAIL("Extend did not lead to expected result (1E A7 BD ...): \n%s" % run["output"]) - -consoleHistory = console.getHistory() -domain.closeConsole() - -old_domid = domid(domName) - -loop = 0 -while loop < 3: - try: - status, ouptut = traceCommand("xm migrate -l %s localhost" % - domName, - timeout=90) - except TimeoutError, e: - saveLog(consoleHistory) - FAIL(str(e)) - - if status != 0: - saveLog(consoleHistory) - FAIL("xm migrate did not succeed. External device migration activated?") - - - domName = domain.getName() - new_domid = domid(domName) - - if (old_domid == new_domid): - FAIL("xm migrate failed, domain id is still %s (loop=%d)" % - (old_domid,loop)) - - try: - console = domain.getConsole() - except ConsoleError, e: - FAIL(str(e)) - - try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") - except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("No result from dumping the PCRs") - - if not re.search("PCR-00:",run["output"]): - saveLog(console.getHistory()) - FAIL("Virtual TPM is not working correctly on /dev/vtpm on backend side") - - if not re.search("PCR-00: 1E A7 BD",run["output"]): - saveLog(console.getHistory()) - FAIL("Virtual TPM lost PCR 0 value: \n%s" % run["output"]) - - loop += 1 - -domain.closeConsole() - -domain.stop() diff --git a/tools/xm-test/tests/vtpm/08_vtpm-mig_pcrs.py b/tools/xm-test/tests/vtpm/08_vtpm-mig_pcrs.py deleted file mode 100644 index 27125fc..0000000 --- a/tools/xm-test/tests/vtpm/08_vtpm-mig_pcrs.py +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/python - -# Copyright (C) International Business Machines Corp., 2006 -# Author: Stefan Berger <stefanb@xxxxxxxxxx> - -# Positive Test: create domain with virtual TPM attached at build time, -# extend a pcr -# check list of pcrs; locally migrate the domain and -# check list of pcrs again and validate extended pcr -# This test does local (non-live) migration. - -from XmTestLib import * -from vtpm_utils import * -import commands -import os -import os.path -import atexit - -config = {"vtpm":"instance=1,backend=0"} -domain = XmTestDomain(extraConfig=config) -domName = domain.getName() -consoleHistory = "" - -try: - console = domain.start() -except DomainError, e: - if verbose: - print e.extra - FAIL("Unable to create domain (%s)" % domName) - -atexit.register(vtpm_cleanup, vtpm_get_uuid(domid(domName))) - -try: - console.sendInput("input") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL(str(e)) - -try: - run = console.runCmd("mknod /dev/tpm0 c 10 224") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("Error while creating /dev/tpm0") - -try: - run = console.runCmd("echo -ne \"\\x00\\xc1\\x00\\x00\\x00\\x22\\x00\\x00\\x00\\x14\\x00\\x00\\x00\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\0xf\\x10\\x11\\x12\\x13\\x14\" > seq; cat seq > /dev/tpm0") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("Error while extending PCR 0") - -try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("No result from dumping the PCRs") - - -if re.search("No such file",run["output"]): - FAIL("TPM frontend support not compiled into (domU?) kernel") - -if not re.search("PCR-00:",run["output"]): - saveLog(console.getHistory()) - FAIL("Virtual TPM is not working correctly on /dev/vtpm on backend side: \n%s" % run["output"]) - -if not re.search("PCR-00: 1E A7 BD",run["output"]): - saveLog(console.getHistory()) - FAIL("Extend did not lead to expected result (1E A7 BD ...): \n%s" % run["output"]) - -consoleHistory = console.getHistory() -domain.closeConsole() - -old_domid = domid(domName) - -loop = 0 -while loop < 3: - try: - status, ouptut = traceCommand("xm migrate %s localhost" % - domName, - timeout=90) - except TimeoutError, e: - saveLog(consoleHistory) - FAIL(str(e)) - - if status != 0: - saveLog(consoleHistory) - FAIL("xm migrate did not succeed. External device migration activated?") - - - domName = domain.getName() - new_domid = domid(domName) - - if (old_domid == new_domid): - FAIL("xm migrate failed, domain id is still %s (loop=%d)" % - (old_domid,loop)) - - try: - console = domain.getConsole() - except ConsoleError, e: - FAIL(str(e)) - - try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") - except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("No result from dumping the PCRs") - - if not re.search("PCR-00:",run["output"]): - saveLog(console.getHistory()) - FAIL("Virtual TPM is not working correctly on /dev/vtpm on backend side") - - if not re.search("PCR-00: 1E A7 BD",run["output"]): - saveLog(console.getHistory()) - FAIL("Virtual TPM lost PCR 0 value: \n%s" % run["output"]) - - loop += 1 - -domain.closeConsole() - -domain.stop() diff --git a/tools/xm-test/tests/vtpm/09_vtpm-xapi.py b/tools/xm-test/tests/vtpm/09_vtpm-xapi.py deleted file mode 100644 index a1aa8b3..0000000 --- a/tools/xm-test/tests/vtpm/09_vtpm-xapi.py +++ /dev/null @@ -1,158 +0,0 @@ -#!/usr/bin/python - -# Copyright (C) International Business Machines Corp., 2006 -# Author: Stefan Berger <stefanb@xxxxxxxxxx> - -# Test to test the vtpm class through the Xen-API -# -# Tested methods: -# VTPM: get_uuid, get_backend, get_by_uuid, get_record -# create, destroy, get_VM -# VM: get_VTPMS - -from XmTestLib import xapi -from XmTestLib.XenAPIDomain import XmTestAPIDomain -from XmTestLib import * -from vtpm_utils import * -import commands -import os - -VTPM_RECORD_KEYS = [ 'backend', 'VM', 'uuid', 'other_config' ] - -try: - # XmTestAPIDomain tries to establish a connection to XenD - domain = XmTestAPIDomain() -except Exception, e: - SKIP("Skipping test. Error: %s" % str(e)) -vm_uuid = domain.get_uuid() - -vtpmcfg = {} -vtpmcfg['backend'] = DOM0_UUID -vtpmcfg['VM'] = vm_uuid - -session = xapi.connect() - -vtpm_uuid = session.xenapi.VTPM.create(vtpmcfg) - -vtpm_be = session.xenapi.VTPM.get_backend(vtpm_uuid) -if vtpm_be != vtpmcfg['backend']: - FAIL("vTPM's backend is in '%s', expected: '%s'" % - (vtpm_be, vtpmcfg['backend'])) - -vtpm_rec = session.xenapi.VTPM.get_record(vtpm_uuid) - -miss_keys = [] -for k in VTPM_RECORD_KEYS: - if k not in vtpm_rec.keys(): - miss_keys.append(k) -if len(miss_keys) > 0: - FAIL("vTPM record is missing key(s): %s" % miss_keys) - -if vtpm_rec['uuid'] != vtpm_uuid: - FAIL("vTPM record shows vtpm uuid '%s', expected: '%s'" % - (vtpm_rec['uuid'], vtpm_uuid)) -if vtpm_rec['VM'] != vm_uuid: - FAIL("vTPM record shows VM uuid '%s', expected: '%s'" % - (vtpm_rec['VM'], vm_uuid)) -if vtpm_rec['backend'] != vtpmcfg['backend']: - FAIL("vTPM record shows VM bakcned '%s', expected: '%s'" % - (vtpm_rev['backend'], vtpmcfg['backend'])) - -badkeys = [] -keys = vtpm_rec.keys() -for k in keys: - if k not in VTPM_RECORD_KEYS: - badkeys.append(k) -if len(badkeys) > 0: - FAIL("Unexpected attributes in result: %s" % badkeys) - -if vm_uuid != session.xenapi.VTPM.get_VM(vtpm_uuid): - FAIL("VM uuid from VTPM.get_VM different (%s) than expected (%s)." % - (vm_ref, vm_uuid)) - -uuid = session.xenapi.VTPM.get_uuid(vtpm_uuid) -if uuid != vtpm_uuid: - FAIL("vTPM from VTPM.get_uuid different (%s) than expected (%s)." % - (uuid, vtpm_uuid)) - -vtpm_ref = session.xenapi.VTPM.get_by_uuid(vtpm_uuid) -if vtpm_ref != vtpm_uuid: - FAIL("vTPM from VTPM.get_by_uuid different (%s) than expected (%s)." % - (vtpm_ref, vtpm_uuid)) - -vm_vtpms = session.xenapi.VM.get_VTPMs(vm_uuid) -if len(vm_vtpms) != 1: - FAIL("Number of vTPMs from get_VTPMs is (%d) not what was expected (%d)" % - (len(vm_vtpms), 1)) -if vtpm_uuid not in vm_vtpms: - FAIL("Other vTPM uuid (%s) returned from VM.get_VTPMs than expected (%s)" % - (vm_vtpms[0], vtpm_uuid)) - -try: - console = domain.start() -except DomainError, e: - FAIL("Unable to create domain.") - -try: - console.sendInput("input") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL(str(e)) - -try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("1. No result from dumping the PCRs") - -if re.search("No such file",run["output"]): - FAIL("TPM frontend support not compiled into (domU?) kernel") - -if not re.search("PCR-00:",run["output"]): - saveLog(console.getHistory()) - FAIL("1. Virtual TPM is not working correctly on /dev/vtpm on backend side: \n%s" % run["output"]) - -try: - session.xenapi.VTPM.destroy(vtpm_uuid) - #Should never get here - FAIL("Could destroy vTPM while VM is running") -except: - pass - -rc = session.xenapi.VM.suspend(vm_uuid) -if rc: - FAIL("Could not suspend VM") - -try: - session.xenapi.VTPM.destroy(vtpm_uuid) - #May not throw an exception in 'suspend' state -except: - pass - -rc = session.xenapi.VM.resume(vm_uuid, False) -if rc: - FAIL("Could not resume VM") - -try: - console = domain.getConsole() -except ConsoleError, e: - FAIL(str(e)) - -try: - run = console.runCmd("cat /sys/devices/xen/vtpm-0/pcrs") -except ConsoleError, e: - saveLog(console.getHistory()) - FAIL("2. No result from dumping the PCRs. vTPM has been removed?") - -if not re.search("PCR-00:",run["output"]): - saveLog(console.getHistory()) - FAIL("2. Virtual TPM is not working correctly on /dev/vtpm on backend side: \n%s" % run["output"]) - -domain.stop() - -try: - session.xenapi.VTPM.destroy(vtpm_uuid) -except: - FAIL("Could NOT destroy vTPM while domain is halted.") - -domain.destroy() diff --git a/tools/xm-test/tests/vtpm/Makefile.am b/tools/xm-test/tests/vtpm/Makefile.am deleted file mode 100644 index dd67e45..0000000 --- a/tools/xm-test/tests/vtpm/Makefile.am +++ /dev/null @@ -1,27 +0,0 @@ -SUBDIRS = - -TESTS = 01_vtpm-list_pos.test \ - 02_vtpm-cat_pcrs.test \ - 03_vtpm-susp_res.test \ - 04_vtpm-loc_migr.test \ - 05_vtpm-loc_migr.test \ - 06_vtpm-susp_res_pcrs.test \ - 07_vtpm-mig_pcrs.test \ - 08_vtpm-mig_pcrs.test \ - 09_vtpm-xapi.test - -XFAIL_TESTS = - -EXTRA_DIST = $(TESTS) $(XFAIL_TESTS) vtpm_utils.py -TESTS_ENVIRONMENT=@TENV@ - -%.test: %.py - cp $< $@ - chmod +x $@ - -clean-local: am_config_clean-local - -am_config_clean-local: - rm -f *test - rm -f *log - rm -f *~ diff --git a/tools/xm-test/tests/vtpm/vtpm_utils.py b/tools/xm-test/tests/vtpm/vtpm_utils.py deleted file mode 100644 index 4e5b281..0000000 --- a/tools/xm-test/tests/vtpm/vtpm_utils.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/python - -# Copyright (C) International Business Machines Corp., 2006 -# Author: Stefan Berger <stefanb@xxxxxxxxxx> - -from XmTestLib import * - -if ENABLE_HVM_SUPPORT: - SKIP("vtpm tests not supported for HVM domains") - -status, output = traceCommand("COLUMNS=200 ; " - "ps aux | grep vtpm_manager | grep -v grep") -if output == "": - SKIP("virtual TPM manager must be started to run this test; might " - "need /dev/tpm0") - -def vtpm_cleanup(domName): - traceCommand("/etc/xen/scripts/vtpm-delete " - "`xenstore-read /local/domain/0/backend/vtpm/%s/0/uuid`" % - str(domid(domName))) - -def vtpm_cleanup(uuid): - from xen.xm import main - if main.serverType != main.SERVER_XEN_API: - traceCommand("/etc/xen/scripts/vtpm-delete %s" % uuid) - -def vtpm_get_uuid(domainid): - s, o = traceCommand("xenstore-read " - "/local/domain/0/backend/vtpm/%s/0/uuid" % domainid) - return o -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |