get_random_data() can return NULL (for instance, if we can't open /dev/random
[u/mdw/putty] / cmdgen.c
index 763d05e..9aa585f 100644 (file)
--- a/cmdgen.c
+++ b/cmdgen.c
@@ -233,7 +233,7 @@ static int move(char *from, char *to)
     return TRUE;
 }
 
-static char *blobfp(char *alg, int bits, char *blob, int bloblen)
+static char *blobfp(char *alg, int bits, unsigned char *blob, int bloblen)
 {
     char buffer[128];
     unsigned char digest[16];
@@ -270,7 +270,8 @@ int main(int argc, char **argv)
     int sshver = 0;
     struct ssh2_userkey *ssh2key = NULL;
     struct RSAKey *ssh1key = NULL;
-    char *ssh2blob = NULL, *ssh2alg = NULL;
+    unsigned char *ssh2blob = NULL;
+    char *ssh2alg = NULL;
     const struct ssh_signkey *ssh2algf = NULL;
     int ssh2bloblen;
     char *passphrase = NULL;
@@ -639,6 +640,11 @@ int main(int argc, char **argv)
 
        random_ref();
        entropy = get_random_data(bits / 8);
+       if (!entropy) {
+           fprintf(stderr, "puttygen: failed to collect entropy, "
+                   "could not generate key\n");
+           return 1;
+       }
        random_add_heavynoise(entropy, bits / 8);
        memset(entropy, 0, bits/8);
        sfree(entropy);
@@ -715,12 +721,12 @@ int main(int argc, char **argv)
            ssh1key = snew(struct RSAKey);
            if (!load_encrypted) {
                void *vblob;
-               char *blob;
+               unsigned char *blob;
                int n, l, bloblen;
 
                ret = rsakey_pubblob(&infilename, &vblob, &bloblen,
                                     &origcomment, &error);
-               blob = (char *)vblob;
+               blob = (unsigned char *)vblob;
 
                n = 4;                 /* skip modulus bits */
                
@@ -892,7 +898,7 @@ int main(int argc, char **argv)
            assert(ssh1key);
 
            if (outfile)
-               fp = f_open(outfilename, "w");
+               fp = f_open(outfilename, "w", FALSE);
            else
                fp = stdout;
            dec1 = bignum_decimal(ssh1key->exponent);
@@ -950,7 +956,7 @@ int main(int argc, char **argv)
                *p++ = '\0';
 
            if (outfile)
-               fp = f_open(outfilename, "w");
+               fp = f_open(outfilename, "w", FALSE);
            else
                fp = stdout;
            fprintf(fp, "%s\n", buffer);
@@ -980,7 +986,7 @@ int main(int argc, char **argv)
            }
 
            if (outfile)
-               fp = f_open(outfilename, "w");
+               fp = f_open(outfilename, "w", FALSE);
            else
                fp = stdout;
            fprintf(fp, "%s\n", fingerprint);