Files
mcias/vendor/github.com/google/go-tpm/tpm2/structures.go
Kyle Isom 115f23a3ea Add Nix flake for mciasctl and mciasgrpcctl
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>
2026-03-25 21:01:21 -07:00

3332 lines
110 KiB
Go

// Package tpm2 defines all the TPM 2.0 structures together to avoid import cycles
package tpm2
import (
"bytes"
"crypto"
"crypto/ecdh"
"crypto/elliptic"
"encoding/binary"
"reflect"
// Register the relevant hash implementations.
_ "crypto/sha1"
_ "crypto/sha256"
_ "crypto/sha512"
"fmt"
)
// TPMCmdHeader is the header structure in front of any TPM command.
// It is described in Part 1, Architecture.
type TPMCmdHeader struct {
marshalByReflection
Tag TPMISTCommandTag
Length uint32
CommandCode TPMCC
}
// TPMRspHeader is the header structure in front of any TPM response.
// It is described in Part 1, Architecture.
type TPMRspHeader struct {
marshalByReflection
Tag TPMISTCommandTag
Length uint32
ResponseCode TPMRC
}
// TPMAlgorithmID represents a TPM_ALGORITHM_ID
// this is the 1.2 compatible form of the TPM_ALG_ID
// See definition in Part 2, Structures, section 5.3.
type TPMAlgorithmID uint32
// TPMModifierIndicator represents a TPM_MODIFIER_INDICATOR.
// See definition in Part 2, Structures, section 5.3.
type TPMModifierIndicator uint32
// TPMAuthorizationSize represents a TPM_AUTHORIZATION_SIZE.
// the authorizationSize parameter in a command
// See definition in Part 2, Structures, section 5.3.
type TPMAuthorizationSize uint32
// TPMParameterSize represents a TPM_PARAMETER_SIZE.
// the parameterSize parameter in a command
// See definition in Part 2, Structures, section 5.3.
type TPMParameterSize uint32
// TPMKeySize represents a TPM_KEY_SIZE.
// a key size in octets
// See definition in Part 2, Structures, section 5.3.
type TPMKeySize uint16
// TPMKeyBits represents a TPM_KEY_BITS.
// a key size in bits
// See definition in Part 2, Structures, section 5.3.
type TPMKeyBits uint16
// TPMGenerated represents a TPM_GENERATED.
// See definition in Part 2: Structures, section 6.2.
type TPMGenerated uint32
// Generated values come from Part 2: Structures, section 6.2.
const (
TPMGeneratedValue TPMGenerated = 0xff544347
)
// Check verifies that a TPMGenerated value is correct, and returns an error
// otherwise.
func (g TPMGenerated) Check() error {
if g != TPMGeneratedValue {
return fmt.Errorf("TPM_GENERATED value should be 0x%x, was 0x%x", TPMGeneratedValue, g)
}
return nil
}
// Curve returns the elliptic.Curve associated with a TPMECCCurve.
func (c TPMECCCurve) Curve() (elliptic.Curve, error) {
switch c {
case TPMECCNistP224:
return elliptic.P224(), nil
case TPMECCNistP256:
return elliptic.P256(), nil
case TPMECCNistP384:
return elliptic.P384(), nil
case TPMECCNistP521:
return elliptic.P521(), nil
default:
return nil, fmt.Errorf("unsupported ECC curve: %v", c)
}
}
// ECDHCurve returns the ecdh.Curve associated with a TPMECCCurve.
func (c TPMECCCurve) ECDHCurve() (ecdh.Curve, error) {
switch c {
case TPMECCNistP256:
return ecdh.P256(), nil
case TPMECCNistP384:
return ecdh.P384(), nil
case TPMECCNistP521:
return ecdh.P521(), nil
default:
return nil, fmt.Errorf("unsupported ECC curve: %v", c)
}
}
// HandleValue returns the handle value. This behavior is intended to satisfy
// an interface that can be implemented by other, more complex types as well.
func (h TPMHandle) HandleValue() uint32 {
return uint32(h)
}
// KnownName returns the TPM Name associated with the handle, if it can be known
// based only on the handle. This depends upon the value of the handle:
// only PCR, session, and permanent values have known constant Names.
// See definition in part 1: Architecture, section 16.
func (h TPMHandle) KnownName() *TPM2BName {
switch (TPMHT)(h >> 24) {
case TPMHTPCR, TPMHTHMACSession, TPMHTPolicySession, TPMHTPermanent:
result := make([]byte, 4)
binary.BigEndian.PutUint32(result, h.HandleValue())
return &TPM2BName{Buffer: result}
}
return nil
}
// TPMAAlgorithm represents a TPMA_ALGORITHM.
// See definition in Part 2: Structures, section 8.2.
type TPMAAlgorithm struct {
bitfield32
marshalByReflection
// SET (1): an asymmetric algorithm with public and private portions
// CLEAR (0): not an asymmetric algorithm
Asymmetric bool `gotpm:"bit=0"`
// SET (1): a symmetric block cipher
// CLEAR (0): not a symmetric block cipher
Symmetric bool `gotpm:"bit=1"`
// SET (1): a hash algorithm
// CLEAR (0): not a hash algorithm
Hash bool `gotpm:"bit=2"`
// SET (1): an algorithm that may be used as an object type
// CLEAR (0): an algorithm that is not used as an object type
Object bool `gotpm:"bit=3"`
// SET (1): a signing algorithm. The setting of asymmetric,
// symmetric, and hash will indicate the type of signing algorithm.
// CLEAR (0): not a signing algorithm
Signing bool `gotpm:"bit=8"`
// SET (1): an encryption/decryption algorithm. The setting of
// asymmetric, symmetric, and hash will indicate the type of
// encryption/decryption algorithm.
// CLEAR (0): not an encryption/decryption algorithm
Encrypting bool `gotpm:"bit=9"`
// SET (1): a method such as a key derivative function (KDF)
// CLEAR (0): not a method
Method bool `gotpm:"bit=10"`
}
// TPMAObject represents a TPMA_OBJECT.
// See definition in Part 2: Structures, section 8.3.2.
type TPMAObject struct {
bitfield32
marshalByReflection
// SET (1): The hierarchy of the object, as indicated by its
// Qualified Name, may not change.
// CLEAR (0): The hierarchy of the object may change as a result
// of this object or an ancestor key being duplicated for use in
// another hierarchy.
FixedTPM bool `gotpm:"bit=1"`
// SET (1): Previously saved contexts of this object may not be
// loaded after Startup(CLEAR).
// CLEAR (0): Saved contexts of this object may be used after a
// Shutdown(STATE) and subsequent Startup().
STClear bool `gotpm:"bit=2"`
// SET (1): The parent of the object may not change.
// CLEAR (0): The parent of the object may change as the result of
// a TPM2_Duplicate() of the object.
FixedParent bool `gotpm:"bit=4"`
// SET (1): Indicates that, when the object was created with
// TPM2_Create() or TPM2_CreatePrimary(), the TPM generated all of
// the sensitive data other than the authValue.
// CLEAR (0): A portion of the sensitive data, other than the
// authValue, was provided by the caller.
SensitiveDataOrigin bool `gotpm:"bit=5"`
// SET (1): Approval of USER role actions with this object may be
// with an HMAC session or with a password using the authValue of
// the object or a policy session.
// CLEAR (0): Approval of USER role actions with this object may
// only be done with a policy session.
UserWithAuth bool `gotpm:"bit=6"`
// SET (1): Approval of ADMIN role actions with this object may
// only be done with a policy session.
// CLEAR (0): Approval of ADMIN role actions with this object may
// be with an HMAC session or with a password using the authValue
// of the object or a policy session.
AdminWithPolicy bool `gotpm:"bit=7"`
// SET (1): The object exists only within a firmware-limited hierarchy.
// CLEAR (0): The object can exist outside a firmware-limited hierarchy.
FirmwareLimited bool `gotpm:"bit=8"`
// SET (1): The object is not subject to dictionary attack
// protections.
// CLEAR (0): The object is subject to dictionary attack
// protections.
NoDA bool `gotpm:"bit=10"`
// SET (1): If the object is duplicated, then symmetricAlg shall
// not be TPM_ALG_NULL and newParentHandle shall not be
// TPM_RH_NULL.
// CLEAR (0): The object may be duplicated without an inner
// wrapper on the private portion of the object and the new parent
// may be TPM_RH_NULL.
EncryptedDuplication bool `gotpm:"bit=11"`
// SET (1): Key usage is restricted to manipulate structures of
// known format; the parent of this key shall have restricted SET.
// CLEAR (0): Key usage is not restricted to use on special
// formats.
Restricted bool `gotpm:"bit=16"`
// SET (1): The private portion of the key may be used to decrypt.
// CLEAR (0): The private portion of the key may not be used to
// decrypt.
Decrypt bool `gotpm:"bit=17"`
// SET (1): For a symmetric cipher object, the private portion of
// the key may be used to encrypt. For other objects, the private
// portion of the key may be used to sign.
// CLEAR (0): The private portion of the key may not be used to
// sign or encrypt.
SignEncrypt bool `gotpm:"bit=18"`
// SET (1): An asymmetric key that may not be used to sign with
// TPM2_Sign() CLEAR (0): A key that may be used with TPM2_Sign()
// if sign is SET
// NOTE: This attribute only has significance if sign is SET.
X509Sign bool `gotpm:"bit=19"`
}
// TPMASession represents a TPMA_SESSION.
// See definition in Part 2: Structures, section 8.4.
type TPMASession struct {
bitfield8
marshalByReflection
// SET (1): In a command, this setting indicates that the session
// is to remain active after successful completion of the command.
// In a response, it indicates that the session is still active.
// If SET in the command, this attribute shall be SET in the response.
// CLEAR (0): In a command, this setting indicates that the TPM should
// close the session and flush any related context when the command
// completes successfully. In a response, it indicates that the
// session is closed and the context is no longer active.
// This attribute has no meaning for a password authorization and the
// TPM will allow any setting of the attribute in the command and SET
// the attribute in the response.
ContinueSession bool `gotpm:"bit=0"`
// SET (1): In a command, this setting indicates that the command
// should only be executed if the session is exclusive at the start of
// the command. In a response, it indicates that the session is
// exclusive. This setting is only allowed if the audit attribute is
// SET (TPM_RC_ATTRIBUTES).
// CLEAR (0): In a command, indicates that the session need not be
// exclusive at the start of the command. In a response, indicates that
// the session is not exclusive.
AuditExclusive bool `gotpm:"bit=1"`
// SET (1): In a command, this setting indicates that the audit digest
// of the session should be initialized and the exclusive status of the
// session SET. This setting is only allowed if the audit attribute is
// SET (TPM_RC_ATTRIBUTES).
// CLEAR (0): In a command, indicates that the audit digest should not
// be initialized. This bit is always CLEAR in a response.
AuditReset bool `gotpm:"bit=2"`
// SET (1): In a command, this setting indicates that the first
// parameter in the command is symmetrically encrypted using the
// parameter encryption scheme described in TPM 2.0 Part 1. The TPM will
// decrypt the parameter after performing any HMAC computations and
// before unmarshaling the parameter. In a response, the attribute is
// copied from the request but has no effect on the response.
// CLEAR (0): Session not used for encryption.
// For a password authorization, this attribute will be CLEAR in both the
// command and response.
Decrypt bool `gotpm:"bit=5"`
// SET (1): In a command, this setting indicates that the TPM should use
// this session to encrypt the first parameter in the response. In a
// response, it indicates that the attribute was set in the command and
// that the TPM used the session to encrypt the first parameter in the
// response using the parameter encryption scheme described in TPM 2.0
// Part 1.
// CLEAR (0): Session not used for encryption.
// For a password authorization, this attribute will be CLEAR in both the
// command and response.
Encrypt bool `gotpm:"bit=6"`
// SET (1): In a command or response, this setting indicates that the
// session is for audit and that auditExclusive and auditReset have
// meaning. This session may also be used for authorization, encryption,
// or decryption. The encrypted and encrypt fields may be SET or CLEAR.
// CLEAR (0): Session is not used for audit.
// If SET in the command, then this attribute will be SET in the response.
Audit bool `gotpm:"bit=7"`
}
// TPMALocality represents a TPMA_LOCALITY.
// See definition in Part 2: Structures, section 8.5.
type TPMALocality struct {
bitfield8
marshalByReflection
TPMLocZero bool `gotpm:"bit=0"`
TPMLocOne bool `gotpm:"bit=1"`
TPMLocTwo bool `gotpm:"bit=2"`
TPMLocThree bool `gotpm:"bit=3"`
TPMLocFour bool `gotpm:"bit=4"`
// If any of these bits is set, an extended locality is indicated
Extended uint8 `gotpm:"bit=7:5"`
}
// TPMACC represents a TPMA_CC.
// See definition in Part 2: Structures, section 8.9.
type TPMACC struct {
bitfield32
marshalByReflection
// indicates the command being selected
CommandIndex uint16 `gotpm:"bit=15:0"`
// SET (1): indicates that the command may write to NV
// CLEAR (0): indicates that the command does not write to NV
NV bool `gotpm:"bit=22"`
// SET (1): This command could flush any number of loaded contexts.
// CLEAR (0): no additional changes other than indicated by the flushed attribute
Extensive bool `gotpm:"bit=23"`
// SET (1): The context associated with any transient handle in the command will be flushed when this command completes.
// CLEAR (0): No context is flushed as a side effect of this command.
Flushed bool `gotpm:"bit=24"`
// indicates the number of the handles in the handle area for this command
CHandles uint8 `gotpm:"bit=27:25"`
// SET (1): indicates the presence of the handle area in the response
RHandle bool `gotpm:"bit=28"`
// SET (1): indicates that the command is vendor-specific
// CLEAR (0): indicates that the command is defined in a version of this specification
V bool `gotpm:"bit=29"`
}
// TPMAACT represents a TPMA_ACT.
// See definition in Part 2: Structures, section 8.12.
type TPMAACT struct {
bitfield32
marshalByReflection
// SET (1): The ACT has signaled
// CLEAR (0): The ACT has not signaled
Signaled bool `gotpm:"bit=0"`
// SET (1): The ACT signaled bit is preserved over a power cycle
// CLEAR (0): The ACT signaled bit is not preserved over a power cycle
PreserveSignaled bool `gotpm:"bit=1"`
}
// TPMIYesNo represents a TPMI_YES_NO.
// See definition in Part 2: Structures, section 9.2.
// Use native bool for TPMI_YES_NO; encoding/binary already treats this as 8 bits wide.
type TPMIYesNo = bool
// TPMIDHObject represents a TPMI_DH_OBJECT.
// See definition in Part 2: Structures, section 9.3.
type TPMIDHObject = TPMHandle
// TPMIDHPersistent represents a TPMI_DH_PERSISTENT.
// See definition in Part 2: Structures, section 9.5.
type TPMIDHPersistent = TPMHandle
// TPMIDHEntity represents a TPMI_DH_ENTITY.
// See definition in Part 2: Structures, section 9.6.
type TPMIDHEntity = TPMHandle
// TPMISHAuthSession represents a TPMI_SH_AUTH_SESSION.
// See definition in Part 2: Structures, section 9.8.
type TPMISHAuthSession = TPMHandle
// TPMISHHMAC represents a TPMI_SH_HMAC.
// See definition in Part 2: Structures, section 9.9.
type TPMISHHMAC = TPMHandle
// TPMISHPolicy represents a TPMI_SH_POLICY.
// See definition in Part 2: Structures, section 9.10.
type TPMISHPolicy = TPMHandle
// TPMIDHContext represents a TPMI_DH_CONTEXT.
// See definition in Part 2: Structures, section 9.11.
type TPMIDHContext = TPMHandle
// TPMIDHSaved represents a TPMI_DH_SAVED.
// See definition in Part 2: Structures, section 9.12.
type TPMIDHSaved = TPMHandle
// TPMIRHHierarchy represents a TPMI_RH_HIERARCHY.
// See definition in Part 2: Structures, section 9.13.
type TPMIRHHierarchy = TPMHandle
// TPMIRHEnables represents a TPMI_RH_ENABLES.
// See definition in Part 2: Structures, section 9.14.
type TPMIRHEnables = TPMHandle
// TPMIRHHierarchyAuth represents a TPMI_RH_HIERARCHY_AUTH.
// See definition in Part 2: Structures, section 9.15.
type TPMIRHHierarchyAuth = TPMHandle
// TPMIRHHierarchyPolicy represents a TPMI_RH_HIERARCHY_POLICY.
// See definition in Part 2: Structures, section 9.16.
type TPMIRHHierarchyPolicy = TPMHandle
// TPMIRHPlatform represents a TPMI_RH_PLATFORM.
// See definition in Part 2: Structures, section 9.17.
type TPMIRHPlatform = TPMHandle
// TPMIRHOwner represents a TPMI_RH_OWNER.
// See definition in Part 2: Structures, section 9.18.
type TPMIRHOwner = TPMHandle
// TPMIRHEndorsement represents a TPMI_RH_ENDORSEMENT.
// See definition in Part 2: Structures, section 9.19.
type TPMIRHEndorsement = TPMHandle
// TPMIRHProvision represents a TPMI_RH_PROVISION.
// See definition in Part 2: Structures, section 9.20.
type TPMIRHProvision = TPMHandle
// TPMIRHClear represents a TPMI_RH_CLEAR.
// See definition in Part 2: Structures, section 9.21.
type TPMIRHClear = TPMHandle
// TPMIRHNVAuth represents a TPMI_RH_NV_AUTH.
// See definition in Part 2: Structures, section 9.22.
type TPMIRHNVAuth = TPMHandle
// TPMIRHLockout represents a TPMI_RH_LOCKOUT.
// See definition in Part 2: Structures, section 9.23.
type TPMIRHLockout = TPMHandle
// TPMIRHNVIndex represents a TPMI_RH_NV_INDEX.
// See definition in Part 2: Structures, section 9.24.
type TPMIRHNVIndex = TPMHandle
// TPMIRHAC represents a TPMI_RH_AC.
// See definition in Part 2: Structures, section 9.25.
type TPMIRHAC = TPMHandle
// TPMIRHACT represents a TPMI_RH_ACT.
// See definition in Part 2: Structures, section 9.26.
type TPMIRHACT = TPMHandle
// TPMIAlgHash represents a TPMI_ALG_HASH.
// See definition in Part 2: Structures, section 9.27.
type TPMIAlgHash = TPMAlgID
// Hash returns the crypto.Hash associated with a TPMIAlgHash.
func (a TPMIAlgHash) Hash() (crypto.Hash, error) {
switch TPMAlgID(a) {
case TPMAlgSHA1:
return crypto.SHA1, nil
case TPMAlgSHA256:
return crypto.SHA256, nil
case TPMAlgSHA384:
return crypto.SHA384, nil
case TPMAlgSHA512:
return crypto.SHA512, nil
}
return crypto.SHA256, fmt.Errorf("unsupported hash algorithm: %v", a)
}
// TPMIAlgSym represents a TPMI_ALG_SYM.
// See definition in Part 2: Structures, section 9.29.
type TPMIAlgSym = TPMAlgID
// TPMIAlgSymObject represents a TPMI_ALG_SYM_OBJECT.
// See definition in Part 2: Structures, section 9.30.
type TPMIAlgSymObject = TPMAlgID
// TPMIAlgSymMode represents a TPMI_ALG_SYM_MODE.
// See definition in Part 2: Structures, section 9.31.
type TPMIAlgSymMode = TPMAlgID
// TPMIAlgKDF represents a TPMI_ALG_KDF.
// See definition in Part 2: Structures, section 9.32.
type TPMIAlgKDF = TPMAlgID
// TPMIAlgSigScheme represents a TPMI_ALG_SIG_SCHEME.
// See definition in Part 2: Structures, section 9.33.
type TPMIAlgSigScheme = TPMAlgID
// TPMISTCommandTag represents a TPMI_ST_COMMAND_TAG.
// See definition in Part 2: Structures, section 9.35.
type TPMISTCommandTag = TPMST
// TPMSEmpty represents a TPMS_EMPTY.
// See definition in Part 2: Structures, section 10.1.
type TPMSEmpty struct {
marshalByReflection
}
// TPMTHA represents a TPMT_HA.
// See definition in Part 2: Structures, section 10.3.2.
type TPMTHA struct {
marshalByReflection
// selector of the hash contained in the digest that implies the size of the digest
HashAlg TPMIAlgHash `gotpm:"nullable"`
// the digest data
// NOTE: For convenience, this is not implemented as a union.
Digest []byte
}
// TPM2BDigest represents a TPM2B_DIGEST.
// See definition in Part 2: Structures, section 10.4.2.
type TPM2BDigest TPM2BData
// TPM2BData represents a TPM2B_DATA.
// See definition in Part 2: Structures, section 10.4.3.
type TPM2BData struct {
marshalByReflection
// size in octets of the buffer field; may be 0
Buffer []byte `gotpm:"sized"`
}
// TPM2BNonce represents a TPM2B_NONCE.
// See definition in Part 2: Structures, section 10.4.4.
type TPM2BNonce TPM2BDigest
// TPM2BEvent represents a TPM2B_EVENT.
// See definition in Part 2: Structures, section 10.4.7.
type TPM2BEvent TPM2BData
// TPM2BTimeout represents a TPM2B_TIMEOUT.
// See definition in Part 2: Structures, section 10.4.10.
type TPM2BTimeout TPM2BData
// TPM2BAuth represents a TPM2B_AUTH.
// See definition in Part 2: Structures, section 10.4.5.
type TPM2BAuth TPM2BDigest
// TPM2BOperand represents a TPM2B_Operand.
// See definition in Part 2: Structures, section 10.4.6.
type TPM2BOperand TPM2BDigest
// TPM2BMaxBuffer represents a TPM2B_MAX_BUFFER.
// See definition in Part 2: Structures, section 10.4.8.
type TPM2BMaxBuffer TPM2BData
// TPM2BMaxNVBuffer represents a TPM2B_MAX_NV_BUFFER.
// See definition in Part 2: Structures, section 10.4.9.
type TPM2BMaxNVBuffer TPM2BData
// TPM2BIV represents a TPM2B_IV.
// See definition in Part 2: Structures, section 10.4.11.
type TPM2BIV TPM2BData
// TPM2BName represents a TPM2B_NAME.
// See definition in Part 2: Structures, section 10.5.3.
// NOTE: This structure does not contain a TPMUName, because that union
// is not tagged with a selector. Instead, TPM2B_Name is flattened and
// all TPMDirect helpers that deal with names will deal with them as so.
type TPM2BName TPM2BData
// TPMSPCRSelection represents a TPMS_PCR_SELECTION.
// See definition in Part 2: Structures, section 10.6.2.
type TPMSPCRSelection struct {
marshalByReflection
Hash TPMIAlgHash
PCRSelect []byte `gotpm:"sized8"`
}
// TPMTTKCreation represents a TPMT_TK_CREATION.
// See definition in Part 2: Structures, section 10.7.3.
type TPMTTKCreation struct {
marshalByReflection
// ticket structure tag
Tag TPMST
// the hierarchy containing name
Hierarchy TPMIRHHierarchy
// This shall be the HMAC produced using a proof value of hierarchy.
Digest TPM2BDigest
}
// TPMTTKVerified represents a TPMT_TK_Verified.
// See definition in Part 2: Structures, section 10.7.4.
type TPMTTKVerified struct {
marshalByReflection
// ticket structure tag
Tag TPMST
// the hierarchy containing keyName
Hierarchy TPMIRHHierarchy
// This shall be the HMAC produced using a proof value of hierarchy.
Digest TPM2BDigest
}
// TPMTTKAuth represents a TPMT_TK_AUTH.
// See definition in Part 2: Structures, section 10.7.5.
type TPMTTKAuth struct {
marshalByReflection
// ticket structure tag
Tag TPMST
// the hierarchy of the object used to produce the ticket
Hierarchy TPMIRHHierarchy `gotpm:"nullable"`
// This shall be the HMAC produced using a proof value of hierarchy.
Digest TPM2BDigest
}
// TPMTTKHashCheck represents a TPMT_TK_HASHCHECK.
// See definition in Part 2: Structures, section 10.7.6.
type TPMTTKHashCheck struct {
marshalByReflection
// ticket structure tag
Tag TPMST
// the hierarchy
Hierarchy TPMIRHHierarchy `gotpm:"nullable"`
// This shall be the HMAC produced using a proof value of hierarchy.
Digest TPM2BDigest
}
// TPMSAlgProperty represents a TPMS_ALG_PROPERTY.
// See definition in Part 2: Structures, section 10.8.1.
type TPMSAlgProperty struct {
marshalByReflection
// an algorithm identifier
Alg TPMAlgID
// the attributes of the algorithm
AlgProperties TPMAAlgorithm
}
// TPMSTaggedProperty represents a TPMS_TAGGED_PROPERTY.
// See definition in Part 2: Structures, section 10.8.2.
type TPMSTaggedProperty struct {
marshalByReflection
// a property identifier
Property TPMPT
// the value of the property
Value uint32
}
// TPMSTaggedPCRSelect represents a TPMS_TAGGED_PCR_SELECT.
// See definition in Part 2: Structures, section 10.8.3.
type TPMSTaggedPCRSelect struct {
marshalByReflection
// the property identifier
Tag TPMPTPCR
// the bit map of PCR with the identified property
PCRSelect []byte `gotpm:"sized8"`
}
// TPMSTaggedPolicy represents a TPMS_TAGGED_POLICY.
// See definition in Part 2: Structures, section 10.8.4.
type TPMSTaggedPolicy struct {
marshalByReflection
// a permanent handle
Handle TPMHandle
// the policy algorithm and hash
PolicyHash TPMTHA
}
// TPMSACTData represents a TPMS_ACT_DATA.
// See definition in Part 2: Structures, section 10.8.5.
type TPMSACTData struct {
marshalByReflection
// a permanent handle
Handle TPMHandle
// the current timeout of the ACT
Timeout uint32
// the state of the ACT
Attributes TPMAACT
}
// TPMLCC represents a TPML_CC.
// See definition in Part 2: Structures, section 10.9.1.
type TPMLCC struct {
marshalByReflection
CommandCodes []TPMCC `gotpm:"list"`
}
// TPMLCCA represents a TPML_CCA.
// See definition in Part 2: Structures, section 10.9.2.
type TPMLCCA struct {
marshalByReflection
CommandAttributes []TPMACC `gotpm:"list"`
}
// TPMLAlg represents a TPML_ALG.
// See definition in Part 2: Structures, section 10.9.3.
type TPMLAlg struct {
marshalByReflection
Algorithms []TPMAlgID `gotpm:"list"`
}
// TPMLHandle represents a TPML_HANDLE.
// See definition in Part 2: Structures, section 10.9.4.
type TPMLHandle struct {
marshalByReflection
Handle []TPMHandle `gotpm:"list"`
}
// TPMLDigest represents a TPML_DIGEST.
// See definition in Part 2: Structures, section 10.9.5.
type TPMLDigest struct {
marshalByReflection
// a list of digests
Digests []TPM2BDigest `gotpm:"list"`
}
// TPMLDigestValues represents a TPML_DIGEST_VALUES.
// See definition in Part 2: Structures, section 10.9.6.
type TPMLDigestValues struct {
marshalByReflection
// a list of tagged digests
Digests []TPMTHA `gotpm:"list"`
}
// TPMLPCRSelection represents a TPML_PCR_SELECTION.
// See definition in Part 2: Structures, section 10.9.7.
type TPMLPCRSelection struct {
marshalByReflection
PCRSelections []TPMSPCRSelection `gotpm:"list"`
}
// TPMLAlgProperty represents a TPML_ALG_PROPERTY.
// See definition in Part 2: Structures, section 10.9.8.
type TPMLAlgProperty struct {
marshalByReflection
AlgProperties []TPMSAlgProperty `gotpm:"list"`
}
// TPMLTaggedTPMProperty represents a TPML_TAGGED_TPM_PROPERTY.
// See definition in Part 2: Structures, section 10.9.9.
type TPMLTaggedTPMProperty struct {
marshalByReflection
TPMProperty []TPMSTaggedProperty `gotpm:"list"`
}
// TPMLTaggedPCRProperty represents a TPML_TAGGED_PCR_PROPERTY.
// See definition in Part 2: Structures, section 10.9.10.
type TPMLTaggedPCRProperty struct {
marshalByReflection
PCRProperty []TPMSTaggedPCRSelect `gotpm:"list"`
}
// TPMLECCCurve represents a TPML_ECC_CURVE.
// See definition in Part 2: Structures, section 10.9.11.
type TPMLECCCurve struct {
marshalByReflection
ECCCurves []TPMECCCurve `gotpm:"list"`
}
// TPMLTaggedPolicy represents a TPML_TAGGED_POLICY.
// See definition in Part 2: Structures, section 10.9.12.
type TPMLTaggedPolicy struct {
marshalByReflection
Policies []TPMSTaggedPolicy `gotpm:"list"`
}
// TPMLACTData represents a TPML_ACT_DATA.
// See definition in Part 2: Structures, section 10.9.13.
type TPMLACTData struct {
marshalByReflection
ACTData []TPMSACTData `gotpm:"list"`
}
// TPMUCapabilities represents a TPMU_CAPABILITIES.
// See definition in Part 2: Structures, section 10.10.1.
type TPMUCapabilities struct {
selector TPMCap
contents Marshallable
}
// CapabilitiesContents is a type constraint representing the possible contents of TPMUCapabilities.
type CapabilitiesContents interface {
Marshallable
*TPMLAlgProperty | *TPMLHandle | *TPMLCCA | *TPMLCC | *TPMLPCRSelection | *TPMLTaggedTPMProperty |
*TPMLTaggedPCRProperty | *TPMLECCCurve | *TPMLTaggedPolicy | *TPMLACTData
}
// create implements the unmarshallableWithHint interface.
func (u *TPMUCapabilities) create(hint int64) (reflect.Value, error) {
switch TPMCap(hint) {
case TPMCapAlgs:
contents := TPMLAlgProperty{}
u.contents = &contents
u.selector = TPMCap(hint)
return reflect.ValueOf(&contents), nil
case TPMCapHandles:
contents := TPMLHandle{}
u.contents = &contents
u.selector = TPMCap(hint)
return reflect.ValueOf(&contents), nil
case TPMCapCommands:
contents := TPMLCCA{}
u.contents = &contents
u.selector = TPMCap(hint)
return reflect.ValueOf(&contents), nil
case TPMCapPPCommands, TPMCapAuditCommands:
contents := TPMLCC{}
u.contents = &contents
u.selector = TPMCap(hint)
return reflect.ValueOf(&contents), nil
case TPMCapPCRs:
contents := TPMLPCRSelection{}
u.contents = &contents
u.selector = TPMCap(hint)
return reflect.ValueOf(&contents), nil
case TPMCapTPMProperties:
contents := TPMLTaggedTPMProperty{}
u.contents = &contents
u.selector = TPMCap(hint)
return reflect.ValueOf(&contents), nil
case TPMCapPCRProperties:
contents := TPMLTaggedPCRProperty{}
u.contents = &contents
u.selector = TPMCap(hint)
return reflect.ValueOf(&contents), nil
case TPMCapECCCurves:
contents := TPMLECCCurve{}
u.contents = &contents
u.selector = TPMCap(hint)
return reflect.ValueOf(&contents), nil
case TPMCapAuthPolicies:
contents := TPMLTaggedPolicy{}
u.contents = &contents
u.selector = TPMCap(hint)
return reflect.ValueOf(&contents), nil
case TPMCapACT:
contents := TPMLACTData{}
u.contents = &contents
u.selector = TPMCap(hint)
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// get implements the marshallableWithHint interface.
func (u TPMUCapabilities) get(hint int64) (reflect.Value, error) {
if u.selector != 0 && hint != int64(u.selector) {
return reflect.ValueOf(nil), fmt.Errorf("incorrect union tag %v, is %v", hint, u.selector)
}
switch TPMCap(hint) {
case TPMCapAlgs:
contents := TPMLAlgProperty{}
if u.contents != nil {
contents = *u.contents.(*TPMLAlgProperty)
}
return reflect.ValueOf(&contents), nil
case TPMCapHandles:
contents := TPMLHandle{}
if u.contents != nil {
contents = *u.contents.(*TPMLHandle)
}
return reflect.ValueOf(&contents), nil
case TPMCapCommands:
contents := TPMLCCA{}
if u.contents != nil {
contents = *u.contents.(*TPMLCCA)
}
return reflect.ValueOf(&contents), nil
case TPMCapPPCommands, TPMCapAuditCommands:
contents := TPMLCC{}
if u.contents != nil {
contents = *u.contents.(*TPMLCC)
}
return reflect.ValueOf(&contents), nil
case TPMCapPCRs:
contents := TPMLPCRSelection{}
if u.contents != nil {
contents = *u.contents.(*TPMLPCRSelection)
}
return reflect.ValueOf(&contents), nil
case TPMCapTPMProperties:
contents := TPMLTaggedTPMProperty{}
if u.contents != nil {
contents = *u.contents.(*TPMLTaggedTPMProperty)
}
return reflect.ValueOf(&contents), nil
case TPMCapPCRProperties:
contents := TPMLTaggedPCRProperty{}
if u.contents != nil {
contents = *u.contents.(*TPMLTaggedPCRProperty)
}
return reflect.ValueOf(&contents), nil
case TPMCapECCCurves:
contents := TPMLECCCurve{}
if u.contents != nil {
contents = *u.contents.(*TPMLECCCurve)
}
return reflect.ValueOf(&contents), nil
case TPMCapAuthPolicies:
contents := TPMLTaggedPolicy{}
if u.contents != nil {
contents = *u.contents.(*TPMLTaggedPolicy)
}
return reflect.ValueOf(&contents), nil
case TPMCapACT:
contents := TPMLACTData{}
if u.contents != nil {
contents = *u.contents.(*TPMLACTData)
}
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// NewTPMUCapabilities instantiates a TPMUCapabilities with the given contents.
func NewTPMUCapabilities[C CapabilitiesContents](selector TPMCap, contents C) TPMUCapabilities {
return TPMUCapabilities{
selector: selector,
contents: contents,
}
}
// Algorithms returns the 'algorithms' member of the union.
func (u *TPMUCapabilities) Algorithms() (*TPMLAlgProperty, error) {
if u.selector == TPMCapAlgs {
return u.contents.(*TPMLAlgProperty), nil
}
return nil, fmt.Errorf("did not contain algorithms (selector value was %v)", u.selector)
}
// Handles returns the 'handles' member of the union.
func (u *TPMUCapabilities) Handles() (*TPMLHandle, error) {
if u.selector == TPMCapHandles {
return u.contents.(*TPMLHandle), nil
}
return nil, fmt.Errorf("did not contain handles (selector value was %v)", u.selector)
}
// Command returns the 'command' member of the union.
func (u *TPMUCapabilities) Command() (*TPMLCCA, error) {
if u.selector == TPMCapCommands {
return u.contents.(*TPMLCCA), nil
}
return nil, fmt.Errorf("did not contain command (selector value was %v)", u.selector)
}
// PPCommands returns the 'ppCommands' member of the union.
func (u *TPMUCapabilities) PPCommands() (*TPMLCC, error) {
if u.selector == TPMCapPPCommands {
return u.contents.(*TPMLCC), nil
}
return nil, fmt.Errorf("did not contain ppCommands (selector value was %v)", u.selector)
}
// AuditCommands returns the 'auditCommands' member of the union.
func (u *TPMUCapabilities) AuditCommands() (*TPMLCC, error) {
if u.selector == TPMCapAuditCommands {
return u.contents.(*TPMLCC), nil
}
return nil, fmt.Errorf("did not contain auditCommands (selector value was %v)", u.selector)
}
// AssignedPCR returns the 'assignedPCR' member of the union.
func (u *TPMUCapabilities) AssignedPCR() (*TPMLPCRSelection, error) {
if u.selector == TPMCapPCRs {
return u.contents.(*TPMLPCRSelection), nil
}
return nil, fmt.Errorf("did not contain assignedPCR (selector value was %v)", u.selector)
}
// TPMProperties returns the 'tpmProperties' member of the union.
func (u *TPMUCapabilities) TPMProperties() (*TPMLTaggedTPMProperty, error) {
if u.selector == TPMCapTPMProperties {
return u.contents.(*TPMLTaggedTPMProperty), nil
}
return nil, fmt.Errorf("did not contain tpmProperties (selector value was %v)", u.selector)
}
// PCRProperties returns the 'pcrProperties' member of the union.
func (u *TPMUCapabilities) PCRProperties() (*TPMLTaggedPCRProperty, error) {
if u.selector == TPMCapPCRProperties {
return u.contents.(*TPMLTaggedPCRProperty), nil
}
return nil, fmt.Errorf("did not contain pcrProperties (selector value was %v)", u.selector)
}
// ECCCurves returns the 'eccCurves' member of the union.
func (u *TPMUCapabilities) ECCCurves() (*TPMLECCCurve, error) {
if u.selector == TPMCapECCCurves {
return u.contents.(*TPMLECCCurve), nil
}
return nil, fmt.Errorf("did not contain eccCurves (selector value was %v)", u.selector)
}
// AuthPolicies returns the 'authPolicies' member of the union.
func (u *TPMUCapabilities) AuthPolicies() (*TPMLTaggedPolicy, error) {
if u.selector == TPMCapAuthPolicies {
return u.contents.(*TPMLTaggedPolicy), nil
}
return nil, fmt.Errorf("did not contain authPolicies (selector value was %v)", u.selector)
}
// ACTData returns the 'actData' member of the union.
func (u *TPMUCapabilities) ACTData() (*TPMLACTData, error) {
if u.selector == TPMCapAuthPolicies {
return u.contents.(*TPMLACTData), nil
}
return nil, fmt.Errorf("did not contain actData (selector value was %v)", u.selector)
}
// TPMSCapabilityData represents a TPMS_CAPABILITY_DATA.
// See definition in Part 2: Structures, section 10.10.2.
type TPMSCapabilityData struct {
marshalByReflection
// the capability
Capability TPMCap
// the capability data
Data TPMUCapabilities `gotpm:"tag=Capability"`
}
// TPMSClockInfo represents a TPMS_CLOCK_INFO.
// See definition in Part 2: Structures, section 10.11.1.
type TPMSClockInfo struct {
marshalByReflection
// time value in milliseconds that advances while the TPM is powered
Clock uint64
// number of occurrences of TPM Reset since the last TPM2_Clear()
ResetCount uint32
// number of times that TPM2_Shutdown() or _TPM_Hash_Start have
// occurred since the last TPM Reset or TPM2_Clear().
RestartCount uint32
// no value of Clock greater than the current value of Clock has been
// previously reported by the TPM. Set to YES on TPM2_Clear().
Safe TPMIYesNo
}
// TPMSTimeInfo represents a TPMS_TIMEzINFO.
// See definition in Part 2: Structures, section 10.11.6.
type TPMSTimeInfo struct {
marshalByReflection
// time in milliseconds since the TIme circuit was last reset
Time uint64
// a structure containing the clock information
ClockInfo TPMSClockInfo
}
// TPMSTimeAttestInfo represents a TPMS_TIME_ATTEST_INFO.
// See definition in Part 2: Structures, section 10.12.2.
type TPMSTimeAttestInfo struct {
marshalByReflection
// the Time, Clock, resetCount, restartCount, and Safe indicator
Time TPMSTimeInfo
// a TPM vendor-specific value indicating the version number of the firmware
FirmwareVersion uint64
}
// TPMSCertifyInfo represents a TPMS_CERTIFY_INFO.
// See definition in Part 2: Structures, section 10.12.3.
type TPMSCertifyInfo struct {
marshalByReflection
// Name of the certified object
Name TPM2BName
// Qualified Name of the certified object
QualifiedName TPM2BName
}
// TPMSQuoteInfo represents a TPMS_QUOTE_INFO.
// See definition in Part 2: Structures, section 10.12.4.
type TPMSQuoteInfo struct {
marshalByReflection
// information on algID, PCR selected and digest
PCRSelect TPMLPCRSelection
// digest of the selected PCR using the hash of the signing key
PCRDigest TPM2BDigest
}
// TPMSCommandAuditInfo represents a TPMS_COMMAND_AUDIT_INFO.
// See definition in Part 2: Structures, section 10.12.5.
type TPMSCommandAuditInfo struct {
marshalByReflection
// the monotonic audit counter
AuditCounter uint64
// hash algorithm used for the command audit
DigestAlg TPMAlgID
// the current value of the audit digest
AuditDigest TPM2BDigest
// digest of the command codes being audited using digestAlg
CommandDigest TPM2BDigest
}
// TPMSSessionAuditInfo represents a TPMS_SESSION_AUDIT_INFO.
// See definition in Part 2: Structures, section 10.12.6.
type TPMSSessionAuditInfo struct {
marshalByReflection
// current exclusive status of the session
ExclusiveSession TPMIYesNo
// the current value of the session audit digest
SessionDigest TPM2BDigest
}
// TPMSCreationInfo represents a TPMS_CREATION_INFO.
// See definition in Part 2: Structures, section 10.12.7.
type TPMSCreationInfo struct {
marshalByReflection
// Name of the object
ObjectName TPM2BName
// creationHash
CreationHash TPM2BDigest
}
// TPMSNVCertifyInfo represents a TPMS_NV_CERTIFY_INFO.
// See definition in Part 2: Structures, section 10.12.8.
type TPMSNVCertifyInfo struct {
marshalByReflection
// Name of the NV Index
IndexName TPM2BName
// the offset parameter of TPM2_NV_Certify()
Offset uint16
// contents of the NV Index
NVContents TPM2BData
}
// TPMSNVDigestCertifyInfo represents a TPMS_NV_DIGEST_CERTIFY_INFO.
// See definition in Part 2: Structures, section 10.12.9.
type TPMSNVDigestCertifyInfo struct {
marshalByReflection
// Name of the NV Index
IndexName TPM2BName
// hash of the contents of the index
NVDigest TPM2BDigest
}
// TPMISTAttest represents a TPMI_ST_ATTEST.
// See definition in Part 2: Structures, section 10.12.10.
type TPMISTAttest = TPMST
// TPMUAttest represents a TPMU_ATTEST.
// See definition in Part 2: Structures, section 10.12.11.
type TPMUAttest struct {
selector TPMST
contents Marshallable
}
// AttestContents is a type constraint representing the possible contents of TPMUAttest.
type AttestContents interface {
Marshallable
*TPMSNVCertifyInfo | *TPMSCommandAuditInfo | *TPMSSessionAuditInfo | *TPMSCertifyInfo |
*TPMSQuoteInfo | *TPMSTimeAttestInfo | *TPMSCreationInfo | *TPMSNVDigestCertifyInfo
}
// create implements the unmarshallableWithHint interface.
func (u *TPMUAttest) create(hint int64) (reflect.Value, error) {
switch TPMST(hint) {
case TPMSTAttestNV:
contents := TPMSNVCertifyInfo{}
u.contents = &contents
u.selector = TPMST(hint)
return reflect.ValueOf(&contents), nil
case TPMSTAttestCommandAudit:
contents := TPMSCommandAuditInfo{}
u.contents = &contents
u.selector = TPMST(hint)
return reflect.ValueOf(&contents), nil
case TPMSTAttestSessionAudit:
contents := TPMSSessionAuditInfo{}
u.contents = &contents
u.selector = TPMST(hint)
return reflect.ValueOf(&contents), nil
case TPMSTAttestCertify:
contents := TPMSCertifyInfo{}
u.contents = &contents
u.selector = TPMST(hint)
return reflect.ValueOf(&contents), nil
case TPMSTAttestQuote:
contents := TPMSQuoteInfo{}
u.contents = &contents
u.selector = TPMST(hint)
return reflect.ValueOf(&contents), nil
case TPMSTAttestTime:
contents := TPMSTimeAttestInfo{}
u.contents = &contents
u.selector = TPMST(hint)
return reflect.ValueOf(&contents), nil
case TPMSTAttestCreation:
contents := TPMSCreationInfo{}
u.contents = &contents
u.selector = TPMST(hint)
return reflect.ValueOf(&contents), nil
case TPMSTAttestNVDigest:
contents := TPMSNVDigestCertifyInfo{}
u.contents = &contents
u.selector = TPMST(hint)
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// get implements the marshallableWithHint interface.
func (u TPMUAttest) get(hint int64) (reflect.Value, error) {
if u.selector != 0 && hint != int64(u.selector) {
return reflect.ValueOf(nil), fmt.Errorf("incorrect union tag %v, is %v", hint, u.selector)
}
switch TPMST(hint) {
case TPMSTAttestNV:
contents := TPMSNVCertifyInfo{}
if u.contents != nil {
contents = *u.contents.(*TPMSNVCertifyInfo)
}
return reflect.ValueOf(&contents), nil
case TPMSTAttestCommandAudit:
contents := TPMSCommandAuditInfo{}
if u.contents != nil {
contents = *u.contents.(*TPMSCommandAuditInfo)
}
return reflect.ValueOf(&contents), nil
case TPMSTAttestSessionAudit:
contents := TPMSSessionAuditInfo{}
if u.contents != nil {
contents = *u.contents.(*TPMSSessionAuditInfo)
}
return reflect.ValueOf(&contents), nil
case TPMSTAttestCertify:
contents := TPMSCertifyInfo{}
if u.contents != nil {
contents = *u.contents.(*TPMSCertifyInfo)
}
return reflect.ValueOf(&contents), nil
case TPMSTAttestQuote:
contents := TPMSQuoteInfo{}
if u.contents != nil {
contents = *u.contents.(*TPMSQuoteInfo)
}
return reflect.ValueOf(&contents), nil
case TPMSTAttestTime:
contents := TPMSTimeAttestInfo{}
if u.contents != nil {
contents = *u.contents.(*TPMSTimeAttestInfo)
}
return reflect.ValueOf(&contents), nil
case TPMSTAttestCreation:
contents := TPMSCreationInfo{}
if u.contents != nil {
contents = *u.contents.(*TPMSCreationInfo)
}
return reflect.ValueOf(&contents), nil
case TPMSTAttestNVDigest:
contents := TPMSNVDigestCertifyInfo{}
if u.contents != nil {
contents = *u.contents.(*TPMSNVDigestCertifyInfo)
}
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// NewTPMUAttest instantiates a TPMUAttest with the given contents.
func NewTPMUAttest[C AttestContents](selector TPMST, contents C) TPMUAttest {
return TPMUAttest{
selector: selector,
contents: contents,
}
}
// Certify returns the 'certify' member of the union.
func (u *TPMUAttest) Certify() (*TPMSCertifyInfo, error) {
if u.selector == TPMSTAttestCertify {
return u.contents.(*TPMSCertifyInfo), nil
}
return nil, fmt.Errorf("did not contain certify (selector value was %v)", u.selector)
}
// Creation returns the 'creation' member of the union.
func (u *TPMUAttest) Creation() (*TPMSCreationInfo, error) {
if u.selector == TPMSTAttestCreation {
return u.contents.(*TPMSCreationInfo), nil
}
return nil, fmt.Errorf("did not contain creation (selector value was %v)", u.selector)
}
// Quote returns the 'quote' member of the union.
func (u *TPMUAttest) Quote() (*TPMSQuoteInfo, error) {
if u.selector == TPMSTAttestQuote {
return u.contents.(*TPMSQuoteInfo), nil
}
return nil, fmt.Errorf("did not contain quote (selector value was %v)", u.selector)
}
// CommandAudit returns the 'commandAudit' member of the union.
func (u *TPMUAttest) CommandAudit() (*TPMSCommandAuditInfo, error) {
if u.selector == TPMSTAttestCommandAudit {
return u.contents.(*TPMSCommandAuditInfo), nil
}
return nil, fmt.Errorf("did not contain commandAudit (selector value was %v)", u.selector)
}
// SessionAudit returns the 'sessionAudit' member of the union.
func (u *TPMUAttest) SessionAudit() (*TPMSSessionAuditInfo, error) {
if u.selector == TPMSTAttestSessionAudit {
return u.contents.(*TPMSSessionAuditInfo), nil
}
return nil, fmt.Errorf("did not contain sessionAudit (selector value was %v)", u.selector)
}
// Time returns the 'time' member of the union.
func (u *TPMUAttest) Time() (*TPMSTimeAttestInfo, error) {
if u.selector == TPMSTAttestTime {
return u.contents.(*TPMSTimeAttestInfo), nil
}
return nil, fmt.Errorf("did not contain time (selector value was %v)", u.selector)
}
// NV returns the 'nv' member of the union.
func (u *TPMUAttest) NV() (*TPMSNVCertifyInfo, error) {
if u.selector == TPMSTAttestNV {
return u.contents.(*TPMSNVCertifyInfo), nil
}
return nil, fmt.Errorf("did not contain nv (selector value was %v)", u.selector)
}
// NVDigest returns the 'nvDigest' member of the union.
func (u *TPMUAttest) NVDigest() (*TPMSNVDigestCertifyInfo, error) {
if u.selector == TPMSTAttestNVDigest {
return u.contents.(*TPMSNVDigestCertifyInfo), nil
}
return nil, fmt.Errorf("did not contain nvDigest (selector value was %v)", u.selector)
}
// TPMSAttest represents a TPMS_ATTEST.
// See definition in Part 2: Structures, section 10.12.12.
type TPMSAttest struct {
marshalByReflection
// the indication that this structure was created by a TPM (always TPM_GENERATED_VALUE)
Magic TPMGenerated `gotpm:"check"`
// type of the attestation structure
Type TPMISTAttest
// Qualified Name of the signing key
QualifiedSigner TPM2BName
// external information supplied by caller
ExtraData TPM2BData
// Clock, resetCount, restartCount, and Safe
ClockInfo TPMSClockInfo
// TPM-vendor-specific value identifying the version number of the firmware
FirmwareVersion uint64
// the type-specific attestation information
Attested TPMUAttest `gotpm:"tag=Type"`
}
// TPM2BAttest represents a TPM2B_ATTEST.
// See definition in Part 2: Structures, section 10.12.13.
type TPM2BAttest = TPM2B[TPMSAttest, *TPMSAttest]
// TPMSAuthCommand represents a TPMS_AUTH_COMMAND.
// See definition in Part 2: Structures, section 10.13.2.
type TPMSAuthCommand struct {
marshalByReflection
Handle TPMISHAuthSession
Nonce TPM2BNonce
Attributes TPMASession
Authorization TPM2BData
}
// TPMSAuthResponse represents a TPMS_AUTH_RESPONSE.
// See definition in Part 2: Structures, section 10.13.3.
type TPMSAuthResponse struct {
marshalByReflection
Nonce TPM2BNonce
Attributes TPMASession
Authorization TPM2BData
}
// TPMUSymKeyBits represents a TPMU_SYM_KEY_BITS.
// See definition in Part 2: Structures, section 11.1.3.
type TPMUSymKeyBits struct {
selector TPMAlgID
contents Marshallable
}
// SymKeyBitsContents is a type constraint representing the possible contents of TPMUSymKeyBits.
type SymKeyBitsContents interface {
TPMKeyBits | TPMAlgID
}
// create implements the unmarshallableWithHint interface.
func (u *TPMUSymKeyBits) create(hint int64) (reflect.Value, error) {
switch TPMAlgID(hint) {
case TPMAlgTDES, TPMAlgAES, TPMAlgSM4, TPMAlgCamellia:
var contents boxed[TPMKeyBits]
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgXOR:
var contents boxed[TPMAlgID]
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// get implements the marshallableWithHint interface.
func (u TPMUSymKeyBits) get(hint int64) (reflect.Value, error) {
if u.selector != 0 && hint != int64(u.selector) {
return reflect.ValueOf(nil), fmt.Errorf("incorrect union tag %v, is %v", hint, u.selector)
}
switch TPMAlgID(hint) {
case TPMAlgTDES, TPMAlgAES, TPMAlgSM4, TPMAlgCamellia:
var contents boxed[TPMKeyBits]
if u.contents != nil {
contents = *u.contents.(*boxed[TPMKeyBits])
}
return reflect.ValueOf(&contents), nil
case TPMAlgXOR:
var contents boxed[TPMAlgID]
if u.contents != nil {
contents = *u.contents.(*boxed[TPMAlgID])
}
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// NewTPMUSymKeyBits instantiates a TPMUSymKeyBits with the given contents.
func NewTPMUSymKeyBits[C SymKeyBitsContents](selector TPMAlgID, contents C) TPMUSymKeyBits {
boxed := box(&contents)
return TPMUSymKeyBits{
selector: selector,
contents: &boxed,
}
}
// Sym returns the 'sym' member of the union.
func (u *TPMUSymKeyBits) Sym() (*TPMKeyBits, error) {
switch u.selector {
case TPMAlgTDES, TPMAlgAES, TPMAlgSM4, TPMAlgCamellia:
value := u.contents.(*boxed[TPMKeyBits]).unbox()
return value, nil
default:
return nil, fmt.Errorf("did not contain sym (selector value was %v)", u.selector)
}
}
// AES returns the 'aes' member of the union.
func (u *TPMUSymKeyBits) AES() (*TPMKeyBits, error) {
if u.selector == TPMAlgAES {
value := u.contents.(*boxed[TPMKeyBits]).unbox()
return value, nil
}
return nil, fmt.Errorf("did not contain aes (selector value was %v)", u.selector)
}
// TDES returns the 'tdes' member of the union.
//
// Deprecated: TDES exists for historical compatibility
// and is not recommended anymore.
// https://csrc.nist.gov/news/2023/nist-to-withdraw-sp-800-67-rev-2
func (u *TPMUSymKeyBits) TDES() (*TPMKeyBits, error) {
if u.selector == TPMAlgTDES {
value := u.contents.(*boxed[TPMKeyBits]).unbox()
return value, nil
}
return nil, fmt.Errorf("did not contain tdes (selector value was %v)", u.selector)
}
// SM4 returns the 'sm4' member of the union.
func (u *TPMUSymKeyBits) SM4() (*TPMKeyBits, error) {
if u.selector == TPMAlgSM4 {
value := u.contents.(*boxed[TPMKeyBits]).unbox()
return value, nil
}
return nil, fmt.Errorf("did not contain sm4 (selector value was %v)", u.selector)
}
// Camellia returns the 'camellia' member of the union.
func (u *TPMUSymKeyBits) Camellia() (*TPMKeyBits, error) {
if u.selector == TPMAlgCamellia {
value := u.contents.(*boxed[TPMKeyBits]).unbox()
return value, nil
}
return nil, fmt.Errorf("did not contain camellia (selector value was %v)", u.selector)
}
// XOR returns the 'xor' member of the union.
func (u *TPMUSymKeyBits) XOR() (*TPMAlgID, error) {
if u.selector == TPMAlgXOR {
value := u.contents.(*boxed[TPMAlgID]).unbox()
return value, nil
}
return nil, fmt.Errorf("did not contain xor (selector value was %v)", u.selector)
}
// TPMUSymMode represents a TPMU_SYM_MODE.
// See definition in Part 2: Structures, section 11.1.4.
type TPMUSymMode struct {
selector TPMAlgID
contents Marshallable
}
// SymModeContents is a type constraint representing the possible contents of TPMUSymMode.
type SymModeContents interface {
TPMIAlgSymMode | TPMSEmpty
}
// create implements the unmarshallableWithHint interface.
func (u *TPMUSymMode) create(hint int64) (reflect.Value, error) {
switch TPMAlgID(hint) {
case TPMAlgTDES, TPMAlgAES, TPMAlgSM4, TPMAlgCamellia:
var contents boxed[TPMAlgID]
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgXOR:
var contents boxed[TPMSEmpty]
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// get implements the marshallableWithHint interface.
func (u TPMUSymMode) get(hint int64) (reflect.Value, error) {
if u.selector != 0 && hint != int64(u.selector) {
return reflect.ValueOf(nil), fmt.Errorf("incorrect union tag %v, is %v", hint, u.selector)
}
switch TPMAlgID(hint) {
case TPMAlgTDES, TPMAlgAES, TPMAlgSM4, TPMAlgCamellia:
var contents boxed[TPMAlgID]
if u.contents != nil {
contents = *u.contents.(*boxed[TPMAlgID])
}
return reflect.ValueOf(&contents), nil
case TPMAlgXOR:
var contents boxed[TPMSEmpty]
if u.contents != nil {
contents = *u.contents.(*boxed[TPMSEmpty])
}
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// NewTPMUSymMode instantiates a TPMUSymMode with the given contents.
func NewTPMUSymMode[C SymModeContents](selector TPMAlgID, contents C) TPMUSymMode {
boxed := box(&contents)
return TPMUSymMode{
selector: selector,
contents: &boxed,
}
}
// Sym returns the 'sym' member of the union.
func (u *TPMUSymMode) Sym() (*TPMIAlgSymMode, error) {
switch u.selector {
case TPMAlgTDES, TPMAlgAES, TPMAlgSM4, TPMAlgCamellia:
value := u.contents.(*boxed[TPMIAlgSymMode]).unbox()
return value, nil
default:
return nil, fmt.Errorf("did not contain sym (selector value was %v)", u.selector)
}
}
// AES returns the 'aes' member of the union.
func (u *TPMUSymMode) AES() (*TPMIAlgSymMode, error) {
if u.selector == TPMAlgAES {
value := u.contents.(*boxed[TPMIAlgSymMode]).unbox()
return value, nil
}
return nil, fmt.Errorf("did not contain aes (selector value was %v)", u.selector)
}
// TDES returns the 'tdes' member of the union.
//
// Deprecated: TDES exists for historical compatibility
// and is not recommended anymore.
// https://csrc.nist.gov/news/2023/nist-to-withdraw-sp-800-67-rev-2
func (u *TPMUSymMode) TDES() (*TPMIAlgSymMode, error) {
if u.selector == TPMAlgTDES {
value := u.contents.(*boxed[TPMIAlgSymMode]).unbox()
return value, nil
}
return nil, fmt.Errorf("did not contain tdes (selector value was %v)", u.selector)
}
// SM4 returns the 'sm4' member of the union.
func (u *TPMUSymMode) SM4() (*TPMIAlgSymMode, error) {
if u.selector == TPMAlgSM4 {
value := u.contents.(*boxed[TPMIAlgSymMode]).unbox()
return value, nil
}
return nil, fmt.Errorf("did not contain sm4 (selector value was %v)", u.selector)
}
// Camellia returns the 'camellia' member of the union.
func (u *TPMUSymMode) Camellia() (*TPMIAlgSymMode, error) {
if u.selector == TPMAlgCamellia {
value := u.contents.(*boxed[TPMIAlgSymMode]).unbox()
return value, nil
}
return nil, fmt.Errorf("did not contain camellia (selector value was %v)", u.selector)
}
// TPMUSymDetails represents a TPMU_SYM_DETAILS.
// See definition in Part 2: Structures, section 11.1.5.
type TPMUSymDetails struct {
selector TPMAlgID
contents Marshallable
}
// SymDetailsContents is a type constraint representing the possible contents of TPMUSymDetails.
type SymDetailsContents interface {
TPMSEmpty
}
// create implements the unmarshallableWithHint interface.
func (u *TPMUSymDetails) create(hint int64) (reflect.Value, error) {
switch TPMAlgID(hint) {
case TPMAlgAES:
var contents boxed[TPMSEmpty]
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgXOR:
var contents boxed[TPMSEmpty]
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// get implements the marshallableWithHint interface.
func (u TPMUSymDetails) get(hint int64) (reflect.Value, error) {
if u.selector != 0 && hint != int64(u.selector) {
return reflect.ValueOf(nil), fmt.Errorf("incorrect union tag %v, is %v", hint, u.selector)
}
switch TPMAlgID(hint) {
case TPMAlgAES, TPMAlgXOR:
var contents boxed[TPMSEmpty]
if u.contents != nil {
contents = *u.contents.(*boxed[TPMSEmpty])
}
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// NewTPMUSymDetails instantiates a TPMUSymDetails with the given contents.
func NewTPMUSymDetails[C SymDetailsContents](selector TPMAlgID, contents C) TPMUSymMode {
boxed := box(&contents)
return TPMUSymMode{
selector: selector,
contents: &boxed,
}
}
// TPMTSymDef represents a TPMT_SYM_DEF.
// See definition in Part 2: Structures, section 11.1.6.
type TPMTSymDef struct {
marshalByReflection
// indicates a symmetric algorithm
Algorithm TPMIAlgSym `gotpm:"nullable"`
// the key size
KeyBits TPMUSymKeyBits `gotpm:"tag=Algorithm"`
// the mode for the key
Mode TPMUSymMode `gotpm:"tag=Algorithm"`
// contains the additional algorithm details
Details TPMUSymDetails `gotpm:"tag=Algorithm"`
}
// TPMTSymDefObject represents a TPMT_SYM_DEF_OBJECT.
// See definition in Part 2: Structures, section 11.1.7.
type TPMTSymDefObject struct {
marshalByReflection
// selects a symmetric block cipher
// When used in the parameter area of a parent object, this shall
// be a supported block cipher and not TPM_ALG_NULL
Algorithm TPMIAlgSymObject `gotpm:"nullable"`
// the key size
KeyBits TPMUSymKeyBits `gotpm:"tag=Algorithm"`
// default mode
// When used in the parameter area of a parent object, this shall
// be TPM_ALG_CFB.
Mode TPMUSymMode `gotpm:"tag=Algorithm"`
// contains the additional algorithm details, if any
Details TPMUSymDetails `gotpm:"tag=Algorithm"`
}
// TPM2BSymKey represents a TPM2B_SYM_KEY.
// See definition in Part 2: Structures, section 11.1.8.
type TPM2BSymKey TPM2BData
// TPMSSymCipherParms represents a TPMS_SYMCIPHER_PARMS.
// See definition in Part 2: Structures, section 11.1.9.
type TPMSSymCipherParms struct {
marshalByReflection
// a symmetric block cipher
Sym TPMTSymDefObject
}
// TPM2BLabel represents a TPM2B_LABEL.
// See definition in Part 2: Structures, section 11.1.10.
type TPM2BLabel TPM2BData
// TPMSDerive represents a TPMS_DERIVE.
// See definition in Part 2: Structures, section 11.1.11.
type TPMSDerive struct {
marshalByReflection
Label TPM2BLabel
Context TPM2BLabel
}
// TPM2BDerive represents a TPM2B_DERIVE.
// See definition in Part 2: Structures, section 11.1.12.
type TPM2BDerive = TPM2B[TPMSDerive, *TPMSDerive]
// TPMUSensitiveCreate represents a TPMU_SENSITIVE_CREATE.
// See definition in Part 2: Structures, section 11.1.13.
type TPMUSensitiveCreate struct {
contents Marshallable
}
// SensitiveCreateContents is a type constraint representing the possible contents of TPMUSensitiveCreate.
type SensitiveCreateContents interface {
Marshallable
*TPM2BDerive | *TPM2BSensitiveData
}
// marshal implements the Marshallable interface.
func (u TPMUSensitiveCreate) marshal(buf *bytes.Buffer) {
if u.contents != nil {
buf.Write(Marshal(u.contents))
} else {
// If this is a zero-valued structure, marshal a default TPM2BSensitiveData.
var defaultValue TPM2BSensitiveData
buf.Write(Marshal(&defaultValue))
}
}
// NewTPMUSensitiveCreate instantiates a TPMUSensitiveCreate with the given contents.
func NewTPMUSensitiveCreate[C SensitiveCreateContents](contents C) TPMUSensitiveCreate {
return TPMUSensitiveCreate{contents: contents}
}
// TPM2BSensitiveData represents a TPM2B_SENSITIVE_DATA.
// See definition in Part 2: Structures, section 11.1.14.
type TPM2BSensitiveData TPM2BData
// TPMSSensitiveCreate represents a TPMS_SENSITIVE_CREATE.
// See definition in Part 2: Structures, section 11.1.15.
type TPMSSensitiveCreate struct {
marshalByReflection
// the USER auth secret value.
UserAuth TPM2BAuth
// data to be sealed, a key, or derivation values.
Data TPMUSensitiveCreate
}
// TPM2BSensitiveCreate represents a TPM2B_SENSITIVE_CREATE.
// See definition in Part 2: Structures, section 11.1.16.
// This is a structure instead of an alias to TPM2B[TPMSSensitiveCreate],
// because it has custom marshalling logic for zero-valued parameters.
type TPM2BSensitiveCreate struct {
Sensitive *TPMSSensitiveCreate
}
// Quirk: When this structure is zero-valued, we need to marshal
// a 2B-wrapped zero-valued TPMS_SENSITIVE_CREATE instead of
// [0x00, 0x00] (a zero-valued 2B).
func (c TPM2BSensitiveCreate) marshal(buf *bytes.Buffer) {
var marshalled TPM2B[TPMSSensitiveCreate, *TPMSSensitiveCreate]
if c.Sensitive != nil {
marshalled = New2B(*c.Sensitive)
} else {
// If no value was provided (i.e., this is a zero-valued structure),
// provide an 2B containing a zero-valued TPMS_SensitiveCreate.
marshalled = New2B(TPMSSensitiveCreate{
Data: NewTPMUSensitiveCreate(&TPM2BSensitiveData{}),
})
}
marshalled.marshal(buf)
}
// TPMSSchemeHash represents a TPMS_SCHEME_HASH.
// See definition in Part 2: Structures, section 11.1.17.
type TPMSSchemeHash struct {
marshalByReflection
// the hash algorithm used to digest the message
HashAlg TPMIAlgHash
}
// TPMSSchemeECDAA represents a TPMS_SCHEME_ECDAA.
// See definition in Part 2: Structures, section 11.1.18.
type TPMSSchemeECDAA struct {
marshalByReflection
// the hash algorithm used to digest the message
HashAlg TPMIAlgHash
// the counter value that is used between TPM2_Commit()
// and the sign operation
Count uint16
}
// TPMIAlgKeyedHashScheme represents a TPMI_ALG_KEYEDHASH_SCHEME.
// See definition in Part 2: Structures, section 11.1.19.
type TPMIAlgKeyedHashScheme = TPMAlgID
// TPMSSchemeHMAC represents a TPMS_SCHEME_HMAC.
// See definition in Part 2: Structures, section 11.1.20.
type TPMSSchemeHMAC TPMSSchemeHash
// TPMSSchemeXOR represents a TPMS_SCHEME_XOR.
// See definition in Part 2: Structures, section 11.1.21.
type TPMSSchemeXOR struct {
marshalByReflection
// the hash algorithm used to digest the message
HashAlg TPMIAlgHash
// the key derivation function
KDF TPMIAlgKDF
}
// TPMUSchemeKeyedHash represents a TPMU_SCHEME_KEYEDHASH.
// See definition in Part 2: Structures, section 11.1.22.
type TPMUSchemeKeyedHash struct {
selector TPMAlgID
contents Marshallable
}
// SchemeKeyedHashContents is a type constraint representing the possible contents of TPMUSchemeKeyedHash.
type SchemeKeyedHashContents interface {
Marshallable
*TPMSSchemeHMAC | *TPMSSchemeXOR
}
// create implements the unmarshallableWithHint interface.
func (u *TPMUSchemeKeyedHash) create(hint int64) (reflect.Value, error) {
switch TPMAlgID(hint) {
case TPMAlgHMAC:
var contents TPMSSchemeHMAC
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgXOR:
var contents TPMSSchemeXOR
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// get implements the marshallableWithHint interface.
func (u TPMUSchemeKeyedHash) get(hint int64) (reflect.Value, error) {
if u.selector != 0 && hint != int64(u.selector) {
return reflect.ValueOf(nil), fmt.Errorf("incorrect union tag %v, is %v", hint, u.selector)
}
switch TPMAlgID(hint) {
case TPMAlgHMAC:
var contents TPMSSchemeHMAC
if u.contents != nil {
contents = *u.contents.(*TPMSSchemeHMAC)
}
return reflect.ValueOf(&contents), nil
case TPMAlgXOR:
var contents TPMSSchemeXOR
if u.contents != nil {
contents = *u.contents.(*TPMSSchemeXOR)
}
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// NewTPMUSchemeKeyedHash instantiates a TPMUSchemeKeyedHash with the given contents.
func NewTPMUSchemeKeyedHash[C SchemeKeyedHashContents](selector TPMAlgID, contents C) TPMUSchemeKeyedHash {
return TPMUSchemeKeyedHash{
selector: selector,
contents: contents,
}
}
// HMAC returns the 'hmac' member of the union.
func (u *TPMUSchemeKeyedHash) HMAC() (*TPMSSchemeHMAC, error) {
if u.selector == TPMAlgHMAC {
value := u.contents.(*TPMSSchemeHMAC)
return value, nil
}
return nil, fmt.Errorf("did not contain hmac (selector value was %v)", u.selector)
}
// XOR returns the 'xor' member of the union.
func (u *TPMUSchemeKeyedHash) XOR() (*TPMSSchemeXOR, error) {
if u.selector == TPMAlgXOR {
value := u.contents.(*TPMSSchemeXOR)
return value, nil
}
return nil, fmt.Errorf("did not contain xor (selector value was %v)", u.selector)
}
// TPMTKeyedHashScheme represents a TPMT_KEYEDHASH_SCHEME.
// See definition in Part 2: Structures, section 11.1.23.
type TPMTKeyedHashScheme struct {
marshalByReflection
Scheme TPMIAlgKeyedHashScheme `gotpm:"nullable"`
Details TPMUSchemeKeyedHash `gotpm:"tag=Scheme"`
}
// TPMSSigSchemeRSASSA represents a TPMS_SIG_SCHEME_RSASSA.
// See definition in Part 2: Structures, section 11.2.1.2.
type TPMSSigSchemeRSASSA TPMSSchemeHash
// TPMSSigSchemeRSAPSS represents a TPMS_SIG_SCHEME_RSAPSS.
// See definition in Part 2: Structures, section 11.2.1.2.
type TPMSSigSchemeRSAPSS TPMSSchemeHash
// TPMSSigSchemeECDSA represents a TPMS_SIG_SCHEME_ECDSA.
// See definition in Part 2: Structures, section 11.2.1.3.
type TPMSSigSchemeECDSA TPMSSchemeHash
// TPMUSigScheme represents a TPMU_SIG_SCHEME.
// See definition in Part 2: Structures, section 11.2.1.4.
type TPMUSigScheme struct {
selector TPMAlgID
contents Marshallable
}
// SigSchemeContents is a type constraint representing the possible contents of TPMUSigScheme.
type SigSchemeContents interface {
Marshallable
*TPMSSchemeHMAC | *TPMSSchemeHash | *TPMSSchemeECDAA
}
// create implements the unmarshallableWithHint interface.
func (u *TPMUSigScheme) create(hint int64) (reflect.Value, error) {
switch TPMAlgID(hint) {
case TPMAlgHMAC:
var contents TPMSSchemeHMAC
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgRSASSA, TPMAlgRSAPSS, TPMAlgECDSA:
var contents TPMSSchemeHash
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgECDAA:
var contents TPMSSchemeECDAA
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// get implements the marshallableWithHint interface.
func (u TPMUSigScheme) get(hint int64) (reflect.Value, error) {
if u.selector != 0 && hint != int64(u.selector) {
return reflect.ValueOf(nil), fmt.Errorf("incorrect union tag %v, is %v", hint, u.selector)
}
switch TPMAlgID(hint) {
case TPMAlgHMAC:
var contents TPMSSchemeHMAC
if u.contents != nil {
contents = *u.contents.(*TPMSSchemeHMAC)
}
return reflect.ValueOf(&contents), nil
case TPMAlgRSASSA, TPMAlgRSAPSS, TPMAlgECDSA:
var contents TPMSSchemeHash
if u.contents != nil {
contents = *u.contents.(*TPMSSchemeHash)
}
return reflect.ValueOf(&contents), nil
case TPMAlgECDAA:
var contents TPMSSchemeECDAA
if u.contents != nil {
contents = *u.contents.(*TPMSSchemeECDAA)
}
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// NewTPMUSigScheme instantiates a TPMUSigScheme with the given contents.
func NewTPMUSigScheme[C SigSchemeContents](selector TPMAlgID, contents C) TPMUSigScheme {
return TPMUSigScheme{
selector: selector,
contents: contents,
}
}
// HMAC returns the 'hmac' member of the union.
func (u *TPMUSigScheme) HMAC() (*TPMSSchemeHMAC, error) {
if u.selector == TPMAlgHMAC {
return u.contents.(*TPMSSchemeHMAC), nil
}
return nil, fmt.Errorf("did not contain hmac (selector value was %v)", u.selector)
}
// RSASSA returns the 'rsassa' member of the union.
func (u *TPMUSigScheme) RSASSA() (*TPMSSchemeHash, error) {
if u.selector == TPMAlgRSASSA {
return u.contents.(*TPMSSchemeHash), nil
}
return nil, fmt.Errorf("did not contain rsassa (selector value was %v)", u.selector)
}
// RSAPSS returns the 'rsapss' member of the union.
func (u *TPMUSigScheme) RSAPSS() (*TPMSSchemeHash, error) {
if u.selector == TPMAlgRSAPSS {
return u.contents.(*TPMSSchemeHash), nil
}
return nil, fmt.Errorf("did not contain rsapss (selector value was %v)", u.selector)
}
// ECDSA returns the 'ecdsa' member of the union.
func (u *TPMUSigScheme) ECDSA() (*TPMSSchemeHash, error) {
if u.selector == TPMAlgECDSA {
return u.contents.(*TPMSSchemeHash), nil
}
return nil, fmt.Errorf("did not contain ecdsa (selector value was %v)", u.selector)
}
// ECDAA returns the 'ecdaa' member of the union.
func (u *TPMUSigScheme) ECDAA() (*TPMSSchemeECDAA, error) {
if u.selector == TPMAlgECDAA {
return u.contents.(*TPMSSchemeECDAA), nil
}
return nil, fmt.Errorf("did not contain ecdaa (selector value was %v)", u.selector)
}
// TPMTSigScheme represents a TPMT_SIG_SCHEME.
// See definition in Part 2: Structures, section 11.2.1.5.
type TPMTSigScheme struct {
marshalByReflection
Scheme TPMIAlgSigScheme `gotpm:"nullable"`
Details TPMUSigScheme `gotpm:"tag=Scheme"`
}
// TPMSEncSchemeRSAES represents a TPMS_ENC_SCHEME_RSAES.
// See definition in Part 2: Structures, section 11.2.2.2.
type TPMSEncSchemeRSAES TPMSEmpty
// TPMSEncSchemeOAEP represents a TPMS_ENC_SCHEME_OAEP.
// See definition in Part 2: Structures, section 11.2.2.2.
type TPMSEncSchemeOAEP TPMSSchemeHash
// TPMSKeySchemeECDH represents a TPMS_KEY_SCHEME_ECDH.
// See definition in Part 2: Structures, section 11.2.2.3.
type TPMSKeySchemeECDH TPMSSchemeHash
// TPMSKeySchemeECMQV represents a TPMS_KEY_SCHEME_ECMQV.
// See definition in Part 2: Structures, section 11.2.2.3.
type TPMSKeySchemeECMQV TPMSSchemeHash
// TPMSKDFSchemeMGF1 represents a TPMS_KDF_SCHEME_MGF1.
// See definition in Part 2: Structures, section 11.2.3.1.
type TPMSKDFSchemeMGF1 TPMSSchemeHash
// TPMSKDFSchemeECDH represents a TPMS_KDF_SCHEME_ECDH.
// See definition in Part 2: Structures, section 11.2.3.1.
type TPMSKDFSchemeECDH TPMSSchemeHash
// TPMSKDFSchemeKDF1SP80056A represents a TPMS_KDF_SCHEME_KDF1SP80056A.
// See definition in Part 2: Structures, section 11.2.3.1.
type TPMSKDFSchemeKDF1SP80056A TPMSSchemeHash
// TPMSKDFSchemeKDF2 represents a TPMS_KDF_SCHEME_KDF2.
// See definition in Part 2: Structures, section 11.2.3.1.
type TPMSKDFSchemeKDF2 TPMSSchemeHash
// TPMSKDFSchemeKDF1SP800108 represents a TPMS_KDF_SCHEME_KDF1SP800108.
// See definition in Part 2: Structures, section 11.2.3.1.
type TPMSKDFSchemeKDF1SP800108 TPMSSchemeHash
// TPMUKDFScheme represents a TPMU_KDF_SCHEME.
// See definition in Part 2: Structures, section 11.2.3.2.
type TPMUKDFScheme struct {
selector TPMAlgID
contents Marshallable
}
// KDFSchemeContents is a type constraint representing the possible contents of TPMUKDFScheme.
type KDFSchemeContents interface {
Marshallable
*TPMSKDFSchemeMGF1 | *TPMSKDFSchemeECDH | *TPMSKDFSchemeKDF1SP80056A |
*TPMSKDFSchemeKDF2 | *TPMSKDFSchemeKDF1SP800108
}
// create implements the unmarshallableWithHint interface.
func (u *TPMUKDFScheme) create(hint int64) (reflect.Value, error) {
switch TPMAlgID(hint) {
case TPMAlgMGF1:
var contents TPMSKDFSchemeMGF1
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgECDH:
var contents TPMSKDFSchemeECDH
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgKDF1SP80056A:
var contents TPMSKDFSchemeKDF1SP80056A
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgKDF2:
var contents TPMSKDFSchemeKDF2
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgKDF1SP800108:
var contents TPMSKDFSchemeKDF1SP800108
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// get implements the marshallableWithHint interface.
func (u TPMUKDFScheme) get(hint int64) (reflect.Value, error) {
if u.selector != 0 && hint != int64(u.selector) {
return reflect.ValueOf(nil), fmt.Errorf("incorrect union tag %v, is %v", hint, u.selector)
}
switch TPMAlgID(hint) {
case TPMAlgMGF1:
var contents TPMSKDFSchemeMGF1
if u.contents != nil {
contents = *u.contents.(*TPMSKDFSchemeMGF1)
}
return reflect.ValueOf(&contents), nil
case TPMAlgECDH:
var contents TPMSKDFSchemeECDH
if u.contents != nil {
contents = *u.contents.(*TPMSKDFSchemeECDH)
}
return reflect.ValueOf(&contents), nil
case TPMAlgKDF1SP80056A:
var contents TPMSKDFSchemeKDF1SP80056A
if u.contents != nil {
contents = *u.contents.(*TPMSKDFSchemeKDF1SP80056A)
}
return reflect.ValueOf(&contents), nil
case TPMAlgKDF2:
var contents TPMSKDFSchemeKDF2
if u.contents != nil {
contents = *u.contents.(*TPMSKDFSchemeKDF2)
}
return reflect.ValueOf(&contents), nil
case TPMAlgKDF1SP800108:
var contents TPMSKDFSchemeKDF1SP800108
if u.contents != nil {
contents = *u.contents.(*TPMSKDFSchemeKDF1SP800108)
}
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// NewTPMUKDFScheme instantiates a TPMUKDFScheme with the given contents.
func NewTPMUKDFScheme[C KDFSchemeContents](selector TPMAlgID, contents C) TPMUKDFScheme {
return TPMUKDFScheme{
selector: selector,
contents: contents,
}
}
// MGF1 returns the 'mgf1' member of the union.
func (u *TPMUKDFScheme) MGF1() (*TPMSKDFSchemeMGF1, error) {
if u.selector == TPMAlgMGF1 {
return u.contents.(*TPMSKDFSchemeMGF1), nil
}
return nil, fmt.Errorf("did not contain mgf1 (selector value was %v)", u.selector)
}
// ECDH returns the 'ecdh' member of the union.
func (u *TPMUKDFScheme) ECDH() (*TPMSKDFSchemeECDH, error) {
if u.selector == TPMAlgECDH {
return u.contents.(*TPMSKDFSchemeECDH), nil
}
return nil, fmt.Errorf("did not contain ecdh (selector value was %v)", u.selector)
}
// KDF1SP80056A returns the 'kdf1sp80056a' member of the union.
func (u *TPMUKDFScheme) KDF1SP80056A() (*TPMSKDFSchemeKDF1SP80056A, error) {
if u.selector == TPMAlgMGF1 {
return u.contents.(*TPMSKDFSchemeKDF1SP80056A), nil
}
return nil, fmt.Errorf("did not contain kdf1sp80056a (selector value was %v)", u.selector)
}
// KDF2 returns the 'kdf2' member of the union.
func (u *TPMUKDFScheme) KDF2() (*TPMSKDFSchemeKDF2, error) {
if u.selector == TPMAlgMGF1 {
return u.contents.(*TPMSKDFSchemeKDF2), nil
}
return nil, fmt.Errorf("did not contain mgf1 (selector value was %v)", u.selector)
}
// KDF1SP800108 returns the 'kdf1sp800108' member of the union.
func (u *TPMUKDFScheme) KDF1SP800108() (*TPMSKDFSchemeKDF1SP800108, error) {
if u.selector == TPMAlgMGF1 {
return u.contents.(*TPMSKDFSchemeKDF1SP800108), nil
}
return nil, fmt.Errorf("did not contain kdf1sp800108 (selector value was %v)", u.selector)
}
// TPMTKDFScheme represents a TPMT_KDF_SCHEME.
// See definition in Part 2: Structures, section 11.2.3.3.
type TPMTKDFScheme struct {
marshalByReflection
// scheme selector
Scheme TPMIAlgKDF `gotpm:"nullable"`
// scheme parameters
Details TPMUKDFScheme `gotpm:"tag=Scheme"`
}
// TPMUAsymScheme represents a TPMU_ASYM_SCHEME.
// See definition in Part 2: Structures, section 11.2.3.5.
type TPMUAsymScheme struct {
selector TPMAlgID
contents Marshallable
}
// AsymSchemeContents is a type constraint representing the possible contents of TPMUAsymScheme.
type AsymSchemeContents interface {
Marshallable
*TPMSSigSchemeRSASSA | *TPMSEncSchemeRSAES | *TPMSSigSchemeRSAPSS | *TPMSEncSchemeOAEP |
*TPMSSigSchemeECDSA | *TPMSKeySchemeECDH | *TPMSKeySchemeECMQV | *TPMSSchemeECDAA
}
// create implements the unmarshallableWithHint interface.
func (u *TPMUAsymScheme) create(hint int64) (reflect.Value, error) {
switch TPMAlgID(hint) {
case TPMAlgRSASSA:
var contents TPMSSigSchemeRSASSA
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgRSAES:
var contents TPMSEncSchemeRSAES
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgRSAPSS:
var contents TPMSSigSchemeRSAPSS
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgOAEP:
var contents TPMSEncSchemeOAEP
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgECDSA:
var contents TPMSSigSchemeECDSA
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgECDH:
var contents TPMSKeySchemeECDH
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgECMQV:
var contents TPMSKeySchemeECMQV
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgECDAA:
var contents TPMSSchemeECDAA
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// get implements the marshallableWithHint interface.
func (u TPMUAsymScheme) get(hint int64) (reflect.Value, error) {
if u.selector != 0 && hint != int64(u.selector) {
return reflect.ValueOf(nil), fmt.Errorf("incorrect union tag %v, is %v", hint, u.selector)
}
switch TPMAlgID(hint) {
case TPMAlgRSASSA:
var contents TPMSSigSchemeRSASSA
if u.contents != nil {
contents = *u.contents.(*TPMSSigSchemeRSASSA)
}
return reflect.ValueOf(&contents), nil
case TPMAlgRSAES:
var contents TPMSEncSchemeRSAES
if u.contents != nil {
contents = *u.contents.(*TPMSEncSchemeRSAES)
}
return reflect.ValueOf(&contents), nil
case TPMAlgRSAPSS:
var contents TPMSSigSchemeRSAPSS
if u.contents != nil {
contents = *u.contents.(*TPMSSigSchemeRSAPSS)
}
return reflect.ValueOf(&contents), nil
case TPMAlgOAEP:
var contents TPMSEncSchemeOAEP
if u.contents != nil {
contents = *u.contents.(*TPMSEncSchemeOAEP)
}
return reflect.ValueOf(&contents), nil
case TPMAlgECDSA:
var contents TPMSSigSchemeECDSA
if u.contents != nil {
contents = *u.contents.(*TPMSSigSchemeECDSA)
}
return reflect.ValueOf(&contents), nil
case TPMAlgECDH:
var contents TPMSKeySchemeECDH
if u.contents != nil {
contents = *u.contents.(*TPMSKeySchemeECDH)
}
return reflect.ValueOf(&contents), nil
case TPMAlgECMQV:
var contents TPMSKeySchemeECMQV
if u.contents != nil {
contents = *u.contents.(*TPMSKeySchemeECMQV)
}
return reflect.ValueOf(&contents), nil
case TPMAlgECDAA:
var contents TPMSSchemeECDAA
if u.contents != nil {
contents = *u.contents.(*TPMSSchemeECDAA)
}
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// NewTPMUAsymScheme instantiates a TPMUAsymScheme with the given contents.
func NewTPMUAsymScheme[C AsymSchemeContents](selector TPMAlgID, contents C) TPMUAsymScheme {
return TPMUAsymScheme{
selector: selector,
contents: contents,
}
}
// RSASSA returns the 'rsassa' member of the union.
func (u *TPMUAsymScheme) RSASSA() (*TPMSSigSchemeRSASSA, error) {
if u.selector == TPMAlgRSASSA {
return u.contents.(*TPMSSigSchemeRSASSA), nil
}
return nil, fmt.Errorf("did not contain rsassa (selector value was %v)", u.selector)
}
// RSAES returns the 'rsaes' member of the union.
func (u *TPMUAsymScheme) RSAES() (*TPMSEncSchemeRSAES, error) {
if u.selector == TPMAlgRSAES {
return u.contents.(*TPMSEncSchemeRSAES), nil
}
return nil, fmt.Errorf("did not contain rsaes (selector value was %v)", u.selector)
}
// RSAPSS returns the 'rsapss' member of the union.
func (u *TPMUAsymScheme) RSAPSS() (*TPMSSigSchemeRSAPSS, error) {
if u.selector == TPMAlgRSAPSS {
return u.contents.(*TPMSSigSchemeRSAPSS), nil
}
return nil, fmt.Errorf("did not contain rsapss (selector value was %v)", u.selector)
}
// OAEP returns the 'oaep' member of the union.
func (u *TPMUAsymScheme) OAEP() (*TPMSEncSchemeOAEP, error) {
if u.selector == TPMAlgOAEP {
return u.contents.(*TPMSEncSchemeOAEP), nil
}
return nil, fmt.Errorf("did not contain oaep (selector value was %v)", u.selector)
}
// ECDSA returns the 'ecdsa' member of the union.
func (u *TPMUAsymScheme) ECDSA() (*TPMSSigSchemeECDSA, error) {
if u.selector == TPMAlgECDSA {
return u.contents.(*TPMSSigSchemeECDSA), nil
}
return nil, fmt.Errorf("did not contain rsassa (selector value was %v)", u.selector)
}
// ECDH returns the 'ecdh' member of the union.
func (u *TPMUAsymScheme) ECDH() (*TPMSKeySchemeECDH, error) {
if u.selector == TPMAlgRSASSA {
return u.contents.(*TPMSKeySchemeECDH), nil
}
return nil, fmt.Errorf("did not contain ecdh (selector value was %v)", u.selector)
}
// ECDAA returns the 'ecdaa' member of the union.
func (u *TPMUAsymScheme) ECDAA() (*TPMSSchemeECDAA, error) {
if u.selector == TPMAlgECDAA {
return u.contents.(*TPMSSchemeECDAA), nil
}
return nil, fmt.Errorf("did not contain rsassa (selector value was %v)", u.selector)
}
// TPMIAlgRSAScheme represents a TPMI_ALG_RSA_SCHEME.
// See definition in Part 2: Structures, section 11.2.4.1.
type TPMIAlgRSAScheme = TPMAlgID
// TPMTRSAScheme represents a TPMT_RSA_SCHEME.
// See definition in Part 2: Structures, section 11.2.4.2.
type TPMTRSAScheme struct {
marshalByReflection
// scheme selector
Scheme TPMIAlgRSAScheme `gotpm:"nullable"`
// scheme parameters
Details TPMUAsymScheme `gotpm:"tag=Scheme"`
}
// TPMIAlgRSADecrypt represents a TPMI_ALG_RSA_DECRYPT.
// See definition in Part 2: Structures, section 11.2.4.3.
type TPMIAlgRSADecrypt = TPMAlgID
// TPMTRSADecrypt represents a TPMT_RSA_DECRYPT.
// See definition in Part 2: Structures, section 11.2.4.4.
type TPMTRSADecrypt struct {
marshalByReflection
// scheme selector
Scheme TPMIAlgRSADecrypt `gotpm:"nullable"`
// scheme parameters
Details TPMUAsymScheme `gotpm:"tag=Scheme"`
}
// TPM2BPublicKeyRSA represents a TPM2B_PUBLIC_KEY_RSA.
// See definition in Part 2: Structures, section 11.2.4.5.
type TPM2BPublicKeyRSA TPM2BData
// TPMIRSAKeyBits represents a TPMI_RSA_KEY_BITS.
// See definition in Part 2: Structures, section 11.2.4.6.
type TPMIRSAKeyBits = TPMKeyBits
// TPM2BPrivateKeyRSA representsa a TPM2B_PRIVATE_KEY_RSA.
// See definition in Part 2: Structures, section 11.2.4.7.
type TPM2BPrivateKeyRSA TPM2BData
// TPM2BECCParameter represents a TPM2B_ECC_PARAMETER.
// See definition in Part 2: Structures, section 11.2.5.1.
type TPM2BECCParameter TPM2BData
// TPMSECCPoint represents a TPMS_ECC_POINT.
// See definition in Part 2: Structures, section 11.2.5.2.
type TPMSECCPoint struct {
marshalByReflection
// X coordinate
X TPM2BECCParameter
// Y coordinate
Y TPM2BECCParameter
}
// TPM2BECCPoint represents a TPM2B_ECC_POINT.
// See definition in Part 2: Structures, section 11.2.5.3.
type TPM2BECCPoint = TPM2B[TPMSECCPoint, *TPMSECCPoint]
// TPMIAlgECCScheme represents a TPMI_ALG_ECC_SCHEME.
// See definition in Part 2: Structures, section 11.2.5.4.
type TPMIAlgECCScheme = TPMAlgID
// TPMIECCCurve represents a TPMI_ECC_CURVE.
// See definition in Part 2: Structures, section 11.2.5.5.
type TPMIECCCurve = TPMECCCurve
// TPMTECCScheme represents a TPMT_ECC_SCHEME.
// See definition in Part 2: Structures, section 11.2.5.6.
type TPMTECCScheme struct {
marshalByReflection
// scheme selector
Scheme TPMIAlgECCScheme `gotpm:"nullable"`
// scheme parameters
Details TPMUAsymScheme `gotpm:"tag=Scheme"`
}
// TPMSSignatureRSA represents a TPMS_SIGNATURE_RSA.
// See definition in Part 2: Structures, section 11.3.1.
type TPMSSignatureRSA struct {
marshalByReflection
// the hash algorithm used to digest the message
Hash TPMIAlgHash
// The signature is the size of a public key.
Sig TPM2BPublicKeyRSA
}
// TPMSSignatureECC represents a TPMS_SIGNATURE_ECC.
// See definition in Part 2: Structures, section 11.3.2.
type TPMSSignatureECC struct {
marshalByReflection
// the hash algorithm used in the signature process
Hash TPMIAlgHash
SignatureR TPM2BECCParameter
SignatureS TPM2BECCParameter
}
// TPMUSignature represents a TPMU_SIGNATURE.
// See definition in Part 2: Structures, section 11.3.3.
type TPMUSignature struct {
selector TPMAlgID
contents Marshallable
}
// SignatureContents is a type constraint representing the possible contents of TPMUSignature.
type SignatureContents interface {
Marshallable
*TPMTHA | *TPMSSignatureRSA | *TPMSSignatureECC
}
// create implements the unmarshallableWithHint interface.
func (u *TPMUSignature) create(hint int64) (reflect.Value, error) {
switch TPMAlgID(hint) {
case TPMAlgHMAC:
var contents TPMTHA
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgRSASSA, TPMAlgRSAPSS:
var contents TPMSSignatureRSA
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgECDSA, TPMAlgECDAA:
var contents TPMSSignatureECC
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// get implements the marshallableWithHint interface.
func (u TPMUSignature) get(hint int64) (reflect.Value, error) {
if u.selector != 0 && hint != int64(u.selector) {
return reflect.ValueOf(nil), fmt.Errorf("incorrect union tag %v, is %v", hint, u.selector)
}
switch TPMAlgID(hint) {
case TPMAlgHMAC:
var contents TPMTHA
if u.contents != nil {
contents = *u.contents.(*TPMTHA)
}
return reflect.ValueOf(&contents), nil
case TPMAlgRSASSA, TPMAlgRSAPSS:
var contents TPMSSignatureRSA
if u.contents != nil {
contents = *u.contents.(*TPMSSignatureRSA)
}
return reflect.ValueOf(&contents), nil
case TPMAlgECDSA, TPMAlgECDAA:
var contents TPMSSignatureECC
if u.contents != nil {
contents = *u.contents.(*TPMSSignatureECC)
}
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// NewTPMUSignature instantiates a TPMUSignature with the given contents.
func NewTPMUSignature[C SignatureContents](selector TPMAlgID, contents C) TPMUSignature {
return TPMUSignature{
selector: selector,
contents: contents,
}
}
// HMAC returns the 'hmac' member of the union.
func (u *TPMUSignature) HMAC() (*TPMTHA, error) {
if u.selector == TPMAlgHMAC {
return u.contents.(*TPMTHA), nil
}
return nil, fmt.Errorf("did not contain hmac (selector value was %v)", u.selector)
}
// RSASSA returns the 'rsassa' member of the union.
func (u *TPMUSignature) RSASSA() (*TPMSSignatureRSA, error) {
if u.selector == TPMAlgRSASSA {
return u.contents.(*TPMSSignatureRSA), nil
}
return nil, fmt.Errorf("did not contain rsassa (selector value was %v)", u.selector)
}
// RSAPSS returns the 'rsapss' member of the union.
func (u *TPMUSignature) RSAPSS() (*TPMSSignatureRSA, error) {
if u.selector == TPMAlgRSAPSS {
return u.contents.(*TPMSSignatureRSA), nil
}
return nil, fmt.Errorf("did not contain rsapss (selector value was %v)", u.selector)
}
// ECDSA returns the 'ecdsa' member of the union.
func (u *TPMUSignature) ECDSA() (*TPMSSignatureECC, error) {
if u.selector == TPMAlgECDSA {
return u.contents.(*TPMSSignatureECC), nil
}
return nil, fmt.Errorf("did not contain ecdsa (selector value was %v)", u.selector)
}
// ECDAA returns the 'ecdaa' member of the union.
func (u *TPMUSignature) ECDAA() (*TPMSSignatureECC, error) {
if u.selector == TPMAlgECDAA {
return u.contents.(*TPMSSignatureECC), nil
}
return nil, fmt.Errorf("did not contain ecdaa (selector value was %v)", u.selector)
}
// TPMTSignature represents a TPMT_SIGNATURE.
// See definition in Part 2: Structures, section 11.3.4.
type TPMTSignature struct {
marshalByReflection
// selector of the algorithm used to construct the signature
SigAlg TPMIAlgSigScheme `gotpm:"nullable"`
// This shall be the actual signature information.
Signature TPMUSignature `gotpm:"tag=SigAlg"`
}
// TPM2BEncryptedSecret represents a TPM2B_ENCRYPTED_SECRET.
// See definition in Part 2: Structures, section 11.4.33.
type TPM2BEncryptedSecret TPM2BData
// TPMIAlgPublic represents a TPMI_ALG_PUBLIC.
// See definition in Part 2: Structures, section 12.2.2.
type TPMIAlgPublic = TPMAlgID
// TPMUPublicID represents a TPMU_PUBLIC_ID.
// See definition in Part 2: Structures, section 12.2.3.2.
type TPMUPublicID struct {
selector TPMAlgID
contents Marshallable
}
// PublicIDContents is a type constraint representing the possible contents of TPMUPublicID.
type PublicIDContents interface {
Marshallable
*TPM2BDigest | *TPM2BPublicKeyRSA | *TPMSECCPoint
}
// create implements the unmarshallableWithHint interface.
func (u *TPMUPublicID) create(hint int64) (reflect.Value, error) {
switch TPMAlgID(hint) {
case TPMAlgKeyedHash:
var contents TPM2BDigest
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgSymCipher:
var contents TPM2BDigest
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgRSA:
var contents TPM2BPublicKeyRSA
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgECC:
var contents TPMSECCPoint
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// get implements the marshallableWithHint interface.
func (u TPMUPublicID) get(hint int64) (reflect.Value, error) {
if u.selector != 0 && hint != int64(u.selector) {
return reflect.ValueOf(nil), fmt.Errorf("incorrect union tag %v, is %v", hint, u.selector)
}
switch TPMAlgID(hint) {
case TPMAlgKeyedHash:
var contents TPM2BDigest
if u.contents != nil {
contents = *u.contents.(*TPM2BDigest)
}
return reflect.ValueOf(&contents), nil
case TPMAlgSymCipher:
var contents TPM2BDigest
if u.contents != nil {
contents = *u.contents.(*TPM2BDigest)
}
return reflect.ValueOf(&contents), nil
case TPMAlgRSA:
var contents TPM2BPublicKeyRSA
if u.contents != nil {
contents = *u.contents.(*TPM2BPublicKeyRSA)
}
return reflect.ValueOf(&contents), nil
case TPMAlgECC:
var contents TPMSECCPoint
if u.contents != nil {
contents = *u.contents.(*TPMSECCPoint)
}
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// NewTPMUPublicID instantiates a TPMUPublicID with the given contents.
func NewTPMUPublicID[C PublicIDContents](selector TPMAlgID, contents C) TPMUPublicID {
return TPMUPublicID{
selector: selector,
contents: contents,
}
}
// KeyedHash returns the 'keyedHash' member of the union.
func (u *TPMUPublicID) KeyedHash() (*TPM2BDigest, error) {
if u.selector == TPMAlgKeyedHash {
return u.contents.(*TPM2BDigest), nil
}
return nil, fmt.Errorf("did not contain keyedHash (selector value was %v)", u.selector)
}
// SymCipher returns the 'symCipher' member of the union.
func (u *TPMUPublicID) SymCipher() (*TPM2BDigest, error) {
if u.selector == TPMAlgSymCipher {
return u.contents.(*TPM2BDigest), nil
}
return nil, fmt.Errorf("did not contain symCipher (selector value was %v)", u.selector)
}
// RSA returns the 'rsa' member of the union.
func (u *TPMUPublicID) RSA() (*TPM2BPublicKeyRSA, error) {
if u.selector == TPMAlgRSA {
return u.contents.(*TPM2BPublicKeyRSA), nil
}
return nil, fmt.Errorf("did not contain rsa (selector value was %v)", u.selector)
}
// ECC returns the 'ecc' member of the union.
func (u *TPMUPublicID) ECC() (*TPMSECCPoint, error) {
if u.selector == TPMAlgECC {
return u.contents.(*TPMSECCPoint), nil
}
return nil, fmt.Errorf("did not contain ecc (selector value was %v)", u.selector)
}
// TPMSKeyedHashParms represents a TPMS_KEYEDHASH_PARMS.
// See definition in Part 2: Structures, section 12.2.3.3.
type TPMSKeyedHashParms struct {
marshalByReflection
// Indicates the signing method used for a keyedHash signing
// object. This field also determines the size of the data field
// for a data object created with TPM2_Create() or
// TPM2_CreatePrimary().
Scheme TPMTKeyedHashScheme
}
// TPMSRSAParms represents a TPMS_RSA_PARMS.
// See definition in Part 2: Structures, section 12.2.3.5.
type TPMSRSAParms struct {
marshalByReflection
// for a restricted decryption key, shall be set to a supported
// symmetric algorithm, key size, and mode.
// if the key is not a restricted decryption key, this field shall
// be set to TPM_ALG_NULL.
Symmetric TPMTSymDefObject
// scheme.scheme shall be:
// for an unrestricted signing key, either TPM_ALG_RSAPSS
// TPM_ALG_RSASSA or TPM_ALG_NULL
// for a restricted signing key, either TPM_ALG_RSAPSS or
// TPM_ALG_RSASSA
// for an unrestricted decryption key, TPM_ALG_RSAES, TPM_ALG_OAEP,
// or TPM_ALG_NULL unless the object also has the sign attribute
// for a restricted decryption key, TPM_ALG_NULL
Scheme TPMTRSAScheme
// number of bits in the public modulus
KeyBits TPMIRSAKeyBits
// the public exponent
// A prime number greater than 2.
Exponent uint32
}
// TPMSECCParms represents a TPMS_ECC_PARMS.
// See definition in Part 2: Structures, section 12.2.3.6.
type TPMSECCParms struct {
marshalByReflection
// for a restricted decryption key, shall be set to a supported
// symmetric algorithm, key size. and mode.
// if the key is not a restricted decryption key, this field shall
// be set to TPM_ALG_NULL.
Symmetric TPMTSymDefObject
// If the sign attribute of the key is SET, then this shall be a
// valid signing scheme.
Scheme TPMTECCScheme
// ECC curve ID
CurveID TPMIECCCurve
// an optional key derivation scheme for generating a symmetric key
// from a Z value
// If the kdf parameter associated with curveID is not TPM_ALG_NULL
// then this is required to be NULL.
KDF TPMTKDFScheme
}
// TPMUPublicParms represents a TPMU_PUBLIC_PARMS.
// See definition in Part 2: Structures, section 12.2.3.7.
type TPMUPublicParms struct {
selector TPMAlgID
contents Marshallable
}
// PublicParmsContents is a type constraint representing the possible contents of TPMUPublicParms.
type PublicParmsContents interface {
Marshallable
*TPMSKeyedHashParms | *TPMSSymCipherParms | *TPMSRSAParms |
*TPMSECCParms
}
// create implements the unmarshallableWithHint interface.
func (u *TPMUPublicParms) create(hint int64) (reflect.Value, error) {
switch TPMAlgID(hint) {
case TPMAlgKeyedHash:
var contents TPMSKeyedHashParms
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgSymCipher:
var contents TPMSSymCipherParms
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgRSA:
var contents TPMSRSAParms
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgECC:
var contents TPMSECCParms
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// get implements the marshallableWithHint interface.
func (u TPMUPublicParms) get(hint int64) (reflect.Value, error) {
if u.selector != 0 && hint != int64(u.selector) {
return reflect.ValueOf(nil), fmt.Errorf("incorrect union tag %v, is %v", hint, u.selector)
}
switch TPMAlgID(hint) {
case TPMAlgKeyedHash:
var contents TPMSKeyedHashParms
if u.contents != nil {
contents = *u.contents.(*TPMSKeyedHashParms)
}
return reflect.ValueOf(&contents), nil
case TPMAlgSymCipher:
var contents TPMSSymCipherParms
if u.contents != nil {
contents = *u.contents.(*TPMSSymCipherParms)
}
return reflect.ValueOf(&contents), nil
case TPMAlgRSA:
var contents TPMSRSAParms
if u.contents != nil {
contents = *u.contents.(*TPMSRSAParms)
}
return reflect.ValueOf(&contents), nil
case TPMAlgECC:
var contents TPMSECCParms
if u.contents != nil {
contents = *u.contents.(*TPMSECCParms)
}
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// NewTPMUPublicParms instantiates a TPMUPublicParms with the given contents.
func NewTPMUPublicParms[C PublicParmsContents](selector TPMAlgID, contents C) TPMUPublicParms {
return TPMUPublicParms{
selector: selector,
contents: contents,
}
}
// KeyedHashDetail returns the 'keyedHashDetail' member of the union.
func (u *TPMUPublicParms) KeyedHashDetail() (*TPMSKeyedHashParms, error) {
if u.selector == TPMAlgKeyedHash {
return u.contents.(*TPMSKeyedHashParms), nil
}
return nil, fmt.Errorf("did not contain keyedHashDetail (selector value was %v)", u.selector)
}
// SymDetail returns the 'symDetail' member of the union.
func (u *TPMUPublicParms) SymDetail() (*TPMSSymCipherParms, error) {
if u.selector == TPMAlgSymCipher {
return u.contents.(*TPMSSymCipherParms), nil
}
return nil, fmt.Errorf("did not contain symDetail (selector value was %v)", u.selector)
}
// RSADetail returns the 'rsaDetail' member of the union.
func (u *TPMUPublicParms) RSADetail() (*TPMSRSAParms, error) {
if u.selector == TPMAlgRSA {
return u.contents.(*TPMSRSAParms), nil
}
return nil, fmt.Errorf("did not contain rsaDetail (selector value was %v)", u.selector)
}
// ECCDetail returns the 'eccDetail' member of the union.
func (u *TPMUPublicParms) ECCDetail() (*TPMSECCParms, error) {
if u.selector == TPMAlgECC {
return u.contents.(*TPMSECCParms), nil
}
return nil, fmt.Errorf("did not contain eccDetail (selector value was %v)", u.selector)
}
// TPMTPublicParms represents a TPMT_PUBLIC_PARMS.
// See definition in Part 2: Structures, section 12.2.3.8.
type TPMTPublicParms struct {
marshalByReflection
// algorithm to be tested
Type TPMIAlgPublic
// algorithm details
Parameters TPMUPublicParms `gotpm:"tag=Type"`
}
// TPMTPublic represents a TPMT_PUBLIC.
// See definition in Part 2: Structures, section 12.2.4.
type TPMTPublic struct {
marshalByReflection
// “algorithm” associated with this object
Type TPMIAlgPublic
// algorithm used for computing the Name of the object
NameAlg TPMIAlgHash
// attributes that, along with type, determine the manipulations
// of this object
ObjectAttributes TPMAObject
// optional policy for using this key
// The policy is computed using the nameAlg of the object.
AuthPolicy TPM2BDigest
// the algorithm or structure details
Parameters TPMUPublicParms `gotpm:"tag=Type"`
// the unique identifier of the structure
// For an asymmetric key, this would be the public key.
Unique TPMUPublicID `gotpm:"tag=Type"`
}
// TPM2BPublic represents a TPM2B_PUBLIC.
// See definition in Part 2: Structures, section 12.2.5.
type TPM2BPublic = TPM2B[TPMTPublic, *TPMTPublic]
// TPM2BTemplate represents a TPM2B_TEMPLATE.
// See definition in Part 2: Structures, section 12.2.6.
type TPM2BTemplate TPM2BData
// TemplateContents is a type constraint representing the possible contents of TPMUTemplate.
type TemplateContents interface {
Marshallable
*TPMTPublic | *TPMTTemplate
}
// TPMTTemplate represents a TPMT_TEMPLATE. It is not defined in the spec.
// It represents the alternate form of TPMT_PUBLIC for TPM2B_TEMPLATE as
// described in Part 2: Structures, 12.2.6.
type TPMTTemplate struct {
marshalByReflection
// “algorithm” associated with this object
Type TPMIAlgPublic
// algorithm used for computing the Name of the object
NameAlg TPMIAlgHash
// attributes that, along with type, determine the manipulations
// of this object
ObjectAttributes TPMAObject
// optional policy for using this key
// The policy is computed using the nameAlg of the object.
AuthPolicy TPM2BDigest
// the algorithm or structure details
Parameters TPMUPublicParms `gotpm:"tag=Type"`
// the derivation parameters
Unique TPMSDerive
}
// New2BTemplate creates a TPM2BTemplate with the given data.
func New2BTemplate[C TemplateContents](data C) TPM2BTemplate {
return TPM2BTemplate{
Buffer: Marshal(data),
}
}
// Sym returns the 'sym' member of the union.
func (u *TPMUSensitiveComposite) Sym() (*TPM2BSymKey, error) {
if u.selector == TPMAlgSymCipher {
return u.contents.(*TPM2BSymKey), nil
}
return nil, fmt.Errorf("did not contain sym (selector value was %v)", u.selector)
}
// Bits returns the 'bits' member of the union.
func (u *TPMUSensitiveComposite) Bits() (*TPM2BSensitiveData, error) {
if u.selector == TPMAlgKeyedHash {
return u.contents.(*TPM2BSensitiveData), nil
}
return nil, fmt.Errorf("did not contain bits (selector value was %v)", u.selector)
}
// RSA returns the 'rsa' member of the union.
func (u *TPMUSensitiveComposite) RSA() (*TPM2BPrivateKeyRSA, error) {
if u.selector == TPMAlgRSA {
return u.contents.(*TPM2BPrivateKeyRSA), nil
}
return nil, fmt.Errorf("did not contain rsa (selector value was %v)", u.selector)
}
// ECC returns the 'ecc' member of the union.
func (u *TPMUSensitiveComposite) ECC() (*TPM2BECCParameter, error) {
if u.selector == TPMAlgECC {
return u.contents.(*TPM2BECCParameter), nil
}
return nil, fmt.Errorf("did not contain ecc (selector value was %v)", u.selector)
}
// TPMUSensitiveComposite represents a TPMU_SENSITIVE_COMPOSITE.
// See definition in Part 2: Structures, section 12.3.2.3.
type TPMUSensitiveComposite struct {
selector TPMAlgID
contents Marshallable
}
// SensitiveCompositeContents is a type constraint representing the possible contents of TPMUSensitiveComposite.
type SensitiveCompositeContents interface {
Marshallable
*TPM2BPrivateKeyRSA | *TPM2BECCParameter | *TPM2BSensitiveData | *TPM2BSymKey
}
// create implements the unmarshallableWithHint interface.
func (u *TPMUSensitiveComposite) create(hint int64) (reflect.Value, error) {
switch TPMAlgID(hint) {
case TPMAlgRSA:
var contents TPM2BPrivateKeyRSA
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgECC:
var contents TPM2BECCParameter
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgKeyedHash:
var contents TPM2BSensitiveData
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
case TPMAlgSymCipher:
var contents TPM2BSymKey
u.contents = &contents
u.selector = TPMAlgID(hint)
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// get implements the marshallableWithHint interface.
func (u TPMUSensitiveComposite) get(hint int64) (reflect.Value, error) {
if u.selector != 0 && hint != int64(u.selector) {
return reflect.ValueOf(nil), fmt.Errorf("incorrect union tag %v, is %v", hint, u.selector)
}
switch TPMAlgID(hint) {
case TPMAlgRSA:
var contents TPM2BPrivateKeyRSA
if u.contents != nil {
contents = *u.contents.(*TPM2BPrivateKeyRSA)
}
return reflect.ValueOf(&contents), nil
case TPMAlgECC:
var contents TPM2BECCParameter
if u.contents != nil {
contents = *u.contents.(*TPM2BECCParameter)
}
return reflect.ValueOf(&contents), nil
case TPMAlgKeyedHash:
var contents TPM2BSensitiveData
if u.contents != nil {
contents = *u.contents.(*TPM2BSensitiveData)
}
return reflect.ValueOf(&contents), nil
case TPMAlgSymCipher:
var contents TPM2BSymKey
if u.contents != nil {
contents = *u.contents.(*TPM2BSymKey)
}
return reflect.ValueOf(&contents), nil
}
return reflect.ValueOf(nil), fmt.Errorf("no union member for tag %v", hint)
}
// NewTPMUSensitiveComposite instantiates a TPMUSensitiveComposite with the given contents.
func NewTPMUSensitiveComposite[C SensitiveCompositeContents](selector TPMAlgID, contents C) TPMUSensitiveComposite {
return TPMUSensitiveComposite{
selector: selector,
contents: contents,
}
}
// RSA returns the 'rsa' member of the union.
func (u *TPMUKDFScheme) RSA() (*TPM2BPrivateKeyRSA, error) {
if u.selector == TPMAlgRSA {
return u.contents.(*TPM2BPrivateKeyRSA), nil
}
return nil, fmt.Errorf("did not contain rsa (selector value was %v)", u.selector)
}
// ECC returns the 'ecc' member of the union.
func (u *TPMUKDFScheme) ECC() (*TPM2BECCParameter, error) {
if u.selector == TPMAlgECC {
return u.contents.(*TPM2BECCParameter), nil
}
return nil, fmt.Errorf("did not contain ecc (selector value was %v)", u.selector)
}
// Bits returns the 'bits' member of the union.
func (u *TPMUKDFScheme) Bits() (*TPM2BSensitiveData, error) {
if u.selector == TPMAlgKeyedHash {
return u.contents.(*TPM2BSensitiveData), nil
}
return nil, fmt.Errorf("did not contain bits (selector value was %v)", u.selector)
}
// Sym returns the 'sym' member of the union.
func (u *TPMUKDFScheme) Sym() (*TPM2BSymKey, error) {
if u.selector == TPMAlgSymCipher {
return u.contents.(*TPM2BSymKey), nil
}
return nil, fmt.Errorf("did not contain sym (selector value was %v)", u.selector)
}
// TPMTSensitive represents a TPMT_SENSITIVE.
// See definition in Part 2: Structures, section 12.3.2.4.
type TPMTSensitive struct {
marshalByReflection
// identifier for the sensitive area
SensitiveType TPMIAlgPublic
// user authorization data
AuthValue TPM2BAuth
// for a parent object, the optional protection seed; for other objects,
// the obfuscation value
SeedValue TPM2BDigest
// the type-specific private data
Sensitive TPMUSensitiveComposite `gotpm:"tag=SensitiveType"`
}
// TPM2BSensitive represents a TPM2B_SENSITIVE.
// See definition in Part 2: Structures, section 12.3.3.
type TPM2BSensitive = TPM2B[TPMTSensitive, *TPMTSensitive]
// TPM2BPrivate represents a TPM2B_PRIVATE.
// See definition in Part 2: Structures, section 12.3.7.
type TPM2BPrivate TPM2BData
// TPMSCreationData represents a TPMS_CREATION_DATA.
// See definition in Part 2: Structures, section 15.1.
type TPMSCreationData struct {
marshalByReflection
// list indicating the PCR included in pcrDigest
PCRSelect TPMLPCRSelection
// digest of the selected PCR using nameAlg of the object for which
// this structure is being created
PCRDigest TPM2BDigest
// the locality at which the object was created
Locality TPMALocality
// nameAlg of the parent
ParentNameAlg TPMAlgID
// Name of the parent at time of creation
ParentName TPM2BName
// Qualified Name of the parent at the time of creation
ParentQualifiedName TPM2BName
// association with additional information added by the key
OutsideInfo TPM2BData
}
// TPM2BIDObject represents a TPM2B_ID_OBJECT.
// See definition in Part 2: Structures, section 12.4.3.
type TPM2BIDObject TPM2BData
// TPMANV represents a TPMA_NV.
// See definition in Part 2: Structures, section 13.4.
type TPMANV struct {
bitfield32
marshalByReflection
// SET (1): The Index data can be written if Platform Authorization is
// provided.
// CLEAR (0): Writing of the Index data cannot be authorized with
// Platform Authorization.
PPWrite bool `gotpm:"bit=0"`
// SET (1): The Index data can be written if Owner Authorization is
// provided.
// CLEAR (0): Writing of the Index data cannot be authorized with Owner
// Authorization.
OwnerWrite bool `gotpm:"bit=1"`
// SET (1): Authorizations to change the Index contents that require
// USER role may be provided with an HMAC session or password.
// CLEAR (0): Authorizations to change the Index contents that require
// USER role may not be provided with an HMAC session or password.
AuthWrite bool `gotpm:"bit=2"`
// SET (1): Authorizations to change the Index contents that require
// USER role may be provided with a policy session.
// CLEAR (0): Authorizations to change the Index contents that require
// USER role may not be provided with a policy session.
PolicyWrite bool `gotpm:"bit=3"`
// The type of the index.
NT TPMNT `gotpm:"bit=7:4"`
// SET (1): Index may not be deleted unless the authPolicy is satisfied
// using TPM2_NV_UndefineSpaceSpecial().
// CLEAR (0): Index may be deleted with proper platform or owner
// authorization using TPM2_NV_UndefineSpace().
PolicyDelete bool `gotpm:"bit=10"`
// SET (1): Index cannot be written.
// CLEAR (0): Index can be written.
WriteLocked bool `gotpm:"bit=11"`
// SET (1): A partial write of the Index data is not allowed. The write
// size shall match the defined space size.
// CLEAR (0): Partial writes are allowed. This setting is required if
// the .dataSize of the Index is larger than NV_MAX_BUFFER_SIZE for the
// implementation.
WriteAll bool `gotpm:"bit=12"`
// SET (1): TPM2_NV_WriteLock() may be used to prevent further writes
// to this location.
// CLEAR (0): TPM2_NV_WriteLock() does not block subsequent writes if
// TPMA_NV_WRITE_STCLEAR is also CLEAR.
WriteDefine bool `gotpm:"bit=13"`
// SET (1): TPM2_NV_WriteLock() may be used to prevent further writes
// to this location until the next TPM Reset or TPM Restart.
// CLEAR (0): TPM2_NV_WriteLock() does not block subsequent writes if
// TPMA_NV_WRITEDEFINE is also CLEAR.
WriteSTClear bool `gotpm:"bit=14"`
// SET (1): If TPM2_NV_GlobalWriteLock() is successful,
// TPMA_NV_WRITELOCKED is set.
// CLEAR (0): TPM2_NV_GlobalWriteLock() has no effect on the writing of
// the data at this Index.
GlobalLock bool `gotpm:"bit=15"`
// SET (1): The Index data can be read if Platform Authorization is
// provided.
// CLEAR (0): Reading of the Index data cannot be authorized with
// Platform Authorization.
PPRead bool `gotpm:"bit=16"`
// SET (1): The Index data can be read if Owner Authorization is
// provided.
// CLEAR (0): Reading of the Index data cannot be authorized with Owner
// Authorization.
OwnerRead bool `gotpm:"bit=17"`
// SET (1): The Index data may be read if the authValue is provided.
// CLEAR (0): Reading of the Index data cannot be authorized with the
// Index authValue.
AuthRead bool `gotpm:"bit=18"`
// SET (1): The Index data may be read if the authPolicy is satisfied.
// CLEAR (0): Reading of the Index data cannot be authorized with the
// Index authPolicy.
PolicyRead bool `gotpm:"bit=19"`
// SET (1): Authorization failures of the Index do not affect the DA
// logic and authorization of the Index is not blocked when the TPM is
// in Lockout mode.
// CLEAR (0): Authorization failures of the Index will increment the
// authorization failure counter and authorizations of this Index are
// not allowed when the TPM is in Lockout mode.
NoDA bool `gotpm:"bit=25"`
// SET (1): NV Index state is only required to be saved when the TPM
// performs an orderly shutdown (TPM2_Shutdown()).
// CLEAR (0): NV Index state is required to be persistent after the
// command to update the Index completes successfully (that is, the NV
// update is synchronous with the update command).
Orderly bool `gotpm:"bit=26"`
// SET (1): TPMA_NV_WRITTEN for the Index is CLEAR by TPM Reset or TPM
// Restart.
// CLEAR (0): TPMA_NV_WRITTEN is not changed by TPM Restart.
ClearSTClear bool `gotpm:"bit=27"`
// SET (1): Reads of the Index are blocked until the next TPM Reset or
// TPM Restart.
// CLEAR (0): Reads of the Index are allowed if proper authorization is
// provided.
ReadLocked bool `gotpm:"bit=28"`
// SET (1): Index has been written.
// CLEAR (0): Index has not been written.
Written bool `gotpm:"bit=29"`
// SET (1): This Index may be undefined with Platform Authorization
// but not with Owner Authorization.
// CLEAR (0): This Index may be undefined using Owner Authorization but
// not with Platform Authorization.
PlatformCreate bool `gotpm:"bit=30"`
// SET (1): TPM2_NV_ReadLock() may be used to SET TPMA_NV_READLOCKED
// for this Index.
// CLEAR (0): TPM2_NV_ReadLock() has no effect on this Index.
ReadSTClear bool `gotpm:"bit=31"`
}
// TPMSNVPublic represents a TPMS_NV_PUBLIC.
// See definition in Part 2: Structures, section 13.5.
type TPMSNVPublic struct {
marshalByReflection
// the handle of the data area
NVIndex TPMIRHNVIndex
// hash algorithm used to compute the name of the Index and used for
// the authPolicy. For an extend index, the hash algorithm used for the
// extend.
NameAlg TPMIAlgHash
// the Index attributes
Attributes TPMANV
// optional access policy for the Index
AuthPolicy TPM2BDigest
// the size of the data area
DataSize uint16
}
// TPM2BNVPublic represents a TPM2B_NV_PUBLIC.
// See definition in Part 2: Structures, section 13.6.
type TPM2BNVPublic = TPM2B[TPMSNVPublic, *TPMSNVPublic]
// TPM2BContextSensitive represents a TPM2B_CONTEXT_SENSITIVE
// See definition in Part 2: Structures, section 14.2.
type TPM2BContextSensitive TPM2BData
// TPMSContextData represents a TPMS_CONTEXT_DATA
// See definition in Part 2: Structures, section 14.3.
type TPMSContextData struct {
marshalByReflection
// the integrity value
Integrity TPM2BDigest
// the sensitive area
Encrypted TPM2BContextSensitive
}
// TPM2BContextData represents a TPM2B_CONTEXT_DATA
// See definition in Part 2: Structures, section 14.4.
// Represented here as a flat buffer because how a TPM chooses
// to represent its context data is implementation-dependent.
type TPM2BContextData TPM2BData
// TPMSContext represents a TPMS_CONTEXT
// See definition in Part 2: Structures, section 14.5.
type TPMSContext struct {
marshalByReflection
// the sequence number of the context
Sequence uint64
// a handle indicating if the context is a session, object, or sequence object
SavedHandle TPMIDHSaved
// the hierarchy of the context
Hierarchy TPMIRHHierarchy
// the context data and integrity HMAC
ContextBlob TPM2BContextData
}
type tpm2bCreationData = TPM2B[TPMSCreationData, *TPMSCreationData]