X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/36b4376e151a09df0e03e9fdd10bddbe2204b23a..7bd029472d96162f71f61df67baedc00fc0bb1a8:/pageant.c diff --git a/pageant.c b/pageant.c index 1b282ab8..c401ea55 100644 --- a/pageant.c +++ b/pageant.c @@ -128,6 +128,24 @@ static void *get_keylist1(void); static void *get_keylist2(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 + * never be called. + * + * If it _is_ called, there is a _serious_ problem, because it + * won't generate true random numbers. So we must scream, panic, + * and exit immediately if that should happen. + */ +int random_byte(void) +{ + MessageBox(main_hwnd, "Internal Error", APPNAME, MB_OK | MB_ICONERROR); + exit(0); + /* this line can't be reached but it placates MSVC's warnings :-) */ + return 0; +} + +/* * Blob structure for passing to the asymmetric SSH2 key compare * function, prototyped here. */ @@ -419,7 +437,7 @@ static void add_keyfile(Filename filename) 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); @@ -459,7 +477,7 @@ static void add_keyfile(Filename filename) 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; @@ -532,7 +550,7 @@ static void add_keyfile(Filename 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; @@ -580,7 +598,7 @@ static void add_keyfile(Filename filename) 4 + clen /* comment */ ; - request = smalloc(reqlen); + request = snewn(reqlen, unsigned char); request[4] = SSH2_AGENTC_ADD_IDENTITY; reqlen = 5; @@ -639,7 +657,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); @@ -684,7 +702,7 @@ static void *make_keylist2(int *length) } /* Allocate the buffer. */ - p = ret = smalloc(len); + p = ret = snewn(len, unsigned char); if (length) *length = len; /* @@ -730,7 +748,7 @@ static void *get_keylist1(void) 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 { @@ -761,7 +779,7 @@ static void *get_keylist2(void) 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 { @@ -913,7 +931,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); @@ -921,7 +939,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'; @@ -949,7 +967,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; @@ -977,7 +995,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'; @@ -1222,7 +1240,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; @@ -1369,7 +1387,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); @@ -1930,11 +1948,6 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) } /* - * Initialise the random number generator. - */ - random_init(); - - /* * Initialise storage for short-term passphrase cache. */ passphrases = newtree234(NULL);