VirtualBox

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

Last change on this file since 41351 was 41351, checked in by vboxsync, 13 years ago

VRDP: smartcard support

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.6 KB
Line 
1/** @file
2 * VBox Remote Desktop Extension (VRDE) - SmartCard interface.
3 */
4
5/*
6 * Copyright (C) 2011-2012 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 VRDESCARD_MAX_READERS 10
153#define VRDESCARD_MAX_ATR_LENGTH 36
154#define VRDESCARD_MAX_PCI_DATA 1024
155
156/*
157 * IO request data structures.
158 */
159typedef struct VRDESCARDCONTEXT
160{
161 uint32_t u32ContextSize;
162 uint8_t au8Context[16];
163} VRDESCARDCONTEXT;
164
165typedef struct VRDESCARDHANDLE
166{
167 VRDESCARDCONTEXT Context;
168 uint32_t u32HandleSize;
169 uint8_t au8Handle[16];
170} VRDESCARDHANDLE;
171
172typedef struct VRDESCARDREADERSTATECALL
173{
174 char *pszReader; /* UTF8 */
175 uint32_t u32CurrentState;
176} VRDESCARDREADERSTATECALL;
177
178typedef struct VRDESCARDREADERSTATERETURN
179{
180 uint32_t u32CurrentState;
181 uint32_t u32EventState;
182 uint32_t u32AtrLength;
183 uint8_t au8Atr[VRDESCARD_MAX_ATR_LENGTH];
184} VRDESCARDREADERSTATERETURN;
185
186typedef struct VRDESCARDPCI
187{
188 uint32_t u32Protocol;
189 uint32_t u32PciLength; /* Includes u32Protocol and u32PciLength fields. 8 if no data in au8PciData. */
190 uint8_t au8PciData[VRDESCARD_MAX_PCI_DATA];
191} VRDESCARDPCI;
192
193typedef struct VRDESCARDESTABLISHCONTEXTREQ
194{
195 uint32_t u32ClientId;
196 uint32_t u32DeviceId;
197} VRDESCARDESTABLISHCONTEXTREQ;
198
199typedef struct VRDESCARDESTABLISHCONTEXTRSP
200{
201 uint32_t u32ReturnCode;
202 VRDESCARDCONTEXT Context;
203} VRDESCARDESTABLISHCONTEXTRSP;
204
205typedef struct VRDESCARDLISTREADERSREQ
206{
207 VRDESCARDCONTEXT Context;
208} VRDESCARDLISTREADERSREQ;
209
210typedef struct VRDESCARDLISTREADERSRSP
211{
212 uint32_t u32ReturnCode;
213 uint32_t cReaders;
214 char *apszNames[VRDESCARD_MAX_READERS]; /* UTF8 */
215} VRDESCARDLISTREADERSRSP;
216
217typedef struct VRDESCARDRELEASECONTEXTREQ
218{
219 VRDESCARDCONTEXT Context;
220} VRDESCARDRELEASECONTEXTREQ;
221
222typedef struct VRDESCARDRELEASECONTEXTRSP
223{
224 uint32_t u32ReturnCode;
225} VRDESCARDRELEASECONTEXTRSP;
226
227typedef struct VRDESCARDGETSTATUSCHANGEREQ
228{
229 VRDESCARDCONTEXT Context;
230 uint32_t u32Timeout;
231 uint32_t cReaders;
232 VRDESCARDREADERSTATECALL aReaderStates[VRDESCARD_MAX_READERS];
233} VRDESCARDGETSTATUSCHANGEREQ;
234
235typedef struct VRDESCARDGETSTATUSCHANGERSP
236{
237 uint32_t u32ReturnCode;
238 uint32_t cReaders;
239 VRDESCARDREADERSTATERETURN aReaderStates[VRDESCARD_MAX_READERS];
240} VRDESCARDGETSTATUSCHANGERSP;
241
242typedef struct VRDESCARDCANCELREQ
243{
244 VRDESCARDCONTEXT Context;
245} VRDESCARDCANCELREQ;
246
247typedef struct VRDESCARDCANCELRSP
248{
249 uint32_t u32ReturnCode;
250} VRDESCARDCANCELRSP;
251
252typedef struct VRDESCARDCONNECTREQ
253{
254 VRDESCARDCONTEXT Context;
255 char *pszReader; /* UTF8 */
256 uint32_t u32ShareMode;
257 uint32_t u32PreferredProtocols;
258} VRDESCARDCONNECTREQ;
259
260typedef struct VRDESCARDCONNECTRSP
261{
262 uint32_t u32ReturnCode;
263 VRDESCARDHANDLE hCard;
264 uint32_t u32ActiveProtocol;
265} VRDESCARDCONNECTRSP;
266
267typedef struct VRDESCARDRECONNECTREQ
268{
269 VRDESCARDHANDLE hCard;
270 uint32_t u32ShareMode;
271 uint32_t u32PreferredProtocols;
272 uint32_t u32Initialization;
273} VRDESCARDRECONNECTREQ;
274
275typedef struct VRDESCARDRECONNECTRSP
276{
277 uint32_t u32ReturnCode;
278 uint32_t u32ActiveProtocol;
279} VRDESCARDRECONNECTRSP;
280
281typedef struct VRDESCARDDISCONNECTREQ
282{
283 VRDESCARDHANDLE hCard;
284 uint32_t u32Disposition;
285} VRDESCARDDISCONNECTREQ;
286
287typedef struct VRDESCARDDISCONNECTRSP
288{
289 uint32_t u32ReturnCode;
290} VRDESCARDDISCONNECTRSP;
291
292typedef struct VRDESCARDBEGINTRANSACTIONREQ
293{
294 VRDESCARDHANDLE hCard;
295 uint32_t u32Disposition;
296} VRDESCARDBEGINTRANSACTIONREQ;
297
298typedef struct VRDESCARDBEGINTRANSACTIONRSP
299{
300 uint32_t u32ReturnCode;
301} VRDESCARDBEGINTRANSACTIONRSP;
302
303typedef struct VRDESCARDENDTRANSACTIONREQ
304{
305 VRDESCARDHANDLE hCard;
306 uint32_t u32Disposition;
307} VRDESCARDENDTRANSACTIONREQ;
308
309typedef struct VRDESCARDENDTRANSACTIONRSP
310{
311 uint32_t u32ReturnCode;
312} VRDESCARDENDTRANSACTIONRSP;
313
314typedef struct VRDESCARDSTATEREQ
315{
316 VRDESCARDHANDLE hCard;
317} VRDESCARDSTATEREQ;
318
319typedef struct VRDESCARDSTATERSP
320{
321 uint32_t u32ReturnCode;
322 uint32_t u32State;
323 uint32_t u32Protocol;
324 uint32_t u32AtrLength;
325 uint8_t au8Atr[VRDESCARD_MAX_ATR_LENGTH];
326} VRDESCARDSTATERSP;
327
328typedef struct VRDESCARDSTATUSREQ
329{
330 VRDESCARDHANDLE hCard;
331} VRDESCARDSTATUSREQ;
332
333typedef struct VRDESCARDSTATUSRSP
334{
335 uint32_t u32ReturnCode;
336 char *szReader;
337 uint32_t u32State;
338 uint32_t u32Protocol;
339 uint32_t u32AtrLength;
340 uint8_t au8Atr[VRDESCARD_MAX_ATR_LENGTH];
341} VRDESCARDSTATUSRSP;
342
343typedef struct VRDESCARDTRANSMITREQ
344{
345 VRDESCARDHANDLE hCard;
346 VRDESCARDPCI ioSendPci;
347 uint32_t u32SendLength;
348 uint8_t *pu8SendBuffer;
349 uint32_t u32RecvLength;
350} VRDESCARDTRANSMITREQ;
351
352typedef struct VRDESCARDTRANSMITRSP
353{
354 uint32_t u32ReturnCode;
355 VRDESCARDPCI ioRecvPci;
356 uint32_t u32RecvLength;
357 uint8_t *pu8RecvBuffer;
358} VRDESCARDTRANSMITRSP;
359
360typedef struct VRDESCARDCONTROLREQ
361{
362 VRDESCARDHANDLE hCard;
363 uint32_t u32ControlCode;
364 uint32_t u32InBufferSize;
365 uint8_t *pu8InBuffer;
366 uint32_t u32OutBufferSize;
367} VRDESCARDCONTROLREQ;
368
369typedef struct VRDESCARDCONTROLRSP
370{
371 uint32_t u32ReturnCode;
372 uint32_t u32OutBufferSize;
373 uint8_t *pu8OutBuffer;
374} VRDESCARDCONTROLRSP;
375
376typedef struct VRDESCARDGETATTRIBREQ
377{
378 VRDESCARDHANDLE hCard;
379 uint32_t u32AttrId;
380 uint32_t u32AttrLen;
381} VRDESCARDGETATTRIBREQ;
382
383typedef struct VRDESCARDGETATTRIBRSP
384{
385 uint32_t u32ReturnCode;
386 uint32_t u32AttrLength;
387 uint8_t *pu8Attr;
388} VRDESCARDGETATTRIBRSP;
389
390typedef struct VRDESCARDSETATTRIBREQ
391{
392 VRDESCARDHANDLE hCard;
393 uint32_t u32AttrId;
394 uint32_t u32AttrLen;
395 uint8_t *pu8Attr;
396} VRDESCARDSETATTRIBREQ;
397
398typedef struct VRDESCARDSETATTRIBRSP
399{
400 uint32_t u32ReturnCode;
401} VRDESCARDSETATTRIBRSP;
402
403#endif
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette