1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
|
// Copyright 2021 Contributors to the Parsec project.
// SPDX-License-Identifier: Apache-2.0
use std::convert::TryFrom;
use tss_esapi::{
constants::{tss::*, CommandCode},
tss2_esys::TPM2_CC,
Error, WrapperErrorKind,
};
macro_rules! test_valid_conversion {
($tpm_command_code:ident, CommandCode::$command_code:ident) => {
assert_eq!(
$tpm_command_code,
TPM2_CC::from(CommandCode::$command_code),
"Failed to convert {} to TPM2_CC",
std::stringify!(CommandCode::$command_code),
);
assert_eq!(
CommandCode::$command_code,
CommandCode::try_from($tpm_command_code).expect(&format!(
"Failed to convert {} to a CommandCode",
std::stringify!($tpm_command_code)
)),
"{} did not convert into {}",
std::stringify!($tpm_command_code),
std::stringify!(CommandCode::$command_code),
)
};
}
#[test]
fn test_valid_conversions() {
test_valid_conversion!(
TPM2_CC_NV_UndefineSpaceSpecial,
CommandCode::NvUndefineSpaceSpecial
);
test_valid_conversion!(TPM2_CC_EvictControl, CommandCode::EvictControl);
test_valid_conversion!(TPM2_CC_HierarchyControl, CommandCode::HierarchyControl);
test_valid_conversion!(TPM2_CC_NV_UndefineSpace, CommandCode::NvUndefineSpace);
test_valid_conversion!(TPM2_CC_ChangeEPS, CommandCode::ChangeEps);
test_valid_conversion!(TPM2_CC_ChangePPS, CommandCode::ChangePps);
test_valid_conversion!(TPM2_CC_Clear, CommandCode::Clear);
test_valid_conversion!(TPM2_CC_ClearControl, CommandCode::ClearControl);
test_valid_conversion!(TPM2_CC_ClockSet, CommandCode::ClockSet);
test_valid_conversion!(
TPM2_CC_HierarchyChangeAuth,
CommandCode::HierarchyChangeAuth
);
test_valid_conversion!(TPM2_CC_NV_DefineSpace, CommandCode::NvDefineSpace);
test_valid_conversion!(TPM2_CC_PCR_Allocate, CommandCode::PcrAllocate);
test_valid_conversion!(TPM2_CC_PCR_SetAuthPolicy, CommandCode::PcrSetAuthPolicy);
test_valid_conversion!(TPM2_CC_PP_Commands, CommandCode::PpCommands);
test_valid_conversion!(TPM2_CC_SetPrimaryPolicy, CommandCode::SetPrimaryPolicy);
test_valid_conversion!(TPM2_CC_FieldUpgradeStart, CommandCode::FieldUpgradeStart);
test_valid_conversion!(TPM2_CC_ClockRateAdjust, CommandCode::ClockRateAdjust);
test_valid_conversion!(TPM2_CC_CreatePrimary, CommandCode::CreatePrimary);
test_valid_conversion!(TPM2_CC_NV_GlobalWriteLock, CommandCode::NvGlobalWriteLock);
test_valid_conversion!(
TPM2_CC_GetCommandAuditDigest,
CommandCode::GetCommandAuditDigest
);
test_valid_conversion!(TPM2_CC_NV_Increment, CommandCode::NvIncrement);
test_valid_conversion!(TPM2_CC_NV_SetBits, CommandCode::NvSetBits);
test_valid_conversion!(TPM2_CC_NV_Extend, CommandCode::NvExtend);
test_valid_conversion!(TPM2_CC_NV_Write, CommandCode::NvWrite);
test_valid_conversion!(TPM2_CC_NV_WriteLock, CommandCode::NvWriteLock);
test_valid_conversion!(
TPM2_CC_DictionaryAttackLockReset,
CommandCode::DictionaryAttackLockReset
);
test_valid_conversion!(
TPM2_CC_DictionaryAttackParameters,
CommandCode::DictionaryAttackParameters
);
test_valid_conversion!(TPM2_CC_NV_ChangeAuth, CommandCode::NvChangeAuth);
test_valid_conversion!(TPM2_CC_PCR_Event, CommandCode::PcrEvent);
test_valid_conversion!(TPM2_CC_PCR_Reset, CommandCode::PcrReset);
test_valid_conversion!(TPM2_CC_SequenceComplete, CommandCode::SequenceComplete);
test_valid_conversion!(TPM2_CC_SetAlgorithmSet, CommandCode::SetAlgorithmSet);
test_valid_conversion!(
TPM2_CC_SetCommandCodeAuditStatus,
CommandCode::SetCommandCodeAuditStatus
);
test_valid_conversion!(TPM2_CC_FieldUpgradeData, CommandCode::FieldUpgradeData);
test_valid_conversion!(
TPM2_CC_IncrementalSelfTest,
CommandCode::IncrementalSelfTest
);
test_valid_conversion!(TPM2_CC_SelfTest, CommandCode::SelfTest);
test_valid_conversion!(TPM2_CC_Startup, CommandCode::Startup);
test_valid_conversion!(TPM2_CC_Shutdown, CommandCode::Shutdown);
test_valid_conversion!(TPM2_CC_StirRandom, CommandCode::StirRandom);
test_valid_conversion!(TPM2_CC_ActivateCredential, CommandCode::ActivateCredential);
test_valid_conversion!(TPM2_CC_Certify, CommandCode::Certify);
test_valid_conversion!(TPM2_CC_PolicyNV, CommandCode::PolicyNv);
test_valid_conversion!(TPM2_CC_CertifyCreation, CommandCode::CertifyCreation);
test_valid_conversion!(TPM2_CC_Duplicate, CommandCode::Duplicate);
test_valid_conversion!(TPM2_CC_GetTime, CommandCode::GetTime);
test_valid_conversion!(
TPM2_CC_GetSessionAuditDigest,
CommandCode::GetSessionAuditDigest
);
test_valid_conversion!(TPM2_CC_NV_Read, CommandCode::NvRead);
test_valid_conversion!(TPM2_CC_NV_ReadLock, CommandCode::NvReadLock);
test_valid_conversion!(TPM2_CC_ObjectChangeAuth, CommandCode::ObjectChangeAuth);
test_valid_conversion!(TPM2_CC_PolicySecret, CommandCode::PolicySecret);
test_valid_conversion!(TPM2_CC_Rewrap, CommandCode::Rewrap);
test_valid_conversion!(TPM2_CC_Create, CommandCode::Create);
test_valid_conversion!(TPM2_CC_ECDH_ZGen, CommandCode::EcdhZGen);
test_valid_conversion!(TPM2_CC_HMAC, CommandCode::Hmac);
test_valid_conversion!(TPM2_CC_Import, CommandCode::Import);
test_valid_conversion!(TPM2_CC_Load, CommandCode::Load);
test_valid_conversion!(TPM2_CC_Quote, CommandCode::Quote);
test_valid_conversion!(TPM2_CC_RSA_Decrypt, CommandCode::RsaDecrypt);
test_valid_conversion!(TPM2_CC_HMAC_Start, CommandCode::HmacStart);
test_valid_conversion!(TPM2_CC_SequenceUpdate, CommandCode::SequenceUpdate);
test_valid_conversion!(TPM2_CC_Sign, CommandCode::Sign);
test_valid_conversion!(TPM2_CC_Unseal, CommandCode::Unseal);
test_valid_conversion!(TPM2_CC_PolicySigned, CommandCode::PolicySigned);
test_valid_conversion!(TPM2_CC_ContextLoad, CommandCode::ContextLoad);
test_valid_conversion!(TPM2_CC_ContextSave, CommandCode::ContextSave);
test_valid_conversion!(TPM2_CC_ECDH_KeyGen, CommandCode::EcdhKeyGen);
test_valid_conversion!(TPM2_CC_EncryptDecrypt, CommandCode::EncryptDecrypt);
test_valid_conversion!(TPM2_CC_FlushContext, CommandCode::FlushContext);
test_valid_conversion!(TPM2_CC_LoadExternal, CommandCode::LoadExternal);
test_valid_conversion!(TPM2_CC_MakeCredential, CommandCode::MakeCredential);
test_valid_conversion!(TPM2_CC_NV_ReadPublic, CommandCode::NvReadPublic);
test_valid_conversion!(TPM2_CC_PolicyAuthorize, CommandCode::PolicyAuthorize);
test_valid_conversion!(TPM2_CC_PolicyAuthValue, CommandCode::PolicyAuthValue);
test_valid_conversion!(TPM2_CC_PolicyCommandCode, CommandCode::PolicyCommandCode);
test_valid_conversion!(TPM2_CC_PolicyCounterTimer, CommandCode::PolicyCounterTimer);
test_valid_conversion!(TPM2_CC_PolicyCpHash, CommandCode::PolicyCpHash);
test_valid_conversion!(TPM2_CC_PolicyLocality, CommandCode::PolicyLocality);
test_valid_conversion!(TPM2_CC_PolicyNameHash, CommandCode::PolicyNameHash);
test_valid_conversion!(TPM2_CC_PolicyOR, CommandCode::PolicyOr);
test_valid_conversion!(TPM2_CC_PolicyTicket, CommandCode::PolicyTicket);
test_valid_conversion!(TPM2_CC_ReadPublic, CommandCode::ReadPublic);
test_valid_conversion!(TPM2_CC_RSA_Encrypt, CommandCode::RsaEncrypt);
test_valid_conversion!(TPM2_CC_StartAuthSession, CommandCode::StartAuthSession);
test_valid_conversion!(TPM2_CC_VerifySignature, CommandCode::VerifySignature);
test_valid_conversion!(TPM2_CC_ECC_Parameters, CommandCode::EccParameters);
test_valid_conversion!(TPM2_CC_FirmwareRead, CommandCode::FirmwareRead);
test_valid_conversion!(TPM2_CC_GetCapability, CommandCode::GetCapability);
test_valid_conversion!(TPM2_CC_GetRandom, CommandCode::GetRandom);
test_valid_conversion!(TPM2_CC_GetTestResult, CommandCode::GetTestResult);
test_valid_conversion!(TPM2_CC_Hash, CommandCode::Hash);
test_valid_conversion!(TPM2_CC_PCR_Read, CommandCode::PcrRead);
test_valid_conversion!(TPM2_CC_PolicyPCR, CommandCode::PolicyPcr);
test_valid_conversion!(TPM2_CC_PolicyRestart, CommandCode::PolicyRestart);
test_valid_conversion!(TPM2_CC_ReadClock, CommandCode::ReadClock);
test_valid_conversion!(TPM2_CC_PCR_Extend, CommandCode::PcrExtend);
test_valid_conversion!(TPM2_CC_PCR_SetAuthValue, CommandCode::PcrSetAuthValue);
test_valid_conversion!(TPM2_CC_NV_Certify, CommandCode::NvCertify);
test_valid_conversion!(
TPM2_CC_EventSequenceComplete,
CommandCode::EventSequenceComplete
);
test_valid_conversion!(TPM2_CC_HashSequenceStart, CommandCode::HashSequenceStart);
test_valid_conversion!(
TPM2_CC_PolicyPhysicalPresence,
CommandCode::PolicyPhysicalPresence
);
test_valid_conversion!(
TPM2_CC_PolicyDuplicationSelect,
CommandCode::PolicyDuplicationSelect
);
test_valid_conversion!(TPM2_CC_PolicyGetDigest, CommandCode::PolicyGetDigest);
test_valid_conversion!(TPM2_CC_TestParms, CommandCode::TestParms);
test_valid_conversion!(TPM2_CC_Commit, CommandCode::Commit);
test_valid_conversion!(TPM2_CC_PolicyPassword, CommandCode::PolicyPassword);
test_valid_conversion!(TPM2_CC_ZGen_2Phase, CommandCode::ZGen2Phase);
test_valid_conversion!(TPM2_CC_EC_Ephemeral, CommandCode::EcEphemeral);
test_valid_conversion!(TPM2_CC_PolicyNvWritten, CommandCode::PolicyNvWritten);
test_valid_conversion!(TPM2_CC_PolicyTemplate, CommandCode::PolicyTemplate);
test_valid_conversion!(TPM2_CC_CreateLoaded, CommandCode::CreateLoaded);
test_valid_conversion!(TPM2_CC_PolicyAuthorizeNV, CommandCode::PolicyAuthorizeNv);
test_valid_conversion!(TPM2_CC_EncryptDecrypt2, CommandCode::EncryptDecrypt2);
test_valid_conversion!(TPM2_CC_AC_GetCapability, CommandCode::AcGetCapability);
test_valid_conversion!(TPM2_CC_AC_Send, CommandCode::AcSend);
test_valid_conversion!(
TPM2_CC_Policy_AC_SendSelect,
CommandCode::PolicyAcSendSelect
);
}
#[test]
fn test_invalid_conversions() {
// Unsupported Vendor specific
const VENDOR_SPECIFIC: TPM2_CC = 0b00100000000000000000000000000001u32;
assert_eq!(
Err(Error::WrapperError(WrapperErrorKind::UnsupportedParam)),
CommandCode::try_from(VENDOR_SPECIFIC),
"Value indicating vendor specific command code did not produce expected error"
);
// Set bits in in places marked as reserved
const RES: TPM2_CC = 0b10000000000000000000000000000001u32;
assert_eq!(
Err(Error::WrapperError(WrapperErrorKind::InvalidParam)),
CommandCode::try_from(RES),
"Value with bit set a place marked as reserved (res) did not produce expected error"
);
const RESERVED: TPM2_CC = 0b00000000000000010000000000000001u32;
assert_eq!(
Err(Error::WrapperError(WrapperErrorKind::InvalidParam)),
CommandCode::try_from(RESERVED),
"Value with bit set a place marked as reserved (reserved) did not produce expected error"
);
// Valid but non existing command code
const NON_EXISTING: TPM2_CC = 0b00000000000000001111111111111111u32;
assert_eq!(
Err(Error::WrapperError(WrapperErrorKind::InvalidParam)),
CommandCode::try_from(NON_EXISTING),
"A value representing a non existing command code did not produce the expected error"
);
}
|