Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
swtpm_ioctls(3) 						 swtpm_ioctls(3)

NAME
     swtpm_ioctls - Description of the ioctl's of the CUSE TPM (swtpm_cuse) and
     control commands used by the control channel over socket interface.

SYNOPSIS
     #include <tpm_ioctl.h>

DESCRIPTION
     The CUSE TPM implements an ioctl interface on the CUSE TPM's character de-
     vice.  The ioctl's are used for out-of-band control of various TPM opera-
     tions, such as its initialization, resetting, and state migration. The con-
     trol channel over TCP or UnixIO sockets uses control commands for these op-
     erations.

     The following is an enumeration of the supported ioctl's and control com-
     mands, along with the names of the data structure types. All ioctl's and
     control commands return a TPM error code in their response. Ioctl's are
     prefixed with PTM and control commands are prefixed with CMD.

     In case of the ioctl interface, the pointer to a command's data structure
     is passed as the 2nd parameter to the ioctl() function. The fields in the
     command's data structure are to be fill out in host endianness format.

     In case of control commands, the command code must be encoded as a 4 byte
     integer preceding the command's data structure. Command code and data must
     be written in big endian format.

     PTM_GET_CAPABILITY / CMD_GET_CAPABILITY, ptm_cap
	 This ioctl allows the caller to check which ioctl's are implemented by
	 the CUSE TPM. The following is a list of capability flags that may be
	 set upon return:

	 PTM_CAP_INIT (since v0.1)
	     The PTM_INIT ioctl or CMD_INIT command is supported.

	 PTM_CAP_SHUTDOWN (since v0.1)
	     The PTM_SHUTDOWN ioctl or CMD_SHUTDOWN command is supported.

	 PTM_CAP_GET_TPMESTABLISHED (since v0.1)
	     The PTM_GET_TPMESTABLISHED ioctl or CMD_GET_TPMESTABLISHED command
	     is supported.

	 PTM_CAP_SET_LOCALITY (since v0.1)
	     The PTM_SET_LOCALITY ioctl or CMD_SET_LOCALITY is supported.

	 PTM_CAP_HASHING (since v0.1)
	     The PTM_HASH_START, PTM_HASH_DATA, and PTM_HASH_END ioctl's or
	     CMD_HASH_START, CMD_HASH_DATA, CMD_HASH_END commands are supported.

	 PTM_CAP_CANCEL_TPM_CMD (since v0.1)
	     The PTM_CANCEL_TPM_CMD ioctl or CMD_CANCEL_TPM_CMD command is sup-
	     ported.

	 PTM_CAP_STORE_VOLATILE (since v0.1)
	     The PTM_STORE_VOLATILE ioctl or CMD_STORE_VOLATILE command is sup-
	     ported.

	 PTM_CAP_RESET_TPMESTABLISHED (since v0.1)
	     The PTM_RESET_TPMESTABLISHED ioctl or CMD_RESET_TPMESTABLISHED com-
	     mand is supported.

	 PTM_CAP_GET_STATEBLOB (since v0.1)
	     The PTM_GET_STATEBLOB ioctl or CMD_GET_STATEBLOB command is sup-
	     ported.

	 PTM_CAP_SET_STATEBLOB (since v0.1)
	     The PTM_SET_STATEBLOB ioctl or CMD_SET_STATEBLOB command is sup-
	     ported.

	 PTM_CAP_STOP (since v0.1)
	     The PTM_STOP ioctl or CMD_STOP command is supported.

	 PTM_CAP_GET_CONFIG (since v0.1)
	     The PTM_GET_CONFIG ioctl or CMD_GET_CONFIG command is supported.

	 PTM_CAP_SET_DATAFD (since v0.1)
	     The CMD_SET_DATAFD command is supported. This command only applies
	     to UnixIO and there is no support for PTM_SET_DATAFD.

	 PTM_CAP_SET_BUFFERSIZE (since v0.1)
	     The PTM_SET_BUFFERSIZE ioctl or CMD_SET_BUFFERSIZE command is sup-
	     ported.

	 PTM_CAP_LOCK_STORAGE (since v0.8)
	     The PTM_LOCK_STORAGE ioctl or CMD_LOCK_STORAGE command is sup-
	     ported.

     PTM_GET_CAPABILITY / CMD_GET_CAPABILITY, ptm_cap_n
	 The ptm_cap_n data structure can be used for non-CUSE swtpm and looks
	 as follows:

	  struct ptm_cap_n {
	     union {
		struct {
		    ptm_res tpm_result; /* will always be TPM_SUCCESS (0) */
		    uint32_t caps;
		} resp; /* response */
	     } u;
	  };

     PTM_INIT / CMD_INIT, ptm_init
	 This ioctl must be used to initialize the TPM. It must be sent to the
	 TPM before any TPM command is sent.

	 The ptm_init data structure looks as follows:

	  struct ptm_init {
	     union {
		 struct {
		     uint32_t init_flags; /* see definitions below */
		 } req; /* request */
		 struct {
		     ptm_res tpm_result;
		 } resp; /* response */
	     } u;
	  };

	 The init_flags field in the request can be used to have the TPM delete
	 the volatile state upon startup (PTM_INIT_FLAG_DELETE_VOLATILE).

	 A TPM result code is returned in the tpm_result field.

     PTM_SHUTDOWN / CMD_SHUTDOWN, ptm_res
	 This ioctl allows a user to shut down the TPM.

	 A TPM result code is returned in ptm_res.

     PTM_GET_TPMESTABLISHED / CMD_GET_TPMESTABLISHED, ptm_est
	 This ioctl is used to check whether the TPM established flag is set.

	 The tpm_est data structure looks as follows:

	  struct ptm_est {
	     union {
		 struct {
		     ptm_res tpm_result;
		     unsigned char bit; /* TPM established bit */
		 } resp; /* response */
	     } u;
	  };

	 A TPM result code is returned in the tpm_result field.

	 The status of the TPM establishment flag is returned in the bit field.

     PTM_SET_LOCALITY / CMD_SET_LOCALITY, ptm_loc
	 This ioctl is used to set the current locality. All subsequent commands
	 will be executed in this locality until the locality is changed.

	 The ptm_loc data structure looks as follows:

	  struct ptm_loc {
	     union {
		 struct {
		     uint8_t loc; /* locality to set */
		 } req; /* request */
		 struct {
		     ptm_res tpm_result;
		 } resp; /* response */
	     } u;
	  };

	 The locality number must be set in the request's loc field. Valid lo-
	 calities are in the range of 0 to 4.

	 A TPM result code is returned in the tpm_result field.

     PTM_HASH_START / CMD_HASH_START, ptm_res
	 This ioctl is used to start the hash operation that is typically initi-
	 ated by writing into certain registers of locality 4 of the TPM Inter-
	 face (TPM TIS). Subsequent write operations for transferring data must
	 be done with the PTM_HASH_DATA ioctl.

	 A TPM result code is returned in ptm_res.

     PTM_HASH_DATA / CMD_HASH_DATA, ptm_hdata
	 This command is used to transfer the data for the hash operation.

	 The ptm_hdata structure looks as follows:

	  struct ptm_hdata {
	     union {
		 struct {
		     uint32_t length;
		     uint8_t data[4096];
		 } req; /* request */
		 struct {
		     ptm_res tpm_result;
		 } resp; /* response */
	     } u;
	  };

	 The length of the data is indicated in the length field with the data
	 in the data field. Up to 4096 bytes can be transferred in one call.

	 A TPM result code is returned in the tpm_result field.

     PTM_HASH_END / CMD_HASH_END, ptm_res
	 This command is used to indicate the end of a hash operation that was
	 started with the PTM_HASH_START ioctl.

	 A TPM result code is returned in ptm_res.

     PTM_CANCEL_CMD / CMD_CANCEL_CMD, ptm_res
	 This command is used to cancel a TPM command.

	 A TPM result code is returned in ptm_res.

     PTM_STORE_VOLATILE / CMD_STORE_VOLATILE, ptm_res
	 This command is used to trigger the TPM to store the volatile state
	 into a file.

	 A TPM result code is returned in ptm_res.

     PTM_RESET_ESTABLISHED / CMD_RESET_ESTABLISHED, ptm_reset_est
	 This command is used to reset the TPM's establishment flag.

	 The ptm_reset_est data structure looks as follows:

	  struct ptm_reset_est {
	     union {
		 struct {
		     uint8_t loc; /* locality to use */
		 } req; /* request */
		 struct {
		     ptm_res tpm_result;
		 } resp; /* response */
	     } u;
	  };

	 The locality in which the establishment flag is to be reset must be set
	 in the loc field. Valid localities are in the range of 0 to 4.

	 A TPM result code is returned in the tpm_result field.

     PTM_GET_STATEBLOB /  CMD_GET_STATEBLOB, ptm_getstate
	 This command is used to initiate the retrieval of one of the TPM's
	 stateblobs.

	 The ptm_getstate data structure looks as follows:

	  struct ptm_getstate {
	     union {
		 struct {
		     uint32_t state_flags; /* may be: PTM_STATE_FLAG_DECRYPTED */
		     uint32_t type;	   /* which blob to pull */
		     uint32_t offset;	   /* offset from where to read */
		 } req; /* request */
		 struct {
		     ptm_res tpm_result;
		     uint32_t state_flags; /* may be: PTM_STATE_FLAG_ENCRYPTED */
		     uint32_t totlength;   /* total length that will be transferred */
		     uint32_t length;	   /* number of bytes in following buffer */
		     uint8_t  data[PTM_STATE_BLOB_SIZE];
		 } resp; /* response */
	     } u;
	  };

	 In the request the state_flags field allows a user to set the
	 PTM_STATE_FLAG_DECRYPT flag to retrieve decrypted TPM state in case the
	 TPM's state was written in encrypted form.

	 The type field allows a user to choose one of the TPM's state blobs,
	 and must be one of PTM_BLOB_TYPE_PERMANENT, PTM_BLOB_TYPE_VOLATILE, and
	 PTM_BLOB_TYPE_SAVESTATE.

	 The offset field indicates at what offset to read the data from. Subse-
	 quent state transfers must advance the offset field to the next byte to
	 be read.  If the read() interface is used the offset will be advanced
	 automatically.

	 The response returns a TPM error code in the tpm_result field.

	 The state_flags field in the response indicates whether the returned
	 blob is encrypted.

	 The totlength field indicates the total length of the state blob.

	 The length field indicates the number of valid bytes in the data field.

	 If necessary, subsequent state blob transfers must be done using this
	 ioctl or using the read() call on the file descriptor. All state must
	 be transferred before the TPM will accept commands again.

     PTM_SET_STATEBLOB / CMD_SET_STATEBLOB, ptm_setstate
	 This command is used to transfer one of the TPM's stateblob to the TPM.

	 The ptm_setstate data structure looks as follows:

	  struct ptm_setstate {
	     union {
		 struct {
		     uint32_t state_flags; /* may be PTM_STATE_FLAG_ENCRYPTED */
		     uint32_t type;	   /* which blob to set */
		     uint32_t length;	   /* length of the data;
					      use 0 on the first packet to
					      transfer using write() */
		     uint8_t data[PTM_STATE_BLOB_SIZE];
		 } req; /* request */
		 struct {
		     ptm_res tpm_result;
		 } resp; /* response */
	     } u;
	  };

	 The state_flags field indicates whether the provided state is en-
	 crypted.  In case it is encrypted, a migration key must have been pro-
	 vided to the TPM for it to be able to decrypt the state.

	 The type field indicates which one of the TPM's state blobs is being
	 set.  It must be either one of PTM_BLOB_TYPE_PERMANENT,
	 PTM_BLOB_TYPE_VOLATILE, and PTM_BLOB_TYPE_SAVESTATE.

	 The length field indicates the number of bytes of state blob data in
	 the data field. To transfer the state blob using the write() call, set
	 the length to 0.

	 The response returns a TPM error code in the tpm_result field.

     PTM_STOP / CMD_STOP, ptm_res
	 This command is used to stop the TPM. In contrast to a TPM shut down,
	 the stopping of the TPM only halts its operations without terminating
	 the TPM process. The TPM can restart operation with the PTM_INIT ioctl.

	 A TPM result code is returned in ptm_res.

     PTM_GET_CONFIG / CMD_GET_CONFIG, ptm_getconfig
	 This command is used to retrieve the TPM's current configuration.

	 The ptm_getconfig data structure looks as follows:

	  struct ptm_getconfig {
	     union {
		 struct {
		     ptm_res tpm_result;
		     uint32_t flags;
		 } resp; /* response */
	     } u;
	  };

	 A TPM result code is returned in the tpm_result field.

	 The flags field holds individual flags that indicate whether a file en-
	 cryption key is used (PTM_CONFIG_FLAG_FILE_KEY) and whether a migration
	 key is used (PTM_CONFIG_FLAG_MIGRATION_KEY).

     CMD_SET_DATAFD, ptm_res
	 This command is only implemented for the control channel over UnixIO
	 socket.  It is used to establish the TPM command channel by transfer-
	 ring a socket file descriptor using the UnixIO socket's control channel
	 and SCM_RIGHTS.  See also sendmsg(2) and cmsg(3).

	 A TPM result code is returned in ptm_res.

     CMD_SET_BUFFERSIZE, ptm_setbuffersize
	 This command allows a user to set and query for the buffer size that
	 the TPM is using for input and output I/O buffers.

	 The ptm_setbuffersize data structure looks as follows:

	  struct ptm_setbuffersize {
	     union {
		 struct {
		     uint32_t buffersize; /* 0 to query for current buffer size */
		 } req; /* request */
		 struct {
		     ptm_res tpm_result;
		     uint32_t buffersize; /* buffer size in use */
		     uint32_t minsize; /* min. supported buffer size */
		     uint32_t maxsize; /* max. supported buffer size */
		 } resp; /* response */
	     } u;
	  };

	 If a 0 is set in the buffer size of the request, the response will re-
	 turn the buffer size that is currently in use. Any other number will
	 try to change the buffer size, but the TPM may adjust it to an allowed
	 minimum or maximum. The minimum and maximum supported buffer sizes are
	 returned in the response.

	 The buffersize can only be changed when the TPM is stopped. The cur-
	 rently used buffersize can be read at any time.

     CMD_LOCK_STORAGE, ptm_lockstorage
	 Lock the storage and retry a given number of times with 10ms delay in
	 between.  Locking the storage may be necessary to do after the state of
	 the TPM has been migrated out and the lock on the storage has been re-
	 leased when the 'savestate' blob was received and now the storage
	 should be locked again.

	 The ptm_lockstorage data structure looks as follows:

	  struct ptm_lockstorage {
	      union {
		  struct {
		      uint32_t retries; /* number of retries */
		  } req; /* request */
		  struct {
		      ptm_res tpm_result;
		  } resp; /* response */
	      } u;
	  };

	 A TPM result code is returned in the tpm_result field.

SEE ALSO
     swtpm_ioctl(8), swtpm_cuse(8)

swtpm				   2025-04-30			 swtpm_ioctls(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=swtpm_ioctls&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help