From 3227331f91d1dd35ce75a9c523672afd4a311c1a Mon Sep 17 00:00:00 2001 From: frankmorgner Date: Tue, 24 Aug 2010 08:31:41 +0000 Subject: [PATCH] added workaround for current buergerclient to read efcardaccess git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@251 96b47cad-a561-4643-ad3b-153ac7d7599c --- ccid/configure.ac | 1 + ccid/src/ccid.c | 28 ++++++++++++++++++++++++++++ ccid/src/pace.c | 17 ++++++++++++++++- ccid/src/pace/pace.h | 19 +++++-------------- 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/ccid/configure.ac b/ccid/configure.ac index fcddeb9..2eb68a4 100644 --- a/ccid/configure.ac +++ b/ccid/configure.ac @@ -96,6 +96,7 @@ AC_SUBST(OPENSSL_LIBS) AM_CONDITIONAL(WITH_PACE, test "${enable_pace}" != "no") AM_COND_IF(WITH_PACE, [AC_DEFINE(WITH_PACE, 1, [enable PACE support])]) +AM_COND_IF(WITH_PACE, [AC_DEFINE(BUERGERCLIENT_WORKAROUND, 1, [Always get EF.CardAccess, when connecting to a smart card. This is a workaround for the recent Buergerclient])]) # --enable-ccid-test diff --git a/ccid/src/ccid.c b/ccid/src/ccid.c index 02c269f..6849cd7 100644 --- a/ccid/src/ccid.c +++ b/ccid/src/ccid.c @@ -35,13 +35,21 @@ #include static struct sm_ctx sctx; +#ifdef BUERGERCLIENT_WORKAROUND +static char *ef_cardaccess = NULL; +static size_t ef_cardaccess_length = 0; +#endif #else #include "pace/scutil.h" #endif static sc_context_t *ctx = NULL; +#ifdef BUERGERCLIENT_WORKAROUND +static sc_card_t *card_in_slot[1]; +#else static sc_card_t *card_in_slot[SC_MAX_SLOTS]; +#endif static sc_reader_t *reader; struct ccid_class_descriptor @@ -141,6 +149,11 @@ int ccid_initialize(int reader_id, const char *cdriver, int verbose) #ifdef WITH_PACE memset(&sctx, 0, sizeof(sctx)); +#ifdef BUERGERCLIENT_WORKAROUND + free(ef_cardaccess); + ef_cardaccess = NULL; + ef_cardaccess_length = 0; +#endif #endif return SC_SUCCESS; @@ -160,6 +173,11 @@ void ccid_shutdown() #ifdef WITH_PACE pace_sm_ctx_clear_free(sctx.cipher_ctx); memset(&sctx, 0, sizeof(sctx)); +#ifdef BUERGERCLIENT_WORKAROUND + free(ef_cardaccess); + ef_cardaccess = NULL; + ef_cardaccess_length = 0; +#endif #endif } @@ -405,6 +423,12 @@ perform_PC_to_RDR_IccPowerOn(const __u8 *in, size_t inlen, __u8 **out, size_t *o } if (sc_result >= 0) { +#ifdef BUERGERCLIENT_WORKAROUND + if (get_ef_card_access(card_in_slot[request->bSlot], + (u8 **) &ef_cardaccess, &ef_cardaccess_length) < 0) { + sc_error(ctx, "Could not get EF.CardAccess."); + } +#endif return get_RDR_to_PC_SlotStatus(request->bSlot, request->bSeq, sc_result, out, outlen, card_in_slot[request->bSlot]->atr, card_in_slot[request->bSlot]->atr_len); @@ -826,6 +850,10 @@ perform_PC_to_RDR_Secure_EstablishPACEChannel(sc_card_t *card, /*if (sc_reset(card) < 0)*/ /*sc_error(ctx, "Could not reset card, will continue anyway");*/ +#ifdef BUERGERCLIENT_WORKAROUND + pace_output.ef_cardaccess_length = ef_cardaccess_length; + pace_output.ef_cardaccess = ef_cardaccess; +#endif sc_result = EstablishPACEChannel(NULL, card, pace_input, &pace_output, &sctx); diff --git a/ccid/src/pace.c b/ccid/src/pace.c index a6999c0..15a1ac4 100644 --- a/ccid/src/pace.c +++ b/ccid/src/pace.c @@ -159,6 +159,21 @@ IMPLEMENT_ASN1_FUNCTIONS(PACE_GEN_AUTH_R) const size_t maxresp = SC_MAX_APDU_BUFFER_SIZE - 2; +static int pace_sm_encrypt(sc_card_t *card, const struct sm_ctx *ctx, + const u8 *data, size_t datalen, u8 **enc); +static int pace_sm_decrypt(sc_card_t *card, const struct sm_ctx *ctx, + const u8 *enc, size_t enclen, u8 **data); +static int pace_sm_authenticate(sc_card_t *card, const struct sm_ctx *ctx, + const u8 *data, size_t datalen, u8 **outdata); +static int pace_sm_verify_authentication(sc_card_t *card, const struct sm_ctx *ctx, + const u8 *mac, size_t maclen, + const u8 *macdata, size_t macdatalen); +static int pace_sm_pre_transmit(sc_card_t *card, const struct sm_ctx *ctx, + sc_apdu_t *apdu); +static int pace_sm_post_transmit(sc_card_t *card, const struct sm_ctx *ctx, + sc_apdu_t *sm_apdu); + + int GetReadersPACECapabilities(u8 *bitmap) { if (!bitmap) @@ -171,7 +186,7 @@ int GetReadersPACECapabilities(u8 *bitmap) } /** select and read EF.CardAccess */ -static int get_ef_card_access(sc_card_t *card, +int get_ef_card_access(sc_card_t *card, u8 **ef_cardaccess, size_t *length_ef_cardaccess) { int r; diff --git a/ccid/src/pace/pace.h b/ccid/src/pace/pace.h index 1bbf28c..5dc10d5 100644 --- a/ccid/src/pace/pace.h +++ b/ccid/src/pace/pace.h @@ -51,20 +51,6 @@ int reset_ssc(struct pace_sm_ctx *psmctx); const char *pace_secret_name(enum s_type pin_id); -int pace_sm_encrypt(sc_card_t *card, const struct sm_ctx *ctx, - const u8 *data, size_t datalen, u8 **enc); -int pace_sm_decrypt(sc_card_t *card, const struct sm_ctx *ctx, - const u8 *enc, size_t enclen, u8 **data); -int pace_sm_authenticate(sc_card_t *card, const struct sm_ctx *ctx, - const u8 *data, size_t datalen, u8 **outdata); -int pace_sm_verify_authentication(sc_card_t *card, const struct sm_ctx *ctx, - const u8 *mac, size_t maclen, - const u8 *macdata, size_t macdatalen); -int pace_sm_pre_transmit(sc_card_t *card, const struct sm_ctx *ctx, - sc_apdu_t *apdu); -int pace_sm_post_transmit(sc_card_t *card, const struct sm_ctx *ctx, - sc_apdu_t *sm_apdu); - struct establish_pace_channel_input { unsigned char pin_id; @@ -96,6 +82,11 @@ struct establish_pace_channel_output { unsigned char *id_icc; }; +#ifdef BUERGERCLIENT_WORKAROUND +int get_ef_card_access(sc_card_t *card, + u8 **ef_cardaccess, size_t *length_ef_cardaccess); +#endif + int GetReadersPACECapabilities(u8 *bitmap); int EstablishPACEChannel(const struct sm_ctx *oldpacectx, sc_card_t *card,