Commit Graph

1178 Commits

Author SHA1 Message Date
Stefan Berger
74a9ab5515 tpm2: rev164: Trivial whitespace, command, and libtpms-unused changes
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-03-07 12:11:50 -05:00
Stefan Berger
c9f9fc52cf tpm2: Fix issue in CryptParameterEncryption() (TPM 2 errata v1.4)
Sync with upstream to fix issue in CryptParameterEncryption() from TPM 2
errate v1.4 2.6.1:

"The functions CryptParameterEncryption() and CryptParameterDecryption() in
the reference code in Part 4, 10.2.6.6.5 and 10.2.6.6.6 do not correctly
check the size of the parameter buffer to be encrypted or decrypted. To fix
the issue, the functions should be corrected to check that the parameter
buffer (a TPM2B type field) is at least 2 bytes in length and should use
the function UINT16_Unmarshal() to read the size of the buffer instead of"
BYTE_ARRAY_TO_UINT16().

[...]

The fixed CryptParameterEncryption() function will enter failure mode and
return TPM_RC_FAILURE if the internal response buffer does not contain
enough data for the UINT16 size field."

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-03-06 17:39:55 -05:00
Stefan Berger
9425f82960 tpm2: Sync fix in TPM2_PolicyAuthorize() with upstream
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-03-06 17:39:55 -05:00
Stefan Berger
d35a48b284 tpm2: Sync CryptParameterDecrypt implementation with upstream
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-03-06 17:39:55 -05:00
Stefan Berger
fb86111ca9 tpm2: Fix issue related to CryptGenerateKeyDes (TPM 2 errata v1.4)
Fix the following issue from TPM 2 errata v1.4 2.6.3:

"The function CryptGenerateKeyDes() in the reference code in Part 4,
0.2.9.2.3 does not correctly check the symmetric key size provided in the
sensitive parameter. To fix the issue, the function will check that the
size of the requested TDES key is a multiple of 8 bytes or otherwise the
TPM will return TPM_RC_SYMMETRIC."

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-03-06 17:39:55 -05:00
Stefan Berger
6e95c68503 tests: Add test cases for CVE-2023-1017 and CVE-2023-1018
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-03-02 09:32:38 -05:00
Stefan Berger
ddbc966ccc tests: Refactor repetitive test scripts to use one common script
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-03-02 09:32:38 -05:00
Stefan Berger
eb8a76807a tests: Use double quotes on command parameters (shellcheck)
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-03-02 09:32:38 -05:00
Stefan Berger
92f470c1b0 tpm2: Check size of TPM2B_NAME buffer before reading 2 bytes from it
Fix the missing buffer size check that the TPM 2 errata v1.4 mentions in
2.6.2 by adding a buffer size check before reading 2 bytes from a
TPM2B_NAME buffer. There's no known CVE for this.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-02-28 17:26:57 -05:00
Stefan Berger
324dbb4c27 tpm2: Check size of buffer before accessing it (CVE-2023-1017 & -1018)
Check that there are sufficient bytes in the buffer before reading the
cipherSize from it. Also, reduce the bufferSize variable by the number
of bytes that make up the cipherSize to avoid reading and writing bytes
beyond the buffer in subsequent steps that do in-place decryption.

This fixes CVE-2023-1017 & CVE-2023-1018.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-02-28 15:56:38 -05:00
Stefan Berger
b87306ca12 tpm2: Add a caching layer to GetEVPCipher() helper function
Add a caching layer to GetEVPCipher() to avoid having to call evpfn()
mulitple times. Instead, return the 'const EVP_CIPHER *' that a single
call to evpfn() (for a particular algorithm + mode + key size) returned
and cache it for subsequent calls.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-02-28 12:04:59 -05:00
Stefan Berger
66d178b981 Travis: Update from focal to jammy and from bionic to focal
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-02-23 20:22:04 -05:00
Stefan Berger
0de6f656b8 tpm2: Replace usage of deprecated DES_random_key() (OSSL 3)
Replace usage of deprecated DES_random_key() with EVP_CIPHER API calls.
These newer calls are much more time consuming than the deprecated call.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-02-23 17:24:17 -05:00
Stefan Berger
7b8572355b tpm2: Replace deprecated EC_POINTs_mul() (OSSL 3)
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-02-23 17:15:11 -05:00
Stefan Berger
574aeb1df2 Travis: Update from bionic to focal and from xenial to bionic
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-02-23 12:26:45 -05:00
Stefan Berger
d08b929ded tpm2: Use EVP_CIPHER_CTX_get_params() to get IV
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-02-13 06:50:42 -05:00
Stefan Berger
06ada5ad3e tpm2: Skip call to DoEVPGetIV() if ivLen = 0
The ivLen may be 0 for ECB and in this case we can skip the call to
DoEVPGetIV().

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-02-13 06:50:42 -05:00
Stefan Berger
f531ad6927 tpm2: Refactor code that gets current IV
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-02-13 06:50:42 -05:00
Stefan Berger
520a2fa27d
Update bug_report.md
Make exact steps to recreate the issue a requirement for the bug report.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-10-10 07:55:32 -04:00
orbea
0c2bc32a21 tests: Fix the build with slibtool
When building the tests with `make check` and slibtool the tests will
then all fail to load libtpms.so.0.

  $ ./base64decode
  /tmp/libtpms/tests/.libs/base64decode: error while loading shared libraries: libtpms.so.0: cannot open shared object file: No such file or directory

