47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * CDDL HEADER START
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * The contents of this file are subject to the terms of the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Common Development and Distribution License (the "License").
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * You may not use this file except in compliance with the License.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * or http://www.opensolaris.org/os/licensing.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * See the License for the specific language governing permissions
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * and limitations under the License.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * When distributing Covered Code, include this CDDL HEADER in each
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * If applicable, add the following below this CDDL HEADER, with the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * fields enclosed by brackets "[]" replaced with your own identifying
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * information: Portions Copyright [yyyy] [name of copyright owner]
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * CDDL HEADER END
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Use is subject to license terms.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include <unistd.h>
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include <stdlib.h>
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include <stdio.h>
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include <strings.h>
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include <fcntl.h>
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include <sys/types.h>
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include <netinet/in.h>
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include <inttypes.h>
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include <sha1.h>
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include <uuid/uuid.h>
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include <sys/stat.h>
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include <libintl.h>
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include <tss/tss_defines.h>
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include <tss/tspi.h>
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#include "tpmadm.h"
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollint cmd_status(TSS_HCONTEXT hContext, TSS_HTPM hTPM, int argc, char *argv[]);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollint cmd_init(TSS_HCONTEXT hContext, TSS_HTPM hTPM, int argc, char *argv[]);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollint cmd_clear(TSS_HCONTEXT hContext, TSS_HTPM hTPM, int argc, char *argv[]);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollint cmd_auth(TSS_HCONTEXT hContext, TSS_HTPM hTPM, int argc, char *argv[]);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollint cmd_keyinfo(TSS_HCONTEXT hContext, TSS_HTPM hTPM, int argc, char *argv[]);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollint cmd_deletekey(TSS_HCONTEXT hContext, TSS_HTPM hTPM, int argc, char *argv[]);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollcmdtable_t commands[] = {
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO { "status", "", cmd_status },
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO { "init", "", cmd_init },
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO { "clear", "[owner | lock]", cmd_clear },
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO { "auth", "", cmd_auth },
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO { "keyinfo", "[uuid]", cmd_keyinfo },
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO { "deletekey", "uuid", cmd_deletekey },
6b35cb3cf158584a9408d44b9b6796564e8e1882Richard PALO { NULL, NULL, NULL },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll};
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollBYTE well_known[] = TSS_WELL_KNOWN_SECRET;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys IngersollTSS_UUID srk_uuid = TSS_UUID_SRK;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * TPM status
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic int
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollprint_tpm_version(TSS_HCONTEXT hContext, TSS_HOBJECT hTPM)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll struct {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TPM_CAP_VERSION_INFO vers_info;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll char extra[20]; /* vendor extensions */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } info;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (get_tpm_capability(hContext, hTPM, TSS_TPMCAP_VERSION_VAL,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll 0, &info, sizeof (info)))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("TPM Version: %d.%d (%c%c%c%c Rev: %d.%d, "
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll "SpecLevel: %d, ErrataRev: %d)\n"),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll info.vers_info.version.major,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll info.vers_info.version.minor,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll info.vers_info.tpmVendorID[0],
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll info.vers_info.tpmVendorID[1],
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll info.vers_info.tpmVendorID[2],
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll info.vers_info.tpmVendorID[3],
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll info.vers_info.version.revMajor,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll info.vers_info.version.revMinor,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (int)ntohs(info.vers_info.specLevel),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll info.vers_info.errataRev);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic int
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersolltpm_is_owned(TSS_HCONTEXT hContext, TSS_HOBJECT hTPM)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll BYTE owned;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (get_tpm_capability(hContext, hTPM, TSS_TPMCAP_PROPERTY,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TPMCAP_PROP_OWNER, &owned, sizeof (owned)))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (owned);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic int
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollprint_tpm_resources(TSS_HCONTEXT hContext, TSS_HOBJECT hTPM)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll UINT32 avail, max;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("TPM resources\n"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (get_tpm_capability(hContext, hTPM, TSS_TPMCAP_PROPERTY,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TPMCAP_PROP_MAXCONTEXTS, &max, sizeof (max)))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (get_tpm_capability(hContext, hTPM, TSS_TPMCAP_PROPERTY,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TPMCAP_PROP_CONTEXTS, &avail, sizeof (avail)))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("\tContexts: %d/%d available\n"), avail, max);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (get_tpm_capability(hContext, hTPM, TSS_TPMCAP_PROPERTY,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TPMCAP_PROP_MAXSESSIONS, &max, sizeof (max)))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (get_tpm_capability(hContext, hTPM, TSS_TPMCAP_PROPERTY,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TPMCAP_PROP_SESSIONS, &avail, sizeof (avail)))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("\tSessions: %d/%d available\n"), avail, max);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (get_tpm_capability(hContext, hTPM, TSS_TPMCAP_PROPERTY,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TPMCAP_PROP_MAXAUTHSESSIONS, &max, sizeof (max)))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (get_tpm_capability(hContext, hTPM, TSS_TPMCAP_PROPERTY,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TPMCAP_PROP_AUTHSESSIONS, &avail, sizeof (avail)))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("\tAuth Sessions: %d/%d available\n"),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll avail, max);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (get_tpm_capability(hContext, hTPM, TSS_TPMCAP_PROPERTY,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TPMCAP_PROP_MAXKEYS, &max, sizeof (max)))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (get_tpm_capability(hContext, hTPM, TSS_TPMCAP_PROPERTY,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TPMCAP_PROP_KEYS, &avail, sizeof (avail)))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("\tLoaded Keys: %d/%d available\n"), avail, max);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic int
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollprint_tpm_pcrs(TSS_HCONTEXT hContext, TSS_HOBJECT hTPM)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll UINT32 num_pcrs;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll int i;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (get_tpm_capability(hContext, hTPM, TSS_TPMCAP_PROPERTY,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TPMCAP_PROP_PCR, &num_pcrs, sizeof (num_pcrs)))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("Platform Configuration Registers (%u)\n"),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll num_pcrs);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* Print each PCR */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll for (i = 0; i < num_pcrs; i++) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_RESULT ret;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll UINT32 datalen;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll BYTE *data;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_TPM_PcrRead(hTPM, i, &datalen, &data);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Read PCR"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ret);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf("\tPCR %u:\t", i);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_bytes(data, datalen, FALSE);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_Context_FreeMemory(hContext, data);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Free PCR memory"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ret);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*ARGSUSED*/
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollint
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollcmd_status(TSS_HCONTEXT hContext, TSS_HTPM hTPM, int argc, char *argv[])
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo if (set_object_policy(hTPM, TSS_SECRET_MODE_POPUP, NULL, 0, NULL))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) print_tpm_version(hContext, hTPM);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (tpm_is_owned(hContext, hTPM)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) print_tpm_resources(hContext, hTPM);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) print_tpm_pcrs(hContext, hTPM);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("No TPM owner installed.\n"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Key Information
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersolltypedef struct {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll UINT32 code;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll char *str;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll} decode_map_t;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersolldecode_map_t key_usage[] = {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_KEYUSAGE_SIGN, "Signing" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_KEYUSAGE_STORAGE, "Storage" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_KEYUSAGE_IDENTITY, "Identity" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_KEYUSAGE_AUTHCHANGE, "Authchange" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_KEYUSAGE_BIND, "Bind" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_KEYUSAGE_LEGACY, "Legacy" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_KEYUSAGE_MIGRATE, "Migrate" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { 0, NULL },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll};
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersolldecode_map_t key_algorithm[] = {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ALG_RSA, "RSA" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ALG_DES, "DES" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ALG_3DES, "3-DES" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ALG_SHA, "SHA" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ALG_HMAC, "HMAC" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ALG_AES, "AES" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ALG_MGF1, "MGF1" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ALG_AES192, "AES192" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ALG_AES256, "AES256" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ALG_XOR, "XOR" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { 0, NULL },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll};
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersolldecode_map_t key_sigscheme[] = {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_SS_NONE, "None" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_SS_RSASSAPKCS1V15_SHA1, "RSASSAPKCS1v15_SHA1" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_SS_RSASSAPKCS1V15_DER, "RSASSAPKCS1v15_DER" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { 0, NULL },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll};
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersolldecode_map_t key_encscheme[] = {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ES_NONE, "None" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ES_RSAESPKCSV15, "RSAESPKCSv15" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ES_RSAESOAEP_SHA1_MGF1, "RSAESOAEP_SHA1_MGF1" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ES_SYM_CNT, "SYM_CNT" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { TSS_ES_SYM_OFB, "SYM_OFB" },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll { 0, NULL },
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll};
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic char *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersolldecode(decode_map_t *table, UINT32 code)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll static char buf[20];
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll int i;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll for (i = 0; table[i].str != NULL; i++) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (table[i].code == code)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (table[i].str);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) snprintf(buf, sizeof (buf), gettext("Unknown (%u)"), code);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (buf);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic void
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollprint_key_info(TSS_HCONTEXT hContext, TSS_HOBJECT hKey)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_RESULT ret;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll UINT32 attrib;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll UINT32 keyInfoSize;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll BYTE *keyInfo;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* Key size */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_GetAttribUint32(hKey, TSS_TSPATTRIB_KEY_INFO,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TSPATTRIB_KEYINFO_SIZE, &attrib);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Get key size"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("Key Size: %d bits\n"), attrib);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* Key usage */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_GetAttribUint32(hKey, TSS_TSPATTRIB_KEY_INFO,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TSPATTRIB_KEYINFO_USAGE, &attrib);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Get key usage"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("Key Usage: %s\n"), decode(key_usage, attrib));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* Algorithm */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_GetAttribUint32(hKey, TSS_TSPATTRIB_KEY_INFO,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TSPATTRIB_KEYINFO_ALGORITHM, &attrib);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Get key algorithm"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("Algorithm: %s\n"),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll decode(key_algorithm, attrib));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* Authorization required */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_GetAttribUint32(hKey, TSS_TSPATTRIB_KEY_INFO,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TSPATTRIB_KEYINFO_AUTHUSAGE, &attrib);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Get key authusage"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("Authorization required: %s\n"),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll attrib ? gettext("Yes") : gettext("No"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* Signature scheme */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_GetAttribUint32(hKey, TSS_TSPATTRIB_KEY_INFO,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TSPATTRIB_KEYINFO_SIGSCHEME, &attrib);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Get key signature scheme"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("Signature scheme: %s\n"),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll decode(key_sigscheme, attrib));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* Encoding scheme */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_GetAttribUint32(hKey, TSS_TSPATTRIB_KEY_INFO,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TSPATTRIB_KEYINFO_ENCSCHEME, &attrib);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Get key encoding scheme"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("Encoding scheme: %s\n"),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll decode(key_encscheme, attrib));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* Key blob */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_GetAttribData(hKey, TSS_TSPATTRIB_KEY_BLOB,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_TSPATTRIB_KEYBLOB_BLOB, &keyInfoSize, &keyInfo);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Get key blob"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf(gettext("TPM Key Blob:\n"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_bytes(keyInfo, keyInfoSize, TRUE);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_Context_FreeMemory(hContext, keyInfo);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Free key info buffer"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersolltypedef struct hash_node {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll struct hash_node *next, *sibling, *child;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_UUID uuid;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_KM_KEYINFO2 *key_data;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll} hash_node_t;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#define HASHSIZE 17
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollhash_node_t *hash_table[HASHSIZE];
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic hash_node_t *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollhash_insert(TSS_UUID uuid, TSS_KM_KEYINFO2 *key_data)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll UINT32 i, index = 0;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll hash_node_t *node;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll char *cp;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll cp = (char *)&uuid;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll for (i = 0; i < sizeof (TSS_UUID); i++)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll index += cp[i];
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll index = index % HASHSIZE;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll for (node = hash_table[index]; node != NULL; node = node->next) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (memcmp(&(node->uuid), &uuid, sizeof (TSS_UUID)) == 0)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll break;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (node == NULL) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll node = calloc(1, sizeof (hash_node_t));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll node->uuid = uuid;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll node->next = hash_table[index];
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll hash_table[index] = node;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (node->key_data == NULL)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll node->key_data = key_data;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (node);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic void
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersolladd_child(hash_node_t *parent, hash_node_t *child)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll hash_node_t *node;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll for (node = parent->child; node != NULL; node = node->next) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (node == child)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll child->sibling = parent->child;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll parent->child = child;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic void
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollprint_all(hash_node_t *parent, int indent)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll char uuidstr[UUID_PRINTABLE_STRING_LENGTH];
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll hash_node_t *node;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll char *type, *loaded;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll uuid_unparse(*(uuid_t *)&parent->uuid, uuidstr);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll type = (parent->key_data->persistentStorageType == TSS_PS_TYPE_USER) ?
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll "USER" : "SYSTEM";
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll loaded = parent->key_data->fIsLoaded ? "(loaded)" : "";
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) printf("%*s[%s] %s %s\n", indent, "",
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll type, uuidstr, loaded);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll for (node = parent->child; node != NULL; node = node->sibling)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_all(node, indent + 4);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*ARGSUSED*/
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollint
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollcmd_keyinfo(TSS_HCONTEXT hContext, TSS_HTPM hTPM, int argc, char *argv[])
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_RESULT ret;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll UINT32 i, num_keys;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_KM_KEYINFO2 *keys;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll hash_node_t *parent, *child, *srk = NULL;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_HKEY hKey;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll union {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll uuid_t arr_uuid;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_UUID tss_uuid;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } uuid;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll switch (argc) {
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo case 1:
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* Print key hierarchy */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_Context_GetRegisteredKeysByUUID2(hContext,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_PS_TYPE_USER, NULL, &num_keys, &keys);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Get key hierarchy"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll for (i = 0; i < num_keys; i++) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll parent = hash_insert(keys[i].parentKeyUUID, NULL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll child = hash_insert(keys[i].keyUUID, &keys[i]);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll add_child(parent, child);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (memcmp(&(keys[i].keyUUID), &srk_uuid,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll sizeof (TSS_UUID)) == 0)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll srk = child;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (srk != NULL)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_all(srk, 0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_Context_FreeMemory(hContext, (BYTE *) keys);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Free key list"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo case 2:
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* Print detailed info about a single key */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (uuid_parse(argv[1], uuid.arr_uuid))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_Context_GetKeyByUUID(hContext, TSS_PS_TYPE_USER,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll uuid.tss_uuid, &hKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret == TSP_ERROR(TSS_E_PS_KEY_NOTFOUND)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_Context_GetKeyByUUID(hContext,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_PS_TYPE_SYSTEM, uuid.tss_uuid, &hKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Get key by UUID"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_key_info(hContext, hKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo default:
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) fprintf(stderr, gettext("Usage:\n"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) fprintf(stderr, "\tkeyinfo [uuid]\n");
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_USAGE);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*ARGSUSED*/
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollint
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollcmd_deletekey(TSS_HCONTEXT hContext, TSS_HTPM hTPM, int argc, char *argv[])
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_RESULT ret;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_HOBJECT hKey;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll union {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll uuid_t arr_uuid;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_UUID tss_uuid;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } uuid;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (argc < 2) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) fprintf(stderr, gettext("Usage:\n"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) fprintf(stderr, "\tdeletekey [uuid]\n");
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_USAGE);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (uuid_parse(argv[1], uuid.arr_uuid))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_Context_UnregisterKey(hContext, TSS_PS_TYPE_USER,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll uuid.tss_uuid, &hKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret == TSP_ERROR(TSS_E_PS_KEY_NOTFOUND)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_Context_UnregisterKey(hContext, TSS_PS_TYPE_SYSTEM,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll uuid.tss_uuid, &hKey);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Unregister key"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Clear
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic int
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollclearowner(TSS_HTPM hTPM)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_RESULT ret;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo if (set_object_policy(hTPM, TSS_SECRET_MODE_POPUP,
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo gettext("= TPM owner passphrase ="), 0, NULL))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_TPM_ClearOwner(hTPM, FALSE);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Clear TPM owner"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic int
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollresetlock(TSS_HTPM hTPM)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_RESULT ret;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo if (set_object_policy(hTPM, TSS_SECRET_MODE_POPUP,
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo gettext("= TPM owner passphrase ="), 0, NULL))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_TPM_SetStatus(hTPM, TSS_TPMSTATUS_RESETLOCK, TRUE);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Reset Lock"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*ARGSUSED*/
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollint
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollcmd_clear(TSS_HCONTEXT hContext, TSS_HTPM hTPM, int argc, char *argv[])
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll char *subcmd = argv[1];
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (subcmd && strcmp(subcmd, "lock") == 0) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (resetlock(hTPM));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else if (subcmd && strcmp(subcmd, "owner") == 0) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (clearowner(hTPM));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll } else {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) fprintf(stderr, gettext("Usage:\n"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) fprintf(stderr, "\tclear owner\n");
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) fprintf(stderr, "\tclear lock\n");
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_USAGE);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * TPM initialization
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic int
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollget_random(UINT32 size, BYTE *randomBytes)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll int fd, len;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll BYTE *buf;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll fd = open("/dev/random", O_RDONLY);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (fd == -1) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) fprintf(stderr, gettext("Unable to open /dev/random"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (-1);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll buf = randomBytes;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll while (size > 0) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll len = read(fd, buf, size);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (len <= 0) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) close(fd);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) fprintf(stderr,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll gettext("Error reading /dev/random"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (-1);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll size -= len;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll buf += len;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (void) close(fd);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstatic int
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollcreateek(TSS_HCONTEXT hContext, TSS_HTPM hTPM)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_RESULT ret;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_HOBJECT hKeyEK;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_VALIDATION ValidationData;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TPM_NONCE nonce;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TPM_DIGEST digest;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* Create the empty key struct for EK */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_RSAKEY,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll (TSS_KEY_NO_AUTHORIZATION | TSS_KEY_NON_VOLATILE |
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_KEY_NOT_MIGRATABLE | TSS_KEY_TYPE_STORAGE |
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_KEY_SIZE_2048 | TSS_KEY_NOT_CERTIFIED_MIGRATABLE |
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_KEY_STRUCT_KEY12 | TSS_KEY_EMPTY_KEY),
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll &hKeyEK);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Create endorsement key object"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ValidationData.ulExternalDataLength = sizeof (nonce);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ValidationData.rgbExternalData = (BYTE *) &nonce;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = get_random(sizeof (nonce), (BYTE *) &nonce);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret)
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ValidationData.ulValidationDataLength = sizeof (digest);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ValidationData.rgbValidationData = (BYTE *) &digest;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_TPM_CreateEndorsementKey(hTPM, hKeyEK, &ValidationData);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Create endorsement key"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*ARGSUSED*/
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollint
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollcmd_init(TSS_HCONTEXT hContext, TSS_HTPM hTPM, int argc, char *argv[])
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_RESULT ret;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_HOBJECT hKeySRK;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo if (set_object_policy(hTPM, TSS_SECRET_MODE_POPUP,
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo gettext("= TPM owner passphrase ="), 0, NULL))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_RSAKEY,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_KEY_TSP_SRK | TSS_KEY_AUTHORIZATION, &hKeySRK);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Create storage root key"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo if (set_object_policy(hKeySRK, TSS_SECRET_MODE_SHA1, NULL,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll sizeof (well_known), well_known))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_TPM_TakeOwnership(hTPM, hKeySRK, NULL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret == TPM_E_NO_ENDORSEMENT) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (createek(hContext, hTPM))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_TPM_TakeOwnership(hTPM, hKeySRK, NULL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Take ownership"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Auth
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*ARGSUSED*/
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollint
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollcmd_auth(TSS_HCONTEXT hContext, TSS_HTPM hTPM, int argc, char *argv[])
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll{
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_RESULT ret;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_HPOLICY hNewPolicy;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo if (set_object_policy(hTPM, TSS_SECRET_MODE_POPUP,
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo gettext("= TPM owner passphrase ="), 0, NULL))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo /* policy object for new passphrase */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_POLICY,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TSS_POLICY_USAGE, &hNewPolicy);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll if (ret) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Create policy object"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo if (set_policy_options(hNewPolicy, TSS_SECRET_MODE_POPUP,
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo gettext("= New TPM owner passphrase ="), 0, NULL))
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ret = Tspi_ChangeAuth(hTPM, NULL, hNewPolicy);
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo if (ret && ret != TSP_ERROR(TSS_E_POLICY_NO_SECRET)) {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll print_error(ret, gettext("Change authorization"));
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (ERR_FAIL);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll }
304d8f901e34de2a80ef006bfa8a8a927d23d56cScott Rotondo
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll return (0);
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll}