in linux/tpm_keys.go [119:176]
func (key *tpmKey) FillKeyData(publicBytes, privateBytes, creationData, keyName []byte) error {
var err error
if publicBytes != nil {
key.PublicBytes = publicBytes
key.PublicArea, err = tpm2.DecodePublic(publicBytes)
if err != nil {
return err
}
flog.Debug("Decoded key public area")
}
if privateBytes != nil {
key.PrivateBytes = privateBytes
}
if creationData != nil {
key.CreationData, err = tpm2.DecodeCreationData(creationData)
if err != nil {
return err
}
flog.Debug("Decoded key creation data")
}
if keyName != nil {
key.Name = tpm2.Name{
Digest: &tpm2.HashValue{},
}
byteCount, err := tpmutil.Unpack(keyName, &key.Name.Digest.Alg)
if err != nil {
flog.Warningf("Got error decoding key name, ignoring: %+v", err)
key.Name = tpm2.Name{}
} else {
key.Name.Digest.Value = keyName[byteCount:]
// Validate the key name digest value
hashFunc, err := key.Name.Digest.Alg.Hash()
if err != nil {
flog.Warningf(
"Failed to get key digest algorithm hash constructor, ignoring: %+v",
err,
)
key.Name = tpm2.Name{}
} else {
if hashFunc.Size() != len(key.Name.Digest.Value) {
flog.Warningf(
"Failed to validate key name value: expected digest length %d, got %d; ignoring name",
hashFunc.Size(),
len(key.Name.Digest.Value),
)
key.Name = tpm2.Name{}
}
}
flog.Debug("Key name set")
}
}
return nil
}