Message ID | 20190725105842.872625-3-stefanb@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | tpm: Improve on error handling | expand |
Hi On Thu, Jul 25, 2019 at 2:58 PM Stefan Berger <stefanb@linux.vnet.ibm.com> wrote: > > Implement a function to translate TPM error codes to strings so that > at least the most common error codes can be translated to human > readable strings. > > Signed-off-by: Stefan Berger <stefanb@linux.ibm.com> > --- > hw/tpm/tpm_emulator.c | 50 ++++++++++++++++++++++++++++++++++--------- > 1 file changed, 40 insertions(+), 10 deletions(-) > > diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c > index 1288cbcb8d..186dde0838 100644 > --- a/hw/tpm/tpm_emulator.c > +++ b/hw/tpm/tpm_emulator.c > @@ -82,6 +82,30 @@ typedef struct TPMEmulator { > TPMBlobBuffers state_blobs; > } TPMEmulator; > > +struct tpm_error { > + uint32_t tpm_result; > + const char *string; > +}; > + > +static const struct tpm_error tpm_errors[] = { > + { 9 , "operation failed" }, > + { 32, "encryption error" }, > + { 33, "decryption error" }, > + /* TPM 2 codes */ > + { 0x101, "operation failed" }, > +}; Wouldn't those codes be better defined in tpm_ioctl.h? > + > +static const char *tpm_emulator_strerror(uint32_t tpm_result) > +{ > + size_t i; > + > + for (i = 0; i < ARRAY_SIZE(tpm_errors); i++) { > + if (tpm_errors[i].tpm_result == tpm_result) { > + return tpm_errors[i].string; > + } > + } > + return ""; > +} > > static int tpm_emulator_ctrlcmd(TPMEmulator *tpm, unsigned long cmd, void *msg, > size_t msg_len_in, size_t msg_len_out) > @@ -264,7 +288,8 @@ static int tpm_emulator_stop_tpm(TPMBackend *tb) > > res = be32_to_cpu(res); > if (res) { > - error_report("tpm-emulator: TPM result for CMD_STOP: 0x%x", res); > + error_report("tpm-emulator: TPM result for CMD_STOP: 0x%x %s", res, > + tpm_emulator_strerror(res)); > return -1; > } > > @@ -293,8 +318,9 @@ static int tpm_emulator_set_buffer_size(TPMBackend *tb, > > psbs.u.resp.tpm_result = be32_to_cpu(psbs.u.resp.tpm_result); > if (psbs.u.resp.tpm_result != 0) { > - error_report("tpm-emulator: TPM result for set buffer size : 0x%x", > - psbs.u.resp.tpm_result); > + error_report("tpm-emulator: TPM result for set buffer size : 0x%x %s", > + psbs.u.resp.tpm_result, > + tpm_emulator_strerror(psbs.u.resp.tpm_result)); > return -1; > } > > @@ -339,7 +365,8 @@ static int tpm_emulator_startup_tpm_resume(TPMBackend *tb, size_t buffersize, > > res = be32_to_cpu(init.u.resp.tpm_result); > if (res) { > - error_report("tpm-emulator: TPM result for CMD_INIT: 0x%x", res); > + error_report("tpm-emulator: TPM result for CMD_INIT: 0x%x %s", res, > + tpm_emulator_strerror(res)); > goto err_exit; > } > return 0; > @@ -399,8 +426,9 @@ static int tpm_emulator_reset_tpm_established_flag(TPMBackend *tb, > > res = be32_to_cpu(reset_est.u.resp.tpm_result); > if (res) { > - error_report("tpm-emulator: TPM result for rest establixhed flag: 0x%x", > - res); > + error_report( > + "tpm-emulator: TPM result for rest establixhed flag: 0x%x %s", > + res, tpm_emulator_strerror(res)); > return -1; > } > > @@ -638,7 +666,8 @@ static int tpm_emulator_get_state_blob(TPMEmulator *tpm_emu, > res = be32_to_cpu(pgs.u.resp.tpm_result); > if (res != 0 && (res & 0x800) == 0) { > error_report("tpm-emulator: Getting the stateblob (type %d) failed " > - "with a TPM error 0x%x", type, res); > + "with a TPM error 0x%x %s", type, res, > + tpm_emulator_strerror(res)); > return -1; > } > > @@ -758,7 +787,8 @@ static int tpm_emulator_set_state_blob(TPMEmulator *tpm_emu, > tpm_result = be32_to_cpu(pss.u.resp.tpm_result); > if (tpm_result != 0) { > error_report("tpm-emulator: Setting the stateblob (type %d) failed " > - "with a TPM error 0x%x", type, tpm_result); > + "with a TPM error 0x%x %s", type, tpm_result, > + tpm_emulator_strerror(tpm_result)); > return -1; > } > > @@ -888,8 +918,8 @@ static void tpm_emulator_shutdown(TPMEmulator *tpm_emu) > error_report("tpm-emulator: Could not cleanly shutdown the TPM: %s", > strerror(errno)); > } else if (res != 0) { > - error_report("tpm-emulator: TPM result for sutdown: 0x%x", > - be32_to_cpu(res)); > + error_report("tpm-emulator: TPM result for shutdown: 0x%x %s", > + be32_to_cpu(res), tpm_emulator_strerror(be32_to_cpu(res))); > } > } lgtm > > -- > 2.20.1 >
On 7/25/19 7:08 AM, Marc-André Lureau wrote: > Hi > > On Thu, Jul 25, 2019 at 2:58 PM Stefan Berger > <stefanb@linux.vnet.ibm.com> wrote: >> Implement a function to translate TPM error codes to strings so that >> at least the most common error codes can be translated to human >> readable strings. >> >> Signed-off-by: Stefan Berger <stefanb@linux.ibm.com> >> --- >> hw/tpm/tpm_emulator.c | 50 ++++++++++++++++++++++++++++++++++--------- >> 1 file changed, 40 insertions(+), 10 deletions(-) >> >> diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c >> index 1288cbcb8d..186dde0838 100644 >> --- a/hw/tpm/tpm_emulator.c >> +++ b/hw/tpm/tpm_emulator.c >> @@ -82,6 +82,30 @@ typedef struct TPMEmulator { >> TPMBlobBuffers state_blobs; >> } TPMEmulator; >> >> +struct tpm_error { >> + uint32_t tpm_result; >> + const char *string; >> +}; >> + >> +static const struct tpm_error tpm_errors[] = { >> + { 9 , "operation failed" }, >> + { 32, "encryption error" }, >> + { 33, "decryption error" }, >> + /* TPM 2 codes */ >> + { 0x101, "operation failed" }, >> +}; > Wouldn't those codes be better defined in tpm_ioctl.h? tpm_int.h has some already. will add some more there. Stefan
diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c index 1288cbcb8d..186dde0838 100644 --- a/hw/tpm/tpm_emulator.c +++ b/hw/tpm/tpm_emulator.c @@ -82,6 +82,30 @@ typedef struct TPMEmulator { TPMBlobBuffers state_blobs; } TPMEmulator; +struct tpm_error { + uint32_t tpm_result; + const char *string; +}; + +static const struct tpm_error tpm_errors[] = { + { 9 , "operation failed" }, + { 32, "encryption error" }, + { 33, "decryption error" }, + /* TPM 2 codes */ + { 0x101, "operation failed" }, +}; + +static const char *tpm_emulator_strerror(uint32_t tpm_result) +{ + size_t i; + + for (i = 0; i < ARRAY_SIZE(tpm_errors); i++) { + if (tpm_errors[i].tpm_result == tpm_result) { + return tpm_errors[i].string; + } + } + return ""; +} static int tpm_emulator_ctrlcmd(TPMEmulator *tpm, unsigned long cmd, void *msg, size_t msg_len_in, size_t msg_len_out) @@ -264,7 +288,8 @@ static int tpm_emulator_stop_tpm(TPMBackend *tb) res = be32_to_cpu(res); if (res) { - error_report("tpm-emulator: TPM result for CMD_STOP: 0x%x", res); + error_report("tpm-emulator: TPM result for CMD_STOP: 0x%x %s", res, + tpm_emulator_strerror(res)); return -1; } @@ -293,8 +318,9 @@ static int tpm_emulator_set_buffer_size(TPMBackend *tb, psbs.u.resp.tpm_result = be32_to_cpu(psbs.u.resp.tpm_result); if (psbs.u.resp.tpm_result != 0) { - error_report("tpm-emulator: TPM result for set buffer size : 0x%x", - psbs.u.resp.tpm_result); + error_report("tpm-emulator: TPM result for set buffer size : 0x%x %s", + psbs.u.resp.tpm_result, + tpm_emulator_strerror(psbs.u.resp.tpm_result)); return -1; } @@ -339,7 +365,8 @@ static int tpm_emulator_startup_tpm_resume(TPMBackend *tb, size_t buffersize, res = be32_to_cpu(init.u.resp.tpm_result); if (res) { - error_report("tpm-emulator: TPM result for CMD_INIT: 0x%x", res); + error_report("tpm-emulator: TPM result for CMD_INIT: 0x%x %s", res, + tpm_emulator_strerror(res)); goto err_exit; } return 0; @@ -399,8 +426,9 @@ static int tpm_emulator_reset_tpm_established_flag(TPMBackend *tb, res = be32_to_cpu(reset_est.u.resp.tpm_result); if (res) { - error_report("tpm-emulator: TPM result for rest establixhed flag: 0x%x", - res); + error_report( + "tpm-emulator: TPM result for rest establixhed flag: 0x%x %s", + res, tpm_emulator_strerror(res)); return -1; } @@ -638,7 +666,8 @@ static int tpm_emulator_get_state_blob(TPMEmulator *tpm_emu, res = be32_to_cpu(pgs.u.resp.tpm_result); if (res != 0 && (res & 0x800) == 0) { error_report("tpm-emulator: Getting the stateblob (type %d) failed " - "with a TPM error 0x%x", type, res); + "with a TPM error 0x%x %s", type, res, + tpm_emulator_strerror(res)); return -1; } @@ -758,7 +787,8 @@ static int tpm_emulator_set_state_blob(TPMEmulator *tpm_emu, tpm_result = be32_to_cpu(pss.u.resp.tpm_result); if (tpm_result != 0) { error_report("tpm-emulator: Setting the stateblob (type %d) failed " - "with a TPM error 0x%x", type, tpm_result); + "with a TPM error 0x%x %s", type, tpm_result, + tpm_emulator_strerror(tpm_result)); return -1; } @@ -888,8 +918,8 @@ static void tpm_emulator_shutdown(TPMEmulator *tpm_emu) error_report("tpm-emulator: Could not cleanly shutdown the TPM: %s", strerror(errno)); } else if (res != 0) { - error_report("tpm-emulator: TPM result for sutdown: 0x%x", - be32_to_cpu(res)); + error_report("tpm-emulator: TPM result for shutdown: 0x%x %s", + be32_to_cpu(res), tpm_emulator_strerror(be32_to_cpu(res))); } }
Implement a function to translate TPM error codes to strings so that at least the most common error codes can be translated to human readable strings. Signed-off-by: Stefan Berger <stefanb@linux.ibm.com> --- hw/tpm/tpm_emulator.c | 50 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 10 deletions(-)