summaryrefslogtreecommitdiffstats
path: root/sesman/chansrv/smartcard.h
blob: 590f89661d098cd9152a80cf93a1dccad4b29aa6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
/**
 * xrdp: A Remote Desktop Protocol server.
 *
 * Copyright (C) Laxmikant Rashinkar 2013 LK.Rashinkar@gmail.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

/*
 * smartcard redirection support
 */

#ifndef _SMARTCARD_C
#define _SMARTCARD_C

#include "parse.h"
#include "irp.h"
#include "trans.h"

#define SCARD_SHARE_EXCLUSIVE       0x00000001
#define SCARD_SHARE_SHARED          0x00000002
#define SCARD_SHARE_DIRECT          0x00000003

/* see [MS-RDPESC] 2.2.5 protocol identifier - Table A */
#define SCARD_PROTOCOL_UNDEFINED    0x00000000
#define SCARD_PROTOCOL_T0           0x00000001
#define SCARD_PROTOCOL_T1           0x00000002
#define SCARD_PROTOCOL_Tx           0x00000003
#define SCARD_PROTOCOL_RAW          0x00010000

/* see [MS-RDPESC] 2.2.5 protocol identifier - Table B */
#define SCARD_PROTOCOL_DEFAULT      0x80000000
#define SCARD_PROTOCOL_OPTIMAL      0x00000000

/* initialization type */
#define SCARD_LEAVE_CARD            0x00000000 /* do not do anything      */
#define SCARD_RESET_CARD            0x00000001 /* reset smart card        */
#define SCARD_UNPOWER_CARD          0x00000002 /* turn off and reset card */

struct xrdp_scard_io_request
{
    tui32 dwProtocol;
    tui32 cbPciLength;
    int extra_bytes;
    char *extra_data;
};

typedef struct reader_state
{
    char   reader_name[128];
    tui32  current_state;
    tui32  event_state;
    tui32  atr_len; /* number of bytes in atr[] */
    tui8   atr[36];

    /*
     * share mode flag, can be one of:
     *  SCARD_SHARE_EXCLUSIVE  app not willing to share smartcard with other apps
     *  SCARD_SHARE_SHARED     app willing to share smartcard with other apps
     *  SCARD_SHARE_DIRECT     app demands direct control of smart card, hence
     *                         it is not available to other readers
     */
    tui32  dwShareMode;

    /*
     * This field MUST have a value from Table A which is logically
     * OR'ed with a value from Table B.
     */
    tui32  dwPreferredProtocols;

    /*
     * initialization type, must be one of the initialization type
     * defined above
     */
    tui32  init_type;

    /* required by scard_send_transmit(), scard_send_control() */
    tui32 map0;
    tui32 map1;
    tui32 map2;
    tui32 map3;
    tui32 map4;
    tui32 map5;
    tui32 map6;

    tui32 dwProtocol;
    tui32 cbPciLength;
    tui32 cbSendLength;
    tui32 cbRecvLength;
    tui32 dwControlCode;
    tui32 cbOutBufferSize;
    tui32 dwAttribId;
    tui32 dwAttrLen;

} READER_STATE;

void scard_device_announce(tui32 device_id);
int  scard_get_wait_objs(tbus *objs, int *count, int *timeout);
int  scard_check_wait_objs(void);
int  scard_init(void);
int  scard_deinit(void);
int  scard_send_establish_context(void *user_data, int scope);
int  scard_send_release_context(void *user_data,
                                       char *context, int context_bytes);
int  scard_send_is_valid_context(void *user_data,
                                        char *context, int context_bytes);
int  scard_send_list_readers(void *user_data,
                                    char *context, int context_bytes,
                                    char *groups, int cchReaders, int wide);

int  scard_send_get_status_change(void *user_data,
                                         char *context, int context_bytes,
                                         int wide, tui32 timeout,
                                         tui32 num_readers, READER_STATE* rsa);

int  scard_send_connect(void *user_data,
                               char *context, int context_bytes, int wide,
                               READER_STATE* rs);

int  scard_send_reconnect(void *user_data,
                                 char *context, int context_bytes,
                                 char *card, int card_bytes,
                                 READER_STATE* rs);

int  scard_send_begin_transaction(void *user_data,
                                         char *context, int context_bytes,
                                         char *card, int card_bytes);
int  scard_send_end_transaction(void *user_data,
                                       char *context, int context_bytes,
                                       char *card, int card_bytes,
                                       tui32 dwDisposition);
int  scard_send_status(void *user_data, int wide,
                              char *context, int context_bytes,
                              char *card, int card_bytes,
                              int cchReaderLen, int cbAtrLen);
int  scard_send_disconnect(void *user_data,
                                  char *context, int context_bytes,
                                  char *card, int card_bytes,
                                  int dwDisposition);

int  scard_send_transmit(void *user_data,
                                char *context, int context_bytes,
                                char *card, int card_bytes,
                                char *send_data, int send_bytes, int recv_bytes,
                                struct xrdp_scard_io_request *send_ior,
                                struct xrdp_scard_io_request *recv_ior);

int  scard_send_control(void *user_data,
                               char *context, int context_bytes,
                               char *card, int card_bytes,
                               char *send_data, int send_bytes,
                               int recv_bytes, int control_code);

int  scard_send_cancel(void *user_data,
                              char *context, int context_bytes);

int  scard_send_get_attrib(void *user_data, char *card, int card_bytes,
                                  READER_STATE* rs);

/*
 * Notes:
 *      SCardTransmit - partially done
 *      SCardControl - partially done
 *      SCardListReaderGroups - not supported
 *      SCardSetAttrib - not supported
 */
#endif /* end #ifndef _SMARTCARD_C */