Commit Graph

1092 Commits

Author SHA1 Message Date
Stefan Berger
5122cec836 tpm2: Limit the response buffer size indicator to the negotiated size
Limit the variable indicating to the caller how many bytes were returned
in a TPM response to the size returned from TPM2_GetBufferSize(). This
then reflects the buffer size that was negotiated with the
TPMLIB_SetBufferSize() call and for which the recipient of the buffer
should have enough space for.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2026-04-30 01:06:31 +00:00
Stefan Berger
9ee88f3ad2 tpm2: Add missing check for disallowed SHA1 HMAC creation
CryptSelectMac is called (only) from TPM2_HMAC and TPM2_Mac_Start and needs
to check whether the creation of an HMAC with SHA1 is not allowed per the
profile attribute no-sha1-hmac-creation and/or no-sha1-hmac.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2026-03-19 17:49:49 -04:00
Stefan Berger
426cc786c6 tpm2: Only write the necessary number of bytes of command bitmaps
Only write the necessary number of bytes of the ppList and auditCommands
bitmaps. The entries in both of these bitmaps are set by a command's
index and the necessary number of bytes can be determined by finding the
command with the highest command code that is enabled in the current
profile (1). This in turn can be found by by searching for the last byte
in the enableCommandsByIdx bitmap that has any bit set.

1) It would be possible to skip writing these arrays entirely if they have
   no bits set. The unmarshalling functions would clear the arrays.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2026-03-11 09:38:11 -04:00
Stefan Berger
2fa21bb386 tpm2: Base enabledCommands on command index rather than command code
Base the enabledCommands array on the command index rather than the command
code since the latter left the first few bytes always unused since command
codes start at 0x11f only.

