VirtualBox

source: vbox/trunk/include/VBox/RemoteDesktop/VRDESCard.h@ 73768

Last change on this file since 73768 was 69107, checked in by vboxsync, 7 years ago

include/VBox/: (C) year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.4 KB
Line 
1/** @file
2 * VBox Remote Desktop Extension (VRDE) - SmartCard interface.
3 */
4
5/*
6 * Copyright (C) 2011-2017 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___VBox_RemoteDesktop_VRDESCard_h
27#define ___VBox_RemoteDesktop_VRDESCard_h
28
29#include <VBox/RemoteDesktop/VRDE.h>
30
31/*
32 * Interface for accessing the smart card reader devices on the client.
33 *
34 * Async callbacks are used for providing feedback, reporting errors, etc.
35 *
36 * The caller prepares a VRDESCARD*REQ structure and submits it.
37 */
38
39#define VRDE_SCARD_INTERFACE_NAME "SCARD"
40
41/** The VRDE server smart card access interface entry points. Interface version 1. */
42typedef struct VRDESCARDINTERFACE
43{
44 /** The header. */
45 VRDEINTERFACEHDR header;
46
47 /** Submit an async IO request to the client.
48 *
49 * @param hServer The VRDE server instance.
50 * @param pvUser The callers context of this request.
51 * @param u32Function The function: VRDE_SCARD_FN_*.
52 * @param pvData Function specific data: VRDESCARD*REQ.
53 * @param cbData Size of data.
54 *
55 * @return IPRT status code.
56 */
57 DECLR3CALLBACKMEMBER(int, VRDESCardRequest, (HVRDESERVER hServer,
58 void *pvUser,
59 uint32_t u32Function,
60 const void *pvData,
61 uint32_t cbData));
62
63} VRDESCARDINTERFACE;
64
65/* Smartcard interface callbacks. */
66typedef struct VRDESCARDCALLBACKS
67{
68 /** The header. */
69 VRDEINTERFACEHDR header;
70
71 /** Notifications.
72 *
73 * @param pvContext The callbacks context specified in VRDEGetInterface.
74 * @param u32Id The notification identifier: VRDE_SCARD_NOTIFY_*.
75 * @param pvData The notification specific data.
76 * @param cbData The size of buffer pointed by pvData.
77 *
78 * @return IPRT status code.
79 */
80 DECLR3CALLBACKMEMBER(int, VRDESCardCbNotify, (void *pvContext,
81 uint32_t u32Id,
82 void *pvData,
83 uint32_t cbData));
84
85 /** IO response.
86 *
87 * @param pvContext The callbacks context specified in VRDEGetInterface.
88 * @param rcRequest The IPRT status code for the request.
89 * @param pvUser The pvUser parameter of VRDESCardRequest.
90 * @param u32Function The completed function: VRDE_SCARD_FN_*.
91 * @param pvData Function specific response data: VRDESCARD*RSP.
92 * @param cbData The size of the buffer pointed by pvData.
93 *
94 * @return IPRT status code.
95 */
96 DECLR3CALLBACKMEMBER(int, VRDESCardCbResponse, (void *pvContext,
97 int rcRequest,
98 void *pvUser,
99 uint32_t u32Function,
100 void *pvData,
101 uint32_t cbData));
102} VRDESCARDCALLBACKS;
103
104
105/*
106 * Notifications.
107 * u32Id parameter of VRDESCARDCALLBACKS::VRDESCardCbNotify.
108 */
109
110#define VRDE_SCARD_NOTIFY_ATTACH 1 /* A SCARD RDPDR device has been attached. */
111#define VRDE_SCARD_NOTIFY_DETACH 2 /* A SCARD RDPDR device has been detached. */
112
113/*
114 * Notifications.
115 * Data structures: pvData of VRDESCARDCALLBACKS::VRDESCardCbNotify.
116 */
117typedef struct VRDESCARDNOTIFYATTACH
118{
119 uint32_t u32ClientId;
120 uint32_t u32DeviceId;
121} VRDESCARDNOTIFYATTACH;
122
123typedef struct VRDESCARDNOTIFYDETACH
124{
125 uint32_t u32ClientId;
126 uint32_t u32DeviceId;
127} VRDESCARDNOTIFYDETACH;
128
129
130/*
131 * IO request codes.
132 * Must be not 0, which is used internally.
133 */
134
135#define VRDE_SCARD_FN_ESTABLISHCONTEXT 1
136#define VRDE_SCARD_FN_LISTREADERS 2
137#define VRDE_SCARD_FN_RELEASECONTEXT 3
138#define VRDE_SCARD_FN_GETSTATUSCHANGE 4
139#define VRDE_SCARD_FN_CANCEL 5
140#define VRDE_SCARD_FN_CONNECT 6
141#define VRDE_SCARD_FN_RECONNECT 7
142#define VRDE_SCARD_FN_DISCONNECT 8
143#define VRDE_SCARD_FN_BEGINTRANSACTION 9
144#define VRDE_SCARD_FN_ENDTRANSACTION 10
145#define VRDE_SCARD_FN_STATE 11
146#define VRDE_SCARD_FN_STATUS 12
147#define VRDE_SCARD_FN_TRANSMIT 13
148#define VRDE_SCARD_FN_CONTROL 14
149#define VRDE_SCARD_FN_GETATTRIB 15
150#define VRDE_SCARD_FN_SETATTRIB 16
151
152#define VRDE_SCARD_MAX_READERS 10
153#define VRDE_SCARD_MAX_ATR_LENGTH 36
154#define VRDE_SCARD_MAX_PCI_DATA 1024
155
156#define VRDE_SCARD_S_SUCCESS 0x00000000
157#define VRDE_SCARD_F_INTERNAL_ERROR 0x80100001
158#define VRDE_SCARD_E_CANCELLED 0x80100002
159#define VRDE_SCARD_E_INVALID_HANDLE 0x80100003
160#define VRDE_SCARD_E_INVALID_PARAMETER 0x80100004
161#define VRDE_SCARD_E_INVALID_TARGET 0x80100005
162#define VRDE_SCARD_E_NO_MEMORY 0x80100006
163#define VRDE_SCARD_F_WAITED_TOO_LONG 0x80100007
164#define VRDE_SCARD_E_INSUFFICIENT_BUFFER 0x80100008
165#define VRDE_SCARD_E_UNKNOWN_READER 0x80100009
166#define VRDE_SCARD_E_TIMEOUT 0x8010000A
167#define VRDE_SCARD_E_SHARING_VIOLATION 0x8010000B
168#define VRDE_SCARD_E_NO_SMARTCARD 0x8010000C
169#define VRDE_SCARD_E_UNKNOWN_CARD 0x8010000D
170#define VRDE_SCARD_E_CANT_DISPOSE 0x8010000E
171#define VRDE_SCARD_E_PROTO_MISMATCH 0x8010000F
172#define VRDE_SCARD_E_NOT_READY 0x80100010
173#define VRDE_SCARD_E_INVALID_VALUE 0x80100011
174#define VRDE_SCARD_E_SYSTEM_CANCELLED 0x80100012
175#define VRDE_SCARD_F_COMM_ERROR 0x80100013
176#define VRDE_SCARD_F_UNKNOWN_ERROR 0x80100014
177#define VRDE_SCARD_E_INVALID_ATR 0x80100015
178#define VRDE_SCARD_E_NOT_TRANSACTED 0x80100016
179#define VRDE_SCARD_E_READER_UNAVAILABLE 0x80100017
180#define VRDE_SCARD_P_SHUTDOWN 0x80100018
181#define VRDE_SCARD_E_PCI_TOO_SMALL 0x80100019
182#define VRDE_SCARD_E_ICC_INSTALLATION 0x80100020
183#define VRDE_SCARD_E_ICC_CREATEORDER 0x80100021
184#define VRDE_SCARD_E_UNSUPPORTED_FEATURE 0x80100022
185#define VRDE_SCARD_E_DIR_NOT_FOUND 0x80100023
186#define VRDE_SCARD_E_FILE_NOT_FOUND 0x80100024
187#define VRDE_SCARD_E_NO_DIR 0x80100025
188#define VRDE_SCARD_E_READER_UNSUPPORTED 0x8010001A
189#define VRDE_SCARD_E_DUPLICATE_READER 0x8010001B
190#define VRDE_SCARD_E_CARD_UNSUPPORTED 0x8010001C
191#define VRDE_SCARD_E_NO_SERVICE 0x8010001D
192#define VRDE_SCARD_E_SERVICE_STOPPED 0x8010001E
193#define VRDE_SCARD_E_UNEXPECTED 0x8010001F
194#define VRDE_SCARD_E_NO_FILE 0x80100026
195#define VRDE_SCARD_E_NO_ACCESS 0x80100027
196#define VRDE_SCARD_E_WRITE_TOO_MANY 0x80100028
197#define VRDE_SCARD_E_BAD_SEEK 0x80100029
198#define VRDE_SCARD_E_INVALID_CHV 0x8010002A
199#define VRDE_SCARD_E_UNKNOWN_RES_MSG 0x8010002B
200#define VRDE_SCARD_E_NO_SUCH_CERTIFICATE 0x8010002C
201#define VRDE_SCARD_E_CERTIFICATE_UNAVAILABLE 0x8010002D
202#define VRDE_SCARD_E_NO_READERS_AVAILABLE 0x8010002E
203#define VRDE_SCARD_E_COMM_DATA_LOST 0x8010002F
204#define VRDE_SCARD_E_NO_KEY_CONTAINER 0x80100030
205#define VRDE_SCARD_E_SERVER_TOO_BUSY 0x80100031
206#define VRDE_SCARD_E_PIN_CACHE_EXPIRED 0x80100032
207#define VRDE_SCARD_E_NO_PIN_CACHE 0x80100033
208#define VRDE_SCARD_E_READ_ONLY_CARD 0x80100034
209#define VRDE_SCARD_W_UNSUPPORTED_CARD 0x80100065
210#define VRDE_SCARD_W_UNRESPONSIVE_CARD 0x80100066
211#define VRDE_SCARD_W_UNPOWERED_CARD 0x80100067
212#define VRDE_SCARD_W_RESET_CARD 0x80100068
213#define VRDE_SCARD_W_REMOVED_CARD 0x80100069
214#define VRDE_SCARD_W_SECURITY_VIOLATION 0x8010006A
215#define VRDE_SCARD_W_WRONG_CHV 0x8010006B
216#define VRDE_SCARD_W_CHV_BLOCKED 0x8010006C
217#define VRDE_SCARD_W_EOF 0x8010006D
218#define VRDE_SCARD_W_CANCELLED_BY_USER 0x8010006E
219#define VRDE_SCARD_W_CARD_NOT_AUTHENTICATED 0x8010006F
220#define VRDE_SCARD_W_CACHE_ITEM_NOT_FOUND 0x80100070
221#define VRDE_SCARD_W_CACHE_ITEM_STALE 0x80100071
222#define VRDE_SCARD_W_CACHE_ITEM_TOO_BIG 0x80100072
223
224#define VRDE_SCARD_STATE_UNAWARE 0x0000
225#define VRDE_SCARD_STATE_IGNORE 0x0001
226#define VRDE_SCARD_STATE_CHANGED 0x0002
227#define VRDE_SCARD_STATE_UNKNOWN 0x0004
228#define VRDE_SCARD_STATE_UNAVAILABLE 0x0008
229#define VRDE_SCARD_STATE_EMPTY 0x0010
230#define VRDE_SCARD_STATE_PRESENT 0x0020
231#define VRDE_SCARD_STATE_ATRMATCH 0x0040
232#define VRDE_SCARD_STATE_EXCLUSIVE 0x0080
233#define VRDE_SCARD_STATE_INUSE 0x0100
234#define VRDE_SCARD_STATE_MUTE 0x0200
235#define VRDE_SCARD_STATE_UNPOWERED 0x0400
236#define VRDE_SCARD_STATE_MASK UINT32_C(0x0000FFFF)
237#define VRDE_SCARD_STATE_COUNT_MASK UINT32_C(0xFFFF0000)
238
239#define VRDE_SCARD_PROTOCOL_UNDEFINED 0x00000000
240#define VRDE_SCARD_PROTOCOL_T0 0x00000001
241#define VRDE_SCARD_PROTOCOL_T1 0x00000002
242#define VRDE_SCARD_PROTOCOL_Tx 0x00000003
243#define VRDE_SCARD_PROTOCOL_RAW 0x00010000
244
245#define VRDE_SCARD_PROTOCOL_DEFAULT 0x80000000
246#define VRDE_SCARD_PROTOCOL_OPTIMAL 0x00000000
247
248#define VRDE_SCARD_SHARE_EXCLUSIVE 0x00000001
249#define VRDE_SCARD_SHARE_SHARED 0x00000002
250#define VRDE_SCARD_SHARE_DIRECT 0x00000003
251
252/* u32Initialization, u32Disposition */
253#define VRDE_SCARD_LEAVE_CARD 0x00000000
254#define VRDE_SCARD_RESET_CARD 0x00000001
255#define VRDE_SCARD_UNPOWER_CARD 0x00000002
256#define VRDE_SCARD_EJECT_CARD 0x00000003
257
258/* VRDESCARDSTATUSRSP::u32State */
259#define VRDE_SCARD_UNKNOWN 0x00000000
260#define VRDE_SCARD_ABSENT 0x00000001
261#define VRDE_SCARD_PRESENT 0x00000002
262#define VRDE_SCARD_SWALLOWED 0x00000003
263#define VRDE_SCARD_POWERED 0x00000004
264#define VRDE_SCARD_NEGOTIABLE 0x00000005
265#define VRDE_SCARD_SPECIFICMODE 0x00000006
266
267
268/*
269 * IO request data structures.
270 */
271typedef struct VRDESCARDCONTEXT
272{
273 uint32_t u32ContextSize;
274 uint8_t au8Context[16];
275} VRDESCARDCONTEXT;
276
277typedef struct VRDESCARDHANDLE
278{
279 VRDESCARDCONTEXT Context;
280 uint32_t u32HandleSize;
281 uint8_t au8Handle[16];
282} VRDESCARDHANDLE;
283
284typedef struct VRDESCARDREADERSTATECALL
285{
286 char *pszReader; /* UTF8 */
287 uint32_t u32CurrentState; /* VRDE_SCARD_STATE_* */
288} VRDESCARDREADERSTATECALL;
289
290typedef struct VRDESCARDREADERSTATERETURN
291{
292 uint32_t u32CurrentState; /* VRDE_SCARD_STATE_* */
293 uint32_t u32EventState; /* VRDE_SCARD_STATE_* */
294 uint32_t u32AtrLength;
295 uint8_t au8Atr[VRDE_SCARD_MAX_ATR_LENGTH];
296} VRDESCARDREADERSTATERETURN;
297
298typedef struct VRDESCARDPCI
299{
300 uint32_t u32Protocol; /* VRDE_SCARD_PROTOCOL_* */
301 uint32_t u32PciLength; /* Includes u32Protocol and u32PciLength fields. 8 if no data in au8PciData. */
302 uint8_t au8PciData[VRDE_SCARD_MAX_PCI_DATA];
303} VRDESCARDPCI;
304
305typedef struct VRDESCARDESTABLISHCONTEXTREQ
306{
307 uint32_t u32ClientId;
308 uint32_t u32DeviceId;
309} VRDESCARDESTABLISHCONTEXTREQ;
310
311typedef struct VRDESCARDESTABLISHCONTEXTRSP
312{
313 uint32_t u32ReturnCode;
314 VRDESCARDCONTEXT Context;
315} VRDESCARDESTABLISHCONTEXTRSP;
316
317typedef struct VRDESCARDLISTREADERSREQ
318{
319 VRDESCARDCONTEXT Context;
320} VRDESCARDLISTREADERSREQ;
321
322typedef struct VRDESCARDLISTREADERSRSP
323{
324 uint32_t u32ReturnCode;
325 uint32_t cReaders;
326 char *apszNames[VRDE_SCARD_MAX_READERS]; /* UTF8 */
327} VRDESCARDLISTREADERSRSP;
328
329typedef struct VRDESCARDRELEASECONTEXTREQ
330{
331 VRDESCARDCONTEXT Context;
332} VRDESCARDRELEASECONTEXTREQ;
333
334typedef struct VRDESCARDRELEASECONTEXTRSP
335{
336 uint32_t u32ReturnCode;
337} VRDESCARDRELEASECONTEXTRSP;
338
339typedef struct VRDESCARDGETSTATUSCHANGEREQ
340{
341 VRDESCARDCONTEXT Context;
342 uint32_t u32Timeout; /* Milliseconds. 0xFFFFFFFF = INFINITE */
343 uint32_t cReaders;
344 VRDESCARDREADERSTATECALL aReaderStates[VRDE_SCARD_MAX_READERS];
345} VRDESCARDGETSTATUSCHANGEREQ;
346
347typedef struct VRDESCARDGETSTATUSCHANGERSP
348{
349 uint32_t u32ReturnCode;
350 uint32_t cReaders;
351 VRDESCARDREADERSTATERETURN aReaderStates[VRDE_SCARD_MAX_READERS];
352} VRDESCARDGETSTATUSCHANGERSP;
353
354typedef struct VRDESCARDCANCELREQ
355{
356 VRDESCARDCONTEXT Context;
357} VRDESCARDCANCELREQ;
358
359typedef struct VRDESCARDCANCELRSP
360{
361 uint32_t u32ReturnCode;
362} VRDESCARDCANCELRSP;
363
364typedef struct VRDESCARDCONNECTREQ
365{
366 VRDESCARDCONTEXT Context;
367 char *pszReader; /* UTF8 */
368 uint32_t u32ShareMode; /* VRDE_SCARD_SHARE_* */
369 uint32_t u32PreferredProtocols;
370} VRDESCARDCONNECTREQ;
371
372typedef struct VRDESCARDCONNECTRSP
373{
374 uint32_t u32ReturnCode;
375 VRDESCARDHANDLE hCard;
376 uint32_t u32ActiveProtocol;
377} VRDESCARDCONNECTRSP;
378
379typedef struct VRDESCARDRECONNECTREQ
380{
381 VRDESCARDHANDLE hCard;
382 uint32_t u32ShareMode;
383 uint32_t u32PreferredProtocols;
384 uint32_t u32Initialization;
385} VRDESCARDRECONNECTREQ;
386
387typedef struct VRDESCARDRECONNECTRSP
388{
389 uint32_t u32ReturnCode;
390 uint32_t u32ActiveProtocol;
391} VRDESCARDRECONNECTRSP;
392
393typedef struct VRDESCARDDISCONNECTREQ
394{
395 VRDESCARDHANDLE hCard;
396 uint32_t u32Disposition;
397} VRDESCARDDISCONNECTREQ;
398
399typedef struct VRDESCARDDISCONNECTRSP
400{
401 uint32_t u32ReturnCode;
402} VRDESCARDDISCONNECTRSP;
403
404typedef struct VRDESCARDBEGINTRANSACTIONREQ
405{
406 VRDESCARDHANDLE hCard;
407 uint32_t u32Disposition;
408} VRDESCARDBEGINTRANSACTIONREQ;
409
410typedef struct VRDESCARDBEGINTRANSACTIONRSP
411{
412 uint32_t u32ReturnCode;
413} VRDESCARDBEGINTRANSACTIONRSP;
414
415typedef struct VRDESCARDENDTRANSACTIONREQ
416{
417 VRDESCARDHANDLE hCard;
418 uint32_t u32Disposition;
419} VRDESCARDENDTRANSACTIONREQ;
420
421typedef struct VRDESCARDENDTRANSACTIONRSP
422{
423 uint32_t u32ReturnCode;
424} VRDESCARDENDTRANSACTIONRSP;
425
426typedef struct VRDESCARDSTATEREQ
427{
428 VRDESCARDHANDLE hCard;
429} VRDESCARDSTATEREQ;
430
431typedef struct VRDESCARDSTATERSP
432{
433 uint32_t u32ReturnCode;
434 uint32_t u32State;
435 uint32_t u32Protocol;
436 uint32_t u32AtrLength;
437 uint8_t au8Atr[VRDE_SCARD_MAX_ATR_LENGTH];
438} VRDESCARDSTATERSP;
439
440typedef struct VRDESCARDSTATUSREQ
441{
442 VRDESCARDHANDLE hCard;
443} VRDESCARDSTATUSREQ;
444
445typedef struct VRDESCARDSTATUSRSP
446{
447 uint32_t u32ReturnCode;
448 char *szReader;
449 uint32_t u32State;
450 uint32_t u32Protocol;
451 uint32_t u32AtrLength;
452 uint8_t au8Atr[VRDE_SCARD_MAX_ATR_LENGTH];
453} VRDESCARDSTATUSRSP;
454
455typedef struct VRDESCARDTRANSMITREQ
456{
457 VRDESCARDHANDLE hCard;
458 VRDESCARDPCI ioSendPci;
459 uint32_t u32SendLength;
460 uint8_t *pu8SendBuffer;
461 uint32_t u32RecvLength;
462} VRDESCARDTRANSMITREQ;
463
464typedef struct VRDESCARDTRANSMITRSP
465{
466 uint32_t u32ReturnCode;
467 VRDESCARDPCI ioRecvPci;
468 uint32_t u32RecvLength;
469 uint8_t *pu8RecvBuffer;
470} VRDESCARDTRANSMITRSP;
471
472typedef struct VRDESCARDCONTROLREQ
473{
474 VRDESCARDHANDLE hCard;
475 uint32_t u32ControlCode;
476 uint32_t u32InBufferSize;
477 uint8_t *pu8InBuffer;
478 uint32_t u32OutBufferSize;
479} VRDESCARDCONTROLREQ;
480
481typedef struct VRDESCARDCONTROLRSP
482{
483 uint32_t u32ReturnCode;
484 uint32_t u32OutBufferSize;
485 uint8_t *pu8OutBuffer;
486} VRDESCARDCONTROLRSP;
487
488typedef struct VRDESCARDGETATTRIBREQ
489{
490 VRDESCARDHANDLE hCard;
491 uint32_t u32AttrId;
492 uint32_t u32AttrLen;
493} VRDESCARDGETATTRIBREQ;
494
495typedef struct VRDESCARDGETATTRIBRSP
496{
497 uint32_t u32ReturnCode;
498 uint32_t u32AttrLength;
499 uint8_t *pu8Attr;
500} VRDESCARDGETATTRIBRSP;
501
502typedef struct VRDESCARDSETATTRIBREQ
503{
504 VRDESCARDHANDLE hCard;
505 uint32_t u32AttrId;
506 uint32_t u32AttrLen;
507 uint8_t *pu8Attr;
508} VRDESCARDSETATTRIBREQ;
509
510typedef struct VRDESCARDSETATTRIBRSP
511{
512 uint32_t u32ReturnCode;
513} VRDESCARDSETATTRIBRSP;
514
515#endif
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use