From da44cd7f86eaf8382987a096cef2e716724b801c Mon Sep 17 00:00:00 2001 From: frankmorgner Date: Sat, 15 Jan 2011 00:35:52 +0000 Subject: [PATCH] - fixed problem when powering the card - removed unused code that had to do with slot-complexity git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@387 96b47cad-a561-4643-ad3b-153ac7d7599c --- ccid/src/ccid.c | 116 ++++++++++++++++++++++++------------------------ ccid/src/usb.c | 3 +- 2 files changed, 61 insertions(+), 58 deletions(-) diff --git a/ccid/src/ccid.c b/ccid/src/ccid.c index ad61ea2..e620447 100644 --- a/ccid/src/ccid.c +++ b/ccid/src/ccid.c @@ -46,7 +46,7 @@ static size_t ef_cardaccess_length = 0; static sc_context_t *ctx = NULL; static sc_card_t *card = NULL; -static sc_reader_t *reader; +static sc_reader_t *reader = NULL; struct ccid_class_descriptor ccid_desc = { @@ -109,15 +109,15 @@ detect_card_presence(void) if (sc_result == 0 && card) { sc_disconnect_card(card); - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Card removed from slot 0"); + sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Card removed"); } if (sc_result & SC_READER_CARD_CHANGED) { sc_disconnect_card(card); - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Card exchanged in slot 0"); + sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Card exchanged"); } if (sc_result & SC_READER_CARD_PRESENT && !card) { - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Unused card in slot 0"); + sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Unused card"); } return sc_result; @@ -132,8 +132,6 @@ int ccid_initialize(int reader_id, const char *cdriver, int verbose) if (i < 0) return i; - ccid_desc.bMaxSlotIndex = 1; - #ifdef WITH_PACE memset(&sctx, 0, sizeof(sctx)); #ifdef BUERGERCLIENT_WORKAROUND @@ -166,7 +164,7 @@ void ccid_shutdown() #endif } -static int get_rapdu(sc_apdu_t *apdu, size_t slot, __u8 **buf, size_t *resplen) +static int get_rapdu(sc_apdu_t *apdu, __u8 **buf, size_t *resplen) { int sc_result; @@ -239,7 +237,7 @@ static __u8 get_bError(int sc_result) return CCID_BERROR_OK; } -static __u8 get_bStatus(int sc_result, __u8 bSlot) +static __u8 get_bStatus(int sc_result) { int flags; __u8 bstatus = 0; @@ -250,29 +248,29 @@ static __u8 get_bStatus(int sc_result, __u8 bSlot) if (sc_result < 0) { if (flags & SC_READER_CARD_PRESENT) { if (flags & SC_READER_CARD_CHANGED - || card) { - /*sc_debug(ctx, SC_LOG_DEBUG_NORMAL, SC_LOG_DEBUG_NORMAL, "error inactive");*/ + && !card) { + sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "error inactive"); bstatus = CCID_BSTATUS_ERROR_INACTIVE; } else { - /*sc_debug(ctx, SC_LOG_DEBUG_NORMAL, SC_LOG_DEBUG_NORMAL, "error active");*/ + sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "error active"); bstatus = CCID_BSTATUS_ERROR_ACTIVE; } } else { - /*sc_debug(ctx, SC_LOG_DEBUG_NORMAL, SC_LOG_DEBUG_NORMAL, "error no icc");*/ + sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "error no icc"); bstatus = CCID_BSTATUS_ERROR_NOICC; } } else { if (flags & SC_READER_CARD_PRESENT) { if (flags & SC_READER_CARD_CHANGED - || card) { - /*sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "ok inactive");*/ + && !card) { + sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "ok inactive"); bstatus = CCID_BSTATUS_OK_INACTIVE; } else { - /*sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "ok active");*/ + sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "ok active"); bstatus = CCID_BSTATUS_OK_ACTIVE; } } else { - /*sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "ok no icc");*/ + sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "ok no icc"); bstatus = CCID_BSTATUS_OK_NOICC; } } @@ -286,7 +284,7 @@ static __u8 get_bStatus(int sc_result, __u8 bSlot) } static int -get_RDR_to_PC_SlotStatus(__u8 bSlot, __u8 bSeq, int sc_result, __u8 **outbuf, size_t *outlen, +get_RDR_to_PC_SlotStatus(__u8 bSeq, int sc_result, __u8 **outbuf, size_t *outlen, const __u8 *abProtocolDataStructure, size_t abProtocolDataStructureLen) { if (!outbuf) @@ -305,9 +303,9 @@ get_RDR_to_PC_SlotStatus(__u8 bSlot, __u8 bSeq, int sc_result, __u8 **outbuf, si status->bMessageType = 0x81; status->dwLength = __constant_cpu_to_le32(abProtocolDataStructureLen); - status->bSlot = bSlot; + status->bSlot = 0; status->bSeq = bSeq; - status->bStatus = get_bStatus(sc_result, bSlot); + status->bStatus = get_bStatus(sc_result); status->bError = get_bError(sc_result); status->bClockStatus = 0; @@ -318,7 +316,7 @@ get_RDR_to_PC_SlotStatus(__u8 bSlot, __u8 bSeq, int sc_result, __u8 **outbuf, si } static int -get_RDR_to_PC_DataBlock(__u8 bSlot, __u8 bSeq, int sc_result, __u8 **outbuf, +get_RDR_to_PC_DataBlock(__u8 bSeq, int sc_result, __u8 **outbuf, size_t *outlen, const __u8 *abData, size_t abDataLen) { if (!outbuf) @@ -337,9 +335,9 @@ get_RDR_to_PC_DataBlock(__u8 bSlot, __u8 bSeq, int sc_result, __u8 **outbuf, data->bMessageType = 0x80; data->dwLength = __constant_cpu_to_le32(abDataLen); - data->bSlot = bSlot; + data->bSlot = 0; data->bSeq = bSeq; - data->bStatus = get_bStatus(sc_result, bSlot); + data->bStatus = get_bStatus(sc_result); data->bError = get_bError(sc_result); data->bChainParameter = 0; @@ -362,13 +360,14 @@ perform_PC_to_RDR_GetSlotStatus(const __u8 *in, size_t inlen, __u8 **out, size_t *outlen = sizeof(RDR_to_PC_SlotStatus_t); - if ( request->bMessageType != 0x65 || - request->dwLength != __constant_cpu_to_le32(0) || - request->abRFU1 != 0 || - request->abRFU2 != 0) + if (request->bMessageType != 0x65 + || request->dwLength != __constant_cpu_to_le32(0) + || request->bSlot != 0 + || request->abRFU1 != 0 + || request->abRFU2 != 0) sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "warning: malformed PC_to_RDR_GetSlotStatus"); - return get_RDR_to_PC_SlotStatus(request->bSlot, request->bSeq, SC_SUCCESS, + return get_RDR_to_PC_SlotStatus(request->bSeq, SC_SUCCESS, out, outlen, NULL, 0); } @@ -384,11 +383,12 @@ perform_PC_to_RDR_IccPowerOn(const __u8 *in, size_t inlen, __u8 **out, size_t *o if (inlen < sizeof *request) SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_VERBOSE, SC_ERROR_INVALID_DATA); - if ( request->bMessageType != 0x62 || - request->dwLength != __constant_cpu_to_le32(0) || - !( request->bPowerSelect == 0 || - request->bPowerSelect & ccid_desc.bVoltageSupport ) || - request->abRFU != 0) + if (request->bMessageType != 0x62 + || request->dwLength != __constant_cpu_to_le32(0) + || request->bSlot != 0 + || !( request->bPowerSelect == 0 + || request->bPowerSelect & ccid_desc.bVoltageSupport) + || request->abRFU != 0) sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "warning: malformed PC_to_RDR_IccPowerOn"); if (card) { @@ -407,11 +407,11 @@ perform_PC_to_RDR_IccPowerOn(const __u8 *in, size_t inlen, __u8 **out, size_t *o } if (sc_result >= 0) { - return get_RDR_to_PC_SlotStatus(request->bSlot, request->bSeq, + return get_RDR_to_PC_SlotStatus(request->bSeq, sc_result, out, outlen, card->atr, card->atr_len); } else { sc_debug(ctx, SC_LOG_DEBUG_VERBOSE, "Returning default status package."); - return get_RDR_to_PC_SlotStatus(request->bSlot, request->bSeq, + return get_RDR_to_PC_SlotStatus(request->bSeq, sc_result, out, outlen, NULL, 0); } } @@ -428,16 +428,17 @@ perform_PC_to_RDR_IccPowerOff(const __u8 *in, size_t inlen, __u8 **out, size_t * if (inlen < sizeof *request) SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_VERBOSE, SC_ERROR_INVALID_DATA); - if ( request->bMessageType != 0x63 || - request->dwLength != __constant_cpu_to_le32(0) || - request->abRFU1 != 0 || - request->abRFU2 != 0) + if (request->bMessageType != 0x63 + || request->dwLength != __constant_cpu_to_le32(0) + || request->bSlot != 0 + || request->abRFU1 != 0 + || request->abRFU2 != 0) sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "warning: malformed PC_to_RDR_IccPowerOff"); sc_reset(card, 1); sc_result = sc_disconnect_card(card); - return get_RDR_to_PC_SlotStatus(request->bSlot, request->bSeq, sc_result, + return get_RDR_to_PC_SlotStatus(request->bSeq, sc_result, out, outlen, NULL, 0); } @@ -457,20 +458,21 @@ perform_PC_to_RDR_XfrBlock(const u8 *in, size_t inlen, __u8** out, size_t *outle if (inlen < sizeof *request) SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_VERBOSE, SC_ERROR_INVALID_DATA); - if ( request->bMessageType != 0x6F || - request->bBWI != 0) + if (request->bMessageType != 0x6F + || request->bSlot != 0 + || request->bBWI != 0) sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "malformed PC_to_RDR_XfrBlock, will continue anyway"); sc_result = build_apdu(ctx, abDataIn, __le32_to_cpu(request->dwLength), &apdu); if (sc_result >= 0) - sc_result = get_rapdu(&apdu, request->bSlot, &abDataOut, + sc_result = get_rapdu(&apdu, &abDataOut, &abDataOutLen); else bin_log(ctx, SC_LOG_DEBUG_VERBOSE, "Invalid APDU", abDataIn, __le32_to_cpu(request->dwLength)); - sc_result = get_RDR_to_PC_DataBlock(request->bSlot, request->bSeq, sc_result, + sc_result = get_RDR_to_PC_DataBlock(request->bSeq, sc_result, out, outlen, abDataOut, abDataOutLen); free(abDataOut); @@ -493,8 +495,9 @@ perform_PC_to_RDR_GetParamters(const __u8 *in, size_t inlen, __u8** out, size_t if (inlen < sizeof *request) SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_VERBOSE, SC_ERROR_INVALID_DATA); - if ( request->bMessageType != 0x6C || - request->dwLength != __constant_cpu_to_le32(0)) + if (request->bMessageType != 0x6C + || request->dwLength != __constant_cpu_to_le32(0) + || request->bSlot != 0) sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "warning: malformed PC_to_RDR_GetParamters"); switch (reader->active_protocol) { @@ -563,9 +566,9 @@ invaliddata: sc_result = SC_ERROR_INVALID_DATA; result->bMessageType = 0x82; - result->bSlot = request->bSlot; + result->bSlot = 0; result->bSeq = request->bSeq; - result->bStatus = get_bStatus(sc_result, request->bSlot); + result->bStatus = get_bStatus(sc_result); result->bError = get_bError(sc_result); if (sc_result < 0) @@ -1047,7 +1050,8 @@ perform_PC_to_RDR_Secure(const __u8 *in, size_t inlen, __u8** out, size_t *outle if (inlen < sizeof *request + 1) SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_VERBOSE, SC_ERROR_INVALID_DATA); - if (request->bMessageType != 0x69) + if (request->bMessageType != 0x69 + || request->bSlot != 0) sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "warning: malformed PC_to_RDR_Secure"); if (request->wLevelParameter != CCID_WLEVEL_DIRECT) { @@ -1224,7 +1228,7 @@ perform_PC_to_RDR_Secure(const __u8 *in, size_t inlen, __u8** out, size_t *outle &sc_result)) goto err; - sc_result = get_rapdu(&apdu, request->bSlot, &abDataOut, &abDataOutLen); + sc_result = get_rapdu(&apdu, &abDataOut, &abDataOutLen); /* clear PINs that have been transmitted */ sc_mem_clear((u8 *) apdu.data, apdu.datalen); @@ -1239,7 +1243,7 @@ err: free((u8 *) new_pin.data); } - sc_result = get_RDR_to_PC_DataBlock(request->bSlot, request->bSeq, sc_result, out, + sc_result = get_RDR_to_PC_DataBlock(request->bSeq, sc_result, out, outlen, abDataOut, abDataOutLen); free(abDataOut); @@ -1289,11 +1293,10 @@ get_RDR_to_PC_NotifySlotChange(RDR_to_PC_NotifySlotChange_t **out) if (sc_result & SC_READER_CARD_PRESENT) oldmask |= present[0]; if (sc_result & SC_READER_CARD_CHANGED) { - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Card status changed in slot 0."); + sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Card status changed."); result->bmSlotICCState |= changed[0]; } - sleep(10); sc_result = detect_card_presence(); @@ -1305,12 +1308,12 @@ get_RDR_to_PC_NotifySlotChange(RDR_to_PC_NotifySlotChange_t **out) if (sc_result & SC_READER_CARD_PRESENT) result->bmSlotICCState |= present[0]; if (sc_result & SC_READER_CARD_CHANGED) { - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Card status changed in slot 0."); + sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Card status changed."); result->bmSlotICCState |= changed[0]; } if ((oldmask & present[0]) != (result->bmSlotICCState & present[0])) { - sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Card status changed in slot 0."); + sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Card status changed."); result->bmSlotICCState |= changed[0]; } @@ -1366,10 +1369,9 @@ perform_unknown(const __u8 *in, size_t inlen, __u8 **out, size_t *outlen) result->bMessageType = 0; } result->dwLength = __constant_cpu_to_le32(0); - result->bSlot = request->bSlot, + result->bSlot = 0, result->bSeq = request->bSeq; - result->bStatus = get_bStatus(SC_ERROR_UNKNOWN_DATA_RECEIVED, - request->bSlot); + result->bStatus = get_bStatus(SC_ERROR_UNKNOWN_DATA_RECEIVED); result->bError = 0; result->bClockStatus = 0; diff --git a/ccid/src/usb.c b/ccid/src/usb.c index 6aae0fd..83ccb2e 100644 --- a/ccid/src/usb.c +++ b/ccid/src/usb.c @@ -1728,6 +1728,7 @@ done: int main (int argc, char **argv) { + /*printf("%s:%d\n", __FILE__, __LINE__);*/ int fd, c, i; int oindex = 0; @@ -1810,7 +1811,7 @@ main (int argc, char **argv) } if (ccid_initialize(usb_reader_num, cdriver, verbose) < 0) { - perror("Can't initialize ccid"); + fprintf (stderr, "Can't initialize ccid\n"); return 1; }