After this change, ppList, auditCommands, and enabledCommandsByIdx bitmaps
are all based on command indices.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2026-03-11 09:38:11 -04:00
Stefan Berger
0355ff61cc tpm2: Use marshalled size of OBJECT to see whether it fits into NVRAM
Use the marshalled size of an OBJECT to check whether it still fits into
NVRAM rather than using the size of the OBJECT (sizeof(obj), which is much
bigger. Using the marshalled size also handles the case where the OBJECT is
still copied into NVRAM using memcpy for the NULL profile case of
libtpms v0.9. This should have been converted once NvObjectToBuffer()
was started to be called there.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2026-03-11 09:38:11 -04:00
Stefan Berger
6bca0291df tpm2: Limit array_size to current size of array (ppList/auditCommands) (BUGFIX)
The current libtpms v0.10.2 does not accept a TPM 2 state that was written
with a more recent version of libtpms if the sizes of ppList and/or
auditCommands increased. Remove the asserts that trigger state reading
failures and limit array_size to the sizeof(data->ppList) and
sizeof(data->auditCommands) respectively . More recent versions of libtpms,
if they support more TPM 2 commands, will extend these arrays but those new
commands will not be usable by older versions of libtpms (via profile and
StateFormatLevel) and can therefore be ignored by truncating those arrays.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2026-03-05 11:20:05 -05:00
Stefan Berger
a20f8b6a22 Fix a compilation error in TPMLIB_GetPlaintext
Fix a compilation error that newer gcc versions may complain about:

tpm_library.c: In function 'TPMLIB_GetPlaintext':
tpm_library.c:441:11: error: assignment discards 'const' qualifier from pointer target type [-Werror=discarded-qualifiers]
  441 |     start = strstr(stream, starttag);
      |           ^
At top level:
cc1: note: unrecognized command-line option '-Wno-self-assign' may have been intended to silence earlier diagnostics
cc1: all warnings being treated as errors

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2026-01-02 12:27:06 -05:00
Stefan Berger
33c9ff074c tpm2: Fix retrieval of updated IV when using OpenSSL >= 3.0
Fix the retrieval of the updated IV for when OpenSSL >= 3.0 is used.
The previously used OSSL_PARAM_octet_ptr allocated a new buffer and then
returned the IV but this newly allocated buffer did not make it back to
the caller. We have to use OSSL_PARAM_octet_string instead to write the
data into the buffer.

Resolves: https://github.com/stefanberger/libtpms/issues/541
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-12-29 13:21:37 -05:00
Stefan Berger
a3917cb923 tpm2: Fix memory leak by freeing KDF context
Fix a memory leak by freeing the KDF context after usage.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-08-28 09:17:13 -04:00
Stefan Berger
e020c1908b tpm2: Fix potential out-of-bound access & abort due to HMAC signing issue
Fix an HMAC signing issue that may causes an out-of-bounds access in a
TPM2B that in turn was running into an assert() in libtpms causing an
abort. The signing issue was due to an inconsistent pairing of the signKey
and signScheme parameters, where the signKey is ALG_KEYEDHASH key and
inScheme is an ECC or RSA scheme.

This fixes CVE-2025-49133.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-06-10 12:04:17 -04:00
orbea
8a8ad3c7e0 tpm2: fix build for LibreSSL 4.1.0
With LibreSSL 4.1.0 the EC_POINTs_mul function was removed, but the
newer OpenSSL 3 code path works instead.

Signed-off-by: orbea <orbea@riseup.net>
2025-05-26 14:19:42 -04:00
Stefan Berger
37779b4999 tpm2: In CheckLockedOut replace TPM_RC_RETRY with TPM_RC_SUCCESS
In CheckLockedOut replace the return code of TPM_RC_RETRY with
TPM_RC_SUCCESS since it does not seem to be necessary to run the TPM2
command again but the TPM2 can continue executing the current command.
If NVRAM wasn't available then the code in CheckLockedOut would return
with an error already.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-05-17 11:07:41 -04:00
Stefan Berger
a643f1e29e tpm2: Fix bugs in RuntimeProfileDedupStrItems
Fix the following bugs in RuntimeProfileDedupStrItems:
- RuntimeProfileDedupStrItems did not memmove the correct number of bytes,
  leading to potential crashes.
- Also, it did not handle deduplicating the last item in the comma-
  separated list correctly.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-05-08 09:12:47 -04:00
Stefan Berger
729b59bceb tpm2 + test: Make it compilable on Debian GNU Hurd
The simple changes make it compilable on GNU Hurd where it is currently
failing to build.

Link: https://buildd.debian.org/status/package.php?p=libtpms&suite=sid
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2025-04-28 12:16:04 -04:00
Stefan Berger
e0dceb11e5 tpm2: Add asserts to silence compiler warning due to -Wstringop-overflow=
The following error occurrs on Fedora build servers. To silence the
compiler warning add runtime asserts:

tpm2/crypto/openssl/CryptCmac.c: In function 'CryptCmacEnd':
tpm2/crypto/openssl/CryptCmac.c:194:48: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=]
  194 |             subkey.t.buffer[subkey.t.size - 1] ^= xorVal;
      |                                                ^
tpm2/TpmTypes.h:1477:33: note: at offset -1 into destination object 'buffer' of size 16
 1477 |         BYTE                    buffer[MAX_SYM_BLOCK_SIZE];
      |                                 ^
lto1: all warnings being treated as errors

In CryptCmacStart the following initialization is done:

cState->iv.t.size = CryptGetSymmetricBlockSize(def->algorithm, def->keyBits.sym);

