mirror of
git://git.gnupg.org/gnupg.git
synced 2024-09-07 12:56:21 +02:00
![James Bottomley](/assets/img/avatar_default.png)
* 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. Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> 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>
138 lines
4.0 KiB
C
138 lines
4.0 KiB
C
/* gpgconf.h - Global definitions for gpgconf
|
|
* Copyright (C) 2003 Free Software Foundation, Inc.
|
|
*
|
|
* This file is part of GnuPG.
|
|
*
|
|
* GnuPG is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* GnuPG is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef GPGCONF_H
|
|
#define GPGCONF_H
|
|
|
|
#include "../common/util.h"
|
|
|
|
/* We keep all global options in the structure OPT. */
|
|
EXTERN_UNLESS_MAIN_MODULE
|
|
struct
|
|
{
|
|
int verbose; /* Verbosity level. */
|
|
int quiet; /* Be extra quiet. */
|
|
int dry_run; /* Don't change any persistent data. */
|
|
int runtime; /* Make changes active at runtime. */
|
|
int null; /* Option -0 active. */
|
|
char *outfile; /* Name of output file. */
|
|
|
|
int component; /* The active component. */
|
|
} opt;
|
|
|
|
|
|
/*-- gpgconf.c --*/
|
|
void gpgconf_write_status (int no, const char *format,
|
|
...) GPGRT_ATTR_PRINTF(2,3);
|
|
void gpgconf_failure (gpg_error_t err) GPGRT_ATTR_NORETURN;
|
|
|
|
/*-- gpgconf-comp.c --*/
|
|
|
|
/* Component system. Each component is a set of options that can be
|
|
* configured at the same time. If you change this, don't forget to
|
|
* update gc_component[] in gpgconf-comp.c. */
|
|
typedef enum
|
|
{
|
|
/* Any component, used as a wildcard arg. */
|
|
GC_COMPONENT_ANY,
|
|
|
|
/* The classic GPG for OpenPGP. */
|
|
GC_COMPONENT_GPG,
|
|
|
|
/* GPG for S/MIME. */
|
|
GC_COMPONENT_GPGSM,
|
|
|
|
/* The optional public key daermon. */
|
|
GC_COMPONENT_KEYBOXD,
|
|
|
|
/* The GPG Agent. */
|
|
GC_COMPONENT_GPG_AGENT,
|
|
|
|
/* The Smardcard Daemon. */
|
|
GC_COMPONENT_SCDAEMON,
|
|
|
|
/* The TPM2 Daemon. */
|
|
GC_COMPONENT_TPM2DAEMON,
|
|
|
|
/* The LDAP Directory Manager for CRLs. */
|
|
GC_COMPONENT_DIRMNGR,
|
|
|
|
/* The external Pinentry. */
|
|
GC_COMPONENT_PINENTRY,
|
|
|
|
/* The number of components. */
|
|
GC_COMPONENT_NR
|
|
} gc_component_id_t;
|
|
|
|
|
|
/* Initialize the components. */
|
|
void gc_components_init (void);
|
|
|
|
/* Percent-Escape special characters. The string is valid until the
|
|
next invocation of the function. */
|
|
char *gc_percent_escape (const char *src);
|
|
|
|
|
|
void gc_error (int status, int errnum, const char *fmt, ...);
|
|
|
|
/* Launch given component. */
|
|
gpg_error_t gc_component_launch (int component);
|
|
|
|
/* Kill given component. */
|
|
void gc_component_kill (int component);
|
|
|
|
/* Reload given component. */
|
|
void gc_component_reload (int component);
|
|
|
|
/* List all components that are available. */
|
|
void gc_component_list_components (estream_t out);
|
|
|
|
/* List all programs along with their status. */
|
|
void gc_check_programs (estream_t out);
|
|
|
|
/* Find the component with the name NAME. Returns -1 if not
|
|
found. */
|
|
int gc_component_find (const char *name);
|
|
|
|
/* Retrieve the currently active options and their defaults from all
|
|
involved backends for this component. */
|
|
void gc_component_retrieve_options (int component);
|
|
|
|
/* List all options of the component COMPONENT. */
|
|
void gc_component_list_options (int component, estream_t out);
|
|
|
|
/* Read the modifications from IN and apply them. */
|
|
void gc_component_change_options (int component, estream_t in, estream_t out,
|
|
int verbatim);
|
|
|
|
/* Check the options of a single component. Returns 0 if everything
|
|
is OK. */
|
|
int gc_component_check_options (int component, estream_t out,
|
|
const char *conf_file);
|
|
|
|
/* Process global configuration file. */
|
|
int gc_process_gpgconf_conf (const char *fname, int update, int defaults,
|
|
estream_t listfp);
|
|
|
|
/* Apply a profile. */
|
|
gpg_error_t gc_apply_profile (const char *fname);
|
|
|
|
|
|
#endif /*GPGCONF_H*/
|