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
|
/*
rdesktop: A Remote Desktop Protocol client.
Smart Card support
Copyright (C) Alexi Volkov <alexi@myrealbox.com> 2006
Copyright 2016 Alexander Zakharov <uglym8@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <pthread.h>
#include "proto.h"
/*************************************************************************/
/* these are the additional types needed to split out 64-vs-32-bit APIs */
/* */
/* The point of all of this is to avoid patching the existing smartcard
* infrastructure (PC/SC Lite, libmusclecard+libmusclepkcs11 or CoolKey, any
* other apps linking against any of these) because the need for patches
* spreads without limit. The alternative is to patch the heck out of rdesktop,
* which is already being done anyway.
*
* - jared.jennings@eglin.af.mil, 2 Aug 2006
*/
#ifdef HAVE_STDINT_H
#include <stdint.h>
#endif
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#endif
/* A DWORD when dealing with the smartcard stuff. Could be 32 bits or 64. */
typedef DWORD MYPCSC_DWORD;
/* A DWORD when talking to the server. Must be exactly 32 bits all the time.*/
typedef uint32_t SERVER_DWORD;
typedef SCARDCONTEXT MYPCSC_SCARDCONTEXT;
typedef SCARDHANDLE MYPCSC_SCARDHANDLE;
typedef uint32_t SERVER_SCARDCONTEXT;
typedef uint32_t SERVER_SCARDHANDLE;
typedef SCARD_READERSTATE MYPCSC_SCARD_READERSTATE_A, *MYPCSC_LPSCARD_READERSTATE_A;
typedef struct
{
const char *szReader;
void *pvUserData;
SERVER_DWORD dwCurrentState;
SERVER_DWORD dwEventState;
SERVER_DWORD cbAtr;
unsigned char rgbAtr[36];
}
SERVER_SCARD_READERSTATE_A;
typedef SERVER_SCARD_READERSTATE_A *SERVER_LPSCARD_READERSTATE_A;
#define SERVER_SCARDSTATESIZE (sizeof(SERVER_SCARD_READERSTATE_A) - sizeof(const char *) - sizeof(void *))
#define MYPCSC_SCARDSTATESIZE (sizeof(MYPCSC_SCARD_READERSTATE_A) - sizeof(const char *) - sizeof(void *))
typedef struct _SERVER_SCARD_IO_REQUEST
{
SERVER_DWORD dwProtocol; /* Protocol identifier */
SERVER_DWORD cbPciLength; /* Protocol Control Inf Length */
}
SERVER_SCARD_IO_REQUEST, *SERVER_LPSCARD_IO_REQUEST;
typedef SCARD_IO_REQUEST MYPCSC_SCARD_IO_REQUEST;
typedef LPSCARD_IO_REQUEST MYPCSC_LPSCARD_IO_REQUEST;
/* */
/* */
/*************************************************************************/
#define SC_TRUE 1
#define SC_FALSE 0
#define SC_ESTABLISH_CONTEXT 0x00090014 /* EstablishContext */
#define SC_RELEASE_CONTEXT 0x00090018 /* ReleaseContext */
#define SC_IS_VALID_CONTEXT 0x0009001C /* IsValidContext */
#define SC_LIST_READER_GROUPS 0x00090020 /* ListReaderGroups */
#define SC_LIST_READERS 0x00090028 /* ListReadersA */
#define SC_INTRODUCE_READER_GROUP 0x00090050 /* IntroduceReaderGroup */
#define SC_FORGET_READER_GROUP 0x00090058 /* ForgetReader */
#define SC_INTRODUCE_READER 0x00090060 /* IntroduceReader */
#define SC_FORGET_READER 0x00090068 /* IntroduceReader */
#define SC_ADD_READER_TO_GROUP 0x00090070 /* AddReaderToGroup */
#define SC_REMOVE_READER_FROM_GROUP 0x00090078 /* RemoveReaderFromGroup */
#define SC_CONNECT 0x000900AC /* ConnectA */
#define SC_RECONNECT 0x000900B4 /* Reconnect */
#define SC_DISCONNECT 0x000900B8 /* Disconnect */
#define SC_GET_STATUS_CHANGE 0x000900A0 /* GetStatusChangeA */
#define SC_CANCEL 0x000900A8 /* Cancel */
#define SC_BEGIN_TRANSACTION 0x000900BC /* BeginTransaction */
#define SC_END_TRANSACTION 0x000900C0 /* EndTransaction */
#define SC_STATE 0x000900C4 /* State */
#define SC_STATUS 0x000900C8 /* StatusA */
#define SC_TRANSMIT 0x000900D0 /* Transmit */
#define SC_CONTROL 0x000900D4 /* Control */
#define SC_GETATTRIB 0x000900D8 /* GetAttrib */
#define SC_SETATTRIB 0x000900DC /* SetAttrib */
#define SC_ACCESS_STARTED_EVENT 0x000900E0 /* SCardAccessStartedEvent */
#define SC_LOCATE_CARDS_BY_ATR 0x000900E8 /* LocateCardsByATR */
/* #define INPUT_LINKED 0x00020000 */
#define INPUT_LINKED 0xFFFFFFFF
#define SC_THREAD_FUNCTION(f) void *(*f)(void *)
extern RDPDR_DEVICE g_rdpdr_device[];
typedef struct _MEM_HANDLE
{
struct _MEM_HANDLE *prevHandle;
struct _MEM_HANDLE *nextHandle;
int dataSize;
} MEM_HANDLE, *PMEM_HANDLE;
typedef struct _SCARD_ATRMASK_L
{
unsigned int cbAtr;
unsigned char rgbAtr[36];
unsigned char rgbMask[36];
} SCARD_ATRMASK_L, *PSCARD_ATRMASK_L, *LPSCARD_ATRMASK_L;
typedef struct _TSCNameMapRec
{
char alias[128];
char name[128];
char vendor[128];
} TSCNameMapRec, *PSCNameMapRec;
typedef struct _TSCHCardRec
{
DWORD hCard;
char *vendor;
struct _TSCHCardRec *next;
struct _TSCHCardRec *prev;
} TSCHCardRec, *PSCHCardRec;
typedef struct _TSCThreadData
{
uint32 device;
uint32 id;
uint32 epoch;
uint32 srv_buf_len;
RD_NTHANDLE handle;
uint32 request;
STREAM in;
STREAM out;
PMEM_HANDLE memHandle;
struct _TSCThreadData *next;
} TSCThreadData, *PSCThreadData;
typedef struct _TThreadListElement
{
pthread_t thread;
pthread_mutex_t busy;
pthread_cond_t nodata;
PSCThreadData data;
struct _TThreadListElement *next;
} TThreadListElement, *PThreadListElement;
|