Commit Graph

826 Commits

Author SHA1 Message Date
Stefan Berger
de8a3cc6f6 tpm2: Only call EVP_PKEY_CTX_set0_rsa_oaep_label when label != NULL (OSSL 3)
EVP_PKEY_CTX_set0_rsa_oaep_label must only be called with label != NULL.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-09-16 12:24:17 -04:00
Stefan Berger
6b498a20fa tpm2: Use EVP_PKEY_get1_RSA() rather than EVP_PKEY_get0_RSA (OSSL 3)
OpenSSL 3.0 has changed the signature of EVP_PKEY_get0_RSA() from

struct rsa_st *EVP_PKEY_get0_RSA(EVP_PKEY *pkey);

to

const struct rsa_st *EVP_PKEY_get0_RSA(const EVP_PKEY *pkey);

We now have to use EVP_PKEY_get1_RSA with this signature so that we can
access the RSA key. The signature of that function hasn't changed between
OpenSSL 1.1.0 and 3.0.0.

struct rsa_st *EVP_PKEY_get1_RSA(EVP_PKEY *pkey);

Free the additional reference held on the RSA key.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-09-16 12:24:17 -04:00
Stefan Berger
05d2b96c31 build-sys: Build libtpms v0.8.7
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-09-16 12:24:17 -04:00
Stefan Berger
7a4d46a119 rpm/debian: Add 0.8.6 entry in changelog
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-09-09 16:26:33 -04:00
Stefan Berger
8ae3d744bc tpm2: Marshal event sequence objects' hash state
Event sequence objects were never properly marshalled and when their state
was saved and later restored their state may have been corrupted. Fix this
now by also marshalling the state of event sequence objects.

Bump up the version of the HASH_OBJECT's header to '3' so that previously
written state can be resumed if an event sequence object is encountered
and we only unmarshal an event sequence object when the version is at least
'3'.

Fixes issue #259.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-09-09 16:26:33 -04:00
Stefan Berger
7cdd87813c CHANGES: Updated CHANGES document for 0.8.6
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-09-09 16:26:33 -04:00
Stefan Berger
77702d8f58 build-sys: Build libtpms v0.8.6
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-09-09 16:26:33 -04:00
Stefan Berger
18ba4c0206 rpm/debian: Add 0.8.5 entry in changelog
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-09-01 13:25:31 +02:00
Stefan Berger
e3e37532d5 CHANGES: Updated CHANGES document for 0.8.5
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-09-01 13:25:31 +02:00
Stefan Berger
855c4e439a git: Fix erroneous gitignore entries; add missing ones
Fix erroneous gitignore entries that previously showed with the
following command line:

git ls-files -i --exclude-standard -c

