X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/a832773496d46caa5e328d36a15b4918f24a804e..7440fd4419acfc9c784f142fb9dee3e64c9a18c2:/pageant.c diff --git a/pageant.c b/pageant.c index b8a4bd81..9d39e46d 100644 --- a/pageant.c +++ b/pageant.c @@ -2,20 +2,20 @@ * Pageant: the PuTTY Authentication Agent. */ -#include -#ifndef NO_SECURITY -#include -#endif #include #include #include #include #include +#include "putty.h" #include "ssh.h" #include "misc.h" #include "tree234.h" -#include "winstuff.h" + +#ifndef NO_SECURITY +#include +#endif #define IDI_MAINICON 200 #define IDI_TRAYICON 201 @@ -65,13 +65,14 @@ static int initial_menuitems_count; void modalfatalbox(char *fmt, ...) { va_list ap; - char stuff[200]; + char *buf; va_start(ap, fmt); - vsprintf(stuff, fmt, ap); + buf = dupvprintf(fmt, ap); va_end(ap); - MessageBox(main_hwnd, stuff, "Pageant Fatal Error", + MessageBox(main_hwnd, buf, "Pageant Fatal Error", MB_SYSTEMMODAL | MB_ICONERROR | MB_OK); + sfree(buf); exit(1); } @@ -112,12 +113,6 @@ 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); - -/* * Forward references */ static void *make_keylist1(int *length); @@ -229,7 +224,7 @@ static int CALLBACK AboutProc(HWND hwnd, UINT msg, return 0; case 101: EnableWindow(hwnd, 0); - DialogBox(instance, MAKEINTRESOURCE(214), NULL, LicenceProc); + DialogBox(instance, MAKEINTRESOURCE(214), hwnd, LicenceProc); EnableWindow(hwnd, 1); SetActiveWindow(hwnd); return 0; @@ -389,7 +384,7 @@ static void keylist_update(void) /* * This function loads a key from a file and adds it. */ -static void add_keyfile(char *filename) +static void add_keyfile(Filename filename) { char passphrase[PASSPHRASE_MAXLEN]; struct RSAKey *rkey = NULL; @@ -402,7 +397,7 @@ static void add_keyfile(char *filename) int type; int original_pass; - type = key_type(filename); + type = key_type(&filename); if (type != SSH_KEYTYPE_SSH1 && type != SSH_KEYTYPE_SSH2) { char msg[256]; sprintf(msg, "Couldn't load this key (%s)", key_type_to_str(type)); @@ -420,7 +415,7 @@ static void add_keyfile(char *filename) int i, nkeys, bloblen; if (type == SSH_KEYTYPE_SSH1) { - if (!rsakey_pubblob(filename, &blob, &bloblen)) { + if (!rsakey_pubblob(&filename, &blob, &bloblen, NULL)) { MessageBox(NULL, "Couldn't load private key.", APPNAME, MB_OK | MB_ICONERROR); return; @@ -428,14 +423,14 @@ static void add_keyfile(char *filename) keylist = get_keylist1(); } else { unsigned char *blob2; - blob = ssh2_userkey_loadpub(filename, NULL, &bloblen); + blob = ssh2_userkey_loadpub(&filename, NULL, &bloblen, NULL); if (!blob) { MessageBox(NULL, "Couldn't load private key.", APPNAME, MB_OK | MB_ICONERROR); return; } /* For our purposes we want the blob prefixed with its length */ - blob2 = smalloc(bloblen+4); + blob2 = snewn(bloblen+4, unsigned char); PUT_32BIT(blob2, bloblen); memcpy(blob2 + 4, blob, bloblen); sfree(blob); @@ -470,12 +465,12 @@ static void add_keyfile(char *filename) } if (type == SSH_KEYTYPE_SSH1) - needs_pass = rsakey_encrypted(filename, &comment); + needs_pass = rsakey_encrypted(&filename, &comment); else - needs_pass = ssh2_userkey_encrypted(filename, &comment); + needs_pass = ssh2_userkey_encrypted(&filename, &comment); attempts = 0; if (type == SSH_KEYTYPE_SSH1) - rkey = smalloc(sizeof(*rkey)); + rkey = snew(struct RSAKey); pps.passphrase = passphrase; pps.comment = comment; original_pass = 0; @@ -502,9 +497,9 @@ static void add_keyfile(char *filename) } else *passphrase = '\0'; if (type == SSH_KEYTYPE_SSH1) - ret = loadrsakey(filename, rkey, passphrase); + ret = loadrsakey(&filename, rkey, passphrase, NULL); else { - skey = ssh2_load_userkey(filename, passphrase); + skey = ssh2_load_userkey(&filename, passphrase, NULL); if (skey == SSH2_WRONG_PASSPHRASE) ret = -1; else if (!skey) @@ -534,7 +529,7 @@ static void add_keyfile(char *filename) if (already_running) { unsigned char *request, *response; void *vresponse; - int reqlen, clen, resplen; + int reqlen, clen, resplen, ret; clen = strlen(rkey->comment); @@ -548,7 +543,7 @@ static void add_keyfile(char *filename) ssh1_bignum_length(rkey->q) + 4 + clen /* comment */ ; - request = smalloc(reqlen); + request = snewn(reqlen, unsigned char); request[4] = SSH1_AGENTC_ADD_RSA_IDENTITY; reqlen = 5; @@ -567,7 +562,9 @@ static void add_keyfile(char *filename) reqlen += 4 + clen; PUT_32BIT(request, reqlen - 4); - agent_query(request, reqlen, &vresponse, &resplen); + ret = agent_query(request, reqlen, &vresponse, &resplen, + NULL, NULL); + assert(ret == 1); response = vresponse; if (resplen < 5 || response[4] != SSH_AGENT_SUCCESS) MessageBox(NULL, "The already running Pageant " @@ -584,7 +581,7 @@ static void add_keyfile(char *filename) if (already_running) { unsigned char *request, *response; void *vresponse; - int reqlen, alglen, clen, keybloblen, resplen; + int reqlen, alglen, clen, keybloblen, resplen, ret; alglen = strlen(skey->alg->name); clen = strlen(skey->comment); @@ -596,7 +593,7 @@ static void add_keyfile(char *filename) 4 + clen /* comment */ ; - request = smalloc(reqlen); + request = snewn(reqlen, unsigned char); request[4] = SSH2_AGENTC_ADD_IDENTITY; reqlen = 5; @@ -612,7 +609,9 @@ static void add_keyfile(char *filename) PUT_32BIT(request, reqlen - 4); reqlen += clen + 4; - agent_query(request, reqlen, &vresponse, &resplen); + ret = agent_query(request, reqlen, &vresponse, &resplen, + NULL, NULL); + assert(ret == 1); response = vresponse; if (resplen < 5 || response[4] != SSH_AGENT_SUCCESS) MessageBox(NULL, "The already running Pageant " @@ -655,7 +654,7 @@ static void *make_keylist1(int *length) } /* Allocate the buffer. */ - p = ret = smalloc(len); + p = ret = snewn(len, unsigned char); if (length) *length = len; PUT_32BIT(p, nkeys); @@ -700,7 +699,7 @@ static void *make_keylist2(int *length) } /* Allocate the buffer. */ - p = ret = smalloc(len); + p = ret = snewn(len, unsigned char); if (length) *length = len; /* @@ -737,16 +736,17 @@ static void *get_keylist1(void) if (already_running) { unsigned char request[5], *response; void *vresponse; - int resplen; + int resplen, retval; request[4] = SSH1_AGENTC_REQUEST_RSA_IDENTITIES; PUT_32BIT(request, 4); - agent_query(request, 5, &vresponse, &resplen); + retval = agent_query(request, 5, &vresponse, &resplen, NULL, NULL); + assert(retval == 1); response = vresponse; if (resplen < 5 || response[4] != SSH1_AGENT_RSA_IDENTITIES_ANSWER) return NULL; - ret = smalloc(resplen-5); + ret = snewn(resplen-5, unsigned char); memcpy(ret, response+5, resplen-5); sfree(response); } else { @@ -767,17 +767,18 @@ static void *get_keylist2(void) if (already_running) { unsigned char request[5], *response; void *vresponse; - int resplen; + int resplen, retval; request[4] = SSH2_AGENTC_REQUEST_IDENTITIES; PUT_32BIT(request, 4); - agent_query(request, 5, &vresponse, &resplen); + retval = agent_query(request, 5, &vresponse, &resplen, NULL, NULL); + assert(retval == 1); response = vresponse; if (resplen < 5 || response[4] != SSH2_AGENT_IDENTITIES_ANSWER) return NULL; - ret = smalloc(resplen-5); + ret = snewn(resplen-5, unsigned char); memcpy(ret, response+5, resplen-5); sfree(response); } else { @@ -929,7 +930,7 @@ static void answer_msg(void *msg) struct RSAKey *key; char *comment; int commentlen; - key = smalloc(sizeof(struct RSAKey)); + key = snew(struct RSAKey); memset(key, 0, sizeof(struct RSAKey)); p += makekey(p, key, NULL, 1); p += makeprivate(p, key); @@ -937,7 +938,7 @@ static void answer_msg(void *msg) p += ssh1_read_bignum(p, &key->p); /* p */ p += ssh1_read_bignum(p, &key->q); /* q */ commentlen = GET_32BIT(p); - comment = smalloc(commentlen+1); + comment = snewn(commentlen+1, char); if (comment) { memcpy(comment, p + 4, commentlen); comment[commentlen] = '\0'; @@ -965,7 +966,7 @@ static void answer_msg(void *msg) int alglen, commlen; int bloblen; - key = smalloc(sizeof(struct ssh2_userkey)); + key = snew(struct ssh2_userkey); alglen = GET_32BIT(p); p += 4; @@ -993,7 +994,7 @@ static void answer_msg(void *msg) commlen = GET_32BIT(p); p += 4; - comment = smalloc(commlen + 1); + comment = snewn(commlen + 1, char); if (comment) { memcpy(comment, p, commlen); comment[commlen] = '\0'; @@ -1238,7 +1239,7 @@ static void prompt_add_keyfile(void) { OPENFILENAME of; char filename[FILENAME_MAX]; - char *filelist = smalloc(8192); + char *filelist = snewn(8192, char); char *filewalker; int n, dirlen; @@ -1249,7 +1250,8 @@ static void prompt_add_keyfile(void) of.lStructSize = sizeof(of); #endif of.hwndOwner = main_hwnd; - of.lpstrFilter = "PuTTY Private Key Files\0*.PPK\0AllFiles\0*\0\0\0"; + of.lpstrFilter = "PuTTY Private Key Files (*.ppk)\0*.ppk\0" + "All Files (*.*)\0*\0\0\0"; of.lpstrCustomFilter = NULL; of.nFilterIndex = 1; of.lpstrFile = filelist; @@ -1262,7 +1264,7 @@ static void prompt_add_keyfile(void) if (GetOpenFileName(&of)) { if(strlen(filelist) > of.nFileOffset) /* Only one filename returned? */ - add_keyfile(filelist); + add_keyfile(filename_from_str(filelist)); else { /* we are returned a bunch of strings, end to * end. first string is the directory, the @@ -1290,7 +1292,7 @@ static void prompt_add_keyfile(void) memcpy(filename + dirlen, filewalker, n); filewalker += n; - add_keyfile(filename); + add_keyfile(filename_from_str(filename)); } } @@ -1384,7 +1386,7 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg, } /* get item indices in an array */ - selectedArray = smalloc(numSelected * sizeof(int)); + selectedArray = snewn(numSelected, int); SendDlgItemMessage(hwnd, 100, LB_GETSELITEMS, numSelected, (WPARAM)selectedArray); @@ -1781,20 +1783,32 @@ void spawn_cmd(char *cmdline, char * args, int show) { if (ShellExecute(NULL, _T("open"), cmdline, args, NULL, show) <= (HINSTANCE) 32) { - TCHAR sMsg[140]; - sprintf(sMsg, _T("Failed to run \"%.100s\", Error: %d"), cmdline, - (int)GetLastError()); - MessageBox(NULL, sMsg, APPNAME, MB_OK | MB_ICONEXCLAMATION); + char *msg; + msg = dupprintf("Failed to run \"%.100s\", Error: %d", cmdline, + (int)GetLastError()); + MessageBox(NULL, msg, APPNAME, MB_OK | MB_ICONEXCLAMATION); + sfree(msg); } } +/* + * This is a can't-happen stub, since Pageant never makes + * asynchronous agent requests. + */ +void agent_schedule_callback(void (*callback)(void *, void *, int), + void *callback_ctx, void *data, int len) +{ + assert(!"We shouldn't get here"); +} + void cleanup_exit(int code) { exit(code); } +int flags = FLAG_SYNCAGENT; + int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { WNDCLASS wndclass; MSG msg; - OSVERSIONINFO osi; HMODULE advapi; char *command = NULL; int added_keys = 0; @@ -1805,9 +1819,11 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) * Determine whether we're an NT system (should have security * APIs) or a non-NT system (don't do security). */ - memset(&osi, 0, sizeof(OSVERSIONINFO)); - osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if (GetVersionEx(&osi) && osi.dwPlatformId == VER_PLATFORM_WIN32_NT) { + if (!init_winver()) + { + modalfatalbox("Windows refuses to report a version"); + } + if (osVersion.dwPlatformId == VER_PLATFORM_WIN32_NT) { has_security = TRUE; } else has_security = FALSE; @@ -1965,7 +1981,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) command = ""; break; } else { - add_keyfile(argv[i]); + add_keyfile(filename_from_str(argv[i])); added_keys = TRUE; } }