]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - pageant.h
first pass
[PuTTY.git] / pageant.h
index 5e23e0db846742e2e88662f88bf65177428c8aaf..6e29f40c181a0fc8e8186d25f1acb8aa29a6ec8c 100644 (file)
--- a/pageant.h
+++ b/pageant.h
@@ -2,6 +2,8 @@
  * pageant.h: header for pageant.c.
  */
 
+#include <stdarg.h>
+
 /*
  * 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
@@ -71,10 +76,68 @@ void keylist_update(void);
  * 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.
+ * socket pointer. Also, provide a logging function later if you want
+ * to.
  */
 struct pageant_listen_state;
-struct pageant_listen_state *pageant_listener_new
-(void *logctx, void (*logfn)(void *logctx, const char *fmt, ...));
+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);