google / go-tpm

Apache License 2.0
562 stars 161 forks source link

Allow callers to omit handles from commands when RH_NULL #344

Closed chrisfenner closed 1 year ago

chrisfenner commented 1 year ago

I observed that the both the following will fail:

tpm2StartAuthSession{
  SessionType: tpm2.TPMSETrial,
  AuthHash:    tpm2.TPMAlgSHA256,
  NonceCaller: tpm2.TPM2BNonce{
      Buffer: make([]byte, 16),
  },
}.Execute(tpm)
tpm2.CreateLoaded{
  InPublic: someTemplate,
}.Execute(tpm)

with a message like

'handle'-tagged member of 'tpm2.StartAuthSession' was of type 'tpm2.handle', which does not satisfy handle

because their handle tagged values of type tpm2.handle, while marked nullable, were failing type assertions to handle during the reflection based marshalling.

Investigating this led me to learn that type assertions on nil-valued interface-typed variables (such as handle-typed TPM command struct fields) will fail due to the design of the language.

To improve the usability of go-tpm and allow callers to leave out handles in commands when NULL is desired, this change adds logic to treat any nil-valued interface-typed command variable (when annotated with gotpm:handle) as TPM_RH_NULL. This allows us to remove the nullable annotation from those fields, which makes sense. It's an interface, the user can always (try to) pass nil, and this should always mean TPM_RH_NULL.