scard: changed the way we store and pass context

ulab-next
Laxmikant Rashinkar 11 years ago
parent a1352b62e3
commit 0ef89c02ab

@ -139,8 +139,6 @@ do \
typedef struct smartcard typedef struct smartcard
{ {
tui32 DeviceId; tui32 DeviceId;
char Context[16]; /* opaque context; save as passed to us */
int Context_len; /* Context len in bytes */
} SMARTCARD; } SMARTCARD;
/* globals */ /* globals */
@ -162,17 +160,20 @@ static int scard_add_new_device(tui32 device_id);
static int scard_get_free_slot(void); static int scard_get_free_slot(void);
static void scard_release_resources(void); static void scard_release_resources(void);
static void scard_send_EstablishContext(IRP* irp, int scope); static void scard_send_EstablishContext(IRP* irp, int scope);
static void scard_send_ReleaseContext(IRP* irp); static void scard_send_ReleaseContext(IRP* irp, tui32 context);
static void scard_send_ListReaders(IRP* irp, int wide); static void scard_send_ListReaders(IRP* irp, tui32 context, int wide);
static void scard_send_GetStatusChange(IRP* irp, int wide, tui32 timeout, static void scard_send_GetStatusChange(IRP* irp, tui32 context, int wide,
tui32 num_readers, READER_STATE* rsa); tui32 timeout, tui32 num_readers,
READER_STATE* rsa);
static void scard_send_Connect(IRP* irp, tui32 context, int wide,
READER_STATE* rs);
static void scard_send_Connect(IRP* irp, int wide, READER_STATE* rs);
static void scard_send_BeginTransaction(IRP* irp, tui32 sc_handle); static void scard_send_BeginTransaction(IRP* irp, tui32 sc_handle);
static void scard_send_EndTransaction(IRP* irp, tui32 sc_handle); static void scard_send_EndTransaction(IRP* irp, tui32 sc_handle);
static void scard_send_Status(IRP* irp, int wide, tui32 sc_handle); static void scard_send_Status(IRP* irp, int wide, tui32 sc_handle);
static void scard_send_Disconnect(IRP* irp, tui32 sc_handle); static void scard_send_Disconnect(IRP* irp, tui32 context, tui32 sc_handle);
/****************************************************************************** /******************************************************************************
** local callbacks into this module ** ** local callbacks into this module **
@ -310,7 +311,7 @@ scard_send_irp_establish_context(struct trans *con, int scope)
* Release a previously established Smart Card context * Release a previously established Smart Card context
*****************************************************************************/ *****************************************************************************/
int int
APP_CC scard_send_release_context(struct trans *con) APP_CC scard_send_release_context(struct trans *con, tui32 context)
{ {
IRP *irp; IRP *irp;
@ -328,7 +329,7 @@ APP_CC scard_send_release_context(struct trans *con)
irp->user_data = con; irp->user_data = con;
/* send IRP to client */ /* send IRP to client */
scard_send_ReleaseContext(irp); scard_send_ReleaseContext(irp, context);
return 0; return 0;
} }
@ -337,7 +338,7 @@ APP_CC scard_send_release_context(struct trans *con)
* *
*****************************************************************************/ *****************************************************************************/
int APP_CC int APP_CC
scard_send_irp_list_readers(struct trans *con) scard_send_irp_list_readers(struct trans *con, tui32 context, int wide)
{ {
IRP *irp; IRP *irp;
@ -354,7 +355,7 @@ scard_send_irp_list_readers(struct trans *con)
irp->user_data = con; irp->user_data = con;
/* send IRP to client */ /* send IRP to client */
scard_send_ListReaders(irp, 1); scard_send_ListReaders(irp, context, wide);
return 0; return 0;
} }
@ -369,8 +370,9 @@ scard_send_irp_list_readers(struct trans *con)
* @param rsa array of READER_STATEs * @param rsa array of READER_STATEs
*****************************************************************************/ *****************************************************************************/
int APP_CC int APP_CC
scard_send_irp_get_status_change(struct trans *con, int wide, tui32 timeout, scard_send_irp_get_status_change(struct trans *con, tui32 context, int wide,
tui32 num_readers, READER_STATE* rsa) tui32 timeout, tui32 num_readers,
READER_STATE* rsa)
{ {
IRP *irp; IRP *irp;
@ -388,7 +390,7 @@ scard_send_irp_get_status_change(struct trans *con, int wide, tui32 timeout,
irp->user_data = con; irp->user_data = con;
/* send IRP to client */ /* send IRP to client */
scard_send_GetStatusChange(irp, wide, timeout, num_readers, rsa); scard_send_GetStatusChange(irp, context, wide, timeout, num_readers, rsa);
return 0; return 0;
} }
@ -400,7 +402,8 @@ scard_send_irp_get_status_change(struct trans *con, int wide, tui32 timeout,
* @param wide TRUE if unicode string * @param wide TRUE if unicode string
*****************************************************************************/ *****************************************************************************/
int APP_CC int APP_CC
scard_send_irp_connect(struct trans *con, int wide, READER_STATE* rs) scard_send_irp_connect(struct trans *con, tui32 context, int wide,
READER_STATE* rs)
{ {
IRP *irp; IRP *irp;
@ -418,7 +421,7 @@ scard_send_irp_connect(struct trans *con, int wide, READER_STATE* rs)
irp->user_data = con; irp->user_data = con;
/* send IRP to client */ /* send IRP to client */
scard_send_Connect(irp, wide, rs); scard_send_Connect(irp, context, wide, rs);
return 0; return 0;
} }
@ -521,7 +524,7 @@ APP_CC scard_send_status(struct trans *con, int wide, tui32 sc_handle)
* @param sc_handle handle to smartcard * @param sc_handle handle to smartcard
*****************************************************************************/ *****************************************************************************/
int int
APP_CC scard_send_disconnect(struct trans *con, tui32 sc_handle) APP_CC scard_send_disconnect(struct trans *con, tui32 context, tui32 sc_handle)
{ {
IRP *irp; IRP *irp;
@ -539,7 +542,7 @@ APP_CC scard_send_disconnect(struct trans *con, tui32 sc_handle)
irp->user_data = con; irp->user_data = con;
/* send IRP to client */ /* send IRP to client */
scard_send_Disconnect(irp, sc_handle); scard_send_Disconnect(irp, context, sc_handle);
return 0; return 0;
} }
@ -716,7 +719,7 @@ scard_send_EstablishContext(IRP *irp, int scope)
* Release a previously established Smart Card context * Release a previously established Smart Card context
*****************************************************************************/ *****************************************************************************/
static void static void
scard_send_ReleaseContext(IRP* irp) scard_send_ReleaseContext(IRP* irp, tui32 context)
{ {
/* see [MS-RDPESC] 3.1.4.2 */ /* see [MS-RDPESC] 3.1.4.2 */
@ -750,8 +753,8 @@ scard_send_ReleaseContext(IRP* irp)
xstream_seek(s, 12); xstream_seek(s, 12);
/* insert context */ /* insert context */
xstream_wr_u32_le(s, sc->Context_len); xstream_wr_u32_le(s, 4);
xstream_copyin(s, sc->Context, sc->Context_len); xstream_wr_u32_le(s, context);
/* get stream len */ /* get stream len */
bytes = xstream_len(s); bytes = xstream_len(s);
@ -768,7 +771,7 @@ scard_send_ReleaseContext(IRP* irp)
* *
*****************************************************************************/ *****************************************************************************/
static void APP_CC static void APP_CC
scard_send_ListReaders(IRP *irp, int wide) scard_send_ListReaders(IRP *irp, tui32 context, int wide)
{ {
/* see [MS-RDPESC] 2.2.2.4 */ /* see [MS-RDPESC] 2.2.2.4 */
@ -793,8 +796,8 @@ scard_send_ListReaders(IRP *irp, int wide)
xstream_seek(s, 28); /* freerdp does not use this */ xstream_seek(s, 28); /* freerdp does not use this */
/* insert context */ /* insert context */
xstream_wr_u32_le(s, sc->Context_len); xstream_wr_u32_le(s, 4);
xstream_copyin(s, sc->Context, sc->Context_len); xstream_wr_u32_le(s, context);
xstream_wr_u32_le(s, 36); /* length of mszGroups */ xstream_wr_u32_le(s, 36); /* length of mszGroups */
xstream_wr_u16_le(s, 0x0053); xstream_wr_u16_le(s, 0x0053);
@ -863,7 +866,7 @@ scard_send_ListReaders(IRP *irp, int wide)
* @param rsa array of READER_STATEs * @param rsa array of READER_STATEs
*****************************************************************************/ *****************************************************************************/
static void static void
scard_send_GetStatusChange(IRP* irp, int wide, tui32 timeout, scard_send_GetStatusChange(IRP* irp, tui32 context, int wide, tui32 timeout,
tui32 num_readers, READER_STATE* rsa) tui32 num_readers, READER_STATE* rsa)
{ {
/* see [MS-RDPESC] 2.2.2.11 for ASCII */ /* see [MS-RDPESC] 2.2.2.11 for ASCII */
@ -898,8 +901,8 @@ scard_send_GetStatusChange(IRP* irp, int wide, tui32 timeout,
xstream_wr_u32_le(s, 0); /* unused */ xstream_wr_u32_le(s, 0); /* unused */
/* insert context */ /* insert context */
xstream_wr_u32_le(s, sc->Context_len); xstream_wr_u32_le(s, 4);
xstream_copyin(s, sc->Context, sc->Context_len); xstream_wr_u32_le(s, context);
xstream_wr_u32_le(s, 0); /* unused */ xstream_wr_u32_le(s, 0); /* unused */
@ -966,7 +969,8 @@ scard_send_GetStatusChange(IRP* irp, int wide, tui32 timeout,
* @param wide TRUE if unicode string * @param wide TRUE if unicode string
* @param rs reader state * @param rs reader state
*****************************************************************************/ *****************************************************************************/
static void scard_send_Connect(IRP* irp, int wide, READER_STATE* rs) static void scard_send_Connect(IRP* irp, tui32 context, int wide,
READER_STATE* rs)
{ {
/* see [MS-RDPESC] 2.2.2.13 for ASCII */ /* see [MS-RDPESC] 2.2.2.13 for ASCII */
/* see [MS-RDPESC] 2.2.2.14 for Wide char */ /* see [MS-RDPESC] 2.2.2.14 for Wide char */
@ -1026,8 +1030,8 @@ static void scard_send_Connect(IRP* irp, int wide, READER_STATE* rs)
} }
/* insert context */ /* insert context */
xstream_wr_u32_le(s, sc->Context_len); xstream_wr_u32_le(s, 4);
xstream_copyin(s, sc->Context, sc->Context_len); xstream_wr_u32_le(s, context);
/* get stream len */ /* get stream len */
bytes = xstream_len(s); bytes = xstream_len(s);
@ -1224,7 +1228,7 @@ scard_send_Status(IRP* irp, int wide, tui32 sc_handle)
* @param sc_handle handle to smartcard * @param sc_handle handle to smartcard
*****************************************************************************/ *****************************************************************************/
static void static void
scard_send_Disconnect(IRP* irp, tui32 sc_handle) scard_send_Disconnect(IRP* irp, tui32 context, tui32 sc_handle)
{ {
/* see [MS-RDPESC] 3.1.4.30 */ /* see [MS-RDPESC] 3.1.4.30 */
@ -1260,8 +1264,8 @@ scard_send_Disconnect(IRP* irp, tui32 sc_handle)
xstream_wr_u32_le(s, SCARD_RESET_CARD); xstream_wr_u32_le(s, SCARD_RESET_CARD);
/* insert context */ /* insert context */
xstream_wr_u32_le(s, sc->Context_len); xstream_wr_u32_le(s, 4);
xstream_copyin(s, sc->Context, sc->Context_len); xstream_wr_u32_le(s, context);
/* insert handle */ /* insert handle */
xstream_wr_u32_le(s, 4); xstream_wr_u32_le(s, 4);
@ -1292,6 +1296,7 @@ scard_handle_EstablishContext_Return(struct stream *s, IRP *irp,
tui32 DeviceId, tui32 CompletionId, tui32 DeviceId, tui32 CompletionId,
tui32 IoStatus) tui32 IoStatus)
{ {
tui32 context;
tui32 len; tui32 len;
int tmp; int tmp;
SMARTCARD *sc; SMARTCARD *sc;
@ -1327,22 +1332,17 @@ scard_handle_EstablishContext_Return(struct stream *s, IRP *irp,
xstream_rd_u32_le(s, tmp); /* ?? */ xstream_rd_u32_le(s, tmp); /* ?? */
xstream_rd_u32_le(s, tmp); /* ?? */ xstream_rd_u32_le(s, tmp); /* ?? */
xstream_rd_u32_le(s, tmp); /* ?? */ xstream_rd_u32_le(s, tmp); /* ?? */
xstream_rd_u32_le(s, len); /* len of context in bytes */ xstream_rd_u32_le(s, len); /* len of context in bytes, always 4 */
sc->Context_len = len; xstream_rd_u32_le(s, context);
xstream_copyout(sc->Context, s, len);
if (LOG_LEVEL == LOG_DEBUG) if (LOG_LEVEL == LOG_DEBUG)
{ log_debug("dumping: )", context);
log_debug("dumping context (%d bytes)", sc->Context_len);
g_hexdump(sc->Context, sc->Context_len);
}
// LK_TODO delete this // LK_TODO delete this
//irp->callback = scard_handle_ListReaders_Return; //irp->callback = scard_handle_ListReaders_Return;
//scard_send_ListReaders(irp, 1);
scard_function_establish_context_return((struct trans *) (irp->user_data), scard_function_establish_context_return((struct trans *) (irp->user_data),
((int*)(sc->Context))[0]); context);
devredir_irp_delete(irp); devredir_irp_delete(irp);

@ -74,16 +74,19 @@ int APP_CC scard_check_wait_objs(void);
int APP_CC scard_init(void); int APP_CC scard_init(void);
int APP_CC scard_deinit(void); int APP_CC scard_deinit(void);
int APP_CC scard_send_irp_establish_context(struct trans *con, int scope); int APP_CC scard_send_irp_establish_context(struct trans *con, int scope);
int APP_CC scard_send_release_context(struct trans *con); int APP_CC scard_send_release_context(struct trans *con, tui32 context);
int APP_CC scard_send_irp_list_readers(struct trans *con); int APP_CC scard_send_irp_list_readers(struct trans *con, tui32 context, int wide);
int APP_CC scard_send_irp_get_status_change(struct trans *con, int wide, tui32 timeout, int APP_CC scard_send_irp_get_status_change(struct trans *con, tui32 context,
int wide, tui32 timeout,
tui32 num_readers, READER_STATE* rsa); tui32 num_readers, READER_STATE* rsa);
int APP_CC scard_send_irp_connect(struct trans *con, int wide, READER_STATE* rs); int APP_CC scard_send_irp_connect(struct trans *con, tui32 context, int wide,
READER_STATE* rs);
int APP_CC scard_send_begin_transaction(struct trans *con, tui32 sc_handle); int APP_CC scard_send_begin_transaction(struct trans *con, tui32 sc_handle);
int APP_CC scard_send_end_transaction(struct trans *con, tui32 sc_handle); int APP_CC scard_send_end_transaction(struct trans *con, tui32 sc_handle);
int APP_CC scard_send_status(struct trans *con, int wide, tui32 sc_handle); int APP_CC scard_send_status(struct trans *con, int wide, tui32 sc_handle);
int APP_CC scard_send_disconnect(struct trans *con, tui32 sc_handle); int APP_CC scard_send_disconnect(struct trans *con, tui32 context, tui32 sc_handle);
#endif /* end #ifndef _SMARTCARD_C */ #endif /* end #ifndef _SMARTCARD_C */

@ -23,6 +23,9 @@
* pcsc lib and daemon write struct on unix domain socket for communication * pcsc lib and daemon write struct on unix domain socket for communication
*/ */
#define JAY_TODO_CONTEXT 0
#define JAY_TODO_WIDE 1
#define PCSC_STANDIN 1 #define PCSC_STANDIN 1
#include "os_calls.h" #include "os_calls.h"
@ -190,7 +193,7 @@ scard_process_establish_context(struct trans *con, struct stream *in_s)
/*****************************************************************************/ /*****************************************************************************/
/* returns error */ /* returns error */
int APP_CC int APP_CC
scard_function_establish_context_return(struct trans *con, int context) scard_function_establish_context_return(struct trans *con, tui32 context)
{ {
struct establish_struct out_es; struct establish_struct out_es;
struct stream *out_s; struct stream *out_s;
@ -279,7 +282,7 @@ scard_process_get_readers_state(struct trans *con, struct stream *in_s)
} }
g_xrdp_pcsc_state |= XRDP_PCSC_STATE_GOT_LR; g_xrdp_pcsc_state |= XRDP_PCSC_STATE_GOT_LR;
scard_send_irp_list_readers(con); scard_send_irp_list_readers(con, JAY_TODO_CONTEXT, JAY_TODO_WIDE);
return 0; return 0;
} }
@ -424,7 +427,7 @@ scard_process_read_state_change(struct trans *con, struct stream *in_s)
#endif #endif
g_xrdp_pcsc_state |= XRDP_PCSC_STATE_GOT_RSC; g_xrdp_pcsc_state |= XRDP_PCSC_STATE_GOT_RSC;
scard_send_irp_get_status_change(con, 1, in_rsc.timeOut, g_num_readers, scard_send_irp_get_status_change(con, JAY_TODO_CONTEXT, 1, in_rsc.timeOut, g_num_readers,
g_xrdp_reader_states); g_xrdp_reader_states);
LLOGLN(0, ("scard_process_read_state_change: timeout %d rv %d", LLOGLN(0, ("scard_process_read_state_change: timeout %d rv %d",

@ -24,23 +24,17 @@
#ifndef _SMARTCARD_PCSC_H #ifndef _SMARTCARD_PCSC_H
#define _SMARTCARD_PCSC_H #define _SMARTCARD_PCSC_H
int APP_CC int APP_CC scard_pcsc_get_wait_objs(tbus *objs, int *count, int *timeout);
scard_pcsc_get_wait_objs(tbus *objs, int *count, int *timeout); int APP_CC scard_pcsc_check_wait_objs(void);
int APP_CC int APP_CC scard_pcsc_init(void);
scard_pcsc_check_wait_objs(void); int APP_CC scard_pcsc_deinit(void);
int APP_CC int APP_CC scard_function_establish_context_return(struct trans *con, tui32 context);
scard_pcsc_init(void);
int APP_CC int APP_CC scard_function_list_readers_return(struct trans *con,
scard_pcsc_deinit(void);
int APP_CC
scard_function_establish_context_return(struct trans *con, int context);
int APP_CC
scard_function_list_readers_return(struct trans *con,
struct stream *in_s,
int len);
int APP_CC
scard_function_get_status_change_return(struct trans *con,
struct stream *in_s, struct stream *in_s,
int len); int len);
int APP_CC scard_function_get_status_change_return(struct trans *con,
struct stream *in_s, int len);
#endif /* end #ifndef _SMARTCARD_PCSC_H */ #endif /* end #ifndef _SMARTCARD_PCSC_H */

Loading…
Cancel
Save