Take the random number generator back out of Pageant: the `random'
[u/mdw/putty] / pageant.c
index 1b282ab..c401ea5 100644 (file)
--- 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);