From 36b88c3ad77483b90537926871edf19f2ce3f199 Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Fri, 6 Apr 2018 13:33:09 +0200 Subject: [PATCH] reader-pcsc: allow fixing the length of a PIN fixes https://github.com/OpenSC/OpenSC/issues/1221 closes https://github.com/OpenSC/OpenSC/pull/1288 --- etc/opensc.conf.in | 6 ++++++ src/libopensc/reader-pcsc.c | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/etc/opensc.conf.in b/etc/opensc.conf.in index e5afe834..f553b58d 100644 --- a/etc/opensc.conf.in +++ b/etc/opensc.conf.in @@ -93,6 +93,12 @@ app default { # Default: true # enable_pinpad = false; # + # Some pinpad readers can only handle one exact length of the PIN. + # fixed_pinlength sets this value so that OpenSC expands the padding to + # this length. + # Default: 0 (i.e. not fixed) + # fixed_pinlength = 6; + # # Detect reader capabilities with escape commands (wrapped APDUs with # CLA=0xFF as defined by PC/SC pt. 3 and BSI TR-03119, e.g. for getting # the UID, escaped PIN commands and the reader's firmware version) diff --git a/src/libopensc/reader-pcsc.c b/src/libopensc/reader-pcsc.c index 95187790..18d97f0c 100644 --- a/src/libopensc/reader-pcsc.c +++ b/src/libopensc/reader-pcsc.c @@ -82,6 +82,7 @@ struct pcsc_global_private_data { SCARDCONTEXT pcsc_ctx; SCARDCONTEXT pcsc_wait_ctx; int enable_pinpad; + int fixed_pinlength; int enable_pace; size_t force_max_recv_size; size_t force_max_send_size; @@ -766,6 +767,7 @@ static int pcsc_init(sc_context_t *ctx) gpriv->transaction_end_action = SCARD_LEAVE_CARD; gpriv->reconnect_action = SCARD_LEAVE_CARD; gpriv->enable_pinpad = 1; + gpriv->fixed_pinlength = 0; gpriv->enable_pace = 1; gpriv->pcsc_ctx = -1; gpriv->pcsc_wait_ctx = -1; @@ -788,6 +790,8 @@ static int pcsc_init(sc_context_t *ctx) pcsc_reset_action(scconf_get_str(conf_block, "reconnect_action", "leave")); gpriv->enable_pinpad = scconf_get_bool(conf_block, "enable_pinpad", gpriv->enable_pinpad); + gpriv->fixed_pinlength = scconf_get_bool(conf_block, "fixed_pinlength", + gpriv->fixed_pinlength); gpriv->enable_pace = scconf_get_bool(conf_block, "enable_pace", gpriv->enable_pace); gpriv->force_max_send_size = scconf_get_int(conf_block, @@ -1889,10 +1893,17 @@ part10_check_pin_min_max(sc_reader_t *reader, struct sc_pin_cmd_data *data) unsigned char buffer[256]; size_t length = sizeof buffer; struct pcsc_private_data *priv = reader->drv_data; + struct pcsc_global_private_data *gpriv = (struct pcsc_global_private_data *) reader->ctx->reader_drv_data; struct sc_pin_cmd_pin *pin_ref = data->flags & SC_PIN_CMD_IMPLICIT_CHANGE ? &data->pin1 : &data->pin2; + if (gpriv->fixed_pinlength != 0) { + pin_ref->min_length = gpriv->fixed_pinlength; + pin_ref->max_length = gpriv->fixed_pinlength; + return 0; + } + if (!priv->get_tlv_properties) return 0;