| =head1 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. |
| |
| =head1 SYNOPSYS |
| |
| B<#include E<lt>tpm_ioctl.hE<gt>> |
| |
| =head1 DESCRIPTION |
| |
| The CUSE TPM implements an ioctl interface on the CUSE TPM's character device. |
| The ioctl's are used for out-of-band control of various TPM operations, |
| such as its initialization, resetting, and state migration. The control channel |
| over TCP or UnixIO sockets uses control commands for these operations. |
| |
| The following is an enumeration of the supported ioctl's and control commands, |
| 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 |
| I<PTM> and control commands are prefixed with I<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. |
| |
| =over 4 |
| |
| =item B<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: |
| |
| =over 4 |
| |
| =item B<PTM_CAP_INIT (since v0.1)> |
| |
| The PTM_INIT ioctl or CMD_INIT command is supported. |
| |
| =item B<PTM_CAP_SHUTDOWN (since v0.1)> |
| |
| The PTM_SHUTDOWN ioctl or CMD_SHUTDOWN command is supported. |
| |
| =item B<PTM_CAP_GET_TPMESTABLISHED (since v0.1)> |
| |
| The PTM_GET_TPMESTABLISHED ioctl or CMD_GET_TPMESTABLISHED command is supported. |
| |
| =item B<PTM_CAP_SET_LOCALITY (since v0.1)> |
| |
| The PTM_SET_LOCALITY ioctl or CMD_SET_LOCALITY is supported. |
| |
| =item B<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. |
| |
| =item B<PTM_CAP_CANCEL_TPM_CMD (since v0.1)> |
| |
| The PTM_CANCEL_TPM_CMD ioctl or CMD_CANCEL_TPM_CMD command is supported. |
| |
| =item B<PTM_CAP_STORE_VOLATILE (since v0.1)> |
| |
| The PTM_STORE_VOLATILE ioctl or CMD_STORE_VOLATILE command is supported. |
| |
| =item B<PTM_CAP_RESET_TPMESTABLISHED (since v0.1)> |
| |
| The PTM_RESET_TPMESTABLISHED ioctl or CMD_RESET_TPMESTABLISHED command is supported. |
| |
| =item B<PTM_CAP_GET_STATEBLOB (since v0.1)> |
| |
| The PTM_GET_STATEBLOB ioctl or CMD_GET_STATEBLOB command is supported. |
| |
| =item B<PTM_CAP_SET_STATEBLOB (since v0.1)> |
| |
| The PTM_SET_STATEBLOB ioctl or CMD_SET_STATEBLOB command is supported. |
| |
| =item B<PTM_CAP_STOP (since v0.1)> |
| |
| The PTM_STOP ioctl or CMD_STOP command is supported. |
| |
| =item B<PTM_CAP_GET_CONFIG (since v0.1)> |
| |
| The PTM_GET_CONFIG ioctl or CMD_GET_CONFIG command is supported. |
| |
| =item B<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. |
| |
| =item B<PTM_SET_BUFFERSIZE (since v0.1)> |
| |
| The PTM_SET_BUFFERSIZE ioctl or CMD_SET_BUFFERSIZE command is supported. |
| |
| =back |
| |
| =item B<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 (B<PTM_INIT_FLAG_DELETE_VOLATILE>). |
| |
| A TPM result code is returned in the tpm_result field. |
| |
| =item B<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. |
| |
| =item B<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. |
| |
| =item B<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 |
| localities are in the range of 0 to 4. |
| |
| A TPM result code is returned in the tpm_result field. |
| |
| =item B<PTM_HASH_START / CMD_HASH_START, ptm_res> |
| |
| This ioctl is used to start the hash operation that is typically |
| initiated by writing into certain registers of locality 4 of the |
| TPM Interface (TPM TIS). Subsequent write operations for transferring |
| data must be done with the B<PTM_HASH_DATA> ioctl. |
| |
| A TPM result code is returned in ptm_res. |
| |
| =item B<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. |
| |
| =item B<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 B<PTM_HASH_START> ioctl. |
| |
| A TPM result code is returned in ptm_res. |
| |
| =item B<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. |
| |
| =item B<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. |
| |
| =item B<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. |
| |
| =item B<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 |
| B<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 B<PTM_BLOB_TYPE_PERMANENT>, B<PTM_BLOB_TYPE_VOLATILE>, and |
| B<PTM_BLOB_TYPE_SAVESTATE>. |
| |
| The offset field indicates at what offset to read the data from. Subsequent |
| 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. |
| |
| =item B<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 encrypted. |
| In case it is encrypted, a migration key must have been provided 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 B<PTM_BLOB_TYPE_PERMANENT>, |
| B<PTM_BLOB_TYPE_VOLATILE>, and B<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. |
| |
| =item B<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 B<PTM_INIT> |
| ioctl. |
| |
| A TPM result code is returned in ptm_res. |
| |
| =item B<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 |
| encryption key is used (B<PTM_CONFIG_FLAG_FILE_KEY>) |
| and whether a migration key is used |
| (B<PTM_CONFIG_FLAG_MIGRATION_KEY>). |
| |
| =item B<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 transferring a socket file |
| descriptor using the UnixIO socket's control channel and I<SCM_RIGHTS>. |
| See also B<sendmsg(2)> and B<cmsg(3)>. |
| |
| A TPM result code is returned in ptm_res. |
| |
| =item B<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 |
| return 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 |
| currently used buffersize can be read at any time. |
| |
| =back |
| |
| =head1 SEE ALSO |
| |
| B<swtpm_ioctl(8)>, B<swtpm_cuse(8)> |