Also ensure that CryptGetSymmetricBlockSize in this case also always returns
a valid size to the TPM2B_IV that it is initializing, which would be the root
cause of any error.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-12-06 14:05:07 -05:00
Stefan Berger
0be55d1350 tpm2: Add padding to OBJECT for 32bit targets
The nvram_offsets test fails on 32bit targets due to an unexpected size
of an OBJECT. This was due to missing padding.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-11-15 11:43:20 -05:00
Stefan Berger
b8c9153a3f tpm2: Only copy Attributes when non-modifyable profile is chosen
If the user provides no Attributes field in the profile then do not copy
the attributes from the internal profile if that profile may be modified.
In this case assume that the the user wanted no attributes. It now is
also unnecessary that any Attributes be set in a modifyable profile ever,
since they will not be copied.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-17 16:30:30 -04:00
Stefan Berger
a5248a9859 test: Allow setting Attributes in JSON profile with an empty string
Adjust the regex checking the JSON input to allow for empty string values,
which will be only used by 'Attributes' since they are all optional.
Then, allow the user to provide an empty string with the Attributes in the
JSON like this: {...,"Attributes":"", ...}

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-17 16:30:30 -04:00
Stefan Berger
aef0ecbeb4 tpm2: Add missing attributes to code documentation and man pages
Add attributes documentation where found missing.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-17 16:30:30 -04:00
Stefan Berger
ecff064e8d tpm2: Implement check to disable ECC key derivation: no-ecc-key-derivation
Per "TCG FIPS 140-3 guidance for TPM 2.0" document the following functions
must prevent an asymmetric ECC key derivation:
- Table 14: TPM2_CreateLoaded
- Table 18: TPM2_ZGen_2Phase
- Table 26: TPM2_Commit
- Table 26: TPM2_EC_Ephemeral

Return TPM_RC_TYPE as a return code to indicate failure of deriving a key.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-15 11:56:24 -04:00
Stefan Berger
774cee962e tpm2: Restrict profile names to 32 characters
Restrict profile names to 32 characters to avoid having to carry
excessively long names in the TPM's state file.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-10 08:42:36 -04:00
Stefan Berger
0d8377b1b4 tpm2: Allow setting the minimum HMAC key size: hmac-min-key-size
Allow setting the minimum HMAC key size and add enforcement gates.

Check that the value of hmac=min-key-size given in the profile is not
larger than 1024. This value is taken from the maximum size of
TPM2B_SENSITIVE, which is MAX_SYM_DATA (=128), which can be provided as
key to an HMAC.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-08 15:55:19 -04:00
Stefan Berger
57074695bc tpm2: Mark unused function parameters to avoid static analyzer warnings
Some function parameters are unused due to OpenSSL usage and other changes
by libtpms. Mark those as unused to avoid static analyzer warnings.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-03 14:35:16 -04:00
Stefan Berger
cbd894e281 tpm2: Add fallthrough comments to avoid static analyzer warnings
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-03 14:35:16 -04:00
Stefan Berger
648cc1ec78 tpm2: Wrap asprintf to avoid static analyzer warnings
To avoid static analyzer warnings due to non-literal format strings being
used, wrap asprintf in TPMLIB_asprintf and call vasprintf from there.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-03 14:35:16 -04:00
Stefan Berger
21e19ffe8d tpm2: Run PCT test on RSA keys and EC signing keys: pct
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-03 14:06:33 -04:00
Stefan Berger
81fbc10a7e tpm2: Implement pairwise consistency test for RSA keys
Implemewnt a pairwise consistency test for RSA keys that is to be enabled
with FIPS_COMPLIANT #define temporarily. Test encryption+decryption and
sign+verify with the created key on random input data.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-03 14:06:33 -04:00
Stefan Berger
99b52fa982 tpm2: Enable DRBG continous test: drbg-continous-test
drbg-continous-test enables an existing code block that was previously
only enabled when FIPS_COMPLIANT #define was set. This code block
ensures that previous 4 consecutive random numbers do not appear again
at the beginning of a 16-byte block.

