aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/scdaemon.texi6
-rw-r--r--scd/apdu.c5
-rw-r--r--scd/app-openpgp.c2
-rw-r--r--scd/scdaemon.c3
-rw-r--r--scd/scdaemon.h1
5 files changed, 14 insertions, 3 deletions
diff --git a/doc/scdaemon.texi b/doc/scdaemon.texi
index 81af28105..1271994c4 100644
--- a/doc/scdaemon.texi
+++ b/doc/scdaemon.texi
@@ -248,6 +248,12 @@ Append all logging output to @var{file}. This is very helpful in
seeing what the agent actually does. Use @file{socket://} to log to
socket.
+@item --pcsc-shared
+@opindex pcsc-shared
+Use shared mode to access the card via PC/SC. This is a somewhat
+dangerous option because Scdaemon assumes exclusivbe access to teh
+card and for example caches certain information from the card. Use
+this option only if you know what you are doing.
@item --pcsc-driver @var{library}
@opindex pcsc-driver
diff --git a/scd/apdu.c b/scd/apdu.c
index 3bdb509b3..6850aae49 100644
--- a/scd/apdu.c
+++ b/scd/apdu.c
@@ -713,7 +713,8 @@ pcsc_get_status (int slot, unsigned int *status, int on_wire)
mode. */
if ( (*status & (APDU_CARD_PRESENT|APDU_CARD_ACTIVE))
== (APDU_CARD_PRESENT|APDU_CARD_ACTIVE)
- && !(reader_table[slot].pcsc.current_state & PCSC_STATE_INUSE) )
+ && (opt.pcsc_shared
+ || !(reader_table[slot].pcsc.current_state & PCSC_STATE_INUSE)))
*status |= APDU_CARD_USABLE;
#else
/* Some winscard drivers may set EXCLUSIVE and INUSE at the same
@@ -827,7 +828,7 @@ connect_pcsc_card (int slot)
err = pcsc_connect (reader_table[slot].pcsc.context,
reader_table[slot].rdrname,
- PCSC_SHARE_EXCLUSIVE,
+ opt.pcsc_shared? PCSC_SHARE_SHARED:PCSC_SHARE_EXCLUSIVE,
PCSC_PROTOCOL_T0|PCSC_PROTOCOL_T1,
&reader_table[slot].pcsc.card,
&reader_table[slot].pcsc.protocol);
diff --git a/scd/app-openpgp.c b/scd/app-openpgp.c
index efd8d79bb..4ac7f5d72 100644
--- a/scd/app-openpgp.c
+++ b/scd/app-openpgp.c
@@ -2397,7 +2397,7 @@ verify_chv2 (app_t app,
return rc;
app->did_chv2 = 1;
- if (!app->did_chv1 && !app->force_chv1 && pinvalue)
+ if (!app->did_chv1 && !app->force_chv1 && pinvalue && !opt.pcsc_shared)
{
/* For convenience we verify CHV1 here too. We do this only if
the card is not configured to require a verification before
diff --git a/scd/scdaemon.c b/scd/scdaemon.c
index 6db9c1b7d..862278b5c 100644
--- a/scd/scdaemon.c
+++ b/scd/scdaemon.c
@@ -93,6 +93,7 @@ enum cmd_and_opt_values
oCardTimeout,
octapiDriver,
opcscDriver,
+ opcscShared,
oDisableCCID,
oDisableOpenSC,
oDisablePinpad,
@@ -139,6 +140,7 @@ static ARGPARSE_OPTS opts[] = {
N_("|NAME|use NAME as ct-API driver")),
ARGPARSE_s_s (opcscDriver, "pcsc-driver",
N_("|NAME|use NAME as PC/SC driver")),
+ ARGPARSE_s_n (opcscShared, "pcsc-shared", "@"),
ARGPARSE_s_n (oDisableCCID, "disable-ccid",
#ifdef HAVE_LIBUSB
N_("do not use the internal CCID driver")
@@ -586,6 +588,7 @@ main (int argc, char **argv )
case oReaderPort: opt.reader_port = pargs.r.ret_str; break;
case octapiDriver: opt.ctapi_driver = pargs.r.ret_str; break;
case opcscDriver: opt.pcsc_driver = pargs.r.ret_str; break;
+ case opcscShared: opt.pcsc_shared = 1; break;
case oDisableCCID: opt.disable_ccid = 1; break;
case oDisableOpenSC: break;
diff --git a/scd/scdaemon.h b/scd/scdaemon.h
index 336013805..3ba1b9ad0 100644
--- a/scd/scdaemon.h
+++ b/scd/scdaemon.h
@@ -62,6 +62,7 @@ struct
int enable_pinpad_varlen; /* Use variable length input for pinpad. */
int allow_admin; /* Allow the use of admin commands for certain
cards. */
+ int pcsc_shared; /* Use shared PC/SC access. */
strlist_t disabled_applications; /* Card applications we do not
want to use. */
unsigned long card_timeout; /* Disconnect after N seconds of inactivity. */