123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- /* SPDX-License-Identifier: BSD-3-Clause */
- #include <string.h>
- #include "log.h"
- #include "tpm2_tool.h"
- #include "tpm2_alg_util.h"
- #include "tpm2_options.h"
- typedef struct tpm_testparms_ctx tpm_testparms_ctx;
- struct tpm_testparms_ctx {
- TPMT_PUBLIC_PARMS inputalg;
- };
- static tpm_testparms_ctx ctx;
- static tool_rc tpm_testparms(ESYS_CONTEXT *ectx) {
- TSS2_RC rval = Esys_TestParms(ectx, ESYS_TR_NONE, ESYS_TR_NONE,
- ESYS_TR_NONE, &(ctx.inputalg));
- /*
- * TODO: this is a good candidate for flatten support via Tss2_RC_Decode(rval);
- */
- if (rval != TSS2_RC_SUCCESS) {
- if ((rval & (TPM2_RC_P | TPM2_RC_1)) == (TPM2_RC_P | TPM2_RC_1)) {
- rval &= ~(TPM2_RC_P | TPM2_RC_1);
- switch (rval) {
- case TPM2_RC_CURVE:
- LOG_ERR("Specified elliptic curve is unsupported");
- break;
- case TPM2_RC_HASH:
- LOG_ERR("Specified hash is unsupported");
- break;
- case TPM2_RC_SCHEME:
- LOG_ERR("Specified signing scheme is unsupported or "
- "incompatible");
- break;
- case TPM2_RC_KDF:
- LOG_ERR("Specified key derivation function is unsupported");
- break;
- case TPM2_RC_MGF:
- LOG_ERR("Specified mask generation function is unsupported");
- break;
- case TPM2_RC_KEY_SIZE:
- LOG_ERR("Specified key size is unsupported");
- break;
- case TPM2_RC_SYMMETRIC:
- LOG_ERR(
- "Specified symmetric algorithm or key length is "
- "unsupported");
- break;
- case TPM2_RC_ASYMMETRIC:
- LOG_ERR("Specified asymmetric algorithm is unsupported");
- break;
- case TPM2_RC_MODE:
- LOG_ERR("Specified symmetric mode unsupported");
- break;
- case TPM2_RC_VALUE:
- default:
- LOG_ERR("Unsupported algorithm specification");
- break;
- }
- return tool_rc_unsupported;
- }
- LOG_PERR(Esys_TestParms, rval);
- return tool_rc_general_error;
- }
- return tool_rc_success;
- }
- static bool on_arg(int argc, char **argv) {
- if (argc < 1) {
- LOG_ERR("Expected one algorithm specification, got: 0");
- return false;
- }
- TPM2B_PUBLIC algorithm = { 0 };
- if (!tpm2_alg_util_handle_ext_alg(argv[0], &algorithm)) {
- LOG_ERR("Invalid or unsupported by the tool : %s", argv[0]);
- return false;
- }
- ctx.inputalg.type = algorithm.publicArea.type;
- memcpy(&ctx.inputalg.parameters, &algorithm.publicArea.parameters,
- sizeof(TPMU_PUBLIC_PARMS));
- return true;
- }
- static bool tpm2_tool_onstart(tpm2_options **opts) {
- *opts = tpm2_options_new(NULL, 0, NULL, NULL, on_arg, 0);
- return *opts != NULL;
- }
- static tool_rc tpm2_tool_onrun(ESYS_CONTEXT *ectx, tpm2_option_flags flags) {
- UNUSED(flags);
- return tpm_testparms(ectx);
- }
- // Register this tool with tpm2_tool.c
- TPM2_TOOL_REGISTER("testparms", tpm2_tool_onstart, tpm2_tool_onrun, NULL, NULL)
|