Index: b/scd/apdu.c =================================================================== --- b/scd/apdu.c +++ b/scd/apdu.c @@ -1825,8 +1825,12 @@ reader_table[slot].is_spr532 = 1; reader_table[slot].pinpad_varlen_supported = 1; } - else if (strstr (reader_table[slot].rdrname, "ST-2xxx") - || strstr (reader_table[slot].rdrname, "cyberJack") + else if (strstr (reader_table[slot].rdrname, "ST-2xxx")) + { + reader_table[slot].pcsc.pinmax = 15; + reader_table[slot].pinpad_varlen_supported = 1; + } + else if (strstr (reader_table[slot].rdrname, "cyberJack") || strstr (reader_table[slot].rdrname, "DIGIPASS") || strstr (reader_table[slot].rdrname, "Gnuk") || strstr (reader_table[slot].rdrname, "KAAN")) @@ -1891,8 +1895,12 @@ reader_table[slot].is_spr532 = 1; reader_table[slot].pinpad_varlen_supported = 1; } - else if ((vendor == 0x046a && product == 0x003e) /* Cherry ST-2xxx */ - || vendor == 0x0c4b /* Tested with Reiner cyberJack GO */ + else if (vendor == 0x046a && product == 0x003e) /* Cherry ST-2xxx */ + { + reader_table[slot].pcsc.pinmax = 15; + reader_table[slot].pinpad_varlen_supported = 1; + } + else if (vendor == 0x0c4b /* Tested with Reiner cyberJack GO */ || vendor == 0x1a44 /* Tested with Vasco DIGIPASS 920 */ || vendor == 0x234b /* Tested with FSIJ Gnuk Token */ || vendor == 0x0d46 /* Tested with KAAN Advanced??? */) Index: b/scd/ccid-driver.c =================================================================== --- b/scd/ccid-driver.c +++ b/scd/ccid-driver.c @@ -3316,6 +3316,7 @@ size_t dummy_nresp; int testmode; int cherry_mode = 0; + int add_zero = 0; int enable_varlen = 0; testmode = !resp && !nresp; @@ -3357,7 +3358,7 @@ enable_varlen = 1; break; case VENDOR_CHERRY: - pininfo->maxlen = 25; + pininfo->maxlen = 15; enable_varlen = 1; /* The CHERRY XX44 keyboard echos an asterisk for each entered character on the keyboard channel. We use a special variant @@ -3366,6 +3367,7 @@ Lc byte to the APDU. It seems that it will be replaced with the actual length instead of being appended before the APDU is send to the card. */ + add_zero = 1; if (handle->id_product != CHERRY_ST2000) cherry_mode = 1; break; @@ -3488,7 +3490,7 @@ msg[msglen++] = apdu_buf[1]; /* INS */ msg[msglen++] = apdu_buf[2]; /* P1 */ msg[msglen++] = apdu_buf[3]; /* P2 */ - if (cherry_mode) + if (add_zero) msg[msglen++] = 0; else if (pininfo->fixedlen != 0) {