Add some missing ones.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-08-31 22:47:53 +02:00
Stefan Berger
aaef222e86 tpm2: NVMarshal: Handle index orderly RAM without 0-sized terminating node
The NVRAM entries in s_indexOrderlyRam array do not need to contain a
0-sized terminating node. Instead, the entries may fill up this 512
byte array so that no NV_RAM_HEADER structure fits anymore. The fact
that no more NV_RAM_HEADER structure fits is also an indicator for the
last entry. We need to account for this in the code marshalling and
unmarshalling the entries so that we stop marshalling the entries
then and similarly stop unmarshalling.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-07-29 17:54:34 -04:00
Stefan Berger
33a03986e0 tpm2: Initialize a whole OBJECT before using it
Initialize a whole OBJECT before using it. This is necessary since
an OBJECT may also be used as a HASH_OBJECT via the ANY_OBJECT
union and that HASH_OBJECT can leave bad size inidicators in TPM2B
buffer in the OBJECT. To get rid of this problem we reset the whole
OBJECT to 0 before using it. This is as if the memory for the
OBJECT was just initialized.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-07-29 17:54:34 -04:00
Stefan Berger
22c9bf90f4 tpm2: Avoid compiler warning by using memcpy instead of MemoryCopy (gcc 10.3)
Fix the following compiler warning from gcc 10.3.0 by using memcpy
instead of MemoryCopy (fixes issue #229).

tpm2/NVDynamic.c: In function 'NvRamGetEnd':
tpm2/NVDynamic.c:378:12: warning: function may return address of local variable [-Wreturn-local-addr]
  378 |     return iter;
      |            ^
tpm2/NVDynamic.c:339:26: note: declared here
  339 |     NV_RAM_HEADER        header;
      |                          ^
tpm2/NVDynamic.c: In function 'NvRamGetIndex':
tpm2/NVDynamic.c:411:12: warning: function may return address of local variable [-Wreturn-local-addr]
  411 |     return currentAddr;
      |            ^
tpm2/NVDynamic.c:339:26: note: declared here
  339 |     NV_RAM_HEADER        header;
      |                          ^

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-07-09 17:13:16 -04:00
Stefan Berger
a016ae7d29 build-sys: Build libtpms v0.8.5
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-07-09 17:13:16 -04:00
Stefan Berger
a594c4692a rpm/debian: Add 0.8.4 entry in changelog
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-06-24 12:05:54 -04:00
Stefan Berger
dc176a5ff5 CHANGES: Updated CHANGES document for 0.8.4
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-06-24 12:05:54 -04:00
Stefan Berger
5cc98a62dc tpm2: Restore original value if unmarshalled value was illegal
Restore the original value of the memory location where data from
a stream was unmarshalled and the unmarshalled value was found to
be illegal. The goal is to not keep illegal values in memory.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-06-24 12:05:54 -04:00
Stefan Berger
3ef9b26cb9 tpm2: Add maxSize parameter to TPM2B_Marshal for sanity checks
Add maxSize parameter to TPM2B_Marshal and assert on it checking
the size of the data intended to be marshaled versus the maximum
buffer size.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-06-24 12:05:54 -04:00
Stefan Berger
f16250b35a tpm2: Reset TPM2B buffer sizes after test fails for valid buffer size
Reset the buffer size indicator in a TPM2B type of buffer after it failed
the test for the maximum buffer size it allows. This prevents having bad
buffer sizes in memory that can come to haunt us when writing the volatile
state for example.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-06-24 12:05:54 -04:00
Stefan Berger
2d412c9aeb build-sys: Run autoupdate on configure.ac for autconf 2.71
Run autoupdate on configure.ac and address the following issues:

configure.ac:10: warning: 'AM_CONFIG_HEADER': this macro is obsolete.
configure.ac:10: You should use the 'AC_CONFIG_HEADERS' macro instead.
./lib/autoconf/general.m4:2434: AC_DIAGNOSE is expanded from...
aclocal.m4:1071: AM_CONFIG_HEADER is expanded from...
configure.ac:10: the top level
configure.ac:31: warning: The macro `AC_HELP_STRING' is obsolete.
configure.ac:31: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
configure.ac:31: the top level
configure.ac:72: warning: The macro `AC_HELP_STRING' is obsolete.
configure.ac:72: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
configure.ac:72: the top level
configure.ac:90: warning: The macro `AC_HELP_STRING' is obsolete.
configure.ac:90: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
configure.ac:90: the top level
configure.ac:253: warning: The macro `AC_PROG_LIBTOOL' is obsolete.
configure.ac:253: You should run autoupdate.
m4/libtool.m4:99: AC_PROG_LIBTOOL is expanded from...
configure.ac:253: the top level
configure.ac:258: warning: The macro `AC_HEADER_STDC' is obsolete.
configure.ac:258: You should run autoupdate.
./lib/autoconf/headers.m4:704: AC_HEADER_STDC is expanded from...
configure.ac:258: the top level

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-06-24 12:05:54 -04:00
Stefan Berger
d67dffcdde build-sys: Build libtpms v0.8.4
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-06-03 15:00:18 -04:00
Stefan Berger
9e736d5281 rpm/debian: Add 0.8.3 entry in changelog
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-06-01 06:39:46 -04:00
Stefan Berger
043a0d9a66 CHANGES: Updated CHANGES document for 0.8.3
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-06-01 06:39:46 -04:00
Stefan Berger
2558937efa tpm2: Consume padding bytes in TPM2_ContextLoad() (Win2k19, issue #217)
Windows 2019 Server padds the TPM_ContextLoad() command with additional
bytes up to TPM_PT_MAX_OBJECT_CONTEXT for the TPMS_CONTEXT part. Since
libtpms does not use an OBJECT to serialize the keys (anymore) it now
uses less bytes than the MAXimum of TPM_PT_MAX_OBJECT_CONTEXT bytes and
the padding leaves some unconsumed bytes that end up failing the command
since no left-over bytes are allowed in any command.

When unconsumed bytes are left in TPMS_CONTEXT_Unmarshal() we check that
the original passed in size was that of TPM_PT_MAX_OBJECT_CONTEXT and
only then consume the additional padding bytes. Luckily only one command
calls TPMS_CONTEXT_Unmarshal() so that no unwanted side effects should
occur anywhere else, such as no bytes left for unmarshalling the next
structure.

The wisdom behind the padding is not quite clear but it feels like
ill-fixing the code to work around a Windows 2019 server bug...

This patch fixes issed #217

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-06-01 06:39:46 -04:00
Stefan Berger
07c03ca501 Travis: Install libjson-glib-dev and drop a few python dependencies
Since swtpm_setup has been rewritten in 'C' now we can drop a few
python dependencies but need libjson-glib-dev as a new dependency
for testing with swtpm's master branch.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-06-01 06:39:46 -04:00
Stefan Berger
86c644321b tpm2: Surround all occurrences of BLOCK_SKIP_READ() with tests of 'rc'
Do not call BLOCK_SKIP_READ once rc has been set to any error value.
Therefore, surround all occurrences of BLOCK_SKIP_READ() with tests
of 'rc'.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-05-04 11:47:41 -04:00
Stefan Berger
729fc6a4ca rpm/debian: Add 0.8.2 entry in changelog
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-03-01 13:51:21 -05:00
Stefan Berger
0cf7318761 CHANGES: Updated CHANGES document for 0.8.2
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-03-01 13:51:21 -05:00
Stefan Berger
5a2f196842 tpm2: CryptSym: fix AES output IV
The TPM is supposed to provide the output IV in the ivInOut parameter in
CryptSymmetricEncrypt. In the case of using the openssl routines, the
output IV is missed, and the resulting output from the TPM is in the
input IV.

OpenSSL unfortunately does not export EVP_CIPHER_CTX_iv() until
tags/OpenSSL_1_1_0, so we have to fall back to the reference code for
previous OpenSSL versions.

Signed-off-by: William Roberts <william.c.roberts@intel.com>
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-03-01 13:51:21 -05:00
Stefan Berger
eee4dd88db build-sys: Build libtpms v0.8.2
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-03-01 13:51:21 -05:00
Stefan Berger
5bf2746e47 rpm/debian: Add 0.8.1 entry in changelog
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-27 10:49:51 -05:00
Stefan Berger
f91b1dba01 CHANGES: Updated CHANGES document for 0.8.1
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-27 10:49:51 -05:00
Stefan Berger
de518332e4 build-sys: Build libtpms v0.8.1
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-27 10:49:51 -05:00
Stefan Berger
28a70c478e tpm2: Fix public key context save due to ANY_OBJECT_Marshal usage
This patch fixes a VM suspend/resume issue when externally loaded public
keys are involved.

This patch addresses the bug reported in issue #195 where the saving of
an externally loaded public key's context doesn't work due to the usage of
ANY_CONTEXT_SAVE for saving key contexts. This patch fixes the issue by
creating local versions of TPM_SENSITIVE_Marshal/_Unmarshal that deals
with the case where sensitiveType is not a type of private key but a
public key instead that basically doesn't have much information in
TPM_SENSITIVE but is all zeros instead.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-26 14:59:39 -05:00
Stefan Berger
bacba163ae debian: Add missing pkg-config to debian/control
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-25 19:15:19 -05:00
Stefan Berger
3fd4b94903 rpm/debian: Adjust date of 0.8.0 entry in changelog
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-24 12:58:38 -05:00
Stefan Berger
6905e8a29c tpm2: Test RSA private keys when -DDO_CHECK_RSA_KEY=1 is used
For some peace-of-mind add a function that allows us to check the RSA keys
that are generated, especially the primary keys that are not generated by
OpenSSL.

Use the following configure line to compile libtpms:

CFLAGS="-DDO_RSA_CHECK_KEY=1" ./autogen.sh --prefix=/usr \
  --with-tpm2 --with-openssl

Start swtpm after installing libtpms:

swtpm socket --tpmstate dir=/tmp/myvtpm --tpm2 --ctrl type=tcp,port=2322  \
  --server type=tcp,port=2321 --flags not-need-init --log level=0

We can now run this test program to check keys by using an RSA primary key
for signing.

export TPM_COMMAND_PORT=2321 TPM_PLATFORM_PORT=2322 \
  TPM_SERVER_NAME=localhost TPM_INTERFACE_TYPE=socsim \
  TPM_SERVER_TYPE=raw

echo "test" > input

swtpm_ioctl --tcp :${TPM_PLATFORM_PORT} -i
tssstartup

while :; do
  for keysize in 2048 3072; do

    tsscreateprimary -rsa $keysize -si -hi n
    tsssign -hk 80000000 -if input
    tssflushcontext -ha 80000000
  done
done

Libtpms has passed multiple hours of testing.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-24 07:14:39 -05:00
Stefan Berger
fb8bc527bc tpm2: Add #error gate for SM3 and SHA3 to NVMarshal.c
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-23 11:11:24 -05:00
Stefan Berger
ef0a741bd2 tpm2: Add statement about unsupported modifications to TpmProfile.h
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-23 11:11:24 -05:00
Stefan Berger
9a13be06b4 tpm2: Add comment to HASH_ALIGNMENT define
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-23 11:11:24 -05:00
Stefan Berger
f66a719eda CHANGES: Updated CHANGES document for 0.8.0
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-22 12:10:54 -05:00
Stefan Berger
8f284d3594 tpm2: Add define for static_assert in case it doesn't exist in assert.h
Some older systems do not define static_assert, so we have to provide
our own static_assert that does 'nothing'.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-22 12:10:54 -05:00
Stefan Berger
d2686dda87 tpm2: Add missing swap defines for FreeBSD
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-22 12:10:54 -05:00
Stefan Berger
b8e883c21d tpm2: Sanitize values read from TPM state stream (Coverity)
Sanitize some of the values read from the TPM state stream.
All Coverity discoveries seem to be false positives.

Coverity doesn't like to see array_size being used in the loop even
though it was compared against ARRAY_SIZE() before. We solve this by
using ARRAY_SIZE() as the loop limit now rather than array size.

Compare seed.b.size against PRIMARY_SEED_SIZE even though this is
already being done in TPM2B_Unmarshal().

The num_bytes parameter is sanitized via a comparison involving a
sum over a sum of values, but Coverity doesn't seem to detect this.
Then we have to use it as a loop limit. I don't see another way.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-22 09:51:34 -05:00
Stefan Berger
5710d697bf tpm2: Prevent a potential buffer overrun (Coverity)
Prevent a potential buffer overrun by checking that EVP_DecryptUpdate()
has not overrun the buffer it was passed in, so this overrun should
never occurr unless EVP_DecryptUpdate() was wrong. Also the pAssert above
it should have taken care of it already.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-22 09:51:34 -05:00
Stefan Berger
00860abce3 tpm2: Initialize keyschedule before AES_set_encrypt_key (overity)
Coverity complains that the *output* variable passed to
AES_set_encrypt_key contains uninitialized bytes, so we initialize
the variables now.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-22 09:51:34 -05:00
Stefan Berger
b4ef12a69c tpm2: Initialize variable and check rc before accessing nrh.size (Coverity)
Coverity complains that nrh may not be initialize when copying nrh.size
from it into the buffer pointer to by nrhp. So resolve this by clearing
nrh at the beginning of the loop and checking 'rc' after the Unmarshal.

Previously we could have copied an uninitialized nrh.size but would have
propagated the rc error code from UINT32_Unmarshal(), so this fix doesn't
really change anything.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-22 09:51:34 -05:00
Stefan Berger
0f86f8b53b tpm2: Fix a double-free in case of unlikely error (Coverity)
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-22 09:51:34 -05:00
Stefan Berger
1e1648fec3 tpm2: Save key and hash contexts using ANY_OBJECT_Marshal
Save key and hash contexts using the ANY_OBJECT_Marshal function and try
to load it using ANY_OBJECT_Unmarshal(). Unfortunately older contexts were
written out as plain OBJECTs, so we have to accomodate this case as well
so that we can restore key contexts from libtpms-0.7.x. We do not support
resuming HASH contexts from libtpms-0.7.x.

Before this modification context files written out by the IBM TSS stack
were 2692 bytes independent of content. Now an RSA 2048 key is 1222 bytes
and a NIST p384 key is 982 bytes.

Several of the original TPM 2 function exporting Sequence state and
importing it can now be disabled.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-20 15:08:46 -05:00
Stefan Berger
81c507f528 tpm2: Make ANY_OBJECT_Marshal/Unmarshal non-static
Make the functions ANY_OBJECT_Marshal/Unmarshal non-static so that we can
call it from other places. Also allow passing a parameter 'verbose' to the
ANY_OBJECT_Unmarshal function that allows us to call this function without
it logging errors. We need this when trying to load a context from an older
libtpms versions that did not use ANY_OBJECT_Marshal to write out the
OBJECT (but copied it right from memory).

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2021-02-20 15:08:46 -05:00