Go to file
Stefan Berger 36d1e03368 tpm2: Use new privateExponent also for dP, dQ, and qInv
Also use the new privatExponent for dP, dQ and qInv.

There are two functions that need to be adapted:
- ComputePrivateExponent: producer of these parameters
- RsaPrivateKeyOp       : consumer of these parameters

ComputePrivateExponent is converted to store the results into Z->dP,
Z->dQ, and Z->qInv. Therefore, remove the old privateExponent parameter
*pExp, that was previously used to store them, from the signature of this
function and pull out the initialization of pExp and preservation of Q
to be done before calling this function. This is done in the 2 calling
functions. After returning from the function copy the values of Z->dP,
Z->dQ, and Z->qInv to the old privateExponent where the results had
been stored previously and where we need to have them.

This change results in a sequence like this for the 2 callers:

RsaInitializeExponentOld(&rsaKey->privateExponent);
BnCopy((bigNum)&rsaKey->privateExponent.Q, Z->Q); // preserve Q

VERIFY(ComputePrivateExponent(bnE, Z));

RsaSetExponentOld(&rsaKey->privateExponent, Z);   // duplicate dP, dQ, qInv

The values for dP, dQ, ad qInv are consumed by RsaPrivateKeyOp. Therefore,
adjust this functions signature by removing the old privateExponent
parameter *pExp from it and make sure that callers initialize Z->dP,
Z->dQ, and Z->qInv before calling this functions. There are two call-sites
where the one in RSADP looks like this:

RsaSetExponentFromOld(Z, &key->privateExponent); // copy Q, dP, dQ, qInv to Z
VERIFY(RsaPrivateKeyOp(bnM, Z));

The call site in CryptRsaGenerateKey has called ComputePrivateExponent
before, therefore it already holds the values in Z.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2023-08-29 21:20:07 -04:00
.github/ISSUE_TEMPLATE Update bug_report.md 2022-10-10 07:55:32 -04:00
debian debian: Adjust changelog for 0.10.0~dev1 2021-10-17 13:07:02 -04:00
dist build-sys: Build libtpms v0.10.0 2021-10-16 09:08:58 -04:00
include build-sys: Build libtpms v0.10.0 2021-10-16 09:08:58 -04:00
m4 build-sys: Require only autoconf 2.63 for older systems 2019-06-20 13:08:39 -04:00
man man: Fix spelling error 2023-07-17 20:37:20 -04:00
src tpm2: Use new privateExponent also for dP, dQ, and qInv 2023-08-29 21:20:07 -04:00
tests tests: Add test cases for CVE-2023-1017 and CVE-2023-1018 2023-03-02 09:32:38 -05:00
.gitignore tests: Add test cases for CVE-2023-1017 and CVE-2023-1018 2023-03-02 09:32:38 -05:00
.travis.yml Travis: Update from focal to jammy and from bionic to focal 2023-02-23 20:22:04 -05:00
autogen.sh build-sys: add a simple autogen.sh 2018-05-26 07:41:18 -04:00
bootstrap.sh Remove config.h.in 2014-06-30 15:04:15 -04:00
CHANGES CHANGES: Write a note about changes to SignedCompareB() 2023-04-17 12:28:47 -04:00
configure.ac Fix configure script to support _FORTIFY_SOURCE=3 2022-04-04 12:40:36 -04:00
CREDITS Add CREDITS file 2013-10-31 16:37:33 -04:00
DCO1.1.txt Replace the CLA with the DCO, simply requiring a Signed-off-by: 2016-12-21 11:09:38 -05:00
INSTALL Fix many misspellings 2021-03-02 08:20:25 -05:00
libtpms.pc.in build-sys: add with_tpm1/with_tpm2 variables to .pc 2021-08-06 08:04:37 -04:00
LICENSE Extend license texts with TPM 2 specifics 2018-06-15 18:07:47 -04:00
MAINTAINERS MAINTAINERS: add LibreSSL maintainer 2022-07-12 17:28:40 -04:00
Makefile.am configure: support --with-pkgconfigdir 2021-02-09 13:33:15 -05:00
README docs: Update README to include CXX=clang++ for fuzzer build 2019-11-16 15:41:09 -05:00

What is libtpms?
----------------

Libtpms is a library that targets the integration of TPM functionality
into hypervisors, primarily into Qemu. Libtpms provides a very narrow
public API for this purpose so that integration is possible. Only the
minimum of necessary APIs are made publicly available.

It is assumed that the user of libtpms is familiar with the concepts
of the Trusted Platform Module (TPM). For the interaction with libtpms
it is necessary to know how to construct valid TPM commands and to
be able to parse their results. It is not within the scope of libtpms's
documentation to provide background on this. See the section on references
below.


What files does the libtpms package provide?
--------------------------------------------

The main libtpms package provides the following files:

/usr/lib64/libtpms.so.0
/usr/lib64/libtpms.so.0.5.1
/usr/share/doc/libtpms-0.5.1
/usr/share/doc/libtpms-0.5.1/CHANGES
/usr/share/doc/libtpms-0.5.1/LICENSE
/usr/share/doc/libtpms-0.5.1/README

Applications can link with -ltpms.


What files does the libtpms development package provide?
--------------------------------------------------------

The libtpms development package (libtpms-devel) provides the following
include files for applications to use:

tpm_error.h
tpm_library.h
tpm_memory.h
tpm_nvfilename.h
tpm_tis.h
tpm_types.h

These files contain the data structures, data types and API calls supported
by libtpms. It is recommended to not use any other API calls than those
provided in these include files.

All APIs are described in man pages. The man pages are part of the libtpms
development package as well:

TPMLIB_DecodeBlob
TPMLIB_GetTPMProperty
TPMLIB_GetVersion
TPMLIB_MainInit
TPMLIB_Process
TPMLIB_RegisterCallbacks
TPMLIB_Terminate
TPMLIB_VolatileAll_Store
TPM_Free
TPM_IO_Hash_Data
TPM_IO_Hash_End
TPM_IO_Hash_Start
TPM_IO_TpmEstablished_Get
TPM_Malloc
TPM_Realloc


How to contribute?
------------------
The mailing list for libtpms is libtpms@googlegroups.com.

For patch submissions, please use a Signed-off-by: <your email> to indicate
agreement to the DCO1.1.txt.


Fuzzing
-------
Initial fuzzing is possible with clang & libfuzzer.

You have to configure the project with --enable-fuzzer
(--enable-sanitizer can also help spot more issues). Then you can
build fuzz and run it with the testing corpus.

Fuzz testing is known to work with Fedora 28 or later. It requires that the
'clang' package is installed.

Ex:
$ ./configure --with-openssl --with-tpm2 --enable-sanitizers --enable-fuzzer \
    CC=clang CXX=clang++
$ make && make -C tests fuzz
$ tests/run-fuzzer.sh

oss-fuzz builds with its own fuzzer flags, and set $LIB_FUZZING_ENGINE
to be linked with. The script run by oss-fuzz is tests/oss-fuzz.sh.

Maintainers
-----------
libtpms is currently being maintained by Stefan Berger <stefanb@us.ibm.com>.

References:
-----------

Documentation about the Trusted Platform Module (TPM) can be downloaded
from the Trusted Computing Group's website at

http://www.trustedcomputinggroup.org