This happens because they are linked with -ltpms rather than the
libtpms.la file which has unexpected results with slibtool. GNU libtool
does some magic to make this work while slibtool fails to link the
dependency.

The correct way to link internal dependencies is directly with the
libtool archive (.la) files where the -lfoo linker flags should be only
used with external dependencies. Additionally -no-undefined is added to
the LDFLAGS to ensure there aren't undefined references in the future.

Note:

* This doesn't happen if libtpms is installed to the system and the tests
  find the already installs libtpms rather than the newly built library.

* GNU libtool silently ignores -no-undefined, but slibtool will respect
  it.

Signed-off-by: orbea <orbea@riseup.net>
2022-07-16 22:32:30 -04:00
William Roberts
554a13379f MAINTAINERS: add LibreSSL maintainer
Signed-off-by: William Roberts <william.c.roberts@intel.com>
2022-07-12 17:28:40 -04:00
Stefan Berger
f1e8b6c694 tests: Add license identifier to test cases
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-07-12 11:30:53 -04:00
Stefan Berger
4e5dffc08a tests: Fix outdated output of expected file size in case of error
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-07-12 11:30:53 -04:00
William Roberts
c6c8f63686 Revert "tpm_crypto: support libressl api"
This reverts commit 9afebc712a.

The issue is that opensslv.h is not included and thus the
OPENSSL_VERSION_NUMBER is not getting set.

Signed-off-by: William Roberts <william.c.roberts@intel.com>
2022-07-12 11:28:47 -04:00
William Roberts
27beabc518 tpm_crypto: support libressl api
Signed-off-by: William Roberts <william.c.roberts@intel.com>
2022-07-09 13:30:55 -04:00
William Roberts
4970a8a0c7 tpm_crypto: simplify OSSL version ifdef
Signed-off-by: William Roberts <william.c.roberts@intel.com>
2022-07-09 13:30:55 -04:00
Stefan Berger
f20a7d7d41 Add MAINTAINERS file to project
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-06-20 16:15:06 -04:00
Stefan Berger
086e1bcb8b tpm2: Fix a typo in PERSISTENT_ALL_Unmarshal
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-06-15 10:35:08 -04:00
Stefan Berger
9c63f076ec tpm2: Implement OpenSSLCryptRsaGenerateKey for OpenSSL 3.0 case
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-31 20:31:10 -04:00
Stefan Berger
d215cfd612 tpm2: Implement BuildRSAKey for OpenSSL 3.0 case
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-31 20:31:10 -04:00
Stefan Berger
e998c06694 tpm2: Delay creation of EVP_PKEY in InitOpenSSLRSAPrivateKey
Delay the creation of the EVP_PKEY in InitOpenSSLRSAPrivateKey
so that we can create the key with all the parameters at once.
We have to do this since with the OpenSSL 3.0 API we cannot set
parameters after the initial creation of the key anymore.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-31 20:31:10 -04:00
Stefan Berger
c8523779f2 tpm2: Implement DoRSACheckKey with OpenSSL 3.0 API
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-31 20:31:10 -04:00
Stefan Berger
f7ccda56fb tpm2: Implement ObjectGetPublicParameters to get N and E from OBJECT
Get the BIGNUMs N and E from an RSA key OBJECT. The purpose of
this refactoring is be able to reuse the new function.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-31 20:31:10 -04:00
Stefan Berger
3eef1fb035 tpm2: Implement BuildRSAKey for building an RSA EVP_PKEY
Implement BuildRSAKey for building an RSA EVP_PKEY from copies
of the BIGNUMs it gets passed. This way it is clear that the
caller has to free the BIGNUMs it passed itself also in case of
error returned by BuildRSAKey.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-31 20:31:10 -04:00
Stefan Berger
6a919f1c6a tpm2: Do not access variable if it could not be read from buffer (Coverity)
Exit the loop when the variable could not be filled with data from the
byte stream. This avoids accessing the variable 'element' in case it
wasn't initialized. The old could would have accessed the possibly
uninitialized variable but exited the loop immediately after.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-28 20:07:35 -04:00
Stefan Berger
b6b8506bce tpm2: Access entrysize variable only if it was read from buffer (Coverity)
Only access the entrysize variable if it was read from the buffer. In case
of an error just head towards the exit. Previously, an error would also
have lead the function to do no more useful processing and exited it with
an error code bug Coverity complains that the entrysize variable would be
access while it wasn't initialized.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-28 20:07:35 -04:00
Stefan Berger
4923e9d67a man: Update description of tpm_io_getlocality callback function
Update the description of the tpm_io_getlocality() callback function
that the TPM 2 code invokes to get the currently active locality.
It is expected that the called software is trusted and returns a valid
locality number at all times and thus also always return TPM_SUCCESS.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-28 20:07:35 -04:00
Stefan Berger
353e835caa tpm2: Expect TPM_SUCCESS from tpm_io_getlocality() callback function
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-28 20:07:35 -04:00
Stefan Berger
77950dd917 tpm2: Fix a potential overflow expression (coverity)
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-28 20:07:35 -04:00
Stefan Berger
3b047cb5fe tpm2: Assign result of OsslToTpmBn to OK
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-28 20:07:35 -04:00
Stefan Berger
0aef1c7471 tpm12: Check returnCode before overwriting it
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-28 16:40:19 -04:00
Stefan Berger
1555b59304 tpm12: Check returnCode before overwriting it
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-28 16:40:19 -04:00
Stefan Berger
adce2d6980 tpm12: Assign return value of TPM_DelegatePublic_Copy to rc
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-28 16:40:19 -04:00
Stefan Berger
2025654843 tpm12: Assign TPM_MGF1 return value to rc
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-28 16:40:19 -04:00
Stefan Berger
03e90a7dd4 tpm12: Assign rc return value of TPM_Sbuffer_Append
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-05-28 16:40:19 -04:00
Ross Lagerwall
3d2bbe2f19 tpm2: Fix size check in CryptSecretDecrypt
Check the secret size against the size of the buffer, not the size
member that has not been set yet.

