2018-09-06 13:47:33 +00:00
|
|
|
/**
|
|
|
|
* Copyright (C) 2017-2018, U.S. Government
|
|
|
|
*/
|
|
|
|
#ifndef HIRS_PROVISIONERTPM2_INCLUDE_COMMANDTPM2_H_
|
|
|
|
#define HIRS_PROVISIONERTPM2_INCLUDE_COMMANDTPM2_H_
|
|
|
|
|
|
|
|
#include <Logger.h>
|
|
|
|
#include <ProvisionerTpm2.pb.h>
|
2018-11-26 21:45:22 +00:00
|
|
|
#include <Tpm2ToolsUtils.h>
|
2018-09-06 13:47:33 +00:00
|
|
|
|
2018-10-08 19:13:03 +00:00
|
|
|
#include <Tss.h>
|
2018-09-06 13:47:33 +00:00
|
|
|
|
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
namespace hirs {
|
|
|
|
namespace tpm2 {
|
|
|
|
|
|
|
|
enum class AsymmetricKeyType {
|
|
|
|
RSA,
|
|
|
|
ECC
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Manages the issuing of commands to tpm2-tools executables.
|
|
|
|
*/
|
|
|
|
class CommandTpm2 {
|
|
|
|
private:
|
|
|
|
static const hirs::log::Logger LOGGER;
|
|
|
|
|
|
|
|
static const int kMaxRetryCommandAttempts;
|
|
|
|
|
|
|
|
static const char* const kAKCertificateHandle;
|
|
|
|
static const char* const kTpm2ToolsTakeOwnershipCommand;
|
|
|
|
static const char* const kTpm2ToolsNvDefineCommand;
|
|
|
|
static const char* const kTpm2ToolsNvListCommand;
|
|
|
|
static const char* const kTpm2ToolsNvReadCommand;
|
|
|
|
static const char* const kTpm2ToolsNvReleaseCommand;
|
|
|
|
static const char* const kTpm2ToolsNvWriteCommand;
|
|
|
|
static const char* const kTpm2ToolsGetPubAkCommand;
|
|
|
|
static const char* const kTpm2ToolsGetPubEkCommand;
|
|
|
|
static const char* const kTpm2ToolsListPersistentCommand;
|
|
|
|
static const char* const kTpm2ToolsReadPublicCommand;
|
|
|
|
static const char* const kTpm2ToolsActivateCredential;
|
|
|
|
static const char* const kTpm2ToolsEvictControlCommand;
|
|
|
|
static const char* const kTpm2RetryCommandCode;
|
|
|
|
static const char* const kWellKnownSecret;
|
|
|
|
static const char* const kRsaAlgorithmId;
|
|
|
|
static const char* const kEccAlgorithmId;
|
|
|
|
static const char* const kDefaultAttributeValue;
|
|
|
|
static const char* const kDefaultOwnerAuthHandle;
|
|
|
|
static const char* const kDefaultRsaEkCredentialHandle;
|
|
|
|
static const char* const kDefaultEccEkCredentialHandle;
|
|
|
|
static const char* const kDefaultPlatformCredentialHandle;
|
|
|
|
static const char* const kDefaultEkHandle;
|
|
|
|
static const char* const kDefaultAkHandle;
|
|
|
|
static const char* const kDefaultAkCertFilename;
|
|
|
|
static const char* const kDefaultAkNameFilename;
|
|
|
|
static const char* const kDefaultAkPubFilename;
|
|
|
|
static const char* const kDefaultEkPubFilename;
|
2019-10-29 13:33:35 +00:00
|
|
|
static const char* const kTpm2ToolsGetQuoteCommand;
|
|
|
|
static const char* const kTpm2DefaultQuoteFilename;
|
|
|
|
static const char* const kTpm2DefaultSigFilename;
|
2020-07-27 17:58:22 +00:00
|
|
|
static const char* const kTpm2Sha256SigAlgorithm;
|
2019-10-29 13:33:35 +00:00
|
|
|
static const char* const kTpm2ToolsPcrListCommand;
|
2018-09-06 13:47:33 +00:00
|
|
|
|
|
|
|
const hirs::tpm2_tools_utils::Tpm2ToolsVersion version;
|
|
|
|
|
|
|
|
uint16_t getNvIndexDataSize(const std::string& nvIndex);
|
|
|
|
|
|
|
|
std::string readNvIndex(const std::string& beginNvIndex,
|
|
|
|
const uint16_t& dataSize);
|
|
|
|
|
|
|
|
bool hasNvIndexDefined(const std::string& nvIndex);
|
|
|
|
|
|
|
|
void releaseNvIndex(const std::string& nvIndex);
|
|
|
|
|
|
|
|
std::string createNvReadCommandArgs(const std::string& nvIndexValue,
|
|
|
|
const uint16_t& offset,
|
|
|
|
const uint16_t& readSize);
|
|
|
|
|
|
|
|
std::string createNvWriteCommandArgs(const std::string& nvIndexValue,
|
|
|
|
const std::string& writeFile);
|
|
|
|
|
|
|
|
bool hasPersistentObject(const std::string& handle);
|
|
|
|
|
|
|
|
void flushPersistentObject(const std::string& handle);
|
|
|
|
|
|
|
|
void createPublicAreaFile(const std::string& keyHandle,
|
|
|
|
const std::string& filename);
|
|
|
|
|
|
|
|
std::string getPublicArea(const std::string& filename);
|
|
|
|
|
|
|
|
std::string runTpm2CommandWithRetry(const std::string& command,
|
2018-12-11 18:27:24 +00:00
|
|
|
const std::string& args,
|
|
|
|
int sourceCodeLineNumber);
|
2018-09-06 13:47:33 +00:00
|
|
|
|
|
|
|
public:
|
|
|
|
static const char* const kDefaultIdentityClaimResponseFilename;
|
|
|
|
static const char* const kDefaultActivatedIdentityFilename;
|
|
|
|
|
|
|
|
explicit CommandTpm2(
|
|
|
|
const hirs::tpm2_tools_utils::Tpm2ToolsVersion& version
|
|
|
|
= hirs::tpm2_tools_utils::Tpm2ToolsVersionChecker
|
|
|
|
::findTpm2ToolsVersion());
|
|
|
|
|
|
|
|
void setAuthData();
|
|
|
|
|
|
|
|
std::string getEndorsementCredentialDefault(
|
|
|
|
const AsymmetricKeyType& keyType);
|
|
|
|
|
|
|
|
std::string getPlatformCredentialDefault();
|
|
|
|
|
|
|
|
std::string getStoredCredential(
|
|
|
|
const std::string& credentialHandle);
|
|
|
|
|
|
|
|
void createEndorsementKey(const AsymmetricKeyType& keyType =
|
|
|
|
AsymmetricKeyType::RSA);
|
|
|
|
|
|
|
|
std::string getEndorsementKeyPublicArea();
|
|
|
|
|
|
|
|
void createAttestationKey();
|
|
|
|
|
|
|
|
std::string getAttestationKeyPublicArea();
|
|
|
|
|
|
|
|
hirs::pb::IdentityClaim createIdentityClaim(
|
|
|
|
const hirs::pb::DeviceInfo& deviceInfo,
|
|
|
|
const std::string& akPublicArea,
|
|
|
|
const std::string& ekPublicArea,
|
|
|
|
const std::string& endorsementCredential = {},
|
|
|
|
const std::vector<std::string>& platformCredentials = {});
|
|
|
|
|
|
|
|
std::string activateIdentity();
|
|
|
|
|
|
|
|
void storeAKCertificate(const std::string& akCertificateByteString);
|
|
|
|
|
2019-10-29 13:33:35 +00:00
|
|
|
std::string getQuote(const std::string& pcr_selection,
|
|
|
|
const std::string& nonce);
|
|
|
|
|
2020-07-29 16:31:34 +00:00
|
|
|
std::string getPcrsList();
|
2018-09-06 13:47:33 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace tpm2
|
|
|
|
} // namespace hirs
|
|
|
|
#endif // HIRS_PROVISIONERTPM2_INCLUDE_COMMANDTPM2_H_
|