• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1[![Linux Build Status](https://travis-ci.org/tpm2-software/tpm2-tss.svg?branch=master)](https://travis-ci.org/tpm2-software/tpm2-tss)
2[![Windows Build status](https://ci.appveyor.com/api/projects/status/2rdmyn1ndkiavngn?svg=true)](https://ci.appveyor.com/project/tpm2-software/tpm2-tss)
3[![FreeBSD Build status](https://api.cirrus-ci.com/github/tpm2-software/tpm2-tss.svg?branch=master)](https://cirrus-ci.com/github/tpm2-software/tpm2-tss)
4[![Coverity Scan](https://img.shields.io/coverity/scan/3997.svg)](https://scan.coverity.com/projects/tpm2-tss)
5[![Coverage Status](https://codecov.io/gh/tpm2-software/tpm2-tss/branch/master/graph/badge.svg)](https://codecov.io/gh/tpm2-software/tpm2-tss)
6[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/2332/badge)](https://bestpractices.coreinfrastructure.org/projects/2332)
7[![Total alerts](https://img.shields.io/lgtm/alerts/g/tpm2-software/tpm2-tss.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/tpm2-software/tpm2-tss/alerts/)
8[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/tpm2-software/tpm2-tss.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/tpm2-software/tpm2-tss/context:cpp)
9[![Documentation Status](https://readthedocs.org/projects/tpm2-tss/badge/?version=latest)](https://tpm2-tss.readthedocs.io/en/latest/?badge=latest)
10[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/tpm2-tss.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:tpm2-tss)
11[![Gitter](https://badges.gitter.im/tpm2-software/community.svg)](https://gitter.im/tpm2-software/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
12
13# Overview
14This repository hosts source code implementing the Trusted Computing Group's (TCG) TPM2 Software Stack (TSS).
15This stack consists of the following layers from top to bottom:
16
17* Feature API (FAPI) as described in the [TSS 2.0 Feature API Specification](https://trustedcomputinggroup.org/wp-content/uploads/TSS_FAPI_v0.94_r04_pubrev.pdf)
18along with [TSS 2.0 JSON Data Types and Policy Language Specification](https://trustedcomputinggroup.org/wp-content/uploads/TSS_JSON_Policy_v0.7_r04_pubrev.pdf)
19This API is designed to be very high-level API, intended to make programming with the TPM as simple as possible.
20The API functions are exposed through a single library: libtss2-fapi.
21* Enhanced System API (ESAPI) as described in the [TSS 2.0 Enhanced System API (ESAPI) Specification](https://trustedcomputinggroup.org/wp-content/uploads/TSS_ESAPI_Version-0.9_Revision-04_reviewEND030918.pdf).
22This API is a 1-to-1 mapping of the TPM2 commands documented in Part 3 of the TPM2 specification.
23Additionally there are asynchronous versions of each command.
24In addition to SAPI, the ESAPI performs tracking of meta data for TPM object and automatic calculation of session based authorization and encryption values.
25Both the synchronous and asynchronous API are exposed through a single library: libtss2-esys.
26* System API (SAPI) as described in the [system level API and TPM command transmission interface specification](http://www.trustedcomputinggroup.org/resources/tss_system_level_api_and_tpm_command_transmission_interface_specification).
27This API is a 1-to-1 mapping of the TPM2 commands documented in Part 3 of the TPM2 specification.
28Additionally there are asynchronous versions of each command.
29These asynchronous variants may be useful for integration into event-driven programming environments.
30Both the synchronous and asynchronous API are exposed through a single library: libtss2-sys.
31* Marshaling/Unmarshaling (MU) as described in the [TCG TSS 2.0 Marshaling/Unmarshaling API Specification](https://trustedcomputinggroup.org/wp-content/uploads/TSS_Marshaling_Unmarshaling_API_Version-1.0_Revision-04_review_ENDS030918.pdf).
32This API provides a set of marshaling and unmarshaling functions for all data types define by the TPM library specification.
33The Marshaling/Unmarshaling API is exposed through a library called libtss2-mu.
34* TPM Command Transmission Interface (TCTI) that is described in the same specification.
35This API provides a standard interface to transmit / receive TPM command / response buffers.
36It is expected that any number of libraries implementing the TCTI API will be implemented as a way to abstract various platform specific IPC mechanisms.
37Currently this repository provides two TCTI implementations: libtss2-tcti-device and libtss2-tcti-mssim.
38The former should be used for direct access to the TPM through the Linux kernel driver.
39The latter implements the protocol exposed by the Microsoft software TPM2 simulator.
40* The [TCG TSS 2.0 Overview and Common Structures Specification](https://trustedcomputinggroup.org/wp-content/uploads/TSS_Overview_Common_Structures_Version-0.9_Revision-03_Review_030918.pdf) forms the basis for all implementations in this project. NOTE: We deviate from this draft of the specification by increasing the value of TPM2_NUM_PCR_BANKS from 3 to 16 to ensure compatibility with TPM2 implementations that have enabled a larger than typical number of PCR banks. This larger value for TPM2_NUM_PCR_BANKS is expected to be included in a future revision of the specification.
41
42# Build and Installation Instructions:
43Instructions to build and install tpm2-tss are available in the [INSTALL](INSTALL.md) file.
44
45# Getting in Touch:
46If you're looking to discuss the source code in this project or get some questions answered you should join the 01.org TPM2 mailing list: https://lists.01.org/postorius/lists/tpm2.lists.01.org/.
47We also have an IRC channel set up on [FreeNode](https://freenode.net/) called \#tpm2.0-tss.
48You can also try Gitter [![Gitter](https://badges.gitter.im/tpm2-software/community.svg)](https://gitter.im/tpm2-software/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
49
50In case you want to contribute to the project, please also have a look at the [Contribution Guidelines](CONTRIBUTING.md).
51
52# Documentation
53
54The doxygen documentation can either be built by oneself (see the [INSTALL](INSTALL.md) file) or browsed directly on [tpm2-tss.readthedocs.io](https://tpm2-tss.readthedocs.io/).
55
56# Test Suite
57This repository contains a test suite intended to exercise the TCTI, SAPI and ESAPI code.
58This test suite is *not* intended to test a TPM implementation, so this test suite should only be run against a TPM simulator.
59If this test suite is executed against a TPM other than the software simulator it may cause damage to the TPM (NV storage wear out, etc.).
60You have been warned.
61
62## Simulator
63The TPM library specification contains reference code sufficient to construct a software TPM 2.0 simulator.
64This code was provided by Microsoft and they provide a binary download for Windows [here](https://www.microsoft.com/en-us/download/details.aspx?id=52507).
65IBM has repackaged this code with a few Makefiles so that the Microsoft code can be built and run on Linux systems.
66The Linux version of the Microsoft TPM 2.0 simulator can be obtained [here](https://downloads.sourceforge.net/project/ibmswtpm2/ibmtpm974.tar.gz).
67Once you've downloaded and successfully built and execute the simulator it will, by default, be accepting connections on the localhost, TCP ports 2321 and 2322.
68
69Issues building or running the simulator should be reported to the IBM software TPM2 project.
70
71NOTE: The Intel TCG TSS is currently tested against version 974 of the simulator.
72Compatibility with later versions has not yet been tested.
73
74## Testing
75To test the various TCTI, SAPI and ESAPI api calls, unit and integration tests can
76be run by configuring the build to enable unit testing and running the "check"
77build target. It is recommended to use a simulator for testing, and the
78simulator will be automatically launched by the tests. Please review the
79dependency list in [INSTALL](INSTALL.md) for dependencies when building
80the test suite.
81```
82$ ./configure --enable-unit --enable-integration
83$ make -j$(nproc) check
84```
85This will generate a file called "test-suite.log" in the root of the build
86directory.
87
88Please report failures in a Github 'issue' with a full log of the test run.
89
90NOTE: The unit and integration tests can be enabled independently.
91The --enable-unit option controls unit tests, and --enable-integration
92controls the integration tests.
93
94### Running tests on physical TPM device
95To run integration tests on a physical TPM device, including a TPM hardware
96or a software TPM implemented in platform firmware the configure script
97provides two options.
98The first option is called --with-ptpm and it is used to point to the TPM
99device interface exposed by the OS, for example:
100
101```
102  $ ./configure  --with-ptpm=/dev/tpm0
103```
104The second option, --with-ptpmtests, enables a "class" of test.
105There are three classes:
1061. destructive - these tests can affect TPM capability or lifespan
1072. mandatory   - these tests check all the functionality that is mandatory
108                 per the TCG specification (default).
1093. optional    - these tests are for functionality that is optional per the
110                 TCG specification.
111
112For example to enable both mandatory and optional test cases during configure
113one needs to set this flag as follows:
114
115```
116  $ ./configure --with-ptpmtests="mandatory,optional"
117```
118Tht default value for the flag is "mandatory"
119Any combination of the three is valid.
120The two flags are only valid when the integration tests are enabled with
121--enable-integration flag.
122
123After that the following command is used to run the test on the configured
124TPM device:
125
126```
127  $ sudo make check-ptpm
128```
129  or
130```
131  $ sudo make check -j 1
132```
133
134Note: The tests can not be run in paralel.
135
136### Running valgrind check
137The unit and integration tests can be run under the valgrind tool, which
138performs additional checks on the library and test code, such as memory
139leak checks etc. The following command is used to run the tests under
140valgrind:
141
142  $ make check-valgrind
143
144This command will enable all valgrind "tools" and kick off as many test
145as many tools it supports. It is possible to enable different valgrind
146tools (checks) in more granularity. This can be controlled by invoking
147different tools separately using check-valgrind-<tool>, for instance:
148
149```
150  $ make check-valgrind-memcheck
151```
152  or
153```
154  $ make check-valgrind-drd
155```
156
157Currently the the following tools are supported:
158
159memcheck - Performs memory related checks. This is the default tool.
160helgrind - Performs synchronization errors checks.
161drd      - Performs thread related checks.
162sgcheck  - Performs stack overrun related checks.
163
164Note that the valgring tool can also be invoked manually using the standard
165libtool:
166
167```
168  $ libtool exec valgrind --tool=memcheck --leak-check=full \
169    test/integration/esys-auto-session-flags.int
170```
171
172This allows for more control on what checks are performed.
173
174### Logging
175While investigating issues it might be helpful to enable extra debug/trace
176output. It can be enabled separately for different components.
177The description how to do this can be found in the [logging](doc/logging.md) file.
178
179### Fuzzing
180All system API function calls can be tested using a fuzzing library.
181The description how to do this can be found in the [fuzzing](doc/fuzzing.md) file.
182
183# Architecture/Block Diagram
184SAPI library, TAB/RM, and Test Code Block Diagram:
185![Architecture Block Diagram](doc/TSS_block_diagram.png)
186
187# Project Layout
188```
189├── doc     : various bits of documentation\
190├── include : header files installed in $(includedir)\
191│   └── tss2      : all public headers for this project\
192├── lib     : data files used by the build or installed into $(libdir)\
193├── m4      : autoconf support macros\
194├── man     : man pages\
195├── script  : scripts used by the build or CI\
196├── src     : all source files\
197│   ├── tss2-esys : enhanced system API (ESAPI) implementation\
198│   │   └── api   : ESAPI TPM API implementation\
199│   ├── tss2-mu   : TPM2 type marshaling/unmarshaling (MU) API implementation\
200│   ├── tss2-sys  : system API (SAPI) implementation\
201│   │   └── api   : SAPI public API implementation\
202│   ├── tss2-tcti : TCTI implementations for device and mssim\
203│   └── util      : Internal utility library (e.g. logging framework)\
204└── test    : test code\
205    ├── integration : integration test harness and test cases\
206    ├── tpmclient   : monolithic, legacy test application\
207    └── unit        : unit tests
208```
209