Extend an existing test case with this new attribute.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-03 08:52:35 -04:00
Stefan Berger
363cbae3b0 tpm2: Allow naming of custom profiles with prefix 'custom:'
Allow the name of custom profiles to also have the prefix 'custom:'.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-10-01 10:56:52 -04:00
Stefan Berger
6adb99a42c tpm2: Add an assert(profileJSON) since it must never be NULL
When profileJSON is passed to String_Marshal it must never be NULL.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-24 09:32:02 -04:00
Stefan Berger
ab3da80dec tpm2: Compare CONTEXT_ENCRYPT_ALG against ALG_AES_VALUE
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-24 09:32:02 -04:00
Stefan Berger
2a883017d6 tpm2: Remove unused function parameters or mark them as unused
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-24 09:32:02 -04:00
Stefan Berger
8b4ad203d0 tpm2: Correct the ending of the string at max characters
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-24 09:32:02 -04:00
Stefan Berger
b97c3bb776 tpm2: Check for n < 0 from asprintf before return
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-24 09:32:02 -04:00
Stefan Berger
27ceda7173 tpm2: Cast void * to BYTE * when doing arithmetic
To avoid warnings from the static analyzer cast void * to BYTE *
when doing arithmetic.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-24 09:32:02 -04:00
Stefan Berger
3b5b842e16 tpm2: Use mgs parameter in error log message
Use unused msg parameter in error log message

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-24 09:32:02 -04:00
Stefan Berger
11dfb9a611 tpm2: Check context hash algorithm with static assert
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-23 21:17:21 -04:00
Stefan Berger
8b3efff19e tpm2: Add const qualifier to char array in StringToUint32
Only constant strings will be passed to StringToUint32 and therefore
add the const qualifier.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-23 21:17:21 -04:00
Stefan Berger
e6c1ac7062 tpm2: Declare constant string as const char *
Only constant strings will be assigned to the static array, so make the
name field also a const char *.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-23 21:17:21 -04:00
Stefan Berger
7cbdd6113d tpm2: Rename variable to avoid clashes with type and shadowing
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-23 19:39:55 -04:00
Stefan Berger
0903c69105 tpm2: Rename block_skip to block_skip_t to avoid shadowing
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-23 19:39:55 -04:00
Stefan Berger
a811c35fca tpm2: Rename buffer to objbuf to avoid shadowing buffer variable
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-23 19:39:55 -04:00
Stefan Berger
e898872637 tpm2: Adjust selection of StateFormatLevel
When a non-modifyable profile is chosen then copy the StateFormatLevel
(SFL) from the internal profile as before. A reason for copying the SFL
is also because the user is not allowed to make modifications to this
type of profile. Otherwise, if the user chooses a modifyable profile,
then let the user choose the StateFormatLevel.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-13 17:04:38 -04:00
Stefan Berger
46548da8ed tpm2: Add missing break statement
Add a missing break statement that was forgotten in recent
commit b389781f49.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-11 19:01:26 -04:00
Stefan Berger
c7baa7e1ac tpm2: Deduplicate verbs in Commands, Algorithms and Attributes in profile
Deduplicate verbs in Commands, Algorithms, and Attributes strings in a
profile and when a verb with an '=' sign is found, such as
ecc-min-size=224, and there is a duplicate later in the string, such as
ecc-min-size=256, then keep the last one.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-11 16:14:08 -04:00
Stefan Berger
7d95e9ce41 tpm2: Remove test case for OpenSSL SSKDF to KDFe comparison
Remove the test case and renaming of the reference implementation of
CryptKDFe. Reverting this patch would bring the test case back in case
it was necessary.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-09 14:56:44 -04:00
Stefan Berger
2ff2f84170 tests: Rename reference KDFe implemention to ReferenceCryptKDFe for tests
To still be able to run the KDFe test case when the OpenSSL replacement
for the KDFe is to be used, rename the reference implemention to
ReferenceCryptKDFe that coexists with the CryptKDFe function that then
calls OSSLCryptKDFe.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-09 14:56:44 -04:00
Stefan Berger
209b9adcd3 tpm2: Use OpenSSL-based KDFe implementation if possible
Use the OpenSSL-based KDFe implementation when USE_OPENSSL_FUNCTIONS_SSKDF
is set.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-09 14:56:44 -04:00
Stefan Berger
c0dcce5afd tests: Add KDFe replacement by OpenSSL 'SSKDF' and test case
Implement a KDFe replacement using OpenSSL's SSKDF and add a test
case that compares the current implementation against the one based
on the OpenSSL SSKDF.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-09 14:56:44 -04:00
Stefan Berger
d635ef81e2 tpm2: Prevent HMAC creation & verification with sha1: no-sha1-hmac
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2024-09-09 14:43:05 -04:00