trousers: add string function for ordinal and error

Add function to convert ordinal and error to human-readable string.

BUG=b:255259293
TEST=build

Change-Id: Idda87f949ed0a8a7c0044797cbf81a9fb0ebf4f2
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/trousers/+/4035875
Reviewed-by: Leo Lai <cylai@google.com>
Tested-by: Ching-Kang Yen <chingkang@chromium.org>
Commit-Queue: Ching-Kang Yen <chingkang@chromium.org>
diff --git a/src/include/trousers/trousers.h b/src/include/trousers/trousers.h
index 3dee970..23405c1 100644
--- a/src/include/trousers/trousers.h
+++ b/src/include/trousers/trousers.h
@@ -281,6 +281,13 @@
 
 /* Error Functions */
 
+/* return a human readable string of enum TCSD_ORD */
+char *Trspi_Ordinal_String(UINT32 ord);
+
+/* return a human readable string of the error code or NULL for unknown
+ * command */
+char *Trspi_Error_Code_String(TSS_RESULT r);
+
 /* return a human readable string based on the result */
 char *Trspi_Error_String(TSS_RESULT);
 
diff --git a/src/trspi/trousers.c b/src/trspi/trousers.c
index 10e57f8..b938a82 100644
--- a/src/trspi/trousers.c
+++ b/src/trspi/trousers.c
@@ -31,6 +31,7 @@
 #include "tsplog.h"
 #include "obj.h"
 #include "tcs_tsp.h"
+#include "tcsd_wrap.h"
 
 void
 Trspi_UnloadBlob_NONCE(UINT64 *offset, BYTE *blob, TPM_NONCE *n)
@@ -1815,6 +1816,351 @@
 	Trspi_LoadBlob(offset, payloadLength, blob, bd.payloadData);
 }
 
