From 175e47711c72a8169f94b971c4e9973bbfb04efc Mon Sep 17 00:00:00 2001 From: Joshua Lock Date: Wed, 5 Sep 2018 23:21:21 +0100 Subject: [PATCH] lib/tpm2_options: restore TCTI configuration environment variables The port to TSS2.0 introduced a new unified environment variable to configure a TCTI, TPM2TOOLS_ENV_TCTI. Unfortunately this also unwittingly removed the old-style environment variable per TCTI configuration options, which is a behavioural regression for the 3.x series of tpm2-tools. Restore the original TPM2TOOLS_* environment variables in addition to the new style single environment variable. Fixes issue #1171 Signed-off-by: Joshua Lock --- lib/tpm2_options.c | 134 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 107 insertions(+), 27 deletions(-) diff --git a/lib/tpm2_options.c b/lib/tpm2_options.c index 751b0eee9819..2531948ecf74 100644 --- a/lib/tpm2_options.c +++ b/lib/tpm2_options.c @@ -52,6 +52,10 @@ #endif #define TPM2TOOLS_ENV_TCTI "TPM2TOOLS_TCTI" +#define TPM2TOOLS_ENV_TCTI_NAME "TPM2TOOLS_TCTI_NAME" +#define TPM2TOOLS_ENV_DEVICE "TPM2TOOLS_DEVICE_FILE" +#define TPM2TOOLS_ENV_SOCK_ADDR "TPM2TOOLS_SOCKET_ADDRESS" +#define TPM2TOOLS_ENV_SOCK_PORT "TPM2TOOLS_SOCKET_PORT" #define TPM2TOOLS_ENV_ENABLE_ERRATA "TPM2TOOLS_ENABLE_ERRATA" tpm2_options *tpm2_options_new(const char *short_opts, size_t len, @@ -136,13 +140,25 @@ void tpm2_options_free(tpm2_options *opts) { } typedef struct tcti_conf tcti_conf; struct tcti_conf { - const char *name; - const char *opts; + char *name; + char *opts; }; +/* + * Some tcti names changed in TSS 2.0, so in order to not break the + * expected options of the 3.X tools series map: + * - abrmd -> tabrmd + * - socket -> mssim + */ static inline const char *fixup_name(const char *name) { - return !strcmp(name, "abrmd") ? "tabrmd" : name; + if (!strcmp(name, "abrmd")) { + return "tabrmd"; + } else if (!strcmp(name, "socket")) { + return "mssim"; + } + + return name; } static const char *find_default_tcti(void) { @@ -165,27 +181,14 @@ static const char *find_default_tcti(void) { return NULL; } -static tcti_conf tcti_get_config(const char *optstr) { - - /* set up the default configuration */ - tcti_conf conf = { - .name = find_default_tcti() - }; - - /* no tcti config supplied, get it from env */ - if (!optstr) { - optstr = getenv (TPM2TOOLS_ENV_TCTI); - if (!optstr) { - /* nothing user supplied, use default */ - return conf; - } - } +/* Parse new-style, TSS 2.0, environment variables */ +static void parse_env_tcti(const char *optstr, tcti_conf *conf) { char *split = strchr(optstr, ':'); if (!split) { /* --tcti=device */ - conf.name = fixup_name(optstr); - return conf; + conf->name = strdup(fixup_name(optstr)); + return; } /* @@ -200,24 +203,99 @@ static tcti_conf tcti_get_config(const char *optstr) { /* Case A */ if (!optstr[0] && !split[1]) { - return conf; + return; } /* Case B */ if (!optstr[0]) { - conf.opts = &split[1]; - return conf; + conf->opts = strdup(&split[1]); + return; } /* Case C */ if (!split[1]) { - conf.name = fixup_name(optstr); - return conf; + conf->name = strdup(fixup_name(optstr)); + return; } /* Case D */ - conf.name = fixup_name(optstr); - conf.opts = &split[1]; + conf->name = strdup(fixup_name(optstr)); + conf->opts = strdup(&split[1]); + return; +} + +static char* parse_device_tcti(void) { + const char *device = getenv(TPM2TOOLS_ENV_DEVICE); + return strdup(device); +} + +static char* parse_socket_tcti(void) { + + /* + * tpm2_tcti_ldr_load() expects conf->opts to be of the format + * "host=localhost,port=2321" for the mssim tcti + * + * Max IPV6 IP address, 45 characters (45) + * Ports are 16bit int, 5 characters (5) + * "host=", 5 characters (5) + * "port=", 5 characters (5) + * strlen = 60 + */ + size_t optlen = 60; + const char *host; + const char *port; + char *ret = malloc(optlen); + if (!ret) { + LOG_ERR ("OOM"); + return NULL; + } + + host = getenv(TPM2TOOLS_ENV_SOCK_ADDR); + port = getenv(TPM2TOOLS_ENV_SOCK_PORT); + + if (host && port) { + snprintf(ret, optlen, "host=%s,port=%s", host, port); + } else if (host) { + snprintf(ret, optlen, "host=%s", host); + } else if (port) { + snprintf(ret, optlen, "port=%s", port); + } + return ret; +} + +static tcti_conf tcti_get_config(const char *optstr) { + + tcti_conf conf = { + .name = NULL + }; + + /* no tcti config supplied, get it from env */ + if (!optstr) { + /* + * Check the "old" way of specifying TCTI, using a shared env var and + * per-tcti option variables. + */ + optstr = getenv (TPM2TOOLS_ENV_TCTI_NAME); + if (optstr) { + conf.name = strdup(fixup_name(optstr)); + if (!strcmp(conf.name, "mssim")) { + conf.opts = parse_socket_tcti(); + } else if (!strcmp(conf.name, "device")) { + conf.opts = parse_device_tcti(); + } + } else { + /* Check the new way of defining a TCTI using a shared env var */ + optstr = getenv (TPM2TOOLS_ENV_TCTI); + if (optstr) { + parse_env_tcti(optstr, &conf); + } + } + } + + if (!conf.name) { + conf.name = strdup(find_default_tcti()); + } + return conf; } @@ -418,6 +496,8 @@ tpm2_option_code tpm2_handle_options (int argc, char **argv, if (!flags->enable_errata) { flags->enable_errata = !!getenv (TPM2TOOLS_ENV_ENABLE_ERRATA); } + free(conf.name); + free(conf.opts); } rc = tpm2_option_code_continue; -- 2.17.1