mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-18 19:41:01 -05:00
New feature: k-i authentication helper plugins.
In recent months I've had two requests from different people to build support into PuTTY for automatically handling complicated third-party auth protocols layered on top of keyboard-interactive - the kind of thing where you're asked to enter some auth response, and you have to refer to some external source like a web server to find out what the right response _is_, which is a pain to do by hand, so you'd prefer it to be automated in the SSH client. That seems like a reasonable thing for an end user to want, but I didn't think it was a good idea to build support for specific protocols of that kind directly into PuTTY, where there would no doubt be an ever-lengthening list, and maintenance needed on all of them. So instead, in collaboration with one of my correspondents, I've designed and implemented a protocol to be spoken between PuTTY and a plugin running as a subprocess. The plugin can opt to handle the keyboard-interactive authentication loop on behalf of the user, in which case PuTTY passes on all the INFO_REQUEST packets to it, and lets it make up responses. It can also ask questions of the user if necessary. The protocol spec is provided in a documentation appendix. The entire configuration for the end user consists of providing a full command line to use as the subprocess. In the contrib directory I've provided an example plugin written in Python. It gives a set of fixed responses suitable for getting through Uppity's made-up k-i system, because that was a reasonable thing I already had lying around to test against. But it also provides example code that someone else could pick up and insert their own live response-provider into the middle of, assuming they were happy with it being in Python.
This commit is contained in:
32
ssh.h
32
ssh.h
@ -1917,3 +1917,35 @@ bool ssh_transient_hostkey_cache_verify(
|
||||
bool ssh_transient_hostkey_cache_has(
|
||||
ssh_transient_hostkey_cache *thc, const ssh_keyalg *alg);
|
||||
bool ssh_transient_hostkey_cache_non_empty(ssh_transient_hostkey_cache *thc);
|
||||
|
||||
/*
|
||||
* Protocol definitions for authentication helper plugins
|
||||
*/
|
||||
|
||||
#define AUTHPLUGIN_MSG_NAMES(X) \
|
||||
X(PLUGIN_INIT, 1) \
|
||||
X(PLUGIN_INIT_RESPONSE, 2) \
|
||||
X(PLUGIN_PROTOCOL, 3) \
|
||||
X(PLUGIN_PROTOCOL_ACCEPT, 4) \
|
||||
X(PLUGIN_PROTOCOL_REJECT, 5) \
|
||||
X(PLUGIN_AUTH_SUCCESS, 6) \
|
||||
X(PLUGIN_AUTH_FAILURE, 7) \
|
||||
X(PLUGIN_INIT_FAILURE, 8) \
|
||||
X(PLUGIN_KI_SERVER_REQUEST, 20) \
|
||||
X(PLUGIN_KI_SERVER_RESPONSE, 21) \
|
||||
X(PLUGIN_KI_USER_REQUEST, 22) \
|
||||
X(PLUGIN_KI_USER_RESPONSE, 23) \
|
||||
/* end of list */
|
||||
|
||||
#define PLUGIN_PROTOCOL_MAX_VERSION 2 /* the highest version we speak */
|
||||
|
||||
enum {
|
||||
#define ENUMDECL(name, value) name = value,
|
||||
AUTHPLUGIN_MSG_NAMES(ENUMDECL)
|
||||
#undef ENUMDECL
|
||||
|
||||
/* Error codes internal to this implementation, indicating failure
|
||||
* to receive a meaningful packet at all */
|
||||
PLUGIN_NOTYPE = 256, /* packet too short to have a type */
|
||||
PLUGIN_EOF = 257 /* EOF from auth plugin */
|
||||
};
|
||||
|
Reference in New Issue
Block a user