Vendor dependencies and expose control program binaries via nix build. Uses nixpkgs-unstable for Go 1.26 support. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2259 lines
72 KiB
Go
2259 lines
72 KiB
Go
// Package tpm2 contains TPM 2.0 commands and structures.
|
||
package tpm2
|
||
|
||
import (
|
||
"bytes"
|
||
"encoding/binary"
|
||
|
||
"github.com/google/go-tpm/tpm2/transport"
|
||
)
|
||
|
||
// handle represents a TPM handle as comprehended in Part 3: Commands.
|
||
// In the context of TPM commands, handles are special parameters for which
|
||
// there is a known associated name.
|
||
// This is not an exported interface, because the reflection logic has special
|
||
// behavior for AuthHandle, due to the fact that referencing Session from this
|
||
// interface would break the ability to make TPMHandle implement it.
|
||
type handle interface {
|
||
// HandleValue is the numeric concrete handle value in the TPM.
|
||
HandleValue() uint32
|
||
// KnownName is the TPM Name of the associated entity. See Part 1, section 16.
|
||
KnownName() *TPM2BName
|
||
}
|
||
|
||
// NamedHandle represents an associated pairing of TPM handle and known Name.
|
||
type NamedHandle struct {
|
||
Handle TPMHandle
|
||
Name TPM2BName
|
||
}
|
||
|
||
// HandleValue implements the handle interface.
|
||
func (h NamedHandle) HandleValue() uint32 {
|
||
return h.Handle.HandleValue()
|
||
}
|
||
|
||
// KnownName implements the handle interface.
|
||
func (h NamedHandle) KnownName() *TPM2BName {
|
||
return &h.Name
|
||
}
|
||
|
||
// AuthHandle allows the caller to add an authorization session onto a handle.
|
||
type AuthHandle struct {
|
||
Handle TPMHandle
|
||
Name TPM2BName
|
||
Auth Session
|
||
}
|
||
|
||
// HandleValue implements the handle interface.
|
||
func (h AuthHandle) HandleValue() uint32 {
|
||
return h.Handle.HandleValue()
|
||
}
|
||
|
||
// KnownName implements the handle interface.
|
||
// If Name is not provided (i.e., only Auth), then rely on the underlying
|
||
// TPMHandle.
|
||
func (h AuthHandle) KnownName() *TPM2BName {
|
||
if len(h.Name.Buffer) != 0 {
|
||
return &h.Name
|
||
}
|
||
return h.Handle.KnownName()
|
||
}
|
||
|
||
// invalidHandleValue is the sentinel value used for handles that have been
|
||
// reconstructed from unmarshalling.
|
||
// This value is intentionally invalid to prevent accidental use with a real TPM.
|
||
const invalidHandleValue TPMHandle = 0xFFFFFFFF
|
||
|
||
// UnmarshalledHandle represents a handle reconstructed from unmarshalling.
|
||
// This type is used for audit and inspection purposes where only the Name is
|
||
// available, not the actual TPM handle value.
|
||
//
|
||
// The HandleValue() method returns [invalidHandleValue] to prevent accidental
|
||
// use of these handles with a real TPM.
|
||
type UnmarshalledHandle struct {
|
||
Name TPM2BName
|
||
}
|
||
|
||
// HandleValue implements the handle interface.
|
||
// Returns invalidHandleValue since unmarshalled handles don't have real TPM handle values.
|
||
func (h UnmarshalledHandle) HandleValue() uint32 {
|
||
return uint32(invalidHandleValue)
|
||
}
|
||
|
||
// KnownName implements the handle interface.
|
||
func (h UnmarshalledHandle) KnownName() *TPM2BName {
|
||
return &h.Name
|
||
}
|
||
|
||
// Command is an interface for any TPM command, parameterized by its response
|
||
// type.
|
||
type Command[R any, PR *R] interface {
|
||
// The TPM command code associated with this command.
|
||
Command() TPMCC
|
||
// Executes the command and returns the response.
|
||
Execute(t transport.TPM, s ...Session) (PR, error)
|
||
}
|
||
|
||
// PolicyCommand is a TPM command that can be part of a TPM policy.
|
||
type PolicyCommand interface {
|
||
// Update updates the given policy hash according to the command
|
||
// parameters.
|
||
Update(policy *PolicyCalculator) error
|
||
}
|
||
|
||
// Shutdown is the input to TPM2_Shutdown.
|
||
// See definition in Part 3, Commands, section 9.4.
|
||
type Shutdown struct {
|
||
// TPM_SU_CLEAR or TPM_SU_STATE
|
||
ShutdownType TPMSU
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (Shutdown) Command() TPMCC { return TPMCCShutdown }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd Shutdown) Execute(t transport.TPM, s ...Session) (*ShutdownResponse, error) {
|
||
var rsp ShutdownResponse
|
||
err := execute[ShutdownResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// ShutdownResponse is the response from TPM2_Shutdown.
|
||
type ShutdownResponse struct{}
|
||
|
||
// Startup is the input to TPM2_Startup.
|
||
// See definition in Part 3, Commands, section 9.3.
|
||
type Startup struct {
|
||
// TPM_SU_CLEAR or TPM_SU_STATE
|
||
StartupType TPMSU
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (Startup) Command() TPMCC { return TPMCCStartup }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd Startup) Execute(t transport.TPM, s ...Session) (*StartupResponse, error) {
|
||
var rsp StartupResponse
|
||
err := execute[StartupResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// StartupResponse is the response from TPM2_Startup.
|
||
type StartupResponse struct{}
|
||
|
||
// StartAuthSession is the input to TPM2_StartAuthSession.
|
||
// See definition in Part 3, Commands, section 11.1
|
||
type StartAuthSession struct {
|
||
// handle of a loaded decrypt key used to encrypt salt
|
||
// may be TPM_RH_NULL
|
||
TPMKey handle `gotpm:"handle"`
|
||
// entity providing the authValue
|
||
// may be TPM_RH_NULL
|
||
Bind handle `gotpm:"handle"`
|
||
// initial nonceCaller, sets nonceTPM size for the session
|
||
// shall be at least 16 octets
|
||
NonceCaller TPM2BNonce
|
||
// value encrypted according to the type of tpmKey
|
||
// If tpmKey is TPM_RH_NULL, this shall be the Empty Buffer.
|
||
EncryptedSalt TPM2BEncryptedSecret
|
||
// indicates the type of the session; simple HMAC or policy (including
|
||
// a trial policy)
|
||
SessionType TPMSE
|
||
// the algorithm and key size for parameter encryption
|
||
// may select transport.TPM_ALG_NULL
|
||
Symmetric TPMTSymDef
|
||
// hash algorithm to use for the session
|
||
// Shall be a hash algorithm supported by the TPM and not transport.TPM_ALG_NULL
|
||
AuthHash TPMIAlgHash
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (StartAuthSession) Command() TPMCC { return TPMCCStartAuthSession }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd StartAuthSession) Execute(t transport.TPM, s ...Session) (*StartAuthSessionResponse, error) {
|
||
var rsp StartAuthSessionResponse
|
||
if err := execute[StartAuthSessionResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// StartAuthSessionResponse is the response from TPM2_StartAuthSession.
|
||
type StartAuthSessionResponse struct {
|
||
// handle for the newly created session
|
||
SessionHandle TPMISHAuthSession `gotpm:"handle"`
|
||
// the initial nonce from the TPM, used in the computation of the sessionKey
|
||
NonceTPM TPM2BNonce
|
||
}
|
||
|
||
// Create is the input to TPM2_Create.
|
||
// See definition in Part 3, Commands, section 12.1
|
||
type Create struct {
|
||
// handle of parent for new object
|
||
ParentHandle handle `gotpm:"handle,auth"`
|
||
// the sensitive data
|
||
InSensitive TPM2BSensitiveCreate
|
||
// the public template
|
||
InPublic TPM2BPublic
|
||
// data that will be included in the creation data for this
|
||
// object to provide permanent, verifiable linkage between this
|
||
// object and some object owner data
|
||
OutsideInfo TPM2BData
|
||
// PCR that will be used in creation data
|
||
CreationPCR TPMLPCRSelection
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (Create) Command() TPMCC { return TPMCCCreate }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd Create) Execute(t transport.TPM, s ...Session) (*CreateResponse, error) {
|
||
var rsp CreateResponse
|
||
if err := execute[CreateResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// CreateResponse is the response from TPM2_Create.
|
||
type CreateResponse struct {
|
||
// the private portion of the object
|
||
OutPrivate TPM2BPrivate
|
||
// the public portion of the created object
|
||
OutPublic TPM2BPublic
|
||
// contains a TPMS_CREATION_DATA
|
||
CreationData tpm2bCreationData
|
||
// digest of creationData using nameAlg of outPublic
|
||
CreationHash TPM2BDigest
|
||
// ticket used by TPM2_CertifyCreation() to validate that the
|
||
// creation data was produced by the TPM.
|
||
CreationTicket TPMTTKCreation
|
||
}
|
||
|
||
// Load is the input to TPM2_Load.
|
||
// See definition in Part 3, Commands, section 12.2
|
||
type Load struct {
|
||
// handle of parent for new object
|
||
ParentHandle handle `gotpm:"handle,auth"`
|
||
// the private portion of the object
|
||
InPrivate TPM2BPrivate
|
||
// the public portion of the object
|
||
InPublic TPM2BPublic
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (Load) Command() TPMCC { return TPMCCLoad }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd Load) Execute(t transport.TPM, s ...Session) (*LoadResponse, error) {
|
||
var rsp LoadResponse
|
||
if err := execute[LoadResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// LoadResponse is the response from TPM2_Load.
|
||
type LoadResponse struct {
|
||
// handle of type TPM_HT_TRANSIENT for loaded object
|
||
ObjectHandle TPMHandle `gotpm:"handle"`
|
||
// Name of the loaded object
|
||
Name TPM2BName
|
||
}
|
||
|
||
// LoadExternal is the input to TPM2_LoadExternal.
|
||
// See definition in Part 3, Commands, section 12.3
|
||
type LoadExternal struct {
|
||
// the sensitive portion of the object (optional)
|
||
InPrivate TPM2BSensitive `gotpm:"optional"`
|
||
// the public portion of the object
|
||
InPublic TPM2BPublic
|
||
// hierarchy with which the object area is associated
|
||
Hierarchy TPMIRHHierarchy `gotpm:"nullable"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (LoadExternal) Command() TPMCC { return TPMCCLoadExternal }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd LoadExternal) Execute(t transport.TPM, s ...Session) (*LoadExternalResponse, error) {
|
||
var rsp LoadExternalResponse
|
||
if err := execute[LoadExternalResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// LoadExternalResponse is the response from TPM2_LoadExternal.
|
||
type LoadExternalResponse struct {
|
||
// handle of type TPM_HT_TRANSIENT for loaded object
|
||
ObjectHandle TPMHandle `gotpm:"handle"`
|
||
// Name of the loaded object
|
||
Name TPM2BName
|
||
}
|
||
|
||
// ReadPublic is the input to TPM2_ReadPublic.
|
||
// See definition in Part 3, Commands, section 12.4
|
||
type ReadPublic struct {
|
||
// TPM handle of an object
|
||
ObjectHandle handle `gotpm:"handle"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (ReadPublic) Command() TPMCC { return TPMCCReadPublic }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd ReadPublic) Execute(t transport.TPM, s ...Session) (*ReadPublicResponse, error) {
|
||
var rsp ReadPublicResponse
|
||
if err := execute[ReadPublicResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// ReadPublicResponse is the response from TPM2_ReadPublic.
|
||
type ReadPublicResponse struct {
|
||
// structure containing the public area of an object
|
||
OutPublic TPM2BPublic
|
||
// name of object
|
||
Name TPM2BName
|
||
// the Qualified Name of the object
|
||
QualifiedName TPM2BName
|
||
}
|
||
|
||
// ActivateCredential is the input to TPM2_ActivateCredential.
|
||
// See definition in Part 3, Commands, section 12.5.
|
||
type ActivateCredential struct {
|
||
// handle of the object associated with certificate in credentialBlob
|
||
ActivateHandle handle `gotpm:"handle,auth"`
|
||
// loaded key used to decrypt the TPMS_SENSITIVE in credentialBlob
|
||
KeyHandle handle `gotpm:"handle,auth"`
|
||
// the credential
|
||
CredentialBlob TPM2BIDObject
|
||
// keyHandle algorithm-dependent encrypted seed that protects credentialBlob
|
||
Secret TPM2BEncryptedSecret
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (ActivateCredential) Command() TPMCC { return TPMCCActivateCredential }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd ActivateCredential) Execute(t transport.TPM, s ...Session) (*ActivateCredentialResponse, error) {
|
||
var rsp ActivateCredentialResponse
|
||
if err := execute[ActivateCredentialResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// ActivateCredentialResponse is the response from TPM2_ActivateCredential.
|
||
type ActivateCredentialResponse struct {
|
||
// the decrypted certificate information
|
||
CertInfo TPM2BDigest
|
||
}
|
||
|
||
// MakeCredential is the input to TPM2_MakeCredential.
|
||
// See definition in Part 3, Commands, section 12.6.
|
||
type MakeCredential struct {
|
||
// loaded public area, used to encrypt the sensitive area containing the credential key
|
||
Handle TPMIDHObject `gotpm:"handle"`
|
||
// the credential information
|
||
Credential TPM2BDigest
|
||
// Name of the object to which the credential applies
|
||
ObjectName TPM2BName
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (MakeCredential) Command() TPMCC { return TPMCCMakeCredential }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd MakeCredential) Execute(t transport.TPM, s ...Session) (*MakeCredentialResponse, error) {
|
||
var rsp MakeCredentialResponse
|
||
if err := execute[MakeCredentialResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// MakeCredentialResponse is the response from TPM2_MakeCredential.
|
||
type MakeCredentialResponse struct {
|
||
// the credential
|
||
CredentialBlob TPM2BIDObject
|
||
// handle algorithm-dependent data that wraps the key that encrypts credentialBlob
|
||
Secret TPM2BEncryptedSecret
|
||
}
|
||
|
||
// Unseal is the input to TPM2_Unseal.
|
||
// See definition in Part 3, Commands, section 12.7
|
||
type Unseal struct {
|
||
ItemHandle handle `gotpm:"handle,auth"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (Unseal) Command() TPMCC { return TPMCCUnseal }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd Unseal) Execute(t transport.TPM, s ...Session) (*UnsealResponse, error) {
|
||
var rsp UnsealResponse
|
||
if err := execute[UnsealResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// UnsealResponse is the response from TPM2_Unseal.
|
||
type UnsealResponse struct {
|
||
OutData TPM2BSensitiveData
|
||
}
|
||
|
||
// ObjectChangeAuth is the input to TPM2_ObjectChangeAuth.
|
||
// See definition in Part 3, Commands, section 12.8
|
||
type ObjectChangeAuth struct {
|
||
// TPM handle of an object
|
||
ObjectHandle handle `gotpm:"handle,auth"`
|
||
// handle of the parent
|
||
ParentHandle handle `gotpm:"handle"`
|
||
// new authorization value
|
||
NewAuth TPM2BAuth
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (ObjectChangeAuth) Command() TPMCC { return TPMCCObjectChangeAuth }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd ObjectChangeAuth) Execute(t transport.TPM, s ...Session) (*ObjectChangeAuthResponse, error) {
|
||
var rsp ObjectChangeAuthResponse
|
||
if err := execute[ObjectChangeAuthResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// ObjectChangeAuthResponse the response from TPM2_ObjectChangeAuth.
|
||
type ObjectChangeAuthResponse struct {
|
||
// private area containing the new authorization value
|
||
OutPrivate TPM2BPrivate
|
||
}
|
||
|
||
// CreateLoaded is the input to TPM2_CreateLoaded.
|
||
// See definition in Part 3, Commands, section 12.9
|
||
type CreateLoaded struct {
|
||
// Handle of a transient storage key, a persistent storage key,
|
||
// TPM_RH_ENDORSEMENT, TPM_RH_OWNER, TPM_RH_PLATFORM+{PP}, or TPM_RH_NULL
|
||
ParentHandle handle `gotpm:"handle,auth"`
|
||
// the sensitive data, see TPM 2.0 Part 1 Sensitive Values
|
||
InSensitive TPM2BSensitiveCreate
|
||
// the public template
|
||
InPublic TPM2BTemplate
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (CreateLoaded) Command() TPMCC { return TPMCCCreateLoaded }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd CreateLoaded) Execute(t transport.TPM, s ...Session) (*CreateLoadedResponse, error) {
|
||
var rsp CreateLoadedResponse
|
||
if err := execute[CreateLoadedResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// CreateLoadedResponse is the response from TPM2_CreateLoaded.
|
||
type CreateLoadedResponse struct {
|
||
// handle of type TPM_HT_TRANSIENT for loaded object
|
||
ObjectHandle TPMHandle `gotpm:"handle"`
|
||
// the sensitive area of the object (optional)
|
||
OutPrivate TPM2BPrivate `gotpm:"optional"`
|
||
// the public portion of the created object
|
||
OutPublic TPM2BPublic
|
||
// the name of the created object
|
||
Name TPM2BName
|
||
}
|
||
|
||
// EncryptDecrypt2 is the input to TPM2_EncryptDecrypt2
|
||
type EncryptDecrypt2 struct {
|
||
// reference to public portion of symmetric key to use for encryption
|
||
KeyHandle handle `gotpm:"handle,auth"`
|
||
Message TPM2BMaxBuffer
|
||
Decrypt TPMIYesNo
|
||
Mode TPMIAlgSymMode `gotpm:"nullable"`
|
||
IV TPM2BIV
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (EncryptDecrypt2) Command() TPMCC { return TPMCCEncryptDecrypt2 }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd EncryptDecrypt2) Execute(t transport.TPM, s ...Session) (*EncryptDecrypt2Response, error) {
|
||
var rsp EncryptDecrypt2Response
|
||
err := execute[EncryptDecrypt2Response](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// EncryptDecrypt2Response is the response from TPM2_EncryptDecrypt2.
|
||
type EncryptDecrypt2Response struct {
|
||
OutData TPM2BMaxBuffer
|
||
IV TPM2BIV
|
||
}
|
||
|
||
// RSAEncrypt is the input to TPM2_RSA_Encrypt
|
||
// See definition in Part 3, Commands, section 14.2.
|
||
type RSAEncrypt struct {
|
||
// reference to public portion of RSA key to use for encryption
|
||
KeyHandle handle `gotpm:"handle"`
|
||
// message to be encrypted
|
||
Message TPM2BPublicKeyRSA
|
||
// the padding scheme to use if scheme associated with keyHandle is TPM_ALG_NULL
|
||
InScheme TPMTRSADecrypt `gotpm:"nullable"`
|
||
// optional label L to be associated with the message
|
||
Label TPM2BData `gotpm:"optional"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (RSAEncrypt) Command() TPMCC { return TPMCCRSAEncrypt }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd RSAEncrypt) Execute(t transport.TPM, s ...Session) (*RSAEncryptResponse, error) {
|
||
var rsp RSAEncryptResponse
|
||
if err := execute[RSAEncryptResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// RSAEncryptResponse is the response from TPM2_RSA_Encrypt
|
||
type RSAEncryptResponse struct {
|
||
// encrypted output
|
||
OutData TPM2BPublicKeyRSA
|
||
}
|
||
|
||
// RSADecrypt is the input to TPM2_RSA_Decrypt
|
||
// See definition in Part 3, Commands, section 14.3.
|
||
type RSADecrypt struct {
|
||
// RSA key to use for decryption
|
||
KeyHandle handle `gotpm:"handle,auth"`
|
||
// cipher text to be decrypted
|
||
CipherText TPM2BPublicKeyRSA
|
||
// the padding scheme to use if scheme associated with keyHandle is TPM_ALG_NULL
|
||
InScheme TPMTRSADecrypt `gotpm:"nullable"`
|
||
// label whose association with the message is to be verified
|
||
Label TPM2BData `gotpm:"optional"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (RSADecrypt) Command() TPMCC { return TPMCCRSADecrypt }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd RSADecrypt) Execute(t transport.TPM, s ...Session) (*RSADecryptResponse, error) {
|
||
var rsp RSADecryptResponse
|
||
if err := execute[RSADecryptResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// RSADecryptResponse is the response from TPM2_RSA_Decrypt
|
||
type RSADecryptResponse struct {
|
||
// decrypted output
|
||
Message TPM2BPublicKeyRSA
|
||
}
|
||
|
||
// ECDHZGen is the input to TPM2_ECDHZGen.
|
||
// See definition in Part 3, Commands, section 14.5
|
||
type ECDHZGen struct {
|
||
// handle of a loaded ECC key
|
||
KeyHandle handle `gotpm:"handle,auth"`
|
||
// a public key
|
||
InPoint TPM2BECCPoint
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (ECDHZGen) Command() TPMCC { return TPMCCECDHZGen }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd ECDHZGen) Execute(t transport.TPM, s ...Session) (*ECDHZGenResponse, error) {
|
||
var rsp ECDHZGenResponse
|
||
if err := execute[ECDHZGenResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// ECDHZGenResponse is the response from TPM2_ECDHZGen.
|
||
type ECDHZGenResponse struct {
|
||
// X and Y coordinates of the product of the multiplication
|
||
OutPoint TPM2BECCPoint
|
||
}
|
||
|
||
// Hash is the input to TPM2_Hash.
|
||
// See definition in Part 3, Commands, section 15.4
|
||
type Hash struct {
|
||
//data to be hashed
|
||
Data TPM2BMaxBuffer
|
||
// algorithm for the hash being computed - shall not be TPM_ALH_NULL
|
||
HashAlg TPMIAlgHash
|
||
// hierarchy to use for the ticket (TPM_RH_NULL_allowed)
|
||
Hierarchy TPMIRHHierarchy `gotpm:"nullable"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (Hash) Command() TPMCC { return TPMCCHash }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd Hash) Execute(t transport.TPM, s ...Session) (*HashResponse, error) {
|
||
var rsp HashResponse
|
||
if err := execute[HashResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// HashResponse is the response from TPM2_Hash.
|
||
type HashResponse struct {
|
||
// results
|
||
OutHash TPM2BDigest
|
||
// ticket indicating that the sequence of octets used to
|
||
// compute outDigest did not start with TPM_GENERATED_VALUE
|
||
Validation TPMTTKHashCheck
|
||
}
|
||
|
||
// Hmac is the input to TPM2_HMAC.
|
||
// See definition in Part 3, Commands, section 15.5.
|
||
type Hmac struct {
|
||
// HMAC key handle requiring an authorization session for the USER role
|
||
Handle AuthHandle `gotpm:"handle,auth"`
|
||
// HMAC data
|
||
Buffer TPM2BMaxBuffer
|
||
// Algorithm to use for HMAC
|
||
HashAlg TPMIAlgHash
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (Hmac) Command() TPMCC { return TPMCCHMAC }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd Hmac) Execute(t transport.TPM, s ...Session) (*HmacResponse, error) {
|
||
var rsp HmacResponse
|
||
if err := execute[HmacResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// HmacResponse is the response from TPM2_HMAC.
|
||
type HmacResponse struct {
|
||
// the returned HMAC in a sized buffer
|
||
OutHMAC TPM2BDigest
|
||
}
|
||
|
||
// GetRandom is the input to TPM2_GetRandom.
|
||
// See definition in Part 3, Commands, section 16.1
|
||
type GetRandom struct {
|
||
// number of octets to return
|
||
BytesRequested uint16
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (GetRandom) Command() TPMCC { return TPMCCGetRandom }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd GetRandom) Execute(t transport.TPM, s ...Session) (*GetRandomResponse, error) {
|
||
var rsp GetRandomResponse
|
||
if err := execute[GetRandomResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// GetRandomResponse is the response from TPM2_GetRandom.
|
||
type GetRandomResponse struct {
|
||
// the random octets
|
||
RandomBytes TPM2BDigest
|
||
}
|
||
|
||
// HashSequenceStart is the input to TPM2_HashSequenceStart.
|
||
// See definition in Part 3, Commands, section 17.3
|
||
type HashSequenceStart struct {
|
||
// authorization value for subsequent use of the sequence
|
||
Auth TPM2BAuth
|
||
// the hash algorithm to use for the hash sequence
|
||
// An Event Sequence starts if this is TPM_ALG_NULL.
|
||
HashAlg TPMIAlgHash
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (HashSequenceStart) Command() TPMCC { return TPMCCHashSequenceStart }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd HashSequenceStart) Execute(t transport.TPM, s ...Session) (*HashSequenceStartResponse, error) {
|
||
var rsp HashSequenceStartResponse
|
||
if err := execute[HashSequenceStartResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// HashSequenceStartResponse is the response from TPM2_StartHashSequence.
|
||
type HashSequenceStartResponse struct {
|
||
// a handle to reference the sequence
|
||
SequenceHandle TPMIDHObject
|
||
}
|
||
|
||
// HmacStart is the input to TPM2_HMAC_Start.
|
||
// See definition in Part 3, Commands, section 17.2.2
|
||
type HmacStart struct {
|
||
// HMAC key handle
|
||
Handle handle `gotpm:"handle,auth"`
|
||
// authorization value for subsequent use of the sequence
|
||
Auth TPM2BAuth
|
||
// the hash algorithm to use for the hmac sequence
|
||
HashAlg TPMIAlgHash `gotpm:"nullable"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (HmacStart) Command() TPMCC { return TPMCCHMACStart }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd HmacStart) Execute(t transport.TPM, s ...Session) (*HmacStartResponse, error) {
|
||
var rsp HmacStartResponse
|
||
if err := execute[HmacStartResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// HmacStartResponse is the response from TPM2_HMAC_Start.
|
||
// See definition in Part 3, Commands, section 17.2.2
|
||
type HmacStartResponse struct {
|
||
// a handle to reference the sequence
|
||
SequenceHandle TPMIDHObject `gotpm:"handle"`
|
||
}
|
||
|
||
// SequenceUpdate is the input to TPM2_SequenceUpdate.
|
||
// See definition in Part 3, Commands, section 17.4
|
||
type SequenceUpdate struct {
|
||
// handle for the sequence object
|
||
SequenceHandle handle `gotpm:"handle,auth,anon"`
|
||
// data to be added to hash
|
||
Buffer TPM2BMaxBuffer
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (SequenceUpdate) Command() TPMCC { return TPMCCSequenceUpdate }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd SequenceUpdate) Execute(t transport.TPM, s ...Session) (*SequenceUpdateResponse, error) {
|
||
var rsp SequenceUpdateResponse
|
||
if err := execute[SequenceUpdateResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// SequenceUpdateResponse is the response from TPM2_SequenceUpdate.
|
||
type SequenceUpdateResponse struct{}
|
||
|
||
// SequenceComplete is the input to TPM2_SequenceComplete.
|
||
// See definition in Part 3, Commands, section 17.5
|
||
type SequenceComplete struct {
|
||
// authorization for the sequence
|
||
SequenceHandle handle `gotpm:"handle,auth,anon"`
|
||
// data to be added to the hash/HMAC
|
||
Buffer TPM2BMaxBuffer
|
||
// hierarchy of the ticket for a hash
|
||
Hierarchy TPMIRHHierarchy `gotpm:"nullable"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (SequenceComplete) Command() TPMCC { return TPMCCSequenceComplete }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd SequenceComplete) Execute(t transport.TPM, s ...Session) (*SequenceCompleteResponse, error) {
|
||
var rsp SequenceCompleteResponse
|
||
if err := execute[SequenceCompleteResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// SequenceCompleteResponse is the response from TPM2_SequenceComplete.
|
||
type SequenceCompleteResponse struct {
|
||
// the returned HMAC or digest in a sized buffer
|
||
Result TPM2BDigest
|
||
// ticket indicating that the sequence of octets used to
|
||
// compute outDigest did not start with TPM_GENERATED_VALUE
|
||
Validation TPMTTKHashCheck
|
||
}
|
||
|
||
// Certify is the input to TPM2_Certify.
|
||
// See definition in Part 3, Commands, section 18.2.
|
||
type Certify struct {
|
||
// handle of the object to be certified
|
||
ObjectHandle handle `gotpm:"handle,auth"`
|
||
// handle of the key used to sign the attestation structure
|
||
SignHandle handle `gotpm:"handle,auth"`
|
||
// user provided qualifying data
|
||
QualifyingData TPM2BData
|
||
// signing scheme to use if the scheme for signHandle is TPM_ALG_NULL
|
||
InScheme TPMTSigScheme
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (Certify) Command() TPMCC { return TPMCCCertify }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd Certify) Execute(t transport.TPM, s ...Session) (*CertifyResponse, error) {
|
||
var rsp CertifyResponse
|
||
if err := execute[CertifyResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// CertifyResponse is the response from TPM2_Certify.
|
||
type CertifyResponse struct {
|
||
// the structure that was signed
|
||
CertifyInfo TPM2BAttest
|
||
// the asymmetric signature over certifyInfo using the key referenced by signHandle
|
||
Signature TPMTSignature
|
||
}
|
||
|
||
// CertifyCreation is the input to TPM2_CertifyCreation.
|
||
// See definition in Part 3, Commands, section 18.3.
|
||
type CertifyCreation struct {
|
||
// handle of the key that will sign the attestation block
|
||
SignHandle handle `gotpm:"handle,auth"`
|
||
// the object associated with the creation data
|
||
ObjectHandle handle `gotpm:"handle"`
|
||
// user-provided qualifying data
|
||
QualifyingData TPM2BData
|
||
// hash of the creation data produced by TPM2_Create() or TPM2_CreatePrimary()
|
||
CreationHash TPM2BDigest
|
||
// signing scheme to use if the scheme for signHandle is TPM_ALG_NULL
|
||
InScheme TPMTSigScheme
|
||
// ticket produced by TPM2_Create() or TPM2_CreatePrimary()
|
||
CreationTicket TPMTTKCreation
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (CertifyCreation) Command() TPMCC { return TPMCCCertifyCreation }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd CertifyCreation) Execute(t transport.TPM, s ...Session) (*CertifyCreationResponse, error) {
|
||
var rsp CertifyCreationResponse
|
||
if err := execute[CertifyCreationResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// CertifyCreationResponse is the response from TPM2_CertifyCreation.
|
||
type CertifyCreationResponse struct {
|
||
// the structure that was signed
|
||
CertifyInfo TPM2BAttest
|
||
// the signature over certifyInfo
|
||
Signature TPMTSignature
|
||
}
|
||
|
||
// Quote is the input to TPM2_Quote.
|
||
// See definition in Part 3, Commands, section 18.4
|
||
type Quote struct {
|
||
// handle of key that will perform signature
|
||
SignHandle handle `gotpm:"handle,auth"`
|
||
// data supplied by the caller
|
||
QualifyingData TPM2BData
|
||
// signing scheme to use if the scheme for signHandle is TPM_ALG_NULL
|
||
InScheme TPMTSigScheme
|
||
// PCR set to quote
|
||
PCRSelect TPMLPCRSelection
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (Quote) Command() TPMCC { return TPMCCQuote }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd Quote) Execute(t transport.TPM, s ...Session) (*QuoteResponse, error) {
|
||
var rsp QuoteResponse
|
||
if err := execute[QuoteResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// QuoteResponse is the response from TPM2_Quote.
|
||
type QuoteResponse struct {
|
||
// the quoted information
|
||
Quoted TPM2BAttest
|
||
// the signature over quoted
|
||
Signature TPMTSignature
|
||
}
|
||
|
||
// GetSessionAuditDigest is the input to TPM2_GetSessionAuditDigest.
|
||
// See definition in Part 3, Commands, section 18.5
|
||
type GetSessionAuditDigest struct {
|
||
// handle of the privacy administrator (TPM_RH_ENDORSEMENT)
|
||
PrivacyAdminHandle handle `gotpm:"handle,auth"`
|
||
// handle of the signing key
|
||
SignHandle handle `gotpm:"handle,auth"`
|
||
// handle of the audit session
|
||
SessionHandle handle `gotpm:"handle"`
|
||
// user-provided qualifying data – may be zero-length
|
||
QualifyingData TPM2BData
|
||
// signing scheme to use if the scheme for signHandle is TPM_ALG_NULL
|
||
InScheme TPMTSigScheme
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (GetSessionAuditDigest) Command() TPMCC { return TPMCCGetSessionAuditDigest }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd GetSessionAuditDigest) Execute(t transport.TPM, s ...Session) (*GetSessionAuditDigestResponse, error) {
|
||
var rsp GetSessionAuditDigestResponse
|
||
if err := execute[GetSessionAuditDigestResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// GetSessionAuditDigestResponse is the response from
|
||
// TPM2_GetSessionAuditDigest.
|
||
type GetSessionAuditDigestResponse struct {
|
||
// the audit information that was signed
|
||
AuditInfo TPM2BAttest
|
||
// the signature over auditInfo
|
||
Signature TPMTSignature
|
||
}
|
||
|
||
// Commit is the input to TPM2_Commit.
|
||
// See definition in Part 3, Commands, section 19.2.
|
||
type Commit struct {
|
||
// handle of the key that will be used in the signing operation
|
||
SignHandle handle `gotpm:"handle,auth"`
|
||
// a point (M) on the curve used by signHandle
|
||
P1 TPM2BECCPoint
|
||
// octet array used to derive x-coordinate of a base point
|
||
S2 TPM2BSensitiveData
|
||
// y coordinate of the point associated with s2
|
||
Y2 TPM2BECCParameter
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (Commit) Command() TPMCC { return TPMCCCommit }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd Commit) Execute(t transport.TPM, s ...Session) (*CommitResponse, error) {
|
||
var rsp CommitResponse
|
||
if err := execute[CommitResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return &rsp, nil
|
||
}
|
||
|
||
// CommitResponse is the response from TPM2_Commit.
|
||
type CommitResponse struct {
|
||
// ECC point K ≔ [ds](x2, y2)
|
||
K TPM2BECCPoint
|
||
// ECC point L ≔ [r](x2, y2)
|
||
L TPM2BECCPoint
|
||
// ECC point E ≔ [r]P1
|
||
E TPM2BECCPoint
|
||
// least-significant 16 bits of commitCount
|
||
Counter uint16
|
||
}
|
||
|
||
// VerifySignature is the input to TPM2_VerifySignature.
|
||
// See definition in Part 3, Commands, section 20.1
|
||
type VerifySignature struct {
|
||
// handle of public key that will be used in the validation
|
||
KeyHandle handle `gotpm:"handle"`
|
||
// digest of the signed message
|
||
Digest TPM2BDigest
|
||
// signature to be tested
|
||
Signature TPMTSignature
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (VerifySignature) Command() TPMCC { return TPMCCVerifySignature }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd VerifySignature) Execute(t transport.TPM, s ...Session) (*VerifySignatureResponse, error) {
|
||
var rsp VerifySignatureResponse
|
||
if err := execute[VerifySignatureResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// VerifySignatureResponse is the response from TPM2_VerifySignature.
|
||
type VerifySignatureResponse struct {
|
||
Validation TPMTTKVerified
|
||
}
|
||
|
||
// Sign is the input to TPM2_Sign.
|
||
// See definition in Part 3, Commands, section 20.2.
|
||
type Sign struct {
|
||
// Handle of key that will perform signing
|
||
KeyHandle handle `gotpm:"handle,auth"`
|
||
// digest to be signed
|
||
Digest TPM2BDigest
|
||
// signing scheme to use if the scheme for keyHandle is TPM_ALG_NULL
|
||
InScheme TPMTSigScheme `gotpm:"nullable"`
|
||
// proof that digest was created by the TPM.
|
||
// If keyHandle is not a restricted signing key, then this
|
||
// may be a NULL Ticket with tag = TPM_ST_CHECKHASH.
|
||
Validation TPMTTKHashCheck
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (Sign) Command() TPMCC { return TPMCCSign }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd Sign) Execute(t transport.TPM, s ...Session) (*SignResponse, error) {
|
||
var rsp SignResponse
|
||
if err := execute[SignResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// SignResponse is the response from TPM2_Sign.
|
||
type SignResponse struct {
|
||
// the signature
|
||
Signature TPMTSignature
|
||
}
|
||
|
||
// PCRExtend is the input to TPM2_PCR_Extend.
|
||
// See definition in Part 3, Commands, section 22.2
|
||
type PCRExtend struct {
|
||
// handle of the PCR
|
||
PCRHandle handle `gotpm:"handle,auth"`
|
||
// list of tagged digest values to be extended
|
||
Digests TPMLDigestValues
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PCRExtend) Command() TPMCC { return TPMCCPCRExtend }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PCRExtend) Execute(t transport.TPM, s ...Session) (*PCRExtendResponse, error) {
|
||
var rsp PCRExtendResponse
|
||
err := execute[PCRExtendResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// PCRExtendResponse is the response from TPM2_PCR_Extend.
|
||
type PCRExtendResponse struct{}
|
||
|
||
// PCREvent is the input to TPM2_PCR_Event.
|
||
// See definition in Part 3, Commands, section 22.3
|
||
type PCREvent struct {
|
||
// Handle of the PCR
|
||
PCRHandle handle `gotpm:"handle,auth"`
|
||
// Event data in sized buffer
|
||
EventData TPM2BEvent
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PCREvent) Command() TPMCC { return TPMCCPCREvent }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PCREvent) Execute(t transport.TPM, s ...Session) (*PCREventResponse, error) {
|
||
var rsp PCREventResponse
|
||
err := execute[PCREventResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// PCREventResponse is the response from TPM2_PCR_Event.
|
||
type PCREventResponse struct{}
|
||
|
||
// PCRRead is the input to TPM2_PCR_Read.
|
||
// See definition in Part 3, Commands, section 22.4
|
||
type PCRRead struct {
|
||
// The selection of PCR to read
|
||
PCRSelectionIn TPMLPCRSelection
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PCRRead) Command() TPMCC { return TPMCCPCRRead }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PCRRead) Execute(t transport.TPM, s ...Session) (*PCRReadResponse, error) {
|
||
var rsp PCRReadResponse
|
||
if err := execute[PCRReadResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// PCRReadResponse is the response from TPM2_PCR_Read.
|
||
type PCRReadResponse struct {
|
||
// the current value of the PCR update counter
|
||
PCRUpdateCounter uint32
|
||
// the PCR in the returned list
|
||
PCRSelectionOut TPMLPCRSelection
|
||
// the contents of the PCR indicated in pcrSelectOut-> pcrSelection[] as tagged digests
|
||
PCRValues TPMLDigest
|
||
}
|
||
|
||
// PCRReset is the input to TPM2_PCRReset.
|
||
// See definition in Part 3, Commands, section 22.8.
|
||
type PCRReset struct {
|
||
// the PCR to reset
|
||
PCRHandle handle `gotpm:"handle,auth"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PCRReset) Command() TPMCC { return TPMCCPCRReset }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PCRReset) Execute(t transport.TPM, s ...Session) (*PCRResetResponse, error) {
|
||
var rsp PCRResetResponse
|
||
if err := execute[PCRResetResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// PCRResetResponse is the response from TPM2_PCRReset.
|
||
type PCRResetResponse struct{}
|
||
|
||
// PolicySigned is the input to TPM2_PolicySigned.
|
||
// See definition in Part 3, Commands, section 23.3.
|
||
type PolicySigned struct {
|
||
// handle for an entity providing the authorization
|
||
AuthObject handle `gotpm:"handle"`
|
||
// handle for the policy session being extended
|
||
PolicySession handle `gotpm:"handle"`
|
||
// the policy nonce for the session
|
||
NonceTPM TPM2BNonce
|
||
// digest of the command parameters to which this authorization is limited
|
||
CPHashA TPM2BDigest
|
||
// a reference to a policy relating to the authorization – may be the Empty Buffer
|
||
PolicyRef TPM2BNonce
|
||
// time when authorization will expire, measured in seconds from the time
|
||
// that nonceTPM was generated
|
||
Expiration int32
|
||
// signed authorization (not optional)
|
||
Auth TPMTSignature
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PolicySigned) Command() TPMCC { return TPMCCPolicySigned }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PolicySigned) Execute(t transport.TPM, s ...Session) (*PolicySignedResponse, error) {
|
||
var rsp PolicySignedResponse
|
||
if err := execute[PolicySignedResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// policyUpdate implements the PolicyUpdate helper for the several TPM policy
|
||
// commands as described in Part 3, 23.2.3.
|
||
func policyUpdate(policy *PolicyCalculator, cc TPMCC, arg2, arg3 []byte) error {
|
||
if err := policy.Update(cc, arg2); err != nil {
|
||
return err
|
||
}
|
||
return policy.Update(arg3)
|
||
}
|
||
|
||
// Update implements the PolicyCommand interface.
|
||
func (cmd PolicySigned) Update(policy *PolicyCalculator) error {
|
||
return policyUpdate(policy, TPMCCPolicySigned, cmd.AuthObject.KnownName().Buffer, cmd.PolicyRef.Buffer)
|
||
}
|
||
|
||
// PolicySignedResponse is the response from TPM2_PolicySigned.
|
||
type PolicySignedResponse struct {
|
||
// implementation-specific time value used to indicate to the TPM when the ticket expires
|
||
Timeout TPM2BTimeout
|
||
// produced if the command succeeds and expiration in the command was non-zero
|
||
PolicyTicket TPMTTKAuth
|
||
}
|
||
|
||
// PolicySecret is the input to TPM2_PolicySecret.
|
||
// See definition in Part 3, Commands, section 23.4.
|
||
type PolicySecret struct {
|
||
// handle for an entity providing the authorization
|
||
AuthHandle handle `gotpm:"handle,auth"`
|
||
// handle for the policy session being extended
|
||
PolicySession handle `gotpm:"handle"`
|
||
// the policy nonce for the session
|
||
NonceTPM TPM2BNonce
|
||
// digest of the command parameters to which this authorization is limited
|
||
CPHashA TPM2BDigest
|
||
// a reference to a policy relating to the authorization – may be the Empty Buffer
|
||
PolicyRef TPM2BNonce
|
||
// time when authorization will expire, measured in seconds from the time
|
||
// that nonceTPM was generated
|
||
Expiration int32
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PolicySecret) Command() TPMCC { return TPMCCPolicySecret }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PolicySecret) Execute(t transport.TPM, s ...Session) (*PolicySecretResponse, error) {
|
||
var rsp PolicySecretResponse
|
||
if err := execute[PolicySecretResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// Update implements the PolicyCommand interface.
|
||
func (cmd PolicySecret) Update(policy *PolicyCalculator) error {
|
||
return policyUpdate(policy, TPMCCPolicySecret, cmd.AuthHandle.KnownName().Buffer, cmd.PolicyRef.Buffer)
|
||
}
|
||
|
||
// PolicySecretResponse is the response from TPM2_PolicySecret.
|
||
type PolicySecretResponse struct {
|
||
// implementation-specific time value used to indicate to the TPM when the ticket expires
|
||
Timeout TPM2BTimeout
|
||
// produced if the command succeeds and expiration in the command was non-zero
|
||
PolicyTicket TPMTTKAuth
|
||
}
|
||
|
||
// PolicyOr is the input to TPM2_PolicyOR.
|
||
// See definition in Part 3, Commands, section 23.6.
|
||
type PolicyOr struct {
|
||
// handle for the policy session being extended
|
||
PolicySession handle `gotpm:"handle"`
|
||
// the list of hashes to check for a match
|
||
PHashList TPMLDigest
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PolicyOr) Command() TPMCC { return TPMCCPolicyOR }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PolicyOr) Execute(t transport.TPM, s ...Session) (*PolicyOrResponse, error) {
|
||
var rsp PolicyOrResponse
|
||
err := execute[PolicyOrResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// Update implements the PolicyCommand interface.
|
||
func (cmd PolicyOr) Update(policy *PolicyCalculator) error {
|
||
policy.Reset()
|
||
var digests bytes.Buffer
|
||
for _, digest := range cmd.PHashList.Digests {
|
||
digests.Write(digest.Buffer)
|
||
}
|
||
return policy.Update(TPMCCPolicyOR, digests.Bytes())
|
||
}
|
||
|
||
// PolicyOrResponse is the response from TPM2_PolicyOr.
|
||
type PolicyOrResponse struct{}
|
||
|
||
// PolicyPCR is the input to TPM2_PolicyPCR.
|
||
// See definition in Part 3, Commands, section 23.7.
|
||
type PolicyPCR struct {
|
||
// handle for the policy session being extended
|
||
PolicySession handle `gotpm:"handle"`
|
||
// expected digest value of the selected PCR using the
|
||
// hash algorithm of the session; may be zero length
|
||
PcrDigest TPM2BDigest
|
||
// the PCR to include in the check digest
|
||
Pcrs TPMLPCRSelection
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PolicyPCR) Command() TPMCC { return TPMCCPolicyPCR }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PolicyPCR) Execute(t transport.TPM, s ...Session) (*PolicyPCRResponse, error) {
|
||
var rsp PolicyPCRResponse
|
||
err := execute[PolicyPCRResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// Update implements the PolicyCommand interface.
|
||
func (cmd PolicyPCR) Update(policy *PolicyCalculator) error {
|
||
return policy.Update(TPMCCPolicyPCR, cmd.Pcrs, cmd.PcrDigest.Buffer)
|
||
}
|
||
|
||
// PolicyPCRResponse is the response from TPM2_PolicyPCR.
|
||
type PolicyPCRResponse struct{}
|
||
|
||
// PolicyAuthValue is the input to TPM2_PolicyAuthValue.
|
||
// See definition in Part 3, Commands, section 23.17.
|
||
type PolicyAuthValue struct {
|
||
// handle for the policy session being extended
|
||
PolicySession handle `gotpm:"handle"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PolicyAuthValue) Command() TPMCC { return TPMCCPolicyAuthValue }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PolicyAuthValue) Execute(t transport.TPM, s ...Session) (*PolicyAuthValueResponse, error) {
|
||
var rsp PolicyAuthValueResponse
|
||
err := execute[PolicyAuthValueResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// Update implements the PolicyAuthValue interface.
|
||
func (cmd PolicyAuthValue) Update(policy *PolicyCalculator) error {
|
||
return policy.Update(TPMCCPolicyAuthValue)
|
||
}
|
||
|
||
// PolicyAuthValueResponse is the response from TPM2_PolicyAuthValue.
|
||
type PolicyAuthValueResponse struct{}
|
||
|
||
// PolicyDuplicationSelect is the input to TPM2_PolicyDuplicationSelect.
|
||
// See definition in Part 3, Commands, section 23.15.
|
||
type PolicyDuplicationSelect struct {
|
||
// handle for the policy session being extended
|
||
PolicySession handle `gotpm:"handle"`
|
||
ObjectName TPM2BName
|
||
NewParentName TPM2BName
|
||
IncludeObject TPMIYesNo
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PolicyDuplicationSelect) Command() TPMCC { return TPMCCPolicyDuplicationSelect }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PolicyDuplicationSelect) Execute(t transport.TPM, s ...Session) (*PolicyDuplicationSelectResponse, error) {
|
||
var rsp PolicyDuplicationSelectResponse
|
||
err := execute[PolicyDuplicationSelectResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// Update implements the PolicyDuplicationSelect interface.
|
||
func (cmd PolicyDuplicationSelect) Update(policy *PolicyCalculator) error {
|
||
if cmd.IncludeObject {
|
||
return policy.Update(TPMCCPolicyDuplicationSelect, cmd.ObjectName.Buffer, cmd.NewParentName.Buffer, cmd.IncludeObject)
|
||
}
|
||
return policy.Update(TPMCCPolicyDuplicationSelect, cmd.NewParentName.Buffer, cmd.IncludeObject)
|
||
}
|
||
|
||
// PolicyDuplicationSelectResponse is the response from TPM2_PolicyDuplicationSelect.
|
||
type PolicyDuplicationSelectResponse struct{}
|
||
|
||
// PolicyNV is the input to TPM2_PolicyNV.
|
||
// See definition in Part 3, Commands, section 23.9.
|
||
type PolicyNV struct {
|
||
// handle indicating the source of the authorization value
|
||
AuthHandle handle `gotpm:"handle,auth"`
|
||
// the NV Index of the area to read
|
||
NVIndex handle `gotpm:"handle"`
|
||
// handle for the policy session being extended
|
||
PolicySession handle `gotpm:"handle"`
|
||
// the second operand
|
||
OperandB TPM2BOperand
|
||
// the octet offset in the NV Index for the start of operand A
|
||
Offset uint16
|
||
// the comparison to make
|
||
Operation TPMEO
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PolicyNV) Command() TPMCC { return TPMCCPolicyNV }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PolicyNV) Execute(t transport.TPM, s ...Session) (*PolicyNVResponse, error) {
|
||
var rsp PolicyNVResponse
|
||
err := execute[PolicyNVResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// Update implements the PolicyCommand interface.
|
||
func (cmd PolicyNV) Update(policy *PolicyCalculator) error {
|
||
alg, err := policy.alg.Hash()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
h := alg.New()
|
||
h.Write(cmd.OperandB.Buffer)
|
||
binary.Write(h, binary.BigEndian, cmd.Offset)
|
||
binary.Write(h, binary.BigEndian, cmd.Operation)
|
||
args := h.Sum(nil)
|
||
return policy.Update(TPMCCPolicyNV, args, cmd.NVIndex.KnownName().Buffer)
|
||
}
|
||
|
||
// PolicyNVResponse is the response from TPM2_PolicyPCR.
|
||
type PolicyNVResponse struct{}
|
||
|
||
// PolicyCommandCode is the input to TPM2_PolicyCommandCode.
|
||
// See definition in Part 3, Commands, section 23.11.
|
||
type PolicyCommandCode struct {
|
||
// handle for the policy session being extended
|
||
PolicySession handle `gotpm:"handle"`
|
||
// the allowed commandCode
|
||
Code TPMCC
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PolicyCommandCode) Command() TPMCC { return TPMCCPolicyCommandCode }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PolicyCommandCode) Execute(t transport.TPM, s ...Session) (*PolicyCommandCodeResponse, error) {
|
||
var rsp PolicyCommandCodeResponse
|
||
err := execute[PolicyCommandCodeResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// Update implements the PolicyCommand interface.
|
||
func (cmd PolicyCommandCode) Update(policy *PolicyCalculator) error {
|
||
return policy.Update(TPMCCPolicyCommandCode, cmd.Code)
|
||
}
|
||
|
||
// PolicyCommandCodeResponse is the response from TPM2_PolicyCommandCode.
|
||
type PolicyCommandCodeResponse struct{}
|
||
|
||
// PolicyCPHash is the input to TPM2_PolicyCpHash.
|
||
// See definition in Part 3, Commands, section 23.13.
|
||
type PolicyCPHash struct {
|
||
// handle for the policy session being extended
|
||
PolicySession handle `gotpm:"handle"`
|
||
// the cpHash added to the policy
|
||
CPHashA TPM2BDigest
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PolicyCPHash) Command() TPMCC { return TPMCCPolicyCpHash }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PolicyCPHash) Execute(t transport.TPM, s ...Session) (*PolicyCPHashResponse, error) {
|
||
var rsp PolicyCPHashResponse
|
||
err := execute[PolicyCPHashResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// Update implements the PolicyCommand interface.
|
||
func (cmd PolicyCPHash) Update(policy *PolicyCalculator) error {
|
||
return policy.Update(TPMCCPolicyCpHash, cmd.CPHashA.Buffer)
|
||
}
|
||
|
||
// PolicyCPHashResponse is the response from TPM2_PolicyCpHash.
|
||
type PolicyCPHashResponse struct{}
|
||
|
||
// PolicyAuthorize is the input to TPM2_PolicySigned.
|
||
// See definition in Part 3, Commands, section 23.16.
|
||
type PolicyAuthorize struct {
|
||
// handle for the policy session being extended
|
||
PolicySession handle `gotpm:"handle"`
|
||
// digest of the policy being approved
|
||
ApprovedPolicy TPM2BDigest
|
||
// a policy qualifier
|
||
PolicyRef TPM2BDigest
|
||
// Name of a key that can sign a policy addition
|
||
KeySign TPM2BName
|
||
// ticket validating that approvedPolicy and policyRef were signed by keySign
|
||
CheckTicket TPMTTKVerified
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PolicyAuthorize) Command() TPMCC { return TPMCCPolicyAuthorize }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PolicyAuthorize) Execute(t transport.TPM, s ...Session) (*PolicyAuthorizeResponse, error) {
|
||
var rsp PolicyAuthorizeResponse
|
||
err := execute[PolicyAuthorizeResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// Update implements the PolicyCommand interface.
|
||
func (cmd PolicyAuthorize) Update(policy *PolicyCalculator) error {
|
||
return policyUpdate(policy, TPMCCPolicyAuthorize, cmd.KeySign.Buffer, cmd.PolicyRef.Buffer)
|
||
}
|
||
|
||
// PolicyAuthorizeResponse is the response from TPM2_PolicyAuthorize.
|
||
type PolicyAuthorizeResponse struct{}
|
||
|
||
// PolicyGetDigest is the input to TPM2_PolicyGetDigest.
|
||
// See definition in Part 3, Commands, section 23.19.
|
||
type PolicyGetDigest struct {
|
||
// handle for the policy session
|
||
PolicySession handle `gotpm:"handle"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PolicyGetDigest) Command() TPMCC { return TPMCCPolicyGetDigest }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PolicyGetDigest) Execute(t transport.TPM, s ...Session) (*PolicyGetDigestResponse, error) {
|
||
var rsp PolicyGetDigestResponse
|
||
if err := execute[PolicyGetDigestResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// PolicyGetDigestResponse is the response from TPM2_PolicyGetDigest.
|
||
type PolicyGetDigestResponse struct {
|
||
// the current value of the policySession→policyDigest
|
||
PolicyDigest TPM2BDigest
|
||
}
|
||
|
||
// PolicyNVWritten is the input to TPM2_PolicyNvWritten.
|
||
// See definition in Part 3, Commands, section 23.20.
|
||
type PolicyNVWritten struct {
|
||
// handle for the policy session being extended
|
||
PolicySession handle `gotpm:"handle"`
|
||
// YES if NV Index is required to have been written
|
||
// NO if NV Index is required not to have been written
|
||
WrittenSet TPMIYesNo
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PolicyNVWritten) Command() TPMCC { return TPMCCPolicyNvWritten }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PolicyNVWritten) Execute(t transport.TPM, s ...Session) (*PolicyNVWrittenResponse, error) {
|
||
var rsp PolicyNVWrittenResponse
|
||
if err := execute[PolicyNVWrittenResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// Update implements the PolicyCommand interface.
|
||
func (cmd PolicyNVWritten) Update(policy *PolicyCalculator) error {
|
||
return policy.Update(TPMCCPolicyNvWritten, cmd.WrittenSet)
|
||
}
|
||
|
||
// PolicyNVWrittenResponse is the response from TPM2_PolicyNvWritten.
|
||
type PolicyNVWrittenResponse struct {
|
||
}
|
||
|
||
// PolicyAuthorizeNV is the input to TPM2_PolicyAuthorizeNV.
|
||
// See definition in Part 3, Commands, section 23.22.
|
||
type PolicyAuthorizeNV struct {
|
||
// handle indicating the source of the authorization value
|
||
AuthHandle handle `gotpm:"handle,auth"`
|
||
// the NV Index of the area to read
|
||
NVIndex handle `gotpm:"handle"`
|
||
// handle for the policy session being extended
|
||
PolicySession handle `gotpm:"handle"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (PolicyAuthorizeNV) Command() TPMCC { return TPMCCPolicyAuthorizeNV }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd PolicyAuthorizeNV) Execute(t transport.TPM, s ...Session) (*PolicyAuthorizeNVResponse, error) {
|
||
var rsp PolicyAuthorizeNVResponse
|
||
err := execute[PolicyAuthorizeNVResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// Update implements the PolicyCommand interface.
|
||
func (cmd PolicyAuthorizeNV) Update(policy *PolicyCalculator) error {
|
||
policy.Reset()
|
||
return policy.Update(TPMCCPolicyAuthorizeNV, cmd.NVIndex.KnownName().Buffer)
|
||
}
|
||
|
||
// PolicyAuthorizeNVResponse is the response from TPM2_PolicyAuthorizeNV.
|
||
type PolicyAuthorizeNVResponse struct{}
|
||
|
||
// CreatePrimary is the input to TPM2_CreatePrimary.
|
||
// See definition in Part 3, Commands, section 24.1
|
||
type CreatePrimary struct {
|
||
// TPM_RH_ENDORSEMENT, TPM_RH_OWNER, TPM_RH_PLATFORM+{PP},
|
||
// TPM_RH_NULL, TPM_RH_FW_ENDORSEMENT, TPM_RH_FW_OWNER
|
||
// TPM_RH_FW_PLATFORM+{PP} or TPM_RH_FW_NULL
|
||
PrimaryHandle handle `gotpm:"handle,auth"`
|
||
// the sensitive data
|
||
InSensitive TPM2BSensitiveCreate
|
||
// the public template
|
||
InPublic TPM2BPublic
|
||
// data that will be included in the creation data for this
|
||
// object to provide permanent, verifiable linkage between this
|
||
// object and some object owner data
|
||
OutsideInfo TPM2BData
|
||
// PCR that will be used in creation data
|
||
CreationPCR TPMLPCRSelection
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (CreatePrimary) Command() TPMCC { return TPMCCCreatePrimary }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd CreatePrimary) Execute(t transport.TPM, s ...Session) (*CreatePrimaryResponse, error) {
|
||
var rsp CreatePrimaryResponse
|
||
if err := execute[CreatePrimaryResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// CreatePrimaryResponse is the response from TPM2_CreatePrimary.
|
||
type CreatePrimaryResponse struct {
|
||
// handle of type TPM_HT_TRANSIENT for created Primary Object
|
||
ObjectHandle TPMHandle `gotpm:"handle"`
|
||
// the public portion of the created object
|
||
OutPublic TPM2BPublic
|
||
// contains a TPMS_CREATION_DATA
|
||
CreationData tpm2bCreationData
|
||
// digest of creationData using nameAlg of outPublic
|
||
CreationHash TPM2BDigest
|
||
// ticket used by TPM2_CertifyCreation() to validate that the
|
||
// creation data was produced by the TPM.
|
||
CreationTicket TPMTTKCreation
|
||
// the name of the created object
|
||
Name TPM2BName
|
||
}
|
||
|
||
// Clear is the input to TPM2_Clear.
|
||
// See definition in Part 3, Commands, section 24.6
|
||
type Clear struct {
|
||
// TPM_RH_LOCKOUT or TPM_RH_PLATFORM+{PP}
|
||
AuthHandle handle `gotpm:"handle,auth"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (Clear) Command() TPMCC { return TPMCCClear }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd Clear) Execute(t transport.TPM, s ...Session) (*ClearResponse, error) {
|
||
var rsp ClearResponse
|
||
err := execute[ClearResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// ClearResponse is the response from TPM2_Clear.
|
||
type ClearResponse struct{}
|
||
|
||
// HierarchyChangeAuth is the input to TPM2_HierarchyChangeAuth.
|
||
// See definition in Part 3, Commands, section 24.8
|
||
type HierarchyChangeAuth struct {
|
||
// TPM_RH_ENDORSEMENT, TPM_RH_LOCKOUT, TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
|
||
AuthHandle handle `gotpm:"handle,auth"`
|
||
// new authorization value
|
||
NewAuth TPM2BAuth
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (HierarchyChangeAuth) Command() TPMCC { return TPMCCHierarchyChanegAuth }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd HierarchyChangeAuth) Execute(t transport.TPM, s ...Session) (*HierarchyChangeAuthResponse, error) {
|
||
var rsp HierarchyChangeAuthResponse
|
||
if err := execute[HierarchyChangeAuthResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// HierarchyChangeAuthResponse is the response from TPM2_HierarchyChangeAuth.
|
||
type HierarchyChangeAuthResponse struct{}
|
||
|
||
// ContextSave is the input to TPM2_ContextSave.
|
||
// See definition in Part 3, Commands, section 28.2
|
||
type ContextSave struct {
|
||
// handle of the resource to save
|
||
SaveHandle TPMIDHContext
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (ContextSave) Command() TPMCC { return TPMCCContextSave }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd ContextSave) Execute(t transport.TPM, s ...Session) (*ContextSaveResponse, error) {
|
||
var rsp ContextSaveResponse
|
||
if err := execute[ContextSaveResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// ContextSaveResponse is the response from TPM2_ContextSave.
|
||
type ContextSaveResponse struct {
|
||
Context TPMSContext
|
||
}
|
||
|
||
// ContextLoad is the input to TPM2_ContextLoad.
|
||
// See definition in Part 3, Commands, section 28.3
|
||
type ContextLoad struct {
|
||
// the context blob
|
||
Context TPMSContext
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (ContextLoad) Command() TPMCC { return TPMCCContextLoad }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd ContextLoad) Execute(t transport.TPM, s ...Session) (*ContextLoadResponse, error) {
|
||
var rsp ContextLoadResponse
|
||
if err := execute[ContextLoadResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// ContextLoadResponse is the response from TPM2_ContextLoad.
|
||
type ContextLoadResponse struct {
|
||
// the handle assigned to the resource after it has been successfully loaded
|
||
LoadedHandle TPMIDHContext
|
||
}
|
||
|
||
// FlushContext is the input to TPM2_FlushContext.
|
||
// See definition in Part 3, Commands, section 28.4
|
||
type FlushContext struct {
|
||
// the handle of the item to flush
|
||
FlushHandle handle `gotpm:"handle"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (FlushContext) Command() TPMCC { return TPMCCFlushContext }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd FlushContext) Execute(t transport.TPM, s ...Session) (*FlushContextResponse, error) {
|
||
var rsp FlushContextResponse
|
||
err := execute[FlushContextResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// FlushContextResponse is the response from TPM2_FlushContext.
|
||
type FlushContextResponse struct{}
|
||
|
||
// EvictControl is the input to TPM2_EvictControl.
|
||
// See definition in Part 3, Commands, section 28.5
|
||
type EvictControl struct {
|
||
// TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
|
||
Auth handle `gotpm:"handle,auth"`
|
||
ObjectHandle handle `gotpm:"handle"`
|
||
PersistentHandle TPMIDHPersistent
|
||
}
|
||
|
||
// EvictControlResponse is the response from TPM2_EvictControl.
|
||
type EvictControlResponse struct{}
|
||
|
||
// Command implements the Command interface.
|
||
func (EvictControl) Command() TPMCC { return TPMCCEvictControl }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd EvictControl) Execute(t transport.TPM, s ...Session) (*EvictControlResponse, error) {
|
||
var rsp EvictControlResponse
|
||
if err := execute[EvictControlResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// Duplicate is the input to TPM2_Duplicate.
|
||
// See definition in Part 3, Commands, section 13.1
|
||
type Duplicate struct {
|
||
// ObjectHandle is the handle of the object to dupliate.
|
||
ObjectHandle handle `gotpm:"handle,auth"`
|
||
|
||
// NewParentHandle is the handle of the new parent.
|
||
NewParentHandle handle `gotpm:"handle"`
|
||
|
||
// EncryptionKeyIn is the optional symmetric encryption key used as the
|
||
// inner wrapper. If SymmetricAlg is TPM_ALG_NULL, then this parameter
|
||
// shall be the Empty Buffer.
|
||
EncryptionKeyIn TPM2BData
|
||
|
||
// Definition of the symmetric algorithm to use for the inner wrapper.
|
||
// It may be TPM_ALG_NULL if no inner wrapper is applied.
|
||
Symmetric TPMTSymDef
|
||
}
|
||
|
||
// DuplicateResponse is the response from TPM2_Duplicate.
|
||
type DuplicateResponse struct {
|
||
// EncryptionKeyOut is the symmetric encryption key used as the
|
||
// inner wrapper. If SymmetricAlg is TPM_ALG_NULL, this value
|
||
// shall be the Empty Buffer.
|
||
EncryptionKeyOut TPM2BData
|
||
|
||
// Duplicate is the private area of the object. It may be encrypted by
|
||
// EncryptionKeyIn and may be doubly encrypted.
|
||
Duplicate TPM2BPrivate
|
||
|
||
// OutSymSeed is the seed protected by the asymmetric algorithms of new
|
||
// parent.
|
||
OutSymSeed TPM2BEncryptedSecret
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (Duplicate) Command() TPMCC { return TPMCCDuplicate }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd Duplicate) Execute(t transport.TPM, s ...Session) (*DuplicateResponse, error) {
|
||
var rsp DuplicateResponse
|
||
if err := execute[DuplicateResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// Import is the input to TPM2_Import.
|
||
// See definition in Part 3, Commands, section 13.3
|
||
type Import struct {
|
||
// handle of parent for new object
|
||
ParentHandle handle `gotpm:"handle,auth"`
|
||
|
||
// The optional symmetric encryption key used as the inner wrapper for duplicate
|
||
// If SymmetricAlg is TPM_ALG_NULL, then this parametert shall be the Empty Buffer
|
||
EncryptionKey TPM2BData
|
||
|
||
// The public area of the object to be imported
|
||
ObjectPublic TPM2BPublic
|
||
|
||
// The symmetrically encrypted duplicate object that may contain an inner
|
||
// symmetric wrapper
|
||
Duplicate TPM2BPrivate
|
||
|
||
// The seed for the symmetric key and HMAC key
|
||
InSymSeed TPM2BEncryptedSecret
|
||
|
||
// Definition of the symmetric algorithm to use for the inner wrapper
|
||
Symmetric TPMTSymDef
|
||
}
|
||
|
||
// ImportResponse is the response from TPM2_Import.
|
||
type ImportResponse struct {
|
||
// the private portion of the object
|
||
OutPrivate TPM2BPrivate
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (Import) Command() TPMCC { return TPMCCImport }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd Import) Execute(t transport.TPM, s ...Session) (*ImportResponse, error) {
|
||
var rsp ImportResponse
|
||
if err := execute[ImportResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// ReadClock is the input to TPM2_ReadClock.
|
||
// See definition in Part 3, Commands, section 29.1
|
||
type ReadClock struct{}
|
||
|
||
// Command implements the Command interface.
|
||
func (ReadClock) Command() TPMCC { return TPMCCReadClock }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd ReadClock) Execute(t transport.TPM, s ...Session) (*ReadClockResponse, error) {
|
||
var rsp ReadClockResponse
|
||
if err := execute[ReadClockResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// ReadClockResponse is the response from TPM2_ReadClock.
|
||
type ReadClockResponse struct {
|
||
CurrentTime TPMSTimeInfo
|
||
}
|
||
|
||
// GetCapability is the input to TPM2_GetCapability.
|
||
// See definition in Part 3, Commands, section 30.2
|
||
type GetCapability struct {
|
||
// group selection; determines the format of the response
|
||
Capability TPMCap
|
||
// further definition of information
|
||
Property uint32
|
||
// number of properties of the indicated type to return
|
||
PropertyCount uint32
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (GetCapability) Command() TPMCC { return TPMCCGetCapability }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd GetCapability) Execute(t transport.TPM, s ...Session) (*GetCapabilityResponse, error) {
|
||
var rsp GetCapabilityResponse
|
||
if err := execute[GetCapabilityResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// GetCapabilityResponse is the response from TPM2_GetCapability.
|
||
type GetCapabilityResponse struct {
|
||
// flag to indicate if there are more values of this type
|
||
MoreData TPMIYesNo
|
||
// the capability data
|
||
CapabilityData TPMSCapabilityData
|
||
}
|
||
|
||
// TestParms is the input to TPM2_TestParms.
|
||
// See definition in Part 3, Commands, section 30.3
|
||
type TestParms struct {
|
||
// Algorithms parameters to be validates
|
||
Parameters TPMTPublicParms
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (TestParms) Command() TPMCC { return TPMCCTestParms }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd TestParms) Execute(t transport.TPM, s ...Session) (*TestParmsResponse, error) {
|
||
var rsp TestParmsResponse
|
||
if err := execute[TestParmsResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// TestParmsResponse is the response from TPM2_TestParms.
|
||
type TestParmsResponse struct{}
|
||
|
||
// NVDefineSpace is the input to TPM2_NV_DefineSpace.
|
||
// See definition in Part 3, Commands, section 31.3.
|
||
type NVDefineSpace struct {
|
||
// TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
|
||
AuthHandle handle `gotpm:"handle,auth"`
|
||
// the authorization value
|
||
Auth TPM2BAuth
|
||
// the public parameters of the NV area
|
||
PublicInfo TPM2BNVPublic
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (NVDefineSpace) Command() TPMCC { return TPMCCNVDefineSpace }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd NVDefineSpace) Execute(t transport.TPM, s ...Session) (*NVDefineSpaceResponse, error) {
|
||
var rsp NVDefineSpaceResponse
|
||
err := execute[NVDefineSpaceResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// NVDefineSpaceResponse is the response from TPM2_NV_DefineSpace.
|
||
type NVDefineSpaceResponse struct{}
|
||
|
||
// NVUndefineSpace is the input to TPM2_NV_UndefineSpace.
|
||
// See definition in Part 3, Commands, section 31.4.
|
||
type NVUndefineSpace struct {
|
||
// TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
|
||
AuthHandle handle `gotpm:"handle,auth"`
|
||
// the NV Index to remove from NV space
|
||
NVIndex handle `gotpm:"handle"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (NVUndefineSpace) Command() TPMCC { return TPMCCNVUndefineSpace }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd NVUndefineSpace) Execute(t transport.TPM, s ...Session) (*NVUndefineSpaceResponse, error) {
|
||
var rsp NVUndefineSpaceResponse
|
||
err := execute[NVUndefineSpaceResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// NVUndefineSpaceResponse is the response from TPM2_NV_UndefineSpace.
|
||
type NVUndefineSpaceResponse struct{}
|
||
|
||
// NVUndefineSpaceSpecial is the input to TPM2_NV_UndefineSpaceSpecial.
|
||
// See definition in Part 3, Commands, section 31.5.
|
||
type NVUndefineSpaceSpecial struct {
|
||
// Index to be deleted
|
||
NVIndex handle `gotpm:"handle,auth"`
|
||
// TPM_RH_PLATFORM+{PP}
|
||
Platform handle `gotpm:"handle,auth"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (NVUndefineSpaceSpecial) Command() TPMCC { return TPMCCNVUndefineSpaceSpecial }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd NVUndefineSpaceSpecial) Execute(t transport.TPM, s ...Session) (*NVUndefineSpaceSpecialResponse, error) {
|
||
var rsp NVUndefineSpaceSpecialResponse
|
||
err := execute[NVUndefineSpaceSpecialResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// NVUndefineSpaceSpecialResponse is the response from TPM2_NV_UndefineSpaceSpecial.
|
||
type NVUndefineSpaceSpecialResponse struct{}
|
||
|
||
// NVReadPublic is the input to TPM2_NV_ReadPublic.
|
||
// See definition in Part 3, Commands, section 31.6.
|
||
type NVReadPublic struct {
|
||
// the NV index
|
||
NVIndex handle `gotpm:"handle"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (NVReadPublic) Command() TPMCC { return TPMCCNVReadPublic }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd NVReadPublic) Execute(t transport.TPM, s ...Session) (*NVReadPublicResponse, error) {
|
||
var rsp NVReadPublicResponse
|
||
if err := execute[NVReadPublicResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// NVReadPublicResponse is the response from TPM2_NV_ReadPublic.
|
||
type NVReadPublicResponse struct {
|
||
NVPublic TPM2BNVPublic
|
||
NVName TPM2BName
|
||
}
|
||
|
||
// NVWrite is the input to TPM2_NV_Write.
|
||
// See definition in Part 3, Commands, section 31.7.
|
||
type NVWrite struct {
|
||
// handle indicating the source of the authorization value
|
||
AuthHandle handle `gotpm:"handle,auth"`
|
||
// the NV index of the area to write
|
||
NVIndex handle `gotpm:"handle"`
|
||
// the data to write
|
||
Data TPM2BMaxNVBuffer
|
||
// the octet offset into the NV Area
|
||
Offset uint16
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (NVWrite) Command() TPMCC { return TPMCCNVWrite }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd NVWrite) Execute(t transport.TPM, s ...Session) (*NVWriteResponse, error) {
|
||
var rsp NVWriteResponse
|
||
err := execute[NVWriteResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// NVWriteResponse is the response from TPM2_NV_Write.
|
||
type NVWriteResponse struct{}
|
||
|
||
// NVIncrement is the input to TPM2_NV_Increment.
|
||
// See definition in Part 3, Commands, section 31.8.
|
||
type NVIncrement struct {
|
||
// handle indicating the source of the authorization value
|
||
AuthHandle handle `gotpm:"handle,auth"`
|
||
// the NV index of the area to write
|
||
NVIndex handle `gotpm:"handle"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (NVIncrement) Command() TPMCC { return TPMCCNVIncrement }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd NVIncrement) Execute(t transport.TPM, s ...Session) (*NVIncrementResponse, error) {
|
||
var rsp NVIncrementResponse
|
||
err := execute[NVIncrementResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// NVIncrementResponse is the response from TPM2_NV_Increment.
|
||
type NVIncrementResponse struct{}
|
||
|
||
// NVWriteLock is the input to TPM2_NV_WriteLock.
|
||
// See definition in Part 3, Commands, section 31.11.
|
||
type NVWriteLock struct {
|
||
// handle indicating the source of the authorization value
|
||
AuthHandle handle `gotpm:"handle,auth"`
|
||
// the NV index of the area to lock
|
||
NVIndex handle `gotpm:"handle"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (NVWriteLock) Command() TPMCC { return TPMCCNVWriteLock }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd NVWriteLock) Execute(t transport.TPM, s ...Session) (*NVWriteLockResponse, error) {
|
||
var rsp NVWriteLockResponse
|
||
err := execute[NVWriteLockResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// NVWriteLockResponse is the response from TPM2_NV_WriteLock.
|
||
type NVWriteLockResponse struct{}
|
||
|
||
// NVRead is the input to TPM2_NV_Read.
|
||
// See definition in Part 3, Commands, section 31.13.
|
||
type NVRead struct {
|
||
// handle indicating the source of the authorization value
|
||
AuthHandle handle `gotpm:"handle,auth"`
|
||
// the NV index to read
|
||
NVIndex handle `gotpm:"handle"`
|
||
// number of octets to read
|
||
Size uint16
|
||
// octet offset into the NV area
|
||
Offset uint16
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (NVRead) Command() TPMCC { return TPMCCNVRead }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd NVRead) Execute(t transport.TPM, s ...Session) (*NVReadResponse, error) {
|
||
var rsp NVReadResponse
|
||
if err := execute[NVReadResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// NVReadResponse is the response from TPM2_NV_Read.
|
||
type NVReadResponse struct {
|
||
// the data read
|
||
Data TPM2BMaxNVBuffer
|
||
}
|
||
|
||
// NVReadLock is the input to TPM2_NV_NVReadLock.
|
||
// See definition in Part 3, Commands, section 31.14.
|
||
type NVReadLock struct {
|
||
// handle indicating the source of the authorization value
|
||
AuthHandle handle `gotpm:"handle,auth"`
|
||
// the NV index of the area to lock
|
||
NVIndex handle `gotpm:"handle"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (NVReadLock) Command() TPMCC { return TPMCCNVReadLock }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd NVReadLock) Execute(t transport.TPM, s ...Session) (*NVReadLockResponse, error) {
|
||
var rsp NVReadLockResponse
|
||
err := execute[NVReadLockResponse](t, cmd, &rsp, s...)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// NVReadLockResponse is the response from TPM2_NV_ReadLock.
|
||
type NVReadLockResponse struct{}
|
||
|
||
// NVCertify is the input to TPM2_NV_Certify.
|
||
// See definition in Part 3, Commands, section 31.16.
|
||
type NVCertify struct {
|
||
// handle of the key used to sign the attestation structure
|
||
SignHandle handle `gotpm:"handle,auth"`
|
||
// handle indicating the source of the authorization value
|
||
AuthHandle handle `gotpm:"handle,auth"`
|
||
// Index for the area to be certified
|
||
NVIndex handle `gotpm:"handle"`
|
||
// user-provided qualifying data
|
||
QualifyingData TPM2BData
|
||
// signing scheme to use if the scheme for signHandle is TPM_ALG_NULL
|
||
InScheme TPMTSigScheme `gotpm:"nullable"`
|
||
// number of octets to certify
|
||
Size uint16
|
||
// octet offset into the NV area
|
||
Offset uint16
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (NVCertify) Command() TPMCC { return TPMCCNVCertify }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd NVCertify) Execute(t transport.TPM, s ...Session) (*NVCertifyResponse, error) {
|
||
var rsp NVCertifyResponse
|
||
if err := execute[NVCertifyResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// NVCertifyResponse is the response from TPM2_NV_Read.
|
||
type NVCertifyResponse struct {
|
||
// the structure that was signed
|
||
CertifyInfo TPM2BAttest
|
||
// the asymmetric signature over certifyInfo using the key referenced by signHandle
|
||
Signature TPMTSignature
|
||
}
|
||
|
||
// GetTime is the input to TPM2_GetTime.
|
||
// See definition in Part 3, Commands, section 18.7.
|
||
type GetTime struct {
|
||
// handle of the privacy administrator (Must be the value TPM_RH_ENDORSEMENT or command will fail)
|
||
PrivacyAdminHandle TPMIRHEndorsement `gotpm:"handle,auth"`
|
||
// the keyHandle identifier of a loaded key that can perform digital signatures
|
||
SignHandle handle `gotpm:"handle,auth"`
|
||
// data to "tick stamp"
|
||
QualifyingData TPM2BData
|
||
// signing scheme to use if the scheme for signHandle is TPM_ALG_NULL
|
||
InScheme TPMTSigScheme `gotpm:"nullable"`
|
||
}
|
||
|
||
// Command implements the Command interface.
|
||
func (GetTime) Command() TPMCC { return TPMCCGetTime }
|
||
|
||
// Execute executes the command and returns the response.
|
||
func (cmd GetTime) Execute(t transport.TPM, s ...Session) (*GetTimeResponse, error) {
|
||
var rsp GetTimeResponse
|
||
if err := execute[GetTimeResponse](t, cmd, &rsp, s...); err != nil {
|
||
return nil, err
|
||
}
|
||
return &rsp, nil
|
||
}
|
||
|
||
// GetTimeResponse is the response from TPM2_GetTime.
|
||
type GetTimeResponse struct {
|
||
// standard TPM-generated attestation block
|
||
TimeInfo TPM2BAttest
|
||
// the signature over timeInfo
|
||
Signature TPMTSignature
|
||
}
|