+char *
+Trspi_Ordinal_String(UINT32 ord) {
+  switch(ord) {
+    case TCSD_ORD_ERROR: return "TCSD_ORD_ERROR";
+    case TCSD_ORD_OPENCONTEXT: return "TCSD_ORD_OPENCONTEXT";
+    case TCSD_ORD_CLOSECONTEXT: return "TCSD_ORD_CLOSECONTEXT";
+    case TCSD_ORD_FREEMEMORY: return "TCSD_ORD_FREEMEMORY";
+    case TCSD_ORD_TCSGETCAPABILITY: return "TCSD_ORD_TCSGETCAPABILITY";
+    case TCSD_ORD_REGISTERKEY: return "TCSD_ORD_REGISTERKEY";
+    case TCSD_ORD_UNREGISTERKEY: return "TCSD_ORD_UNREGISTERKEY";
+    case TCSD_ORD_ENUMREGISTEREDKEYS: return "TCSD_ORD_ENUMREGISTEREDKEYS";
+    case TCSD_ORD_GETREGISTEREDKEY: return "TCSD_ORD_GETREGISTEREDKEY";
+    case TCSD_ORD_GETREGISTEREDKEYBLOB: return "TCSD_ORD_GETREGISTEREDKEYBLOB";
+    case TCSD_ORD_GETREGISTEREDKEYBYPUBLICINFO: return "TCSD_ORD_GETREGISTEREDKEYBYPUBLICINFO";
+    case TCSD_ORD_LOADKEYBYBLOB: return "TCSD_ORD_LOADKEYBYBLOB";
+    case TCSD_ORD_LOADKEYBYUUID: return "TCSD_ORD_LOADKEYBYUUID";
+    case TCSD_ORD_EVICTKEY: return "TCSD_ORD_EVICTKEY";
+    case TCSD_ORD_CREATEWRAPKEY: return "TCSD_ORD_CREATEWRAPKEY";
+    case TCSD_ORD_GETPUBKEY: return "TCSD_ORD_GETPUBKEY";
+    case TCSD_ORD_MAKEIDENTITY: return "TCSD_ORD_MAKEIDENTITY";
+    case TCSD_ORD_LOGPCREVENT: return "TCSD_ORD_LOGPCREVENT";
+    case TCSD_ORD_GETPCREVENT: return "TCSD_ORD_GETPCREVENT";
+    case TCSD_ORD_GETPCREVENTBYPCR: return "TCSD_ORD_GETPCREVENTBYPCR";
+    case TCSD_ORD_GETPCREVENTLOG: return "TCSD_ORD_GETPCREVENTLOG";
+    case TCSD_ORD_SETOWNERINSTALL: return "TCSD_ORD_SETOWNERINSTALL";
+    case TCSD_ORD_TAKEOWNERSHIP: return "TCSD_ORD_TAKEOWNERSHIP";
+    case TCSD_ORD_OIAP: return "TCSD_ORD_OIAP";
+    case TCSD_ORD_OSAP: return "TCSD_ORD_OSAP";
+    case TCSD_ORD_CHANGEAUTH: return "TCSD_ORD_CHANGEAUTH";
+    case TCSD_ORD_CHANGEAUTHOWNER: return "TCSD_ORD_CHANGEAUTHOWNER";
+    case TCSD_ORD_CHANGEAUTHASYMSTART: return "TCSD_ORD_CHANGEAUTHASYMSTART";
+    case TCSD_ORD_CHANGEAUTHASYMFINISH: return "TCSD_ORD_CHANGEAUTHASYMFINISH";
+    case TCSD_ORD_TERMINATEHANDLE: return "TCSD_ORD_TERMINATEHANDLE";
+    case TCSD_ORD_ACTIVATETPMIDENTITY: return "TCSD_ORD_ACTIVATETPMIDENTITY";
+    case TCSD_ORD_EXTEND: return "TCSD_ORD_EXTEND";
+    case TCSD_ORD_PCRREAD: return "TCSD_ORD_PCRREAD";
+    case TCSD_ORD_QUOTE: return "TCSD_ORD_QUOTE";
+    case TCSD_ORD_DIRWRITEAUTH: return "TCSD_ORD_DIRWRITEAUTH";
+    case TCSD_ORD_DIRREAD: return "TCSD_ORD_DIRREAD";
+    case TCSD_ORD_SEAL: return "TCSD_ORD_SEAL";
+    case TCSD_ORD_UNSEAL: return "TCSD_ORD_UNSEAL";
+    case TCSD_ORD_UNBIND: return "TCSD_ORD_UNBIND";
+    case TCSD_ORD_CREATEMIGRATIONBLOB: return "TCSD_ORD_CREATEMIGRATIONBLOB";
+    case TCSD_ORD_CONVERTMIGRATIONBLOB: return "TCSD_ORD_CONVERTMIGRATIONBLOB";
+    case TCSD_ORD_AUTHORIZEMIGRATIONKEY: return "TCSD_ORD_AUTHORIZEMIGRATIONKEY";
+    case TCSD_ORD_CERTIFYKEY: return "TCSD_ORD_CERTIFYKEY";
+    case TCSD_ORD_SIGN: return "TCSD_ORD_SIGN";
+    case TCSD_ORD_GETRANDOM: return "TCSD_ORD_GETRANDOM";
+    case TCSD_ORD_STIRRANDOM: return "TCSD_ORD_STIRRANDOM";
+    case TCSD_ORD_GETCAPABILITY: return "TCSD_ORD_GETCAPABILITY";
+    case TCSD_ORD_GETCAPABILITYSIGNED: return "TCSD_ORD_GETCAPABILITYSIGNED";
+    case TCSD_ORD_GETCAPABILITYOWNER: return "TCSD_ORD_GETCAPABILITYOWNER";
+    case TCSD_ORD_CREATEENDORSEMENTKEYPAIR: return "TCSD_ORD_CREATEENDORSEMENTKEYPAIR";
+    case TCSD_ORD_READPUBEK: return "TCSD_ORD_READPUBEK";
+    case TCSD_ORD_DISABLEPUBEKREAD: return "TCSD_ORD_DISABLEPUBEKREAD";
+    case TCSD_ORD_OWNERREADPUBEK: return "TCSD_ORD_OWNERREADPUBEK";
+    case TCSD_ORD_SELFTESTFULL: return "TCSD_ORD_SELFTESTFULL";
+    case TCSD_ORD_CERTIFYSELFTEST: return "TCSD_ORD_CERTIFYSELFTEST";
+    case TCSD_ORD_CONTINUESELFTEST: return "TCSD_ORD_CONTINUESELFTEST";
+    case TCSD_ORD_GETTESTRESULT: return "TCSD_ORD_GETTESTRESULT";
+    case TCSD_ORD_OWNERSETDISABLE: return "TCSD_ORD_OWNERSETDISABLE";
+    case TCSD_ORD_OWNERCLEAR: return "TCSD_ORD_OWNERCLEAR";
+    case TCSD_ORD_DISABLEOWNERCLEAR: return "TCSD_ORD_DISABLEOWNERCLEAR";
+    case TCSD_ORD_FORCECLEAR: return "TCSD_ORD_FORCECLEAR";
+    case TCSD_ORD_DISABLEFORCECLEAR: return "TCSD_ORD_DISABLEFORCECLEAR";
+    case TCSD_ORD_PHYSICALDISABLE: return "TCSD_ORD_PHYSICALDISABLE";
+    case TCSD_ORD_PHYSICALENABLE: return "TCSD_ORD_PHYSICALENABLE";
+    case TCSD_ORD_PHYSICALSETDEACTIVATED: return "TCSD_ORD_PHYSICALSETDEACTIVATED";
+    case TCSD_ORD_SETTEMPDEACTIVATED: return "TCSD_ORD_SETTEMPDEACTIVATED";
+    case TCSD_ORD_PHYSICALPRESENCE: return "TCSD_ORD_PHYSICALPRESENCE";
+    case TCSD_ORD_FIELDUPGRADE: return "TCSD_ORD_FIELDUPGRADE";
+    case TCSD_ORD_SETRIDIRECTION: return "TCSD_ORD_SETRIDIRECTION";
+    case TCSD_ORD_CREATEMAINTENANCEARCHIVE: return "TCSD_ORD_CREATEMAINTENANCEARCHIVE";
+    case TCSD_ORD_LOADMAINTENANCEARCHIVE: return "TCSD_ORD_LOADMAINTENANCEARCHIVE";
+    case TCSD_ORD_KILLMAINTENANCEFEATURE: return "TCSD_ORD_KILLMAINTENANCEFEATURE";
+    case TCSD_ORD_LOADMANUFACTURERMAINTENANCEPUB: return "TCSD_ORD_LOADMANUFACTURERMAINTENANCEPUB";
+    case TCSD_ORD_READMANUFACTURERMAINTENANCEPUB: return "TCSD_ORD_READMANUFACTURERMAINTENANCEPUB";
+    case TCSD_ORD_DAAJOIN: return "TCSD_ORD_DAAJOIN";
+    case TCSD_ORD_DAASIGN: return "TCSD_ORD_DAASIGN";
+    case TCSD_ORD_SETCAPABILITY: return "TCSD_ORD_SETCAPABILITY";
+    case TCSD_ORD_RESETLOCKVALUE: return "TCSD_ORD_RESETLOCKVALUE";
+    case TCSD_ORD_PCRRESET: return "TCSD_ORD_PCRRESET";
+    case TCSD_ORD_READCOUNTER: return "TCSD_ORD_READCOUNTER";
+    case TCSD_ORD_CREATECOUNTER: return "TCSD_ORD_CREATECOUNTER";
+    case TCSD_ORD_INCREMENTCOUNTER: return "TCSD_ORD_INCREMENTCOUNTER";
+    case TCSD_ORD_RELEASECOUNTER: return "TCSD_ORD_RELEASECOUNTER";
+    case TCSD_ORD_RELEASECOUNTEROWNER: return "TCSD_ORD_RELEASECOUNTEROWNER";
+    case TCSD_ORD_READCURRENTTICKS: return "TCSD_ORD_READCURRENTTICKS";
+    case TCSD_ORD_TICKSTAMPBLOB: return "TCSD_ORD_TICKSTAMPBLOB";
+    case TCSD_ORD_GETCREDENTIAL: return "TCSD_ORD_GETCREDENTIAL";
+    case TCSD_ORD_NVDEFINEORRELEASESPACE: return "TCSD_ORD_NVDEFINEORRELEASESPACE";
+    case TCSD_ORD_NVWRITEVALUE: return "TCSD_ORD_NVWRITEVALUE";
+    case TCSD_ORD_NVWRITEVALUEAUTH: return "TCSD_ORD_NVWRITEVALUEAUTH";
+    case TCSD_ORD_NVREADVALUE: return "TCSD_ORD_NVREADVALUE";
+    case TCSD_ORD_NVREADVALUEAUTH: return "TCSD_ORD_NVREADVALUEAUTH";
+    case TCSD_ORD_ESTABLISHTRANSPORT: return "TCSD_ORD_ESTABLISHTRANSPORT";
+    case TCSD_ORD_EXECUTETRANSPORT: return "TCSD_ORD_EXECUTETRANSPORT";
+    case TCSD_ORD_RELEASETRANSPORTSIGNED: return "TCSD_ORD_RELEASETRANSPORTSIGNED";
+    case TCSD_ORD_SETORDINALAUDITSTATUS: return "TCSD_ORD_SETORDINALAUDITSTATUS";
+    case TCSD_ORD_GETAUDITDIGEST: return "TCSD_ORD_GETAUDITDIGEST";
+    case TCSD_ORD_GETAUDITDIGESTSIGNED: return "TCSD_ORD_GETAUDITDIGESTSIGNED";
+    case TCSD_ORD_SEALX: return "TCSD_ORD_SEALX";
+    case TCSD_ORD_SETOPERATORAUTH: return "TCSD_ORD_SETOPERATORAUTH";
+    case TCSD_ORD_OWNERREADINTERNALPUB: return "TCSD_ORD_OWNERREADINTERNALPUB";
+    case TCSD_ORD_ENUMREGISTEREDKEYS2: return "TCSD_ORD_ENUMREGISTEREDKEYS2";
+    case TCSD_ORD_SETTEMPDEACTIVATED2: return "TCSD_ORD_SETTEMPDEACTIVATED2";
+    case TCSD_ORD_DELEGATE_MANAGE: return "TCSD_ORD_DELEGATE_MANAGE";
+    case TCSD_ORD_DELEGATE_CREATEKEYDELEGATION: return "TCSD_ORD_DELEGATE_CREATEKEYDELEGATION";
+    case TCSD_ORD_DELEGATE_CREATEOWNERDELEGATION: return "TCSD_ORD_DELEGATE_CREATEOWNERDELEGATION";
+    case TCSD_ORD_DELEGATE_LOADOWNERDELEGATION: return "TCSD_ORD_DELEGATE_LOADOWNERDELEGATION";
+    case TCSD_ORD_DELEGATE_READTABLE: return "TCSD_ORD_DELEGATE_READTABLE";
+    case TCSD_ORD_DELEGATE_UPDATEVERIFICATIONCOUNT: return "TCSD_ORD_DELEGATE_UPDATEVERIFICATIONCOUNT";
+    case TCSD_ORD_DELEGATE_VERIFYDELEGATION: return "TCSD_ORD_DELEGATE_VERIFYDELEGATION";
+    case TCSD_ORD_CREATEREVOCABLEENDORSEMENTKEYPAIR: return "TCSD_ORD_CREATEREVOCABLEENDORSEMENTKEYPAIR";
+    case TCSD_ORD_REVOKEENDORSEMENTKEYPAIR: return "TCSD_ORD_REVOKEENDORSEMENTKEYPAIR";
+    case TCSD_ORD_MAKEIDENTITY2: return "TCSD_ORD_MAKEIDENTITY2";
+    case TCSD_ORD_QUOTE2: return "TCSD_ORD_QUOTE2";
+    case TCSD_ORD_CMK_SETRESTRICTIONS: return "TCSD_ORD_CMK_SETRESTRICTIONS";
+    case TCSD_ORD_CMK_APPROVEMA: return "TCSD_ORD_CMK_APPROVEMA";
+    case TCSD_ORD_CMK_CREATEKEY: return "TCSD_ORD_CMK_CREATEKEY";
+    case TCSD_ORD_CMK_CREATETICKET: return "TCSD_ORD_CMK_CREATETICKET";
+    case TCSD_ORD_CMK_CREATEBLOB: return "TCSD_ORD_CMK_CREATEBLOB";
+    case TCSD_ORD_CMK_CONVERTMIGRATION: return "TCSD_ORD_CMK_CONVERTMIGRATION";
+    case TCSD_ORD_FLUSHSPECIFIC: return "TCSD_ORD_FLUSHSPECIFIC";
+    case TCSD_ORD_KEYCONTROLOWNER: return "TCSD_ORD_KEYCONTROLOWNER";
+    case TCSD_ORD_DSAP: return "TCSD_ORD_DSAP";
+    default: return NULL;
+  }
+  return NULL;
+}
+
+char *
+Trspi_Error_Code_String(TSS_RESULT r) {
+  if (TSS_ERROR_CODE(r) == TSS_SUCCESS) {
+    return "TSS_SUCCESS";
+  }
+  if (TSS_ERROR_LAYER(r) == TSS_LAYER_TPM) {
+    switch (TSS_ERROR_CODE(r)) {
+      case TPM_E_AUTHFAIL: return "TPM_E_AUTHFAIL";
+      case TPM_E_BAD_PARAMETER: return "TPM_E_BAD_PARAMETER";
+      case TPM_E_BADINDEX: return "TPM_E_BADINDEX";
+      case TPM_E_AUDITFAILURE: return "TPM_E_AUDITFAILURE";
+      case TPM_E_CLEAR_DISABLED: return "TPM_E_CLEAR_DISABLED";
+      case TPM_E_DEACTIVATED: return "TPM_E_DEACTIVATED";
+      case TPM_E_DISABLED: return "TPM_E_DISABLED";
+      case TPM_E_FAIL: return "TPM_E_FAIL";
+      case TPM_E_BAD_ORDINAL: return "TPM_E_BAD_ORDINAL";
+      case TPM_E_INSTALL_DISABLED: return "TPM_E_INSTALL_DISABLED";
+      case TPM_E_INVALID_KEYHANDLE: return "TPM_E_INVALID_KEYHANDLE";
+      case TPM_E_KEYNOTFOUND: return "TPM_E_KEYNOTFOUND";
+      case TPM_E_INAPPROPRIATE_ENC: return "TPM_E_INAPPROPRIATE_ENC";
+      case TPM_E_MIGRATEFAIL: return "TPM_E_MIGRATEFAIL";
+      case TPM_E_INVALID_PCR_INFO: return "TPM_E_INVALID_PCR_INFO";
+      case TPM_E_NOSPACE: return "TPM_E_NOSPACE";
+      case TPM_E_NOSRK: return "TPM_E_NOSRK";
+      case TPM_E_NOTSEALED_BLOB: return "TPM_E_NOTSEALED_BLOB";
+      case TPM_E_OWNER_SET: return "TPM_E_OWNER_SET";
+      case TPM_E_RESOURCES: return "TPM_E_RESOURCES";
+      case TPM_E_SHORTRANDOM: return "TPM_E_SHORTRANDOM";
+      case TPM_E_SIZE: return "TPM_E_SIZE";
+      case TPM_E_WRONGPCRVAL: return "TPM_E_WRONGPCRVAL";
+      case TPM_E_BAD_PARAM_SIZE: return "TPM_E_BAD_PARAM_SIZE";
+      case TPM_E_SHA_THREAD: return "TPM_E_SHA_THREAD";
+      case TPM_E_SHA_ERROR: return "TPM_E_SHA_ERROR";
+      case TPM_E_FAILEDSELFTEST: return "TPM_E_FAILEDSELFTEST";
+      case TPM_E_AUTH2FAIL: return "TPM_E_AUTH2FAIL";
+      case TPM_E_BADTAG: return "TPM_E_BADTAG";
+      case TPM_E_IOERROR: return "TPM_E_IOERROR";
+      case TPM_E_ENCRYPT_ERROR: return "TPM_E_ENCRYPT_ERROR";
+      case TPM_E_DECRYPT_ERROR: return "TPM_E_DECRYPT_ERROR";
+      case TPM_E_INVALID_AUTHHANDLE: return "TPM_E_INVALID_AUTHHANDLE";
+      case TPM_E_NO_ENDORSEMENT: return "TPM_E_NO_ENDORSEMENT";
+      case TPM_E_INVALID_KEYUSAGE: return "TPM_E_INVALID_KEYUSAGE";
+      case TPM_E_WRONG_ENTITYTYPE: return "TPM_E_WRONG_ENTITYTYPE";
+      case TPM_E_INVALID_POSTINIT: return "TPM_E_INVALID_POSTINIT";
+      case TPM_E_INAPPROPRIATE_SIG: return "TPM_E_INAPPROPRIATE_SIG";
+      case TPM_E_BAD_KEY_PROPERTY: return "TPM_E_BAD_KEY_PROPERTY";
+      case TPM_E_BAD_MIGRATION: return "TPM_E_BAD_MIGRATION";
+      case TPM_E_BAD_SCHEME: return "TPM_E_BAD_SCHEME";
+      case TPM_E_BAD_DATASIZE: return "TPM_E_BAD_DATASIZE";
+      case TPM_E_BAD_MODE: return "TPM_E_BAD_MODE";
+      case TPM_E_BAD_PRESENCE: return "TPM_E_BAD_PRESENCE";
+      case TPM_E_BAD_VERSION: return "TPM_E_BAD_VERSION";
+      case TPM_E_NO_WRAP_TRANSPORT: return "TPM_E_NO_WRAP_TRANSPORT";
+      case TPM_E_AUDITFAIL_UNSUCCESSFUL: return "TPM_E_AUDITFAIL_UNSUCCESSFUL";
+      case TPM_E_AUDITFAIL_SUCCESSFUL: return "TPM_E_AUDITFAIL_SUCCESSFUL";
+      case TPM_E_NOTRESETABLE: return "TPM_E_NOTRESETABLE";
+      case TPM_E_NOTLOCAL: return "TPM_E_NOTLOCAL";
+      case TPM_E_BAD_TYPE: return "TPM_E_BAD_TYPE";
+      case TPM_E_INVALID_RESOURCE: return "TPM_E_INVALID_RESOURCE";
+      case TPM_E_NOTFIPS: return "TPM_E_NOTFIPS";
+      case TPM_E_INVALID_FAMILY: return "TPM_E_INVALID_FAMILY";
+      case TPM_E_NO_NV_PERMISSION: return "TPM_E_NO_NV_PERMISSION";
+      case TPM_E_REQUIRES_SIGN: return "TPM_E_REQUIRES_SIGN";
+      case TPM_E_KEY_NOTSUPPORTED: return "TPM_E_KEY_NOTSUPPORTED";
+      case TPM_E_AUTH_CONFLICT: return "TPM_E_AUTH_CONFLICT";
+      case TPM_E_AREA_LOCKED: return "TPM_E_AREA_LOCKED";
+      case TPM_E_BAD_LOCALITY: return "TPM_E_BAD_LOCALITY";
+      case TPM_E_READ_ONLY: return "TPM_E_READ_ONLY";
+      case TPM_E_PER_NOWRITE: return "TPM_E_PER_NOWRITE";
+      case TPM_E_FAMILYCOUNT: return "TPM_E_FAMILYCOUNT";
+      case TPM_E_WRITE_LOCKED: return "TPM_E_WRITE_LOCKED";
+      case TPM_E_BAD_ATTRIBUTES: return "TPM_E_BAD_ATTRIBUTES";
+      case TPM_E_INVALID_STRUCTURE: return "TPM_E_INVALID_STRUCTURE";
+      case TPM_E_KEY_OWNER_CONTROL: return "TPM_E_KEY_OWNER_CONTROL";
+      case TPM_E_BAD_COUNTER: return "TPM_E_BAD_COUNTER";
+      case TPM_E_NOT_FULLWRITE: return "TPM_E_NOT_FULLWRITE";
+      case TPM_E_CONTEXT_GAP: return "TPM_E_CONTEXT_GAP";
+      case TPM_E_MAXNVWRITES: return "TPM_E_MAXNVWRITES";
+      case TPM_E_NOOPERATOR: return "TPM_E_NOOPERATOR";
+      case TPM_E_RESOURCEMISSING: return "TPM_E_RESOURCEMISSING";
+      case TPM_E_DELEGATE_LOCK: return "TPM_E_DELEGATE_LOCK";
+      case TPM_E_DELEGATE_FAMILY: return "TPM_E_DELEGATE_FAMILY";
+      case TPM_E_DELEGATE_ADMIN: return "TPM_E_DELEGATE_ADMIN";
+      case TPM_E_TRANSPORT_NOTEXCLUSIVE: return "TPM_E_TRANSPORT_NOTEXCLUSIVE";
+      case TPM_E_OWNER_CONTROL: return "TPM_E_OWNER_CONTROL";
+      case TPM_E_DAA_RESOURCES: return "TPM_E_DAA_RESOURCES";
+      case TPM_E_DAA_INPUT_DATA0: return "TPM_E_DAA_INPUT_DATA0";
+      case TPM_E_DAA_INPUT_DATA1: return "TPM_E_DAA_INPUT_DATA1";
+      case TPM_E_DAA_ISSUER_SETTINGS: return "TPM_E_DAA_ISSUER_SETTINGS";
+      case TPM_E_DAA_TPM_SETTINGS: return "TPM_E_DAA_TPM_SETTINGS";
+      case TPM_E_DAA_STAGE: return "TPM_E_DAA_STAGE";
+      case TPM_E_DAA_ISSUER_VALIDITY: return "TPM_E_DAA_ISSUER_VALIDITY";
+      case TPM_E_DAA_WRONG_W: return "TPM_E_DAA_WRONG_W";
+      case TPM_E_BAD_HANDLE: return "TPM_E_BAD_HANDLE";
+      case TPM_E_BAD_DELEGATE: return "TPM_E_BAD_DELEGATE";
+      case TPM_E_BADCONTEXT: return "TPM_E_BADCONTEXT";
+      case TPM_E_TOOMANYCONTEXTS: return "TPM_E_TOOMANYCONTEXTS";
+      case TPM_E_MA_TICKET_SIGNATURE: return "TPM_E_MA_TICKET_SIGNATURE";
+      case TPM_E_MA_DESTINATION: return "TPM_E_MA_DESTINATION";
+      case TPM_E_MA_SOURCE: return "TPM_E_MA_SOURCE";
+      case TPM_E_MA_AUTHORITY: return "TPM_E_MA_AUTHORITY";
+      case TPM_E_PERMANENTEK: return "TPM_E_PERMANENTEK";
+      case TPM_E_BAD_SIGNATURE: return "TPM_E_BAD_SIGNATURE";
+      case TPM_E_NOCONTEXTSPACE: return "TPM_E_NOCONTEXTSPACE";
+      case TPM_E_RETRY:      return "TPM_E_RETRY";
+      case TPM_E_NEEDS_SELFTEST: return "TPM_E_NEEDS_SELFTEST";
+      case TPM_E_DOING_SELFTEST: return "TPM_E_DOING_SELFTEST";
+      case TPM_E_DEFEND_LOCK_RUNNING: return "TPM_E_DEFEND_LOCK_RUNNING";
+      case TPM_E_DISABLED_CMD: return "TPM_E_DISABLED_CMD";
+      default: return NULL;
+    }
+  } else if (TSS_ERROR_LAYER(r) == TSS_LAYER_TDDL) {
+    switch (TSS_ERROR_CODE(r)) {
+      case TSS_E_FAIL: return "TSS_E_FAIL";
+      case TSS_E_BAD_PARAMETER: return "TSS_E_BAD_PARAMETER";
+      case TSS_E_INTERNAL_ERROR: return "TSS_E_INTERNAL_ERROR";
+      case TSS_E_NOTIMPL: return "TSS_E_NOTIMPL";
+      case TSS_E_PS_KEY_NOTFOUND: return "TSS_E_PS_KEY_NOTFOUND";
+      case TSS_E_KEY_ALREADY_REGISTERED: return "TSS_E_KEY_ALREADY_REGISTERED";
+      case TSS_E_CANCELED: return "TSS_E_CANCELED";
+      case TSS_E_TIMEOUT: return "TSS_E_TIMEOUT";
+      case TSS_E_OUTOFMEMORY: return "TSS_E_OUTOFMEMORY";
+      case TSS_E_TPM_UNEXPECTED: return "TSS_E_TPM_UNEXPECTED";
+      case TSS_E_COMM_FAILURE: return "TSS_E_COMM_FAILURE";
+      case TSS_E_TPM_UNSUPPORTED_FEATURE: return "TSS_E_TPM_UNSUPPORTED_FEATURE";
+      case TDDL_E_COMPONENT_NOT_FOUND: return "TDDL_E_COMPONENT_NOT_FOUND";
+      case TDDL_E_ALREADY_OPENED: return "TDDL_E_ALREADY_OPENED";
+      case TDDL_E_BADTAG: return "TDDL_E_BADTAG";
+      case TDDL_E_INSUFFICIENT_BUFFER: return "TDDL_E_INSUFFICIENT_BUFFER";
+      case TDDL_E_COMMAND_COMPLETED: return "TDDL_E_COMMAND_COMPLETED";
+      case TDDL_E_COMMAND_ABORTED: return "TDDL_E_COMMAND_ABORTED";
+      case TDDL_E_ALREADY_CLOSED: return "TDDL_E_ALREADY_CLOSED";
+      case TDDL_E_IOERROR: return "TDDL_E_IOERROR";
+      default: return NULL;
+    }
+  } else if (TSS_ERROR_LAYER(r) == TSS_LAYER_TCS) {
+    switch (TSS_ERROR_CODE(r)) {
+      case TSS_E_FAIL: return "TSS_E_FAIL";
+      case TSS_E_BAD_PARAMETER: return "TSS_E_BAD_PARAMETER";
+      case TSS_E_INTERNAL_ERROR: return "TSS_E_INTERNAL_ERROR";
+      case TSS_E_NOTIMPL: return "TSS_E_NOTIMPL";
+      case TSS_E_PS_KEY_NOTFOUND: return "TSS_E_PS_KEY_NOTFOUND";
+      case TSS_E_KEY_ALREADY_REGISTERED: return "TSS_E_KEY_ALREADY_REGISTERED";
+      case TSS_E_CANCELED: return "TSS_E_CANCELED";
+      case TSS_E_TIMEOUT: return "TSS_E_TIMEOUT";
+      case TSS_E_OUTOFMEMORY: return "TSS_E_OUTOFMEMORY";
+      case TSS_E_TPM_UNEXPECTED: return "TSS_E_TPM_UNEXPECTED";
+      case TSS_E_COMM_FAILURE: return "TSS_E_COMM_FAILURE";
+      case TSS_E_TPM_UNSUPPORTED_FEATURE: return "TSS_E_TPM_UNSUPPORTED_FEATURE";
+      case TCS_E_KEY_MISMATCH: return "TCS_E_KEY_MISMATCH";
+      case TCS_E_KM_LOADFAILED:    return "TCS_E_KM_LOADFAILED";
+      case TCS_E_KEY_CONTEXT_RELOAD: return "TCS_E_KEY_CONTEXT_RELOAD";
+      case TCS_E_BAD_INDEX: return "TCS_E_BAD_INDEX";
+      case TCS_E_INVALID_CONTEXTHANDLE: return "TCS_E_INVALID_CONTEXTHANDLE";
+      case TCS_E_INVALID_KEYHANDLE: return "TCS_E_INVALID_KEYHANDLE";
+      case TCS_E_INVALID_AUTHHANDLE: return "TCS_E_INVALID_AUTHHANDLE";
+      case TCS_E_INVALID_AUTHSESSION: return "TCS_E_INVALID_AUTHSESSION";
+      case TCS_E_INVALID_KEY: return "TCS_E_INVALID_KEY";
+      default: return NULL;
+    }
+  } else {
+    switch (TSS_ERROR_CODE(r)) {
+      case TSS_E_FAIL: return "TSS_E_FAIL";
+      case TSS_E_BAD_PARAMETER: return "TSS_E_BAD_PARAMETER";
+      case TSS_E_INTERNAL_ERROR: return "TSS_E_INTERNAL_ERROR";
+      case TSS_E_NOTIMPL: return "TSS_E_NOTIMPL";
+      case TSS_E_PS_KEY_NOTFOUND: return "TSS_E_PS_KEY_NOTFOUND";
+      case TSS_E_KEY_ALREADY_REGISTERED: return "TSS_E_KEY_ALREADY_REGISTERED";
+      case TSS_E_CANCELED: return "TSS_E_CANCELED";
+      case TSS_E_TIMEOUT: return "TSS_E_TIMEOUT";
+      case TSS_E_OUTOFMEMORY: return "TSS_E_OUTOFMEMORY";
+      case TSS_E_TPM_UNEXPECTED: return "TSS_E_TPM_UNEXPECTED";
+      case TSS_E_COMM_FAILURE: return "TSS_E_COMM_FAILURE";
+      case TSS_E_TPM_UNSUPPORTED_FEATURE: return "TSS_E_TPM_UNSUPPORTED_FEATURE";
+      case TSS_E_INVALID_OBJECT_TYPE: return "TSS_E_INVALID_OBJECT_TYPE";
+      case TSS_E_INVALID_OBJECT_INITFLAG: return "TSS_E_INVALID_OBJECT_INITFLAG";
+      case TSS_E_INVALID_HANDLE: return "TSS_E_INVALID_HANDLE";
+      case TSS_E_NO_CONNECTION: return "TSS_E_NO_CONNECTION";
+      case TSS_E_CONNECTION_FAILED: return "TSS_E_CONNECTION_FAILED";
+      case TSS_E_CONNECTION_BROKEN: return "TSS_E_CONNECTION_BROKEN";
+      case TSS_E_HASH_INVALID_ALG: return "TSS_E_HASH_INVALID_ALG";
+      case TSS_E_HASH_INVALID_LENGTH: return "TSS_E_HASH_INVALID_LENGTH";
+      case TSS_E_HASH_NO_DATA: return "TSS_E_HASH_NO_DATA";
+      case TSS_E_SILENT_CONTEXT: return "TSS_E_SILENT_CONTEXT";
+      case TSS_E_INVALID_ATTRIB_FLAG: return "TSS_E_INVALID_ATTRIB_FLAG";
+      case TSS_E_INVALID_ATTRIB_SUBFLAG: return "TSS_E_INVALID_ATTRIB_SUBFLAG";
+      case TSS_E_INVALID_ATTRIB_DATA: return "TSS_E_INVALID_ATTRIB_DATA";
+      case TSS_E_NO_PCRS_SET: return "TSS_E_NO_PCRS_SET";
+      case TSS_E_KEY_NOT_LOADED: return "TSS_E_KEY_NOT_LOADED";
+      case TSS_E_KEY_NOT_SET: return "TSS_E_KEY_NOT_SET";
+      case TSS_E_VALIDATION_FAILED: return "TSS_E_VALIDATION_FAILED";
+      case TSS_E_TSP_AUTHREQUIRED: return "TSS_E_TSP_AUTHREQUIRED";
+      case TSS_E_TSP_AUTH2REQUIRED: return "TSS_E_TSP_AUTH2REQUIRED";
+      case TSS_E_TSP_AUTHFAIL: return "TSS_E_TSP_AUTHFAIL";
+      case TSS_E_TSP_AUTH2FAIL: return "TSS_E_TSP_AUTH2FAIL";
+      case TSS_E_KEY_NO_MIGRATION_POLICY: return "TSS_E_KEY_NO_MIGRATION_POLICY";
+      case TSS_E_POLICY_NO_SECRET: return "TSS_E_POLICY_NO_SECRET";
+      case TSS_E_INVALID_OBJ_ACCESS: return "TSS_E_INVALID_OBJ_ACCESS";
+      case TSS_E_INVALID_ENCSCHEME: return "TSS_E_INVALID_ENCSCHEME";
+      case TSS_E_INVALID_SIGSCHEME: return "TSS_E_INVALID_SIGSCHEME";
+      case TSS_E_ENC_INVALID_LENGTH: return "TSS_E_ENC_INVALID_LENGTH";
+      case TSS_E_ENC_NO_DATA: return "TSS_E_ENC_NO_DATA";
+      case TSS_E_ENC_INVALID_TYPE: return "TSS_E_ENC_INVALID_TYPE";
+      case TSS_E_INVALID_KEYUSAGE: return "TSS_E_INVALID_KEYUSAGE";
+      case TSS_E_VERIFICATION_FAILED: return "TSS_E_VERIFICATION_FAILED";
+      case TSS_E_HASH_NO_IDENTIFIER: return "TSS_E_HASH_NO_IDENTIFIER";
+      case TSS_E_NV_AREA_EXIST: return "TSS_E_NV_AREA_EXIST";
+      case TSS_E_NV_AREA_NOT_EXIST: return "TSS_E_NV_AREA_NOT_EXIST";
+      default: return NULL;
+    }
+  }
+  return NULL;
+}
+
 /* function to mimic strerror with TSS error codes */
 char *
 Trspi_Error_String(TSS_RESULT r)