Home GnuPG
Diffusion GnuPG 62a7854816b8

tpm2d: Add tpm2daemon code

Description

tpm2d: Add tpm2daemon code

* tpm2d: New directory.
* Makefile.am (SUBDIRS): Add directory.
* configure.ac: Detect libtss and decide whether to build tpm2d.
* am/cmacros.am: Add a define.
* util.h (GNUPG_MODULE_NAME_TPM2DAEMON): New.
* common/homedir.c (gnupg_module_name): Add tpm2d.
* common/mapstrings.c (macros): Add "TPM2DAEMON".
* tools/gpgconf.h (GC_COMPONENT_TPM2DAEMON): New.
* tools/gpgconf-comp.c (known_options_tpm2daemon): New.
(gc_component): Add TPM2.
(tpm2daemon_runtime_change): New.
* tpm2d/Makefile.am: New.
* tpm2d/command.c: New.
* tpm2d/ibm-tss.h: New.
* tpm2d/tpm2.c: New.
* tpm2d/tpm2.h: New.
* tpm2d/tpm2daemon.c: New.
* tpm2d/tpm2daemon.h: New.

This commit adds and plumbs in a tpm2daemon to the build to mirror the
operation of scdaemon. The architecture of the code is that
tpm2daemon.c itself is pretty much a clone of scd/scdaemon.c just with
updated function prefixes (this argues there could be some further
consolidation of the daemon handling code). Note that although this
commit causes the daemon to be built and installed, nothing actually
starts it or uses it yet.

Command handling

command.c is copied from the command handler in scd.c except that the
command implementation is now done in terms of tpm2 commands and the
wire protocol is far simpler. The tpm2daemon only responds to 4
commands

IMPORT: import a standard s-expression private key and export it to

TPM2 format.  This conversion cannot be undone and the
private key now can *only* be used by the TPM2.  To anyone
who gets hold of the private key now, it's just an
encrypted binary blob.

PKSIGN: create a signature from the tpm2 key. The TPM2 form private

key is retrieved by KEYDATA and the hash to be signed by
EXTRA.  Note there is no hash specifier because the tpm2
tss deduces the hash type from the length of the EXTRA
data.  This is actually a limitation of the tpm2 command
API and it will be interesting to see how this fares if the
tpm2 ever supports say sha3-256 hashes.

PKDECRYPT: decrypt (RSA case) or derive (ECC case) a symmetric key.

	   The tpm2 for private key is retrieved by KEYDATA and the
	   information used to create the symmetric key by EXTRA.

KILLTPM2D: stop the daemon

All the tpm2 primitives used by command.c are in tpm2.h and all the
tpm2 specific gunk is confined to tpm2.c, which is the only piece of
this that actually does calls into the tss library.

Changes from James' patch:

  • gpgconf: The displayed name is "TPM" and not "TPM2". That string is used by GUIs and should be something the user understands. For example we also use "network" instead of "Dirmngr".
  • Removed some commented includes.
  • Use 16 as emulation of GPG_ERR_SOURCE_TPM2.
  • Silenced a C90 compiler warning and flags unused parameters.
  • Removed "if HAVE_LIBS" from tpm2/Makefile.am and add missing files so that make distcheck works.
  • Signed-off-by: Werner Koch <wk@gnupg.org>

Details

Provenance
James Bottomley <James.Bottomley@HansenPartnership.com>Authored on Mar 9 2021, 10:50 PM
wernerCommitted on Mar 10 2021, 12:33 PM
Parents
rG0f191a0707fe: scd:p15: Fix faulty removal of a test code change.
Branches
Unknown
Tags
Unknown

Event Timeline

werner committed rG62a7854816b8: tpm2d: Add tpm2daemon code (authored by James Bottomley <James.Bottomley@HansenPartnership.com>).Mar 10 2021, 12:33 PM