func()

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
}