X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/510dcd2dd2303a8eff189b4764f74a390734ef95..01c034ad857128c51482a563befb374e38ebe668:/pageant.c diff --git a/pageant.c b/pageant.c index acbc4ae2..50ac337d 100644 --- a/pageant.c +++ b/pageant.c @@ -56,6 +56,12 @@ static gsi_fn_t getsecurityinfo; #endif /* + * Exports from pageantc.c + */ +void agent_query(void *in, int inlen, void **out, int *outlen); +int agent_exists(void); + +/* * We need this to link with the RSA code, because rsaencrypt() * pads its data with random bytes. Since we only use rsadecrypt() * and the signing functions, which are deterministic, this should @@ -164,7 +170,7 @@ static int CALLBACK AboutProc (HWND hwnd, UINT msg, */ static int CALLBACK PassphraseProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - static char *passphrase; + static char *passphrase = NULL; struct PassphraseProcStruct *p; switch (msg) { @@ -191,6 +197,7 @@ static int CALLBACK PassphraseProc(HWND hwnd, UINT msg, if (p->comment) SetDlgItemText(hwnd, 101, p->comment); *passphrase = 0; + SetDlgItemText (hwnd, 102, passphrase); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { @@ -204,7 +211,7 @@ static int CALLBACK PassphraseProc(HWND hwnd, UINT msg, EndDialog (hwnd, 0); return 0; case 102: /* edit box */ - if (HIWORD(wParam) == EN_CHANGE) { + if ((HIWORD(wParam) == EN_CHANGE) && passphrase) { GetDlgItemText (hwnd, 102, passphrase, PASSPHRASE_MAXLEN-1); passphrase[PASSPHRASE_MAXLEN-1] = '\0'; } @@ -224,11 +231,11 @@ static int CALLBACK PassphraseProc(HWND hwnd, UINT msg, static void keylist_update(void) { struct RSAKey *rkey; struct ssh2_userkey *skey; - enum234 e; + int i; if (keylist) { SendDlgItemMessage(keylist, 100, LB_RESETCONTENT, 0, 0); - for (rkey = first234(rsakeys, &e); rkey; rkey = next234(&e)) { + for (i = 0; NULL != (rkey = index234(rsakeys, i)); i++) { char listentry[512], *p; /* * Replace two spaces in the fingerprint with tabs, for @@ -242,7 +249,7 @@ static void keylist_update(void) { SendDlgItemMessage (keylist, 100, LB_ADDSTRING, 0, (LPARAM)listentry); } - for (skey = first234(ssh2keys, &e); skey; skey = next234(&e)) { + for (i = 0; NULL != (skey = index234(ssh2keys, i)); i++) { char listentry[512], *p; int len; /* @@ -438,15 +445,15 @@ static void answer_msg(void *msg) { * Reply with SSH1_AGENT_RSA_IDENTITIES_ANSWER. */ { - enum234 e; struct RSAKey *key; int len, nkeys; + int i; /* * Count up the number and length of keys we hold. */ len = nkeys = 0; - for (key = first234(rsakeys, &e); key; key = next234(&e)) { + for (i = 0; NULL != (key = index234(rsakeys, i)); i++) { nkeys++; len += 4; /* length field */ len += ssh1_bignum_length(key->exponent); @@ -465,7 +472,7 @@ static void answer_msg(void *msg) { ret[4] = SSH1_AGENT_RSA_IDENTITIES_ANSWER; PUT_32BIT(ret+5, nkeys); p = ret + 5 + 4; - for (key = first234(rsakeys, &e); key; key = next234(&e)) { + for (i = 0; NULL != (key = index234(rsakeys, i)); i++) { PUT_32BIT(p, bignum_bitcount(key->modulus)); p += 4; p += ssh1_write_bignum(p, key->exponent); @@ -481,17 +488,17 @@ static void answer_msg(void *msg) { * Reply with SSH2_AGENT_IDENTITIES_ANSWER. */ { - enum234 e; struct ssh2_userkey *key; int len, nkeys; unsigned char *blob; int bloblen; + int i; /* * Count up the number and length of keys we hold. */ len = nkeys = 0; - for (key = first234(ssh2keys, &e); key; key = next234(&e)) { + for (i = 0; NULL != (key = index234(ssh2keys, i)); i++) { nkeys++; len += 4; /* length field */ blob = key->alg->public_blob(key->data, &bloblen); @@ -511,7 +518,7 @@ static void answer_msg(void *msg) { ret[4] = SSH2_AGENT_IDENTITIES_ANSWER; PUT_32BIT(ret+5, nkeys); p = ret + 5 + 4; - for (key = first234(ssh2keys, &e); key; key = next234(&e)) { + for (i = 0; NULL != (key = index234(ssh2keys, i)); i++) { blob = key->alg->public_blob(key->data, &bloblen); PUT_32BIT(p, bloblen); p += 4; @@ -743,9 +750,8 @@ static void answer_msg(void *msg) { */ { struct RSAKey *rkey; - enum234 e; - while ( (rkey = first234(rsakeys, &e)) != NULL ) { + while ( (rkey = index234(rsakeys, 0)) != NULL ) { del234(rsakeys, rkey); freersakey(rkey); sfree(rkey); @@ -762,9 +768,8 @@ static void answer_msg(void *msg) { */ { struct ssh2_userkey *skey; - enum234 e; - while ( (skey = first234(ssh2keys, &e)) != NULL ) { + while ( (skey = index234(ssh2keys, 0)) != NULL ) { del234(ssh2keys, skey); skey->alg->freekey(skey->data); sfree(skey); @@ -925,7 +930,6 @@ static void prompt_add_keyfile(void) { */ static int CALLBACK KeyListProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - enum234 e; struct RSAKey *rkey; struct ssh2_userkey *skey; @@ -970,11 +974,12 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg, if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { int n = SendDlgItemMessage (hwnd, 100, LB_GETCURSEL, 0, 0); + int i; if (n == LB_ERR) { MessageBeep(0); break; } - for (rkey = first234(rsakeys, &e); rkey; rkey = next234(&e)) + for (i = 0; NULL != (rkey = index234(rsakeys, i)); i++) if (n-- == 0) break; if (rkey) { @@ -982,7 +987,7 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg, freersakey(rkey); sfree(rkey); } else { - for (skey = first234(ssh2keys, &e); skey; skey = next234(&e)) + for (i = 0; NULL != (skey = index234(ssh2keys, i)); i++) if (n-- == 0) break; if (skey) { @@ -1090,11 +1095,11 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, if (mapname[cds->cbData - 1] != '\0') return 0; /* failure to be ASCIZ! */ #ifdef DEBUG_IPC - debug(("mapname is :%s:\r\n", mapname)); + debug(("mapname is :%s:\n", mapname)); #endif filemap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, mapname); #ifdef DEBUG_IPC - debug(("filemap is %p\r\n", filemap)); + debug(("filemap is %p\n", filemap)); #endif if (filemap != NULL && filemap != INVALID_HANDLE_VALUE) { int rc; @@ -1103,7 +1108,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, if ((proc = OpenProcess(MAXIMUM_ALLOWED, FALSE, GetCurrentProcessId())) == NULL) { #ifdef DEBUG_IPC - debug(("couldn't get handle for process\r\n")); + debug(("couldn't get handle for process\n")); #endif return 0; } @@ -1112,7 +1117,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, &procowner, NULL, NULL, NULL, &psd2) != ERROR_SUCCESS) { #ifdef DEBUG_IPC - debug(("couldn't get owner info for process\r\n")); + debug(("couldn't get owner info for process\n")); #endif CloseHandle(proc); return 0; /* unable to get security info */ @@ -1123,30 +1128,30 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, &mapowner, NULL, NULL, NULL, &psd1) != ERROR_SUCCESS)) { #ifdef DEBUG_IPC - debug(("couldn't get owner info for filemap: %d\r\n", rc)); + debug(("couldn't get owner info for filemap: %d\n", rc)); #endif return 0; } #ifdef DEBUG_IPC - debug(("got security stuff\r\n")); + debug(("got security stuff\n")); #endif if (!EqualSid(mapowner, procowner)) return 0; /* security ID mismatch! */ #ifdef DEBUG_IPC - debug(("security stuff matched\r\n")); + debug(("security stuff matched\n")); #endif LocalFree(psd1); LocalFree(psd2); } else { #ifdef DEBUG_IPC - debug(("security APIs not present\r\n")); + debug(("security APIs not present\n")); #endif } #endif p = MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, 0); #ifdef DEBUG_IPC - debug(("p is %p\r\n", p)); - {int i; for(i=0;i<5;i++)debug(("p[%d]=%02x\r\n", i, ((unsigned char *)p)[i]));} + debug(("p is %p\n", p)); + {int i; for(i=0;i<5;i++)debug(("p[%d]=%02x\n", i, ((unsigned char *)p)[i]));} #endif answer_msg(p); ret = 1; @@ -1222,7 +1227,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { * Find out if Pageant is already running. */ already_running = FALSE; - if (FindWindow("Pageant", "Pageant")) + if (agent_exists()) already_running = TRUE; else {