1a61ed2ceSHans Rosenfeld /*
2a61ed2ceSHans Rosenfeld  * This file and its contents are supplied under the terms of the
3a61ed2ceSHans Rosenfeld  * Common Development and Distribution License ("CDDL"), version 1.0.
4a61ed2ceSHans Rosenfeld  * You may only use this file in accordance with the terms of version
5a61ed2ceSHans Rosenfeld  * 1.0 of the CDDL.
6a61ed2ceSHans Rosenfeld  *
7a61ed2ceSHans Rosenfeld  * A full copy of the text of the CDDL should have accompanied this
8a61ed2ceSHans Rosenfeld  * source.  A copy of the CDDL is also available via the Internet at
9a61ed2ceSHans Rosenfeld  * http://www.illumos.org/license/CDDL.
10a61ed2ceSHans Rosenfeld  */
11a61ed2ceSHans Rosenfeld 
12a61ed2ceSHans Rosenfeld /*
13a61ed2ceSHans Rosenfeld  * Copyright 2019, Joyent, Inc.
14a61ed2ceSHans Rosenfeld  */
15a61ed2ceSHans Rosenfeld 
16a61ed2ceSHans Rosenfeld #ifndef _SYS_USB_UCCID_H
17a61ed2ceSHans Rosenfeld #define	_SYS_USB_UCCID_H
18a61ed2ceSHans Rosenfeld 
19a61ed2ceSHans Rosenfeld /*
20a61ed2ceSHans Rosenfeld  * Definitions for the userland CCID interface.
21a61ed2ceSHans Rosenfeld  */
22a61ed2ceSHans Rosenfeld 
23a61ed2ceSHans Rosenfeld #include <sys/types.h>
24a61ed2ceSHans Rosenfeld #include <sys/usb/clients/ccid/ccid.h>
25a61ed2ceSHans Rosenfeld 
26a61ed2ceSHans Rosenfeld #ifdef __cplusplus
27a61ed2ceSHans Rosenfeld extern "C" {
28a61ed2ceSHans Rosenfeld #endif
29a61ed2ceSHans Rosenfeld 
30a61ed2ceSHans Rosenfeld /*
31a61ed2ceSHans Rosenfeld  * The maximum size of a normal APDU. This is the upper bound of what a user can
32a61ed2ceSHans Rosenfeld  * read or write to a given card.
33a61ed2ceSHans Rosenfeld  */
34a61ed2ceSHans Rosenfeld #define	UCCID_APDU_SIZE_MAX	261
35a61ed2ceSHans Rosenfeld 
36a61ed2ceSHans Rosenfeld /*
37a61ed2ceSHans Rosenfeld  * This is the maximum length of an ATR as per ISO/IEC 7816-3:2006.
38a61ed2ceSHans Rosenfeld  */
39a61ed2ceSHans Rosenfeld #define	UCCID_ATR_MAX		33
40a61ed2ceSHans Rosenfeld 
41a61ed2ceSHans Rosenfeld 
42a61ed2ceSHans Rosenfeld #define	UCCID_IOCTL	(('u' << 24) | ('c' << 16) | ('d') << 8)
43a61ed2ceSHans Rosenfeld 
44a61ed2ceSHans Rosenfeld #define	UCCID_VERSION_ONE	1
45a61ed2ceSHans Rosenfeld #define	UCCID_CURRENT_VERSION	UCCID_VERSION_ONE
46a61ed2ceSHans Rosenfeld 
47a61ed2ceSHans Rosenfeld /*
48a61ed2ceSHans Rosenfeld  * Attempt to obtain exclusive access. If the UCN_TXN_DONT_BLOCK flag is
49a61ed2ceSHans Rosenfeld  * specified, the ioctl will return immediately if exclusive access cannot be
50a61ed2ceSHans Rosenfeld  * gained. Otherwise, it will block in an interruptible fashion. The argument is
51a61ed2ceSHans Rosenfeld  * a uccid_cmd_txn_begin_t.
52a61ed2ceSHans Rosenfeld  */
53a61ed2ceSHans Rosenfeld #define	UCCID_CMD_TXN_BEGIN	(UCCID_IOCTL | 0x01)
54a61ed2ceSHans Rosenfeld #define	UCCID_TXN_DONT_BLOCK	0x01
55a61ed2ceSHans Rosenfeld 
56a61ed2ceSHans Rosenfeld typedef struct uccid_cmd_txn_begin {
57a61ed2ceSHans Rosenfeld 	uint32_t	uct_version;
58a61ed2ceSHans Rosenfeld 	uint32_t	uct_flags;
59a61ed2ceSHans Rosenfeld } uccid_cmd_txn_begin_t;
60a61ed2ceSHans Rosenfeld 
61a61ed2ceSHans Rosenfeld /*
62a61ed2ceSHans Rosenfeld  * Relinquish exclusive access. Takes a uccid_cmd_txn_end_t. The callers should
63a61ed2ceSHans Rosenfeld  * specify one of UCCID_TXN_END_RESET or UCCID_TXN_END_RELEASE. These indicate
64a61ed2ceSHans Rosenfeld  * what behavior should be taken when we release the transaction. It is
65a61ed2ceSHans Rosenfeld  * considered an error if neither is specified. If the caller exits without
66a61ed2ceSHans Rosenfeld  * calling this function, then the ICC will be reset.
67a61ed2ceSHans Rosenfeld  */
68a61ed2ceSHans Rosenfeld #define	UCCID_CMD_TXN_END	(UCCID_IOCTL | 0x02)
69a61ed2ceSHans Rosenfeld #define	UCCID_TXN_END_RESET	0x01
70a61ed2ceSHans Rosenfeld #define	UCCID_TXN_END_RELEASE	0x02
71a61ed2ceSHans Rosenfeld 
72a61ed2ceSHans Rosenfeld typedef struct uccid_cmd_txn_end {
73a61ed2ceSHans Rosenfeld 	uint32_t	uct_version;
74a61ed2ceSHans Rosenfeld 	uint32_t	uct_flags;
75a61ed2ceSHans Rosenfeld } uccid_cmd_txn_end_t;
76a61ed2ceSHans Rosenfeld 
77a61ed2ceSHans Rosenfeld /*
78a61ed2ceSHans Rosenfeld  * Obtain the status of the slot. Returns a filled-in uccid_cmd_status_t.
79a61ed2ceSHans Rosenfeld  */
80a61ed2ceSHans Rosenfeld #define	UCCID_CMD_STATUS	(UCCID_IOCTL | 0x3)
81a61ed2ceSHans Rosenfeld 
82a61ed2ceSHans Rosenfeld /*
83a61ed2ceSHans Rosenfeld  * Protocol definitions. This should match common/ccid/atr.h.
84a61ed2ceSHans Rosenfeld  */
85a61ed2ceSHans Rosenfeld typedef enum {
86*ae5c3fb7SToomas Soome 	UCCID_PROT_NONE = 0,
87a61ed2ceSHans Rosenfeld 	UCCID_PROT_T0	= 1 << 0,
88a61ed2ceSHans Rosenfeld 	UCCID_PROT_T1	= 1 << 1
89a61ed2ceSHans Rosenfeld } uccid_prot_t;
90a61ed2ceSHans Rosenfeld 
91a61ed2ceSHans Rosenfeld /*
92a61ed2ceSHans Rosenfeld  * Bits for UCS Status
93a61ed2ceSHans Rosenfeld  */
94a61ed2ceSHans Rosenfeld #define	UCCID_STATUS_F_CARD_PRESENT	0x01
95a61ed2ceSHans Rosenfeld #define	UCCID_STATUS_F_CARD_ACTIVE	0x02
96a61ed2ceSHans Rosenfeld #define	UCCID_STATUS_F_PRODUCT_VALID	0x04
97a61ed2ceSHans Rosenfeld #define	UCCID_STATUS_F_SERIAL_VALID	0x08
98a61ed2ceSHans Rosenfeld #define	UCCID_STATUS_F_PARAMS_VALID	0x10
99a61ed2ceSHans Rosenfeld 
100a61ed2ceSHans Rosenfeld typedef struct uccid_cmd_status {
101a61ed2ceSHans Rosenfeld 	uint32_t	ucs_version;
102a61ed2ceSHans Rosenfeld 	uint32_t	ucs_status;
103a61ed2ceSHans Rosenfeld 	int32_t		ucs_instance;
104a61ed2ceSHans Rosenfeld 	uint32_t	ucs_slot;
105a61ed2ceSHans Rosenfeld 	uint8_t		ucs_atr[UCCID_ATR_MAX];
106a61ed2ceSHans Rosenfeld 	uint8_t		ucs_atrlen;
107a61ed2ceSHans Rosenfeld 	uint8_t		ucs_pad[6];
108a61ed2ceSHans Rosenfeld 	int8_t		ucs_product[256];
109a61ed2ceSHans Rosenfeld 	int8_t		ucs_serial[256];
110a61ed2ceSHans Rosenfeld 	ccid_class_descr_t	ucs_class;
111a61ed2ceSHans Rosenfeld 	uccid_prot_t	ucs_prot;
112a61ed2ceSHans Rosenfeld 	ccid_params_t	ucs_params;
113a61ed2ceSHans Rosenfeld } uccid_cmd_status_t;
114a61ed2ceSHans Rosenfeld 
115a61ed2ceSHans Rosenfeld /*
116a61ed2ceSHans Rosenfeld  * Modify the state of the ICC, if present.
117a61ed2ceSHans Rosenfeld  */
118a61ed2ceSHans Rosenfeld #define	UCCID_CMD_ICC_MODIFY	(UCCID_IOCTL | 0x04)
119a61ed2ceSHans Rosenfeld 
120a61ed2ceSHans Rosenfeld #define	UCCID_ICC_POWER_ON	0x01
121a61ed2ceSHans Rosenfeld #define	UCCID_ICC_POWER_OFF	0x02
122a61ed2ceSHans Rosenfeld #define	UCCID_ICC_WARM_RESET	0x03
123a61ed2ceSHans Rosenfeld 
124a61ed2ceSHans Rosenfeld typedef struct uccid_cmd_icc_modify {
125a61ed2ceSHans Rosenfeld 	uint32_t uci_version;
126a61ed2ceSHans Rosenfeld 	uint32_t uci_action;
127a61ed2ceSHans Rosenfeld } uccid_cmd_icc_modify_t;
128a61ed2ceSHans Rosenfeld 
129a61ed2ceSHans Rosenfeld #ifdef __cplusplus
130a61ed2ceSHans Rosenfeld }
131a61ed2ceSHans Rosenfeld #endif
132a61ed2ceSHans Rosenfeld 
133a61ed2ceSHans Rosenfeld 
134a61ed2ceSHans Rosenfeld #endif /* _SYS_USB_UCCID_H */
135