838 changes: 0 additions & 838 deletions lib/rc-decode.c

This file was deleted.

290 changes: 0 additions & 290 deletions lib/rc-decode.h

This file was deleted.

726 changes: 0 additions & 726 deletions test/unit/tpm2-rc-decode_unit.c

This file was deleted.

312 changes: 0 additions & 312 deletions test/unit/tpm2-rc-entry_unit.c

This file was deleted.

210 changes: 15 additions & 195 deletions tools/tpm2_rc_decode.c
Expand Up @@ -32,14 +32,21 @@
#include <sapi/tpm20.h>

#include "log.h"
#include "rc-decode.h"
#include "tpm2_error.h"
#include "tpm2_options.h"
#include "tpm2_tool.h"
#include "tpm2_util.h"

#define TPM2_RC_MAX 0xffffffff

typedef struct tpm2_rc_ctx tpm2_rc_ctx;
struct tpm2_rc_ctx {
TSS2_RC rc;
};

tpm2_rc_ctx ctx;

static bool str_to_tpm_rc(const char *rc_str, TSS2_RC *rc) {

uintmax_t rc_read = 0;
char *end_ptr = NULL;

Expand All @@ -55,196 +62,19 @@ static bool str_to_tpm_rc(const char *rc_str, TSS2_RC *rc) {
return true;
}

/* Dump the hex, identifier and description for the format zero / VER1 error
* provided in TSS2_RC parameter.
*/
static int print_tpm_rc_format_zero(TSS2_RC rc) {
TSS2_RC rc_tmp;
tpm2_rc_entry_t *entry;

rc_tmp = tpm2_rc_get_code_7bit(rc);
if (tpm2_rc_is_vendor_defined(rc)) {
LOG_ERR("vendor defined TSS2_RCs are not supported");
return -1;
} else if (tpm2_rc_is_warning_code(rc)) {
entry = tpm2_get_warn_entry(rc_tmp);
if (entry)
tpm2_tool_output("format 0 warning code\n hex: 0x%02x\n name: %s\n "
"description: %s\n", rc_tmp, entry->name,
entry->description);
else
tpm2_tool_output("failed to decode TSS2_RC warning: 0x%x\n", rc_tmp);
} else if (tpm2_rc_is_error_code(rc)) {
entry = tpm2_get_fmt0_entry(rc_tmp);
if (entry)
tpm2_tool_output("format 0 error code\n hex: 0x%02x\n name: %s\n "
"description: %s\n", rc_tmp, entry->name,
entry->description);
else
tpm2_tool_output("failed to decode TSS2_RC error: 0x%02x\n", rc_tmp);
} else if (tpm2_rc_is_tpm12(rc_tmp)) {
LOG_ERR("version 1.2 TSS2_RCs are not supported");
return -1;
} else {
LOG_ERR("Unknown TSS2_RC format");
return -1;
}
/* decode warning / error code */
return 0;
}
/* Dump the hex, identifier and description for the format one / FMT1 error
* as well as the parameter, handle or session data.
*/
static int print_tpm_rc_format_one(TSS2_RC rc) {
TSS2_RC rc_tmp;
tpm2_rc_entry_t *entry;

tpm2_tool_output("format 1 error code\n");
rc_tmp = tpm2_rc_get_code_6bit(rc);
tpm2_tool_output(" hex: 0x%02x\n", rc_tmp);
/* decode error message */
entry = tpm2_get_fmt1_entry(rc_tmp);
if (!entry) {
tpm2_tool_output("Unknown TSS2_RC\n");
return -1;
}
tpm2_tool_output(" identifier: %s\n description: %s\n", entry->name,
entry->description);
/* decode parameter / handle / session number */
if (tpm2_rc_is_error_code_with_parameter(rc)) {
rc_tmp = tpm2_rc_get_parameter_number(rc);
entry = tpm2_get_parameter_entry(rc_tmp);
if (!entry) {
tpm2_tool_output("Unknown TSS2_RC parameter number: 0x%03x\n", rc_tmp);
return -1;
}
tpm2_tool_output("parameter\n hex: 0x%03x\n identifier: %s\n "
"description: %s\n", rc_tmp, entry->name, entry->description);
} else if (tpm2_rc_is_error_code_with_handle(rc)) {
rc_tmp = tpm2_rc_get_handle_number(rc);
entry = tpm2_get_handle_entry(rc_tmp);
if (!entry) {
tpm2_tool_output("Unkonwn TSS2_RC handle number: 0x%03x\n", rc_tmp);
return -1;
}
tpm2_tool_output("handle\n hex:0x%03x\n identifier: %s\n "
"description: %s\n", rc_tmp, entry->name, entry->description);
} else if (tpm2_rc_is_error_code_with_session(rc)) {
rc_tmp = tpm2_rc_get_session_number(rc);
entry = tpm2_get_session_entry(rc_tmp);
if (!entry) {
tpm2_tool_output("Unknown TSS2_RC session number: 0x%03x\n", rc_tmp);
return -1;
}
tpm2_tool_output("session\n hex: 0x%03x\n identifier: %s\n "
"description: %s\n", rc_tmp, entry->name, entry->description);
}

return 0;
}
/* Dump the hex, identifier and description for the TSS defined layer
* indicator in the provided TSS2_RC.
*/
static int print_tpm_rc_tss_layer(TSS2_RC rc) {
TSS2_RC rc_tmp;
tpm2_rc_entry_t *entry;
int ret;

rc_tmp = tpm2_rc_get_layer(rc);
/* Currently no entry for 0x0 layer, assume it's directly from the TPM? */
tpm2_tool_output("error layer\n hex: 0x%x\n", rc_tmp);
entry = tpm2_get_layer_entry(rc_tmp);
if (entry) {
tpm2_tool_output(" identifier: %s\n description: %s\n", entry->name,
entry->description);
ret = 0;
} else {
tpm2_tool_output("failed to decode TSS2_RC layer: 0x%x\n", rc_tmp);
ret = -1;
}

return ret;
}
/* Dump the hex, identifier string and description for the TSS defined
* base error code in the provided TSS2_RC.
*/
static int print_tpm_rc_tss_error_code(TSS2_RC rc) {
TSS2_RC rc_tmp;
tpm2_rc_entry_t *entry;
int ret;

entry = tpm2_get_tss_base_rc_entry(rc);
if (entry) {
tpm2_tool_output("base error code\n identifier: %s\n description: %s\n",
entry->name, entry->description);
ret = 0;
} else {
rc_tmp = tpm2_rc_get_tss_err_code(rc);
tpm2_tool_output("failed to decode TSS2_RC error code: 0x%x\n", rc_tmp);
ret = -1;
}

return ret;
}
/* Top level function to dump human readable data about TSS2_RCs as defined
* in the TPM2 Part 2: Structures, Table 17..
*/
static int print_tpm_rc_tpm_error_code(TSS2_RC rc) {
if (tpm2_rc_is_format_zero(rc))
print_tpm_rc_format_zero(rc);
else if (tpm2_rc_is_format_one(rc))
print_tpm_rc_format_one(rc);
else {
LOG_ERR("Unknown TSS2_RC format");
return -1;
}
return 0;
}
/* Top level function to dump human readable data about TSS2_RCs.
*/
bool print_tpm_rc(TSS2_RC rc) {

/* Determine which layer in the stack produced the error */
TSS2_RC rc_tmp = tpm2_rc_get_layer(rc);
int ret = print_tpm_rc_tss_layer(rc);
if (ret) {
return false;
}

switch (rc_tmp) {
case TSS2_SYS_RC_LAYER:
case TSS2_MU_RC_LAYER:
case TSS2_TCTI_RC_LAYER:
case TSS2_RESMGR_RC_LAYER:
ret = print_tpm_rc_tss_error_code(rc);
break;
case TSS2_RESMGRTPM_RC_LAYER:
case TSS2_TPM_RC_LAYER:
ret = print_tpm_rc_tpm_error_code(rc);
break;
default:
break;
}

return ret == 0;
}

static char *rc_str;

static bool on_arg(int argc, char **argv) {

if (argc != 1) {
LOG_ERR("Expected 1 rc code, got: %d", argc);
}

rc_str = argv[0];

return true;
return str_to_tpm_rc(argv[0], &ctx.rc);
}

bool tpm2_tool_onstart(tpm2_options **opts) {

*opts = tpm2_options_new(NULL, 0, NULL, NULL, on_arg, TPM2_OPTIONS_SHOW_USAGE);
*opts = tpm2_options_new(NULL, 0, NULL, NULL, on_arg,
TPM2_OPTIONS_SHOW_USAGE);

return *opts != NULL;
}
Expand All @@ -254,18 +84,8 @@ int tpm2_tool_onrun(TSS2_SYS_CONTEXT *sapi_context, tpm2_option_flags flags) {
UNUSED(flags);
UNUSED(sapi_context);

TSS2_RC rc;

if (!rc_str) {
LOG_ERR("Expected a single rc value argument, got none.");
return 1;
}
const char *e = tpm2_error_str(ctx.rc);
tpm2_tool_output("%s\n", e);

bool result = str_to_tpm_rc(rc_str, &rc);
if (!result) {
return 1;
}

result = print_tpm_rc(rc);
return result != true;
return 0;
}