Reported by Coverity.

Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
2022-05-24 14:08:56 -04:00
Ross Lagerwall
71d3a27bc7 nvfile: Free allocated memory on failure
In TPM_NVRAM_LoadData(), there is an unlikely path where the function
will return an error code but still expect the caller to free the
allocated data. At least some of the callers don't handle this correctly
so ensure that the caller only needs to free data if the function
returns success.

Reported by Coverity.

Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
2022-05-20 09:57:09 -04:00
Stefan Berger
f9a6f51cb8 tpm: #undef printf in case it is #define'd (OSS-Fuzz)
The build environment used by OSS-Fuzz reports this error.

 In file included from /src/libtpms/src/tpm_debug.c:42:
 /src/libtpms/src/tpm_debug.h:69:9: error: 'printf' macro redefined [-Werror,-Wmacro-redefined]
 #define printf(...) TPMLIB_LogPrintf(__VA_ARGS__);
 :         ^
 /usr/include/x86_64-linux-gnu/bits/stdio2.h:110:11: note: previous definition is here
 # define printf(...) \
           ^
 1 error generated.

The simple fix is to #undef printf in case it is #define'd.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-04-08 08:35:19 -04:00
Stefan Berger
13dcff6592 Fix configure script to support _FORTIFY_SOURCE=3
gcc 12.1 supports _FORTIFY_SOURCE=3. Modify the existing check for whether
_FORTIFY_SOURCE=2 can be used to test compile with the user provided
CFLAGS and only add _D_FORTIFY_SOURCE=2 to the HARDENING_CFLAGS if the
user doesn't provide anything that's not compatible.

Following an online article _FORTIFY_SOURCE=3 may add more overhead, so
we only go up to level 2 for now and let build servers or user provide
the higher level via the CFLAGS.

https://developers.redhat.com/blog/2021/04/16/broadening-compiler-checks-for-buffer-overflows-in-_fortify_source#what_s_next_for__fortify_source

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-04-04 12:40:36 -04:00
Stefan Berger
73fca84031 tpm2: Require TPM_NV_DISK to avoid case of tpm_stata_path being NULL
Address an issue reported by cppcheck that raises the issue that
tpm_state_path could be NULL when the #define TPM_NV_DISK is not set.
Require that the #define TPM_NV_DISK always be set.

Resolves: https://github.com/stefanberger/libtpms/issues/313
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2022-04-01 08:41:35 -04:00