/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "tpm_commands.h"

#include <tss2/tss2_tpm2_types.h>

#include <cstddef>
#include <string>

namespace cuttlefish {

std::string TpmCommandName(std::uint32_t command_num) {
  switch(command_num) {
    #define MATCH_TPM_COMMAND(name) case name: return #name;
    MATCH_TPM_COMMAND(TPM2_CC_NV_UndefineSpaceSpecial)
    MATCH_TPM_COMMAND(TPM2_CC_EvictControl)
    MATCH_TPM_COMMAND(TPM2_CC_HierarchyControl)
    MATCH_TPM_COMMAND(TPM2_CC_NV_UndefineSpace)
    MATCH_TPM_COMMAND(TPM2_CC_ChangeEPS)
    MATCH_TPM_COMMAND(TPM2_CC_ChangePPS)
    MATCH_TPM_COMMAND(TPM2_CC_Clear)
    MATCH_TPM_COMMAND(TPM2_CC_ClearControl)
    MATCH_TPM_COMMAND(TPM2_CC_ClockSet)
    MATCH_TPM_COMMAND(TPM2_CC_HierarchyChangeAuth)
    MATCH_TPM_COMMAND(TPM2_CC_NV_DefineSpace)
    MATCH_TPM_COMMAND(TPM2_CC_PCR_Allocate)
    MATCH_TPM_COMMAND(TPM2_CC_PCR_SetAuthPolicy)
    MATCH_TPM_COMMAND(TPM2_CC_PP_Commands)
    MATCH_TPM_COMMAND(TPM2_CC_SetPrimaryPolicy)
    MATCH_TPM_COMMAND(TPM2_CC_FieldUpgradeStart)
    MATCH_TPM_COMMAND(TPM2_CC_ClockRateAdjust)
    MATCH_TPM_COMMAND(TPM2_CC_CreatePrimary)
    MATCH_TPM_COMMAND(TPM2_CC_NV_GlobalWriteLock)
    MATCH_TPM_COMMAND(TPM2_CC_GetCommandAuditDigest)
    MATCH_TPM_COMMAND(TPM2_CC_NV_Increment)
    MATCH_TPM_COMMAND(TPM2_CC_NV_SetBits)
    MATCH_TPM_COMMAND(TPM2_CC_NV_Extend)
    MATCH_TPM_COMMAND(TPM2_CC_NV_Write)
    MATCH_TPM_COMMAND(TPM2_CC_NV_WriteLock)
    MATCH_TPM_COMMAND(TPM2_CC_DictionaryAttackLockReset)
    MATCH_TPM_COMMAND(TPM2_CC_DictionaryAttackParameters)
    MATCH_TPM_COMMAND(TPM2_CC_NV_ChangeAuth)
    MATCH_TPM_COMMAND(TPM2_CC_PCR_Event)
    MATCH_TPM_COMMAND(TPM2_CC_PCR_Reset)
    MATCH_TPM_COMMAND(TPM2_CC_SequenceComplete)
    MATCH_TPM_COMMAND(TPM2_CC_SetAlgorithmSet)
    MATCH_TPM_COMMAND(TPM2_CC_SetCommandCodeAuditStatus)
    MATCH_TPM_COMMAND(TPM2_CC_FieldUpgradeData)
    MATCH_TPM_COMMAND(TPM2_CC_IncrementalSelfTest)
    MATCH_TPM_COMMAND(TPM2_CC_SelfTest)
    MATCH_TPM_COMMAND(TPM2_CC_Startup)
    MATCH_TPM_COMMAND(TPM2_CC_Shutdown)
    MATCH_TPM_COMMAND(TPM2_CC_StirRandom)
    MATCH_TPM_COMMAND(TPM2_CC_ActivateCredential)
    MATCH_TPM_COMMAND(TPM2_CC_Certify)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyNV)
    MATCH_TPM_COMMAND(TPM2_CC_CertifyCreation)
    MATCH_TPM_COMMAND(TPM2_CC_Duplicate)
    MATCH_TPM_COMMAND(TPM2_CC_GetTime)
    MATCH_TPM_COMMAND(TPM2_CC_GetSessionAuditDigest)
    MATCH_TPM_COMMAND(TPM2_CC_NV_Read)
    MATCH_TPM_COMMAND(TPM2_CC_NV_ReadLock)
    MATCH_TPM_COMMAND(TPM2_CC_ObjectChangeAuth)
    MATCH_TPM_COMMAND(TPM2_CC_PolicySecret)
    MATCH_TPM_COMMAND(TPM2_CC_Rewrap)
    MATCH_TPM_COMMAND(TPM2_CC_Create)
    MATCH_TPM_COMMAND(TPM2_CC_ECDH_ZGen)
    MATCH_TPM_COMMAND(TPM2_CC_HMAC)
    MATCH_TPM_COMMAND(TPM2_CC_Import)
    MATCH_TPM_COMMAND(TPM2_CC_Load)
    MATCH_TPM_COMMAND(TPM2_CC_Quote)
    MATCH_TPM_COMMAND(TPM2_CC_RSA_Decrypt)
    MATCH_TPM_COMMAND(TPM2_CC_HMAC_Start)
    MATCH_TPM_COMMAND(TPM2_CC_SequenceUpdate)
    MATCH_TPM_COMMAND(TPM2_CC_Sign)
    MATCH_TPM_COMMAND(TPM2_CC_Unseal)
    MATCH_TPM_COMMAND(TPM2_CC_PolicySigned)
    MATCH_TPM_COMMAND(TPM2_CC_ContextLoad)
    MATCH_TPM_COMMAND(TPM2_CC_ContextSave)
    MATCH_TPM_COMMAND(TPM2_CC_ECDH_KeyGen)
    MATCH_TPM_COMMAND(TPM2_CC_EncryptDecrypt)
    MATCH_TPM_COMMAND(TPM2_CC_FlushContext)
    MATCH_TPM_COMMAND(TPM2_CC_LoadExternal)
    MATCH_TPM_COMMAND(TPM2_CC_MakeCredential)
    MATCH_TPM_COMMAND(TPM2_CC_NV_ReadPublic)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyAuthorize)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyAuthValue)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyCommandCode)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyCounterTimer)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyCpHash)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyLocality)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyNameHash)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyOR)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyTicket)
    MATCH_TPM_COMMAND(TPM2_CC_ReadPublic)
    MATCH_TPM_COMMAND(TPM2_CC_RSA_Encrypt)
    MATCH_TPM_COMMAND(TPM2_CC_StartAuthSession)
    MATCH_TPM_COMMAND(TPM2_CC_VerifySignature)
    MATCH_TPM_COMMAND(TPM2_CC_ECC_Parameters)
    MATCH_TPM_COMMAND(TPM2_CC_FirmwareRead)
    MATCH_TPM_COMMAND(TPM2_CC_GetCapability)
    MATCH_TPM_COMMAND(TPM2_CC_GetRandom)
    MATCH_TPM_COMMAND(TPM2_CC_GetTestResult)
    MATCH_TPM_COMMAND(TPM2_CC_Hash)
    MATCH_TPM_COMMAND(TPM2_CC_PCR_Read)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyPCR)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyRestart)
    MATCH_TPM_COMMAND(TPM2_CC_ReadClock)
    MATCH_TPM_COMMAND(TPM2_CC_PCR_Extend)
    MATCH_TPM_COMMAND(TPM2_CC_PCR_SetAuthValue)
    MATCH_TPM_COMMAND(TPM2_CC_NV_Certify)
    MATCH_TPM_COMMAND(TPM2_CC_EventSequenceComplete)
    MATCH_TPM_COMMAND(TPM2_CC_HashSequenceStart)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyPhysicalPresence)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyDuplicationSelect)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyGetDigest)
    MATCH_TPM_COMMAND(TPM2_CC_TestParms)
    MATCH_TPM_COMMAND(TPM2_CC_Commit)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyPassword)
    MATCH_TPM_COMMAND(TPM2_CC_ZGen_2Phase)
    MATCH_TPM_COMMAND(TPM2_CC_EC_Ephemeral)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyNvWritten)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyTemplate)
    MATCH_TPM_COMMAND(TPM2_CC_CreateLoaded)
    MATCH_TPM_COMMAND(TPM2_CC_PolicyAuthorizeNV)
    MATCH_TPM_COMMAND(TPM2_CC_EncryptDecrypt2)
    MATCH_TPM_COMMAND(TPM2_CC_AC_GetCapability)
    MATCH_TPM_COMMAND(TPM2_CC_AC_Send)
    MATCH_TPM_COMMAND(TPM2_CC_Policy_AC_SendSelect)
    MATCH_TPM_COMMAND(TPM2_CC_Vendor_TCG_Test)
    #undef MATCH_TPM_COMMAND
    default:
      return "Unknown";
  }
}

}  // namespace cuttlefish
