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