1 /*
2  * MUSCLE SmartCard Development ( https://pcsclite.apdu.fr/ )
3  *
4  * Copyright (C) 1999-2004
5  *  David Corcoran <corcoran@musclecard.com>
6  * Copyright (C) 2002-2011
7  *  Ludovic Rousseau <ludovic.rousseau@free.fr>
8  * Copyright (C) 2005
9  *  Martin Paljak <martin@paljak.pri.ee>
10  *
11 Redistribution and use in source and binary forms, with or without
12 modification, are permitted provided that the following conditions
13 are met:
14 
15 1. Redistributions of source code must retain the above copyright
16    notice, this list of conditions and the following disclaimer.
17 2. Redistributions in binary form must reproduce the above copyright
18    notice, this list of conditions and the following disclaimer in the
19    documentation and/or other materials provided with the distribution.
20 3. The name of the author may not be used to endorse or promote products
21    derived from this software without specific prior written permission.
22 
23 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34 
35 /**
36  * @file
37  * @brief This keeps a list of defines for pcsc-lite.
38  *
39  * Error codes from http://msdn.microsoft.com/en-us/library/aa924526.aspx
40  */
41 
42 #ifndef __pcsclite_h__
43 #define __pcsclite_h__
44 
45 #include <wintypes.h>
46 
47 #ifdef __cplusplus
48 extern "C"
49 {
50 #endif
51 
52 typedef LONG SCARDCONTEXT; /**< \p hContext returned by SCardEstablishContext() */
53 typedef SCARDCONTEXT *PSCARDCONTEXT;
54 typedef SCARDCONTEXT *LPSCARDCONTEXT;
55 typedef LONG SCARDHANDLE; /**< \p hCard returned by SCardConnect() */
56 typedef SCARDHANDLE *PSCARDHANDLE;
57 typedef SCARDHANDLE *LPSCARDHANDLE;
58 
59 #define MAX_ATR_SIZE                  33      /**< Maximum ATR size */
60 
61 /* Set structure elements aligment on bytes
62  * http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html */
63 #ifdef __APPLE__
64 #pragma pack(1)
65 #endif
66 
67 typedef struct
68 {
69       const char *szReader;
70       void *pvUserData;
71       DWORD dwCurrentState;
72       DWORD dwEventState;
73       DWORD cbAtr;
74       unsigned char rgbAtr[MAX_ATR_SIZE];
75 }
76 SCARD_READERSTATE, *LPSCARD_READERSTATE;
77 
78 /** Protocol Control Information (PCI) */
79 typedef struct
80 {
81       unsigned long dwProtocol;      /**< Protocol identifier */
82       unsigned long cbPciLength;      /**< Protocol Control Inf Length */
83 }
84 SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
85 
86 typedef const SCARD_IO_REQUEST *LPCSCARD_IO_REQUEST;
87 
88 extern const SCARD_IO_REQUEST g_rgSCardT0Pci, g_rgSCardT1Pci, g_rgSCardRawPci;
89 
90 /* restore default structure elements alignment */
91 #ifdef __APPLE__
92 #pragma pack()
93 #endif
94 
95 #define SCARD_PCI_T0      (&g_rgSCardT0Pci) /**< protocol control information (PCI) for T=0 */
96 #define SCARD_PCI_T1      (&g_rgSCardT1Pci) /**< protocol control information (PCI) for T=1 */
97 #define SCARD_PCI_RAW      (&g_rgSCardRawPci) /**< protocol control information (PCI) for RAW protocol */
98 
99 /**
100  * @defgroup ErrorCodes ErrorCodes
101  * @brief Error code documentation
102  *
103  * The error codes descriptions are from
104  * http://msdn.microsoft.com/en-us/library/aa924526.aspx
105  */
106 /** @ingroup ErrorCodes */
107 #define SCARD_S_SUCCESS                  ((LONG)0x00000000) /**< No error was encountered. */
108 /** @ingroup ErrorCodes */
109 #define SCARD_F_INTERNAL_ERROR            ((LONG)0x80100001) /**< An internal consistency check failed. */
110 /** @ingroup ErrorCodes */
111 #define SCARD_E_CANCELLED            ((LONG)0x80100002) /**< The action was cancelled by an SCardCancel request. */
112 /** @ingroup ErrorCodes */
113 #define SCARD_E_INVALID_HANDLE            ((LONG)0x80100003) /**< The supplied handle was invalid. */
114 /** @ingroup ErrorCodes */
115 #define SCARD_E_INVALID_PARAMETER      ((LONG)0x80100004) /**< One or more of the supplied parameters could not be properly interpreted. */
116 /** @ingroup ErrorCodes */
117 #define SCARD_E_INVALID_TARGET            ((LONG)0x80100005) /**< Registry startup information is missing or invalid. */
118 /** @ingroup ErrorCodes */
119 #define SCARD_E_NO_MEMORY            ((LONG)0x80100006) /**< Not enough memory available to complete this command. */
120 /** @ingroup ErrorCodes */
121 #define SCARD_F_WAITED_TOO_LONG            ((LONG)0x80100007) /**< An internal consistency timer has expired. */
122 /** @ingroup ErrorCodes */
123 #define SCARD_E_INSUFFICIENT_BUFFER      ((LONG)0x80100008) /**< The data buffer to receive returned data is too small for the returned data. */
124 /** @ingroup ErrorCodes */
125 #define SCARD_E_UNKNOWN_READER            ((LONG)0x80100009) /**< The specified reader name is not recognized. */
126 /** @ingroup ErrorCodes */
127 #define SCARD_E_TIMEOUT                  ((LONG)0x8010000A) /**< The user-specified timeout value has expired. */
128 /** @ingroup ErrorCodes */
129 #define SCARD_E_SHARING_VIOLATION      ((LONG)0x8010000B) /**< The smart card cannot be accessed because of other connections outstanding. */
130 /** @ingroup ErrorCodes */
131 #define SCARD_E_NO_SMARTCARD            ((LONG)0x8010000C) /**< The operation requires a Smart Card, but no Smart Card is currently in the device. */
132 /** @ingroup ErrorCodes */
133 #define SCARD_E_UNKNOWN_CARD            ((LONG)0x8010000D) /**< The specified smart card name is not recognized. */
134 /** @ingroup ErrorCodes */
135 #define SCARD_E_CANT_DISPOSE            ((LONG)0x8010000E) /**< The system could not dispose of the media in the requested manner. */
136 /** @ingroup ErrorCodes */
137 #define SCARD_E_PROTO_MISMATCH            ((LONG)0x8010000F) /**< The requested protocols are incompatible with the protocol currently in use with the smart card. */
138 /** @ingroup ErrorCodes */
139 #define SCARD_E_NOT_READY            ((LONG)0x80100010) /**< The reader or smart card is not ready to accept commands. */
140 /** @ingroup ErrorCodes */
141 #define SCARD_E_INVALID_VALUE            ((LONG)0x80100011) /**< One or more of the supplied parameters values could not be properly interpreted. */
142 /** @ingroup ErrorCodes */
143 #define SCARD_E_SYSTEM_CANCELLED      ((LONG)0x80100012) /**< The action was cancelled by the system, presumably to log off or shut down. */
144 /** @ingroup ErrorCodes */
145 #define SCARD_F_COMM_ERROR            ((LONG)0x80100013) /**< An internal communications error has been detected. */
146 /** @ingroup ErrorCodes */
147 #define SCARD_F_UNKNOWN_ERROR            ((LONG)0x80100014) /**< An internal error has been detected, but the source is unknown. */
148 /** @ingroup ErrorCodes */
149 #define SCARD_E_INVALID_ATR            ((LONG)0x80100015) /**< An ATR obtained from the registry is not a valid ATR string. */
150 /** @ingroup ErrorCodes */
151 #define SCARD_E_NOT_TRANSACTED            ((LONG)0x80100016) /**< An attempt was made to end a non-existent transaction. */
152 /** @ingroup ErrorCodes */
153 #define SCARD_E_READER_UNAVAILABLE      ((LONG)0x80100017) /**< The specified reader is not currently available for use. */
154 /** @ingroup ErrorCodes */
155 #define SCARD_P_SHUTDOWN            ((LONG)0x80100018) /**< The operation has been aborted to allow the server application to exit. */
156 /** @ingroup ErrorCodes */
157 #define SCARD_E_PCI_TOO_SMALL            ((LONG)0x80100019) /**< The PCI Receive buffer was too small. */
158 /** @ingroup ErrorCodes */
159 #define SCARD_E_READER_UNSUPPORTED      ((LONG)0x8010001A) /**< The reader driver does not meet minimal requirements for support. */
160 /** @ingroup ErrorCodes */
161 #define SCARD_E_DUPLICATE_READER      ((LONG)0x8010001B) /**< The reader driver did not produce a unique reader name. */
162 /** @ingroup ErrorCodes */
163 #define SCARD_E_CARD_UNSUPPORTED      ((LONG)0x8010001C) /**< The smart card does not meet minimal requirements for support. */
164 /** @ingroup ErrorCodes */
165 #define SCARD_E_NO_SERVICE            ((LONG)0x8010001D) /**< The Smart card resource manager is not running. */
166 /** @ingroup ErrorCodes */
167 #define SCARD_E_SERVICE_STOPPED            ((LONG)0x8010001E) /**< The Smart card resource manager has shut down. */
168 /** @ingroup ErrorCodes */
169 #define SCARD_E_UNEXPECTED            ((LONG)0x8010001F) /**< An unexpected card error has occurred. */
170 /** @ingroup ErrorCodes */
171 #define SCARD_E_UNSUPPORTED_FEATURE      ((LONG)0x8010001F) /**< This smart card does not support the requested feature. */
172 /** @ingroup ErrorCodes */
173 #define SCARD_E_ICC_INSTALLATION      ((LONG)0x80100020) /**< No primary provider can be found for the smart card. */
174 /** @ingroup ErrorCodes */
175 #define SCARD_E_ICC_CREATEORDER            ((LONG)0x80100021) /**< The requested order of object creation is not supported. */
176 /** @ingroup ErrorCodes */
177 /* #define SCARD_E_UNSUPPORTED_FEATURE      ((LONG)0x80100022) / **< This smart card does not support the requested feature. */
178 /** @ingroup ErrorCodes */
179 #define SCARD_E_DIR_NOT_FOUND            ((LONG)0x80100023) /**< The identified directory does not exist in the smart card. */
180 /** @ingroup ErrorCodes */
181 #define SCARD_E_FILE_NOT_FOUND            ((LONG)0x80100024) /**< The identified file does not exist in the smart card. */
182 /** @ingroup ErrorCodes */
183 #define SCARD_E_NO_DIR                  ((LONG)0x80100025) /**< The supplied path does not represent a smart card directory. */
184 /** @ingroup ErrorCodes */
185 #define SCARD_E_NO_FILE                  ((LONG)0x80100026) /**< The supplied path does not represent a smart card file. */
186 /** @ingroup ErrorCodes */
187 #define SCARD_E_NO_ACCESS            ((LONG)0x80100027) /**< Access is denied to this file. */
188 /** @ingroup ErrorCodes */
189 #define SCARD_E_WRITE_TOO_MANY            ((LONG)0x80100028) /**< The smart card does not have enough memory to store the information. */
190 /** @ingroup ErrorCodes */
191 #define SCARD_E_BAD_SEEK            ((LONG)0x80100029) /**< There was an error trying to set the smart card file object pointer. */
192 /** @ingroup ErrorCodes */
193 #define SCARD_E_INVALID_CHV            ((LONG)0x8010002A) /**< The supplied PIN is incorrect. */
194 /** @ingroup ErrorCodes */
195 #define SCARD_E_UNKNOWN_RES_MNG            ((LONG)0x8010002B) /**< An unrecognized error code was returned from a layered component. */
196 /** @ingroup ErrorCodes */
197 #define SCARD_E_NO_SUCH_CERTIFICATE      ((LONG)0x8010002C) /**< The requested certificate does not exist. */
198 /** @ingroup ErrorCodes */
199 #define SCARD_E_CERTIFICATE_UNAVAILABLE      ((LONG)0x8010002D) /**< The requested certificate could not be obtained. */
200 /** @ingroup ErrorCodes */
201 #define SCARD_E_NO_READERS_AVAILABLE    ((LONG)0x8010002E) /**< Cannot find a smart card reader. */
202 /** @ingroup ErrorCodes */
203 #define SCARD_E_COMM_DATA_LOST            ((LONG)0x8010002F) /**< A communications error with the smart card has been detected. Retry the operation. */
204 /** @ingroup ErrorCodes */
205 #define SCARD_E_NO_KEY_CONTAINER      ((LONG)0x80100030) /**< The requested key container does not exist on the smart card. */
206 /** @ingroup ErrorCodes */
207 #define SCARD_E_SERVER_TOO_BUSY            ((LONG)0x80100031) /**< The Smart Card Resource Manager is too busy to complete this operation. */
208 
209 /** @ingroup ErrorCodes */
210 #define SCARD_W_UNSUPPORTED_CARD      ((LONG)0x80100065) /**< The reader cannot communicate with the card, due to ATR string configuration conflicts. */
211 /** @ingroup ErrorCodes */
212 #define SCARD_W_UNRESPONSIVE_CARD      ((LONG)0x80100066) /**< The smart card is not responding to a reset. */
213 /** @ingroup ErrorCodes */
214 #define SCARD_W_UNPOWERED_CARD            ((LONG)0x80100067) /**< Power has been removed from the smart card, so that further communication is not possible. */
215 /** @ingroup ErrorCodes */
216 #define SCARD_W_RESET_CARD            ((LONG)0x80100068) /**< The smart card has been reset, so any shared state information is invalid. */
217 /** @ingroup ErrorCodes */
218 #define SCARD_W_REMOVED_CARD            ((LONG)0x80100069) /**< The smart card has been removed, so further communication is not possible. */
219 
220 /** @ingroup ErrorCodes */
221 #define SCARD_W_SECURITY_VIOLATION      ((LONG)0x8010006A) /**< Access was denied because of a security violation. */
222 /** @ingroup ErrorCodes */
223 #define SCARD_W_WRONG_CHV            ((LONG)0x8010006B) /**< The card cannot be accessed because the wrong PIN was presented. */
224 /** @ingroup ErrorCodes */
225 #define SCARD_W_CHV_BLOCKED            ((LONG)0x8010006C) /**< The card cannot be accessed because the maximum number of PIN entry attempts has been reached. */
226 /** @ingroup ErrorCodes */
227 #define SCARD_W_EOF                  ((LONG)0x8010006D) /**< The end of the smart card file has been reached. */
228 /** @ingroup ErrorCodes */
229 #define SCARD_W_CANCELLED_BY_USER      ((LONG)0x8010006E) /**< The user pressed "Cancel" on a Smart Card Selection Dialog. */
230 /** @ingroup ErrorCodes */
231 #define SCARD_W_CARD_NOT_AUTHENTICATED      ((LONG)0x8010006F) /**< No PIN was presented to the smart card. */
232 
233 #define SCARD_AUTOALLOCATE (DWORD)(-1)      /**< see SCardFreeMemory() */
234 #define SCARD_SCOPE_USER            0x0000      /**< Scope in user space */
235 #define SCARD_SCOPE_TERMINAL            0x0001      /**< Scope in terminal */
236 #define SCARD_SCOPE_SYSTEM            0x0002      /**< Scope in system */
237 #define SCARD_SCOPE_GLOBAL            0x0003      /**< Scope is global */
238 
239 #define SCARD_PROTOCOL_UNDEFINED      0x0000      /**< protocol not set */
240 #define SCARD_PROTOCOL_UNSET SCARD_PROTOCOL_UNDEFINED      /* backward compat */
241 #define SCARD_PROTOCOL_T0            0x0001      /**< T=0 active protocol. */
242 #define SCARD_PROTOCOL_T1            0x0002      /**< T=1 active protocol. */
243 #define SCARD_PROTOCOL_RAW            0x0004      /**< Raw active protocol. */
244 #define SCARD_PROTOCOL_T15            0x0008      /**< T=15 protocol. */
245 
246 #define SCARD_PROTOCOL_ANY            (SCARD_PROTOCOL_T0|SCARD_PROTOCOL_T1)      /**< IFD determines prot. */
247 
248 #define SCARD_SHARE_EXCLUSIVE            0x0001      /**< Exclusive mode only */
249 #define SCARD_SHARE_SHARED            0x0002      /**< Shared mode only */
250 #define SCARD_SHARE_DIRECT            0x0003      /**< Raw mode only */
251 
252 #define SCARD_LEAVE_CARD            0x0000      /**< Do nothing on close */
253 #define SCARD_RESET_CARD            0x0001      /**< Reset on close */
254 #define SCARD_UNPOWER_CARD            0x0002      /**< Power down on close */
255 #define SCARD_EJECT_CARD            0x0003      /**< Eject on close */
256 
257 #define SCARD_UNKNOWN                  0x0001      /**< Unknown state */
258 #define SCARD_ABSENT                  0x0002      /**< Card is absent */
259 #define SCARD_PRESENT                  0x0004      /**< Card is present */
260 #define SCARD_SWALLOWED                  0x0008      /**< Card not powered */
261 #define SCARD_POWERED                  0x0010      /**< Card is powered */
262 #define SCARD_NEGOTIABLE            0x0020      /**< Ready for PTS */
263 #define SCARD_SPECIFIC                  0x0040      /**< PTS has been set */
264 
265 #define SCARD_STATE_UNAWARE            0x0000      /**< App wants status */
266 #define SCARD_STATE_IGNORE            0x0001      /**< Ignore this reader */
267 #define SCARD_STATE_CHANGED            0x0002      /**< State has changed */
268 #define SCARD_STATE_UNKNOWN            0x0004      /**< Reader unknown */
269 #define SCARD_STATE_UNAVAILABLE            0x0008      /**< Status unavailable */
270 #define SCARD_STATE_EMPTY            0x0010      /**< Card removed */
271 #define SCARD_STATE_PRESENT            0x0020      /**< Card inserted */
272 #define SCARD_STATE_ATRMATCH            0x0040      /**< ATR matches card */
273 #define SCARD_STATE_EXCLUSIVE            0x0080      /**< Exclusive Mode */
274 #define SCARD_STATE_INUSE            0x0100      /**< Shared Mode */
275 #define SCARD_STATE_MUTE            0x0200      /**< Unresponsive card */
276 #define SCARD_STATE_UNPOWERED            0x0400      /**< Unpowered card */
277 
278 #ifndef INFINITE
279 #define INFINITE                  0xFFFFFFFF      /**< Infinite timeout */
280 #endif
281 
282 #define PCSCLITE_VERSION_NUMBER            "1.8.26"      /**< Current version */
283 /** Maximum readers context (a slot is count as a reader) */
284 #define PCSCLITE_MAX_READERS_CONTEXTS                  16
285 
286 #define MAX_READERNAME                  128
287 
288 #ifndef SCARD_ATR_LENGTH
289 #define SCARD_ATR_LENGTH            MAX_ATR_SIZE      /**< Maximum ATR size */
290 #endif
291 
292 /*
293  * The message and buffer sizes must be multiples of 16.
294  * The max message size must be at least large enough
295  * to accomodate the transmit_struct
296  */
297 #define MAX_BUFFER_SIZE                  264      /**< Maximum Tx/Rx Buffer for short APDU */
298 #define MAX_BUFFER_SIZE_EXTENDED      (4 + 3 + (1<<16) + 3 + 2)      /**< enhanced (64K + APDU + Lc + Le + SW) Tx/Rx Buffer */
299 
300 /*
301  * Gets a stringified error response
302  */
303 const char *pcsc_stringify_error(const LONG);
304 
305 #ifdef __cplusplus
306 }
307 #endif
308 
309 #endif
310