pcsc-lite  1.8.11
reader.h
Go to the documentation of this file.
1 /*
2  * MUSCLE SmartCard Development ( http://pcsclite.alioth.debian.org/pcsclite.html )
3  *
4  * Copyright (C) 1999-2005
5  * David Corcoran <corcoran@musclecard.com>
6  * Copyright (C) 2005-2009
7  * Ludovic Rousseau <ludovic.rousseau@free.fr>
8  *
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions
11 are met:
12 
13 1. Redistributions of source code must retain the above copyright
14  notice, this list of conditions and the following disclaimer.
15 2. Redistributions in binary form must reproduce the above copyright
16  notice, this list of conditions and the following disclaimer in the
17  documentation and/or other materials provided with the distribution.
18 3. The name of the author may not be used to endorse or promote products
19  derived from this software without specific prior written permission.
20 
21 Changes to this license can be made only by the copyright author with
22 explicit written consent.
23 
24 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
25 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
28 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  *
35  * $Id: reader.h 6851 2014-02-14 15:43:32Z rousseau $
36  */
37 
43 #ifndef __reader_h__
44 #define __reader_h__
45 
46 /*
47  * Tags for requesting card and reader attributes
48  */
49 
50 #define SCARD_ATTR_VALUE(Class, Tag) ((((ULONG)(Class)) << 16) | ((ULONG)(Tag)))
51 
52 #define SCARD_CLASS_VENDOR_INFO 1
53 #define SCARD_CLASS_COMMUNICATIONS 2
54 #define SCARD_CLASS_PROTOCOL 3
55 #define SCARD_CLASS_POWER_MGMT 4
56 #define SCARD_CLASS_SECURITY 5
57 #define SCARD_CLASS_MECHANICAL 6
58 #define SCARD_CLASS_VENDOR_DEFINED 7
59 #define SCARD_CLASS_IFD_PROTOCOL 8
60 #define SCARD_CLASS_ICC_STATE 9
61 #define SCARD_CLASS_SYSTEM 0x7fff
63 #define SCARD_ATTR_VENDOR_NAME SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0100)
64 #define SCARD_ATTR_VENDOR_IFD_TYPE SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0101)
65 #define SCARD_ATTR_VENDOR_IFD_VERSION SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0102)
66 #define SCARD_ATTR_VENDOR_IFD_SERIAL_NO SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0103)
67 #define SCARD_ATTR_CHANNEL_ID SCARD_ATTR_VALUE(SCARD_CLASS_COMMUNICATIONS, 0x0110)
68 #define SCARD_ATTR_ASYNC_PROTOCOL_TYPES SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0120)
69 #define SCARD_ATTR_DEFAULT_CLK SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0121)
70 #define SCARD_ATTR_MAX_CLK SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0122)
71 #define SCARD_ATTR_DEFAULT_DATA_RATE SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0123)
72 #define SCARD_ATTR_MAX_DATA_RATE SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0124)
73 #define SCARD_ATTR_MAX_IFSD SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0125)
74 #define SCARD_ATTR_SYNC_PROTOCOL_TYPES SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0126)
75 #define SCARD_ATTR_POWER_MGMT_SUPPORT SCARD_ATTR_VALUE(SCARD_CLASS_POWER_MGMT, 0x0131)
76 #define SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE SCARD_ATTR_VALUE(SCARD_CLASS_SECURITY, 0x0140)
77 #define SCARD_ATTR_USER_AUTH_INPUT_DEVICE SCARD_ATTR_VALUE(SCARD_CLASS_SECURITY, 0x0142)
78 #define SCARD_ATTR_CHARACTERISTICS SCARD_ATTR_VALUE(SCARD_CLASS_MECHANICAL, 0x0150)
80 #define SCARD_ATTR_CURRENT_PROTOCOL_TYPE SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0201)
81 #define SCARD_ATTR_CURRENT_CLK SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0202)
82 #define SCARD_ATTR_CURRENT_F SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0203)
83 #define SCARD_ATTR_CURRENT_D SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0204)
84 #define SCARD_ATTR_CURRENT_N SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0205)
85 #define SCARD_ATTR_CURRENT_W SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0206)
86 #define SCARD_ATTR_CURRENT_IFSC SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0207)
87 #define SCARD_ATTR_CURRENT_IFSD SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0208)
88 #define SCARD_ATTR_CURRENT_BWT SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0209)
89 #define SCARD_ATTR_CURRENT_CWT SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020a)
90 #define SCARD_ATTR_CURRENT_EBC_ENCODING SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020b)
91 #define SCARD_ATTR_EXTENDED_BWT SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020c)
93 #define SCARD_ATTR_ICC_PRESENCE SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0300)
94 #define SCARD_ATTR_ICC_INTERFACE_STATUS SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0301)
95 #define SCARD_ATTR_CURRENT_IO_STATE SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0302)
96 #define SCARD_ATTR_ATR_STRING SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0303)
97 #define SCARD_ATTR_ICC_TYPE_PER_ATR SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0304)
99 #define SCARD_ATTR_ESC_RESET SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA000)
100 #define SCARD_ATTR_ESC_CANCEL SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA003)
101 #define SCARD_ATTR_ESC_AUTHREQUEST SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA005)
102 #define SCARD_ATTR_MAXINPUT SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA007)
104 #define SCARD_ATTR_DEVICE_UNIT SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0001)
105 #define SCARD_ATTR_DEVICE_IN_USE SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0002)
106 #define SCARD_ATTR_DEVICE_FRIENDLY_NAME_A SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0003)
107 #define SCARD_ATTR_DEVICE_SYSTEM_NAME_A SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0004)
108 #define SCARD_ATTR_DEVICE_FRIENDLY_NAME_W SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0005)
109 #define SCARD_ATTR_DEVICE_SYSTEM_NAME_W SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0006)
110 #define SCARD_ATTR_SUPRESS_T1_IFS_REQUEST SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0007)
112 #ifdef UNICODE
113 #define SCARD_ATTR_DEVICE_FRIENDLY_NAME SCARD_ATTR_DEVICE_FRIENDLY_NAME_W
114 #define SCARD_ATTR_DEVICE_SYSTEM_NAME SCARD_ATTR_DEVICE_SYSTEM_NAME_W
115 #else
116 #define SCARD_ATTR_DEVICE_FRIENDLY_NAME SCARD_ATTR_DEVICE_FRIENDLY_NAME_A
117 #define SCARD_ATTR_DEVICE_SYSTEM_NAME SCARD_ATTR_DEVICE_SYSTEM_NAME_A
118 #endif
119 
123 #define SCARD_CTL_CODE(code) (0x42000000 + (code))
124 
128 #define CM_IOCTL_GET_FEATURE_REQUEST SCARD_CTL_CODE(3400)
129 
130 #define FEATURE_VERIFY_PIN_START 0x01
131 #define FEATURE_VERIFY_PIN_FINISH 0x02
132 #define FEATURE_MODIFY_PIN_START 0x03
133 #define FEATURE_MODIFY_PIN_FINISH 0x04
134 #define FEATURE_GET_KEY_PRESSED 0x05
135 #define FEATURE_VERIFY_PIN_DIRECT 0x06
136 #define FEATURE_MODIFY_PIN_DIRECT 0x07
137 #define FEATURE_MCT_READER_DIRECT 0x08
138 #define FEATURE_MCT_UNIVERSAL 0x09
139 #define FEATURE_IFD_PIN_PROPERTIES 0x0A
140 #define FEATURE_ABORT 0x0B
141 #define FEATURE_SET_SPE_MESSAGE 0x0C
142 #define FEATURE_VERIFY_PIN_DIRECT_APP_ID 0x0D
143 #define FEATURE_MODIFY_PIN_DIRECT_APP_ID 0x0E
144 #define FEATURE_WRITE_DISPLAY 0x0F
145 #define FEATURE_GET_KEY 0x10
146 #define FEATURE_IFD_DISPLAY_PROPERTIES 0x11
147 #define FEATURE_GET_TLV_PROPERTIES 0x12
148 #define FEATURE_CCID_ESC_COMMAND 0x13
149 #define FEATURE_EXECUTE_PACE 0x20
150 
151 /* structures used (but not defined) in PC/SC Part 10:
152  * "IFDs with Secure Pin Entry Capabilities" */
153 
154 #include <inttypes.h>
155 
156 /* Set structure elements aligment on bytes
157  * http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html */
158 #if defined(__APPLE__) | defined(sun)
159 #pragma pack(1)
160 #else
161 #pragma pack(push, 1)
162 #endif
163 
165 typedef struct
166 {
167  uint8_t tag;
168  uint8_t length;
169  uint32_t value;
171 
174 #define HOST_TO_CCID_16(x) (x)
175 #define HOST_TO_CCID_32(x) (x)
176 
178 typedef struct
179 {
180  uint8_t bTimerOut;
181  uint8_t bTimerOut2;
182  uint8_t bmFormatString;
190  uint16_t wPINMaxExtraDigit;
194  uint8_t bNumberMessage;
195  uint16_t wLangId;
196  uint8_t bMsgIndex;
197  uint8_t bTeoPrologue[3];
198  uint32_t ulDataLength;
199  uint8_t abData
200 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
201  [] /* valid C99 code */
202 #else
203  [0] /* non-standard, but usually working code */
204 #endif
205  ;
207 
209 typedef struct
210 {
211  uint8_t bTimerOut;
212  uint8_t bTimerOut2;
213  uint8_t bmFormatString;
228  uint8_t bConfirmPIN;
231  uint8_t bNumberMessage;
232  uint16_t wLangId;
233  uint8_t bMsgIndex1;
234  uint8_t bMsgIndex2;
235  uint8_t bMsgIndex3;
236  uint8_t bTeoPrologue[3];
237  uint32_t ulDataLength;
238  uint8_t abData
239 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
240  [] /* valid C99 code */
241 #else
242  [0] /* non-standard, but usually working code */
243 #endif
244  ;
246 
248 typedef struct {
249  uint16_t wLcdLayout;
250  uint8_t bEntryValidationCondition;
251  uint8_t bTimeOut2;
253 
254 /* restore default structure elements alignment */
255 #if defined(__APPLE__) | defined(sun)
256 #pragma pack()
257 #else
258 #pragma pack(pop)
259 #endif
260 
261 /* properties returned by FEATURE_GET_TLV_PROPERTIES */
262 #define PCSCv2_PART10_PROPERTY_wLcdLayout 1
263 #define PCSCv2_PART10_PROPERTY_bEntryValidationCondition 2
264 #define PCSCv2_PART10_PROPERTY_bTimeOut2 3
265 #define PCSCv2_PART10_PROPERTY_wLcdMaxCharacters 4
266 #define PCSCv2_PART10_PROPERTY_wLcdMaxLines 5
267 #define PCSCv2_PART10_PROPERTY_bMinPINSize 6
268 #define PCSCv2_PART10_PROPERTY_bMaxPINSize 7
269 #define PCSCv2_PART10_PROPERTY_sFirmwareID 8
270 #define PCSCv2_PART10_PROPERTY_bPPDUSupport 9
271 #define PCSCv2_PART10_PROPERTY_dwMaxAPDUDataSize 10
272 #define PCSCv2_PART10_PROPERTY_wIdVendor 11
273 #define PCSCv2_PART10_PROPERTY_wIdProduct 12
274 
275 #endif
276 
uint32_t value
This value is always in BIG ENDIAN format as documented in PCSC v2 part 10 ch 2.2 page 2...
Definition: reader.h:169
uint8_t bmFormatString
formatting options
Definition: reader.h:182
uint8_t bmPINBlockString
bits 7-4 bit size of PIN length in APDU, bits 3-0 PIN block size in bytes after justification and for...
Definition: reader.h:183
uint32_t ulDataLength
length of Data to be sent to the ICC
Definition: reader.h:198
the structure must be 6-bytes long
Definition: reader.h:165
uint32_t ulDataLength
length of Data to be sent to the ICC
Definition: reader.h:237
uint8_t bNumberMessage
Number of messages to display for PIN verification.
Definition: reader.h:194
uint8_t bMsgIndex2
index of 2d prompting message
Definition: reader.h:234
uint8_t bTimerOut2
timeout in seconds after first key stroke
Definition: reader.h:181
uint8_t bmFormatString
formatting options
Definition: reader.h:213
uint16_t wPINMaxExtraDigit
0xXXYY where XX is minimum PIN size in digits, and YY is maximum PIN size in digits ...
Definition: reader.h:225
uint8_t bEntryValidationCondition
Conditions under which PIN entry should be considered complete.
Definition: reader.h:229
uint8_t bTimerOut
timeout is seconds (00 means use default timeout)
Definition: reader.h:211
uint8_t bNumberMessage
Number of messages to display for PIN verification.
Definition: reader.h:231
uint8_t bEntryValidationCondition
Conditions under which PIN entry should be considered complete.
Definition: reader.h:192
uint16_t wLangId
Language for messages.
Definition: reader.h:232
uint8_t bTimerOut
timeout is seconds (00 means use default timeout)
Definition: reader.h:180
uint8_t bInsertionOffsetNew
Insertion position offset in bytes for the new PIN.
Definition: reader.h:223
uint8_t bMsgIndex
Message index (should be 00)
Definition: reader.h:196
uint8_t bTimerOut2
timeout in seconds after first key stroke
Definition: reader.h:212
uint16_t wLcdLayout
display characteristics
Definition: reader.h:249
uint8_t bConfirmPIN
Flags governing need for confirmation of new PIN.
Definition: reader.h:228
uint16_t wLangId
Language for messages.
Definition: reader.h:195
uint8_t bmPINLengthFormat
bits 7-5 RFU, bit 4 set if system units are bytes, clear if system units are bits, bits 3-0 PIN length position in system units
Definition: reader.h:186
structure used with FEATURE_IFD_PIN_PROPERTIES
Definition: reader.h:248
structure used with FEATURE_MODIFY_PIN_DIRECT
Definition: reader.h:209
uint8_t bmPINLengthFormat
bits 7-5 RFU, bit 4 set if system units are bytes, clear if system units are bits, bits 3-0 PIN length position in system units
Definition: reader.h:217
uint8_t bMsgIndex3
index of 3d prompting message
Definition: reader.h:235
uint8_t bMsgIndex1
index of 1st prompting message
Definition: reader.h:233
structure used with FEATURE_VERIFY_PIN_DIRECT
Definition: reader.h:178
uint16_t wPINMaxExtraDigit
0xXXYY where XX is minimum PIN size in digits, and YY is maximum PIN size in digits ...
Definition: reader.h:190
uint8_t bmPINBlockString
bits 7-4 bit size of PIN length in APDU, bits 3-0 PIN block size in bytes after justification and for...
Definition: reader.h:214
uint8_t bInsertionOffsetOld
Insertion position offset in bytes for the current PIN.
Definition: reader.h:221