diff options
Diffstat (limited to 'usr/src/man/man7d/ccid.7d')
-rw-r--r-- | usr/src/man/man7d/ccid.7d | 558 |
1 files changed, 0 insertions, 558 deletions
diff --git a/usr/src/man/man7d/ccid.7d b/usr/src/man/man7d/ccid.7d deleted file mode 100644 index f5158b0d0d..0000000000 --- a/usr/src/man/man7d/ccid.7d +++ /dev/null @@ -1,558 +0,0 @@ -.\" -.\" This file and its contents are supplied under the terms of the -.\" Common Development and Distribution License ("CDDL"), version 1.0. -.\" You may only use this file in accordance with the terms of version -.\" 1.0 of the CDDL. -.\" -.\" A full copy of the text of the CDDL should have accompanied this -.\" source. A copy of the CDDL is also available via the Internet at -.\" http://www.illumos.org/license/CDDL. -.\" -.\" -.\" Copyright 2019 Joyent, Inc. -.\" -.Dd December 20, 2019 -.Dt CCID 7D -.Os -.Sh NAME -.Nm ccid -.Nd chip card interface device USB client class driver -.Sh SYNOPSIS -.In sys/usb/clients/ccid/uccid.h -.Sh INTERFACE LEVEL -.Sy Volatile -.Pp -The interfaces provided by this driver are private at this time and -subject to change. -It should not be relied upon. -.Sh DESCRIPTION -The -.Nm -driver is a USB CCID (chip card interface device) class device driver. -.Pp -The driver exposes interfaces that allow consumers to send and receive -APDUs (application protocol data unit) to a given smart card that is -plugged into a reader. -The driver also provides interfaces to obtain status information, the -ATR (answer to reset), and obtain exclusive access to the device. -In addition, the system exposes control of CCID devices through -.Xr cfgadm 1M . -.Ss Supported Devices -The CCID specification allows for readers to come in different flavors. -These different flavors support different communication protocols and -have different levels of automation for determining the protocol and -transfers that are required. -.Pp -At this time, only the short APDU protocol is supported, which also works with -readers using the extended APDU protocol. -TPDU and character level readers are not supported by the driver. -Readers in this category will still attach; however, -I/O cannot be performed to them. -.Pp -In addition, at this time the driver does not support devices which -require manually setting the clock and data rates to support an ICC. -.Ss Device Model -Each CCID class device provides a number of slots. -Each slot may have an independent ICC (integrated circuit card or Smart -Card) inserted into it. -Each device, or reader, has its own directory under -.Pa /dev/ccid -based on its device number. -Inside of each directory is a character device for each slot. -A slot exists regardless of whether or not an ICC is inserted into it. -As long as a CCID device is present in the system, its device nodes will -be present. -.Pp -Slots are enumerated using this pattern: -.Pa /dev/ccid/ccid%instance/slot%slot . -.Pp -For example, all the slots that belong to CCID instance 5 will be -enumerated under the directory -.Pa /dev/ccid/ccid5 . -Slots are numbered starting at zero for each reader and increment from -there. -For example, the second physical slot would be numbered as slot one. -If this were on CCID instance zero, then we would find a character -device at: -.Pa /dev/ccid/ccid0/slot1 . -.Pp -To enumerate all of the ccid devices present on the system, one could -read all of the directories under -.Pa /dev/ccid . -To enumerate all of the slots on a device, one could read all of the -device nodes under a particular CCID device, such as: -.Pa /dev/ccid/ccid0 . -The number of slots is also obtainable through various ioctls that will -be discussed later on. -It's important to note that while slot numbering will always be -consistent for a given device, the CCID numbering is based on the driver -instance. -Therefore, it is possible for a device to change device numbers. -To deal with this, symlinks based on other properties will be provided -(for example, the USB serial number). -.Pp -All of the CCID devices in the system can also be listed by using the -.Xr ccidadm 1M -command. -.Ss I/O Model -To send and receive responses to commands, a program must open up the -corresponding slot's device node. -In many of the commands that use an ICC, there is a logical notion of -state associated with the ICC that is mutated by performing commands on -it. -For example, a command might be issued that uses a PIN to unlock a slot -or that selects a particular PIV applet for use. -Because of this, all I/O to a given device must be performed inside the -context of a transaction. -When a program begins a transaction, it is guaranteed that no one else -may send commands to the ICC. -When a program is finished, it must explicitly end the transaction, -which may have the side effect of resetting the ICC. -If a program with an open transaction crashes or closes the file -descriptor without taking other actions, then the transaction will be -automatically closed and the ICC will be reset. -Without a transaction open, it will still be possible to issue ioctls -that obtain the status of the slot and the reader. -.Pp -While in an active transaction, a program may send commands to a card. -Sending a command and reading a response are done through the -traditional -.Xr read 2 -and -.Xr write 2 -family of system calls. -To submit a command, the program would issue a -.Xr write 2 -family system call that contained the payload to send to the ICC. -Once submitted, the call would return and the program would be able to -issue a -.Xr read 2 -system call to obtain the results. -Once a command has been submitted, it is illegal to submit another one. -The next command cannot be submitted until the response has been fully -consumed. -Similarly, if a command has not been submitted, one cannot issue a -.Xr read 2 -system call to obtain results. -Only a single thread may be blocked waiting to submit a command or -read a response. -.Pp -To facilitate non-blocking operation, the underlying file descriptor may -be opened with -.Dv O_NONBLOCK . -.Pp -While a transaction is active, -.Xr poll 2 -may be used to receive status information about the slot. -The following events are used by -.Nm : -.Bl -tag -width POLLRDNORM -.It Dv POLLOUT -The device is ready to receive a command using -.Xr write 2 . -.It Dv POLLIN, POLLRDNORM -The device has completed a command the results may be retrieved with -.Xr read 2 . -.It Dv POLLHUP -The card has been removed from the slot. -.It Dv POLLERR -An hardware error has occurred, or the CCID reader has been disconnected. -.El -.Pp -One important note is that readers with multiple slots often still only -allow I/O a single command to be outstanding across all of the slots in -the system. -Because transactions are on a per-slot basis, it is still possible for a -command submission to block even though one has a transaction open. -.Pp -While a transaction is open, various events can occur that cause a fatal -error on the transaction. -These include: -.Bl -bullet -offset indent -.It -USB CCID reader removed -.It -ICC removed -.It -A fatal error while communicating to the device -.It -An administrator issued an ioctl to power off or reset the ICC -.El -.Pp -Once such a fatal error has occurred, all new I/O will fail though it -will still be possible to read any successfully completed commands. -To clear the error state the program will need to end the transaction -and begin a new one or close the file descriptor if the device has been -removed. -.Ss Opening Devices, Exclusive Access, and Performing I/O -To perform I/O to a particular card, one must first open the slot of -interest. -Opening the slot requires that the process be in the global zone and -that it have the privilege -.Sy PRIV_SYS_DEVICES . -The device node can be opened through the -.Xr open 2 -or -.Xr openat 2 -system calls. -For programs that just want to query the slot status using the -.Dv UCCID_CMD_STATUS -command, opening the device node read-only is sufficient. -All other uses require that the device be opened both for reading and -writing -.Po Dv O_RDWR Pc . -.Pp -Once the device has been opened, the program may issue ioctls to get -status information. -.Pp -To perform general I/O to the card, a program must be in the context of -a transaction as discussed in the -.Sx I/O Model -section. -To open a transaction, a program must issue the -.Dv UCCID_CMD_TXN_BEGIN -command through the -.Xr ioctl 2 -system call. -.Pp -When a program is done, it must issue the -.Dv UCCID_CMD_TXN_END -command to release the transaction. -As part of issuing the command, the program must determine a disposition -of what it would like done with the card when it has completed. -These options include leaving the ICC alone and resetting the ICC. -For many use cases, such as those where a pin is entered or the ICC's -state is mutated, a reset is the recommended option. -If the program crashes or closes the file descriptor without issuing a -transaction end, then the ICC will be reset. -.Pp -Please see the ioctl listing in the -.Sx IOCTLS -section for more information on the command structure. -.Pp -If a multi-threaded application opens a slot once and shares it among multiple -threads performing I/O to that slot, there can still only be one transaction -active or waiting on the slot shared by all threads. -Acquiring another transaction on the same slot minor while another thread is -already blocked waiting for one will return -.Dv EINPROGRESS . -If another transaction is already active, -.Dv EINVAL -will be returned. -Consequently, all threads in a multi-threaded application share the transaction -state and may issue writes, and read the results. -The same applies to any other method of sharing an open file descriptor of a slot -minor, be it by sharing the fd over a socket, a child process inheriting it from -its parent during -.Xr fork 2 , -even across calls to -.Xr exec 2 . -.Ss Device Status and ATR -Once a slot has been opened, any caller may issue commands to get the -status of the slot. -This can also be used to obtain the ATR (answer to reset) of an ICC that -is present on the slot, if it is known. -.Pp -While exclusive access is not required to issue these commands, there is -no guarantee that they will not have changed between the time that the -program issued the command and it obtains a transaction. -.Pp -To obtain information about the reader, slot, and the ATR, one should -issue the -.Dv UCCID_CMD_STATUS -command. -Please see the ioctl listing in the -.Sx IOCTLS -section for more information. -.Sh IOCTLS -This section lists the different commands that may be issued to a CCID -device through the -.Xr ioctl 2 -system call. -.Ss Ic UCCID_CMD_STATUS -This command is used to obtain the status of the slot. -It may be used regardless of whether or not the caller has exclusive access. -.Pp -The -.Ic UCCID_CMD_STATUS -command uses the structure -.Vt uccid_cmd_status_t , -the fields of which have the following meanings: -.Bl -tag -width Fa -.It Fa uint32_t ucs_version -Indicates the current version of the structure. -This should be set to -.Dv UCCID_CURRENT_VERSION . -.It Fa uint32_t ucs_status -This value is ignored when issuing the command. -On return, it will be filled in with various flags that describe the -current status of the slot and the contents returned in the -.Vt uccid_cmd_status_t . -The following flags are defined: -.Bl -tag -width Dv -.It Dv UCCID_STATUS_F_CARD_PRESENT -A card has been inserted into the slot of the CCID class device. -.It Dv UCCID_STATUS_F_CARD_ACTIVE -The inserted card has been successfully activated. -This will only be set if the -.Dv UCCID_STATUS_F_CARD_PRESENT -flag is also set. -.It Dv UCCID_STATUS_F_PRODUCT_VALID -The contents of -.Fa ucs_product -are valid. -.It Dv UCCID_STATUS_F_SERIAL_VALID -The contents of -.Fa ucs_serial -are valid. -.It Dv UCCID_STATUS_F_PARAMS_VALID -The parameters returned in -.Fa ucs_params -are valid. -.El -.It Fa int32_t ucs_instance -The instance number of the CCID device. -.It Fa uint32_t ucs_slot -The slot number currently in use. -.It Fa uint8_t ucs_atr[UCCID_ATR_MAX] -The ATR (answer to reset) of the card. -.It Fa uint8_t ucs_atrlen -The actual length of the ATR data. -A length of 0 indicates that there is no ATR data. -.It Fa int8_t ucs_product[256] -The product string of the CCID device. -.It Fa int8_t ucs_serial[256] -The serial number of the CCID device. -.It Fa ccid_class_descr_t ucs_class -The CCID class descriptor of the CCID device. -.It Fa uccid_prot_t ucs_prot -The protocol in use by the ICC. -This can be either -.Dv UCCID_PROT_T0 -for the TPDU T=0 protocol or -.Dv UCCID_PROT_T1 -for the TPDU T=1 protocol. -.It Fa ccid_params_t ucs_params -The CCID parameters available on the card. -.El -.Ss Ic UCCID_CMD_TXN_BEGIN -This command is used to begin a transaction. -The command will block until exclusive access is available to the -caller. -If the caller does not wish to block, it should set the -.Dv UCCID_TXN_DONT_BLOCK -flag. -.Pp -The command uses the structure -.Vt uccid_cmd_txn_begin_t -with the following members: -.Bl -tag -width Fa -.It Fa uint32_t ucs_version -Indicates the current version of the structure. -This should be set to -.Dv UCCID_CURRENT_VERSION . -.It Fa uint32_t uct_flags -Flags that impact the behavior of the command. -The following flags are defined: -.Bl -tag -width Dv -.It Dv UCCID_TXN_DONT_BLOCK -The command should not block for exclusive access. -If exclusive access is not available, then the command will fail -immediately. -.El -.Pp -If an unknown flag is specified, an error will be returned. -.El -.Ss Ic UCCID_CMD_TXN_END -The -.Dv UCCID_CMD_TXN_END -command is used to end a transaction and relinquish exclusive access -to the ICC. -.Pp -The command uses the structure -.Vt uccid_cmd_txn_end_t -with the following members: -.Bl -tag -width Fa -.It Fa uint32_t uct_version -Indicates the current version of the structure. -This should be set to -.Dv UCCID_CURRENT_VERSION . -.It Fa uint32_t uct_flags -.Bl -tag -width Dv -.It Dv UCCID_TXN_END_RESET -The ICC should be reset at the end of the transaction. -.It Dv UCCID_TXN_END_RELEASE -The ICC should be released without being reset at the end of the -transaction. -.El -.Pp -Exactly one of these two flags must be specified. -It is an error if neither flag or both flags are specified at the same -time. -If the device is closed without ending a transaction first, then the ICC -will be reset. -.El -.Ss Ic UCCID_CMD_ICC_MODIFY -This command can be used to change the state of an ICC, if present. -.Pp -The command uses the structure -.Vt uccid_cmd_icc_modify_t -with the following members: -.Bl -tag -width Fa -.It Fa uint32_t uci_version -Indicates the current version of the structure. -This should be set to -.Dv UCCID_CURRENT_VERSION . -.It Fa uint32_t uci_action -The action to be taken on the ICC. -The following actions are defined: -.Bl -tag -width Dv -.It Dv UCCID_ICC_POWER_ON -Power on the ICC. -.It Dv UCCID_ICC_POWER_OFF -Power off the ICC. -.It Dv UCCID_ICC_WARM_RESET -Perform a warm reset of the ICC. -.El -.El -.Ss Ic FIONREAD -This command returns the size in bytes of a command response available -for reading with -.Xr read 2 . -The size is returned in an -.Vt int -pointed to by the argument. -.Sh SYSTEM CALLS -This section lists the different system calls that may be issued to a -CCID device. -.Ss Xr open 2 -.Nm -slot device nodes can be opened using -.Xr open 2 . -Non-blocking operation can be selected by using the -.Dv O_NONBLOCK -flag when opening the device node. -A device node opened for read-only operations will not allow creating -transactions or doing I/O, but it will allow the ICC/reader status to -be queried. -.Ss Xr close 2 -When no longer needed by a program, a device node can be closed with -.Xr close 2 . -If a transaction is still active when a device node is closed, the transaction -will be ended automatically and the ICC will be reset. -Any unread data is discarded. -.Ss Xr ioctl 2 -The -.Xr ioctl 2 -system call can be used to start or end a transaction, query the reply size for -.Xr read 2 , -query the ICC and CCID reader status, or change the state of an ICC in a reader. -See section -.Sx IOCTLS -for details. -.Ss Xr write 2 -Within an active transaction the -.Xr write 2 -system call can be used to transfer an APDU (application protocol data unit) to -an ICC, one single complete APDU at a time. -Partial writes or writing more than one APDU at a time are not supported. -The data returned by the ICC must be consumed by a subsequent -.Xr read 2 -call before -.Xr write 2 -can be called again within the same transaction. -.Pp -The following errors for -.Xr write 2 -have specific meaning in -.Nm : -.Bl -tag -width Dv -.It Dv E2BIG -The number of bytes to write is larger than the maximum APDU length supported by -.Nm , -currently defined as 261 bytes. -.It Dv EACCES -The device is opened read-only, or no transaction is active. -.It Dv EBUSY -There is unread data from a previous call to -.Xr write 2 . -.It Dv ENOTSUP -The reader and/or ICC is unsupported for I/O. -.It Dv ENXIO -The ICC is inactive and can't be used for I/O. -.It Dv ENODEV -The CCID reader has been disconnected. -.El -.Ss Xr read 2 -Within an active transaction the -.Xr read 2 -system call is used to read the reply from an ICC following sending an APDU with -.Xr write 2 . -The whole reply needs to be read with a single call to -.Xr read 2 . -The size of the reply can be queried before reading by issuing the -.Dv FIONREAD -ioctl. -See section -.Sx IOCTLS -for details. -.Pp -The following errors for -.Xr read 2 -have specific meaning in -.Nm : -.Bl -tag -width Dv -.It Dv EACCES -No transaction is active. -.It Dv EBUSY -Another thread is already blocked in -.Xr read 2 -waiting for data. -.It Dv EOVERFLOW -The buffer size is too small to fit the reply. -.It Dv ENODATA -No -.Xr write 2 -was issued before and consequently there is no reply to be read. -.It Dv ENODEV -The CCID reader has been disconnected. -.El -.Ss Xr poll 2 -Within an active transaction the -.Xr poll 2 -system call is used to wait for status changes on a device node. -See section -.Sx I/O model -for details. -.Pp -The following errors for -.Xr poll 2 -have specific meaning in -.Nm : -.Bl -tag -width Dv -.It Dv EACCES -No transaction is active. -.It Dv ENODEV -The CCID reader has been disconnected. -.El -.Sh SEE ALSO -.Xr ccidadm 1M , -.Xr cfgadm 1M , -.Xr close 2 , -.Xr ioctl 2 , -.Xr open 2 , -.Xr poll 2 , -.Xr read 2 , -.Xr write 2 -.Rs -.%T Universal Serial Bus Device Class: Smart Card CCID -.%O Revision 1.1 -.%D April 22, 2005 -.Re -.Rs -.%Q ISO/IEC -.%B Identification Cards - Integrated Circuits -.%N Part 3: Cards with contacts — Electrical interface and transmission protocols -.%O ISO/IEC 7616-3:2006 -.%D 2006 -.Re |