Dirk-Willem van Gulik
2014-May-06 11:15 UTC
Supporting smartcard readers with PIN entry keypads
Folks, Find below a minor patch to allow the use of smartcards in readers that have their own PIN entry keypads (Secure PIN entry) such as the SPR332 and most german/medical chipcard devices. Tested on Solaris, FreeBSD and MacOSX against various cards and drivers. I?ve left the pkcs11_interactive check in place. Arguably - with some Secure PIN readers it may be better to move this just in front of the keyboard entry ONLY; as there are some secure PIN keypads that use means which are somewhat suitable to unattended operation. But I thought it better to let this wait until an actual use case warrants this and/or the need for a special flag/argument to control such. Thanks, Dw. diff -ur openssh-6.2p2.orig/ssh-pkcs11.c openssh-6.2p2/ssh-pkcs11.c --- openssh-6.2p2.orig/ssh-pkcs11.c 2011-09-04 11:59:26.000000000 +0200 +++ openssh-6.2p2/ssh-pkcs11.c 2014-05-06 13:03:15.000000000 +0200 @@ -256,21 +256,29 @@ si = &k11->provider->slotinfo[k11->slotidx]; if ((si->token.flags & CKF_LOGIN_REQUIRED) && !si->logged_in) { if (!pkcs11_interactive) { - error("need pin"); + error("need pin entry%s", + (si->token.flags & CKF_PROTECTED_AUTHENTICATION_PATH) ? " on reader keypad" : ""); return (-1); } - snprintf(prompt, sizeof(prompt), "Enter PIN for '%s': ", - si->token.label); - pin = read_passphrase(prompt, RP_ALLOW_EOF); - if (pin == NULL) - return (-1); /* bail out */ - if ((rv = f->C_Login(si->session, CKU_USER, pin, strlen(pin))) + if (si->token.flags & CKF_PROTECTED_AUTHENTICATION_PATH) { + verbose("Deferring PIN entry to keypad of chipcard reader."); + pin = NULL; + } else { + snprintf(prompt, sizeof(prompt), "Enter PIN for '%s': ", + si->token.label); + pin = read_passphrase(prompt, RP_ALLOW_EOF); + if (pin == NULL) + return (-1); /* bail out */ + }; + if ((rv = f->C_Login(si->session, CKU_USER, pin, pin ? strlen(pin): 0)) != CKR_OK) { - xfree(pin); + if (pin) + xfree(pin); error("C_Login failed: %lu", rv); return (-1); - } - xfree(pin); + } + if (pin) + xfree(pin); si->logged_in = 1; } key_filter[1].pValue = k11->keyid; Only in openssh-6.2p2: ssh-pkcs11.o
Apparently Analagous Threads
- [patch] Supporting smartcard readers with PIN entry keypads (updated against -HEAD)
- [patch] Updated patch for pkcs#11 smartcard readers that have a protected PIN path
- [Bug 2240] New: Secure PIN entry for smartcards through the keypad on the reader (patch)
- Call for testing: OpenSSH 6.7
- uniroot