X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=pageant.h;h=6e29f40c181a0fc8e8186d25f1acb8aa29a6ec8c;hb=bda87b39e40ec4e75309cdf778dfc9cd339fdeeb;hp=6ea13efa09a31af1da1c3f6fbc9dac10010569e8;hpb=5ba2d611f9346701b7b5b983b605cb7641fb19d7;p=PuTTY.git diff --git a/pageant.h b/pageant.h index 6ea13efa..6e29f40c 100644 --- a/pageant.h +++ b/pageant.h @@ -2,6 +2,8 @@ * pageant.h: header for pageant.c. */ +#include + /* * FIXME: it would be nice not to have this arbitrary limit. It's * currently needed because the Windows Pageant IPC system needs an @@ -10,6 +12,8 @@ */ #define AGENT_MAX_MSGLEN 8192 +typedef void (*pageant_logfn_t)(void *logctx, const char *fmt, va_list ap); + /* * Initial setup. */ @@ -24,7 +28,8 @@ void pageant_init(void); * Returns a fully formatted message as output, *with* its initial * length field, and sets *outlen to the full size of that message. */ -void *pageant_handle_msg(const void *msg, int msglen, int *outlen); +void *pageant_handle_msg(const void *msg, int msglen, int *outlen, + void *logctx, pageant_logfn_t logfn); /* * Construct a failure response. Useful for agent front ends which @@ -65,3 +70,74 @@ int pageant_delete_ssh2_key(struct ssh2_userkey *skey); * empty. */ void keylist_update(void); + +/* + * Functions to establish a listening socket speaking the SSH agent + * protocol. Call pageant_listener_new() to set up a state; then + * create a socket using the returned pointer as a Plug; then call + * pageant_listener_got_socket() to give the listening state its own + * socket pointer. Also, provide a logging function later if you want + * to. + */ +struct pageant_listen_state; +struct pageant_listen_state *pageant_listener_new(void); +void pageant_listener_got_socket(struct pageant_listen_state *pl, Socket sock); +void pageant_listener_set_logfn(struct pageant_listen_state *pl, + void *logctx, pageant_logfn_t logfn); +void pageant_listener_free(struct pageant_listen_state *pl); + +/* + * Functions to perform specific key actions, either as a client of an + * ssh-agent running elsewhere, or directly on the agent state in this + * process. (On at least one platform we want to do this in an + * agnostic way between the two situations.) + * + * pageant_get_keylist{1,2} work just like pageant_make_keylist{1,2} + * above, except that they can also cope if they have to contact an + * external agent. + * + * pageant_add_keyfile() is used to load a private key from a file and + * add it to the agent. Initially, you should call it with passphrase + * NULL, and it will check if the key is already in the agent, and + * whether a passphrase is required. Return values are given in the + * enum below. On return, *retstr will either be NULL, or a + * dynamically allocated string containing a key comment or an error + * message. + * + * pageant_add_keyfile() also remembers passphrases with which it's + * successfully decrypted keys (because if you try to add multiple + * keys in one go, you might very well have used the same passphrase + * for keys that have the same trust properties). Call + * pageant_forget_passphrases() to get rid of them all. + */ +void *pageant_get_keylist1(int *length); +void *pageant_get_keylist2(int *length); +enum { + PAGEANT_ACTION_OK, /* success; no further action needed */ + PAGEANT_ACTION_FAILURE, /* failure; *retstr is error message */ + PAGEANT_ACTION_NEED_PP /* need passphrase: *retstr is key comment */ +}; +int pageant_add_keyfile(Filename *filename, const char *passphrase, + char **retstr); +void pageant_forget_passphrases(void); + +struct pageant_pubkey { + /* Everything needed to identify a public key found by + * pageant_enum_keys and pass it back to the agent or other code + * later */ + void *blob; + int bloblen; + char *comment; + int ssh_version; +}; +struct pageant_pubkey *pageant_pubkey_copy(struct pageant_pubkey *key); +void pageant_pubkey_free(struct pageant_pubkey *key); + +typedef void (*pageant_key_enum_fn_t)(void *ctx, + const char *fingerprint, + const char *comment, + struct pageant_pubkey *key); +int pageant_enum_keys(pageant_key_enum_fn_t callback, void *callback_ctx, + char **retstr); +int pageant_delete_key(struct pageant_pubkey *key, char **retstr); +int pageant_delete_all_keys(char **retstr);