Colin's const-fixing Patch Of Death. Seems to build fine on Windows
[u/mdw/putty] / sshpubk.c
index 8a9b75d..d0594b7 100644 (file)
--- a/sshpubk.c
+++ b/sshpubk.c
@@ -9,6 +9,7 @@
 #include <stdlib.h>
 #include <assert.h>
 
+#include "putty.h"
 #include "ssh.h"
 #include "misc.h"
 
@@ -86,7 +87,7 @@ static int loadrsakey_main(FILE * fp, struct RSAKey *key, int pub_only,
     i += 4;
     if (len - i < j)
        goto end;
-    comment = smalloc(j + 1);
+    comment = snewn(j + 1, char);
     if (comment) {
        memcpy(comment, buf + i, j);
        comment[j] = '\0';
@@ -105,7 +106,7 @@ static int loadrsakey_main(FILE * fp, struct RSAKey *key, int pub_only,
      */
     if (ciphertype) {
        MD5Init(&md5c);
-       MD5Update(&md5c, passphrase, strlen(passphrase));
+       MD5Update(&md5c, (unsigned char *)passphrase, strlen(passphrase));
        MD5Final(keybuf, &md5c);
        des3_decrypt_pubkey(keybuf, buf + i, (len - i + 7) & ~7);
        memset(keybuf, 0, sizeof(keybuf));      /* burn the evidence */
@@ -152,12 +153,12 @@ static int loadrsakey_main(FILE * fp, struct RSAKey *key, int pub_only,
     return ret;
 }
 
-int loadrsakey(char *filename, struct RSAKey *key, char *passphrase)
+int loadrsakey(const Filename *filename, struct RSAKey *key, char *passphrase)
 {
     FILE *fp;
-    unsigned char buf[64];
+    char buf[64];
 
-    fp = fopen(filename, "rb");
+    fp = f_open(*filename, "rb");
     if (!fp)
        return 0;                      /* doesn't even exist */
 
@@ -180,12 +181,12 @@ int loadrsakey(char *filename, struct RSAKey *key, char *passphrase)
  * See whether an RSA key is encrypted. Return its comment field as
  * well.
  */
-int rsakey_encrypted(char *filename, char **comment)
+int rsakey_encrypted(const Filename *filename, char **comment)
 {
     FILE *fp;
-    unsigned char buf[64];
+    char buf[64];
 
-    fp = fopen(filename, "rb");
+    fp = f_open(*filename, "rb");
     if (!fp)
        return 0;                      /* doesn't even exist */
 
@@ -205,10 +206,10 @@ int rsakey_encrypted(char *filename, char **comment)
  * an RSA key, as given in the agent protocol (modulus bits,
  * exponent, modulus).
  */
-int rsakey_pubblob(char *filename, void **blob, int *bloblen)
+int rsakey_pubblob(const Filename *filename, void **blob, int *bloblen)
 {
     FILE *fp;
-    unsigned char buf[64];
+    char buf[64];
     struct RSAKey key;
     int ret;
 
@@ -217,7 +218,7 @@ int rsakey_pubblob(char *filename, void **blob, int *bloblen)
     *bloblen = 0;
     ret = 0;
 
-    fp = fopen(filename, "rb");
+    fp = f_open(*filename, "rb");
     if (!fp)
        return 0;                      /* doesn't even exist */
 
@@ -240,7 +241,7 @@ int rsakey_pubblob(char *filename, void **blob, int *bloblen)
 /*
  * Save an RSA key file. Return nonzero on success.
  */
-int saversakey(char *filename, struct RSAKey *key, char *passphrase)
+int saversakey(const Filename *filename, struct RSAKey *key, char *passphrase)
 {
     unsigned char buf[16384];
     unsigned char keybuf[16];
@@ -321,7 +322,7 @@ int saversakey(char *filename, struct RSAKey *key, char *passphrase)
      */
     if (passphrase) {
        MD5Init(&md5c);
-       MD5Update(&md5c, passphrase, strlen(passphrase));
+       MD5Update(&md5c, (unsigned char *)passphrase, strlen(passphrase));
        MD5Final(keybuf, &md5c);
        des3_encrypt_pubkey(keybuf, estart, p - estart);
        memset(keybuf, 0, sizeof(keybuf));      /* burn the evidence */
@@ -330,7 +331,7 @@ int saversakey(char *filename, struct RSAKey *key, char *passphrase)
     /*
      * Done. Write the result to the file.
      */
-    fp = fopen(filename, "wb");
+    fp = f_open(*filename, "wb");
     if (fp) {
        int ret = (fwrite(buf, 1, p - buf, fp) == (size_t) (p - buf));
        ret = ret && (fclose(fp) == 0);
@@ -456,7 +457,7 @@ static char *read_body(FILE * fp)
     int c;
 
     size = 128;
-    text = smalloc(size);
+    text = snewn(size, char);
     len = 0;
     text[len] = '\0';
 
@@ -474,7 +475,7 @@ static char *read_body(FILE * fp)
        }
        if (len + 1 > size) {
            size += 128;
-           text = srealloc(text, size);
+           text = sresize(text, size, char);
        }
        text[len++] = c;
        text[len] = '\0';
@@ -529,7 +530,7 @@ int base64_decode_atom(char *atom, unsigned char *out)
     return len;
 }
 
-static char *read_blob(FILE * fp, int nlines, int *bloblen)
+static unsigned char *read_blob(FILE * fp, int nlines, int *bloblen)
 {
     unsigned char *blob;
     char *line;
@@ -537,7 +538,7 @@ static char *read_blob(FILE * fp, int nlines, int *bloblen)
     int i, j, k;
 
     /* We expect at most 64 base64 characters, ie 48 real bytes, per line. */
-    blob = smalloc(48 * nlines);
+    blob = snewn(48 * nlines, unsigned char);
     len = 0;
     for (i = 0; i < nlines; i++) {
        line = read_body(fp);
@@ -573,7 +574,8 @@ struct ssh2_userkey ssh2_wrong_passphrase = {
     NULL, NULL, NULL
 };
 
-struct ssh2_userkey *ssh2_load_userkey(char *filename, char *passphrase)
+struct ssh2_userkey *ssh2_load_userkey(const Filename *filename,
+                                      char *passphrase)
 {
     FILE *fp;
     char header[40], *b, *encryption, *comment, *mac;
@@ -586,10 +588,10 @@ struct ssh2_userkey *ssh2_load_userkey(char *filename, char *passphrase)
     int passlen = passphrase ? strlen(passphrase) : 0;
 
     ret = NULL;                               /* return NULL for most errors */
-    comment = mac = NULL;
+    encryption = comment = mac = NULL;
     public_blob = private_blob = NULL;
 
-    fp = fopen(filename, "rb");
+    fp = f_open(*filename, "rb");
     if (!fp)
        goto error;
 
@@ -725,7 +727,7 @@ struct ssh2_userkey *ssh2_load_userkey(char *filename, char *passphrase)
                      4 + commlen +
                      4 + public_blob_len +
                      4 + private_blob_len);
-           macdata = smalloc(maclen);
+           macdata = snewn(maclen, unsigned char);
            p = macdata;
 #define DO_STR(s,len) PUT_32BIT(p,(len));memcpy(p+4,(s),(len));p+=4+(len)
            DO_STR(alg->name, namelen);
@@ -776,7 +778,7 @@ struct ssh2_userkey *ssh2_load_userkey(char *filename, char *passphrase)
     /*
      * Create and return the key.
      */
-    ret = smalloc(sizeof(struct ssh2_userkey));
+    ret = snew(struct ssh2_userkey);
     ret->alg = alg;
     ret->comment = comment;
     ret->data = alg->createkey(public_blob, public_blob_len,
@@ -810,7 +812,7 @@ struct ssh2_userkey *ssh2_load_userkey(char *filename, char *passphrase)
     return ret;
 }
 
-char *ssh2_userkey_loadpub(char *filename, char **algorithm,
+char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm,
                           int *pub_blob_len)
 {
     FILE *fp;
@@ -822,7 +824,7 @@ char *ssh2_userkey_loadpub(char *filename, char **algorithm,
 
     public_blob = NULL;
 
-    fp = fopen(filename, "rb");
+    fp = f_open(*filename, "rb");
     if (!fp)
        goto error;
 
@@ -873,7 +875,7 @@ char *ssh2_userkey_loadpub(char *filename, char **algorithm,
        *pub_blob_len = public_blob_len;
     if (algorithm)
        *algorithm = alg->name;
-    return public_blob;
+    return (char *)public_blob;
 
     /*
      * Error processing.
@@ -886,7 +888,7 @@ char *ssh2_userkey_loadpub(char *filename, char **algorithm,
     return NULL;
 }
 
-int ssh2_userkey_encrypted(char *filename, char **commentptr)
+int ssh2_userkey_encrypted(const Filename *filename, char **commentptr)
 {
     FILE *fp;
     char header[40], *b, *comment;
@@ -895,7 +897,7 @@ int ssh2_userkey_encrypted(char *filename, char **commentptr)
     if (commentptr)
        *commentptr = NULL;
 
-    fp = fopen(filename, "rb");
+    fp = f_open(*filename, "rb");
     if (!fp)
        return 0;
     if (!read_header(fp, header)
@@ -949,30 +951,6 @@ int base64_lines(int datalen)
     return (datalen + 47) / 48;
 }
 
-void base64_encode_atom(unsigned char *data, int n, char *out)
-{
-    static const char base64_chars[] =
-       "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-    unsigned word;
-
-    word = data[0] << 16;
-    if (n > 1)
-       word |= data[1] << 8;
-    if (n > 2)
-       word |= data[2];
-    out[0] = base64_chars[(word >> 18) & 0x3F];
-    out[1] = base64_chars[(word >> 12) & 0x3F];
-    if (n > 1)
-       out[2] = base64_chars[(word >> 6) & 0x3F];
-    else
-       out[2] = '=';
-    if (n > 2)
-       out[3] = base64_chars[word & 0x3F];
-    else
-       out[3] = '=';
-}
-
 void base64_encode(FILE * fp, unsigned char *data, int datalen, int cpl)
 {
     int linelen = 0;
@@ -996,7 +974,7 @@ void base64_encode(FILE * fp, unsigned char *data, int datalen, int cpl)
     fputc('\n', fp);
 }
 
-int ssh2_save_userkey(char *filename, struct ssh2_userkey *key,
+int ssh2_save_userkey(const Filename *filename, struct ssh2_userkey *key,
                      char *passphrase)
 {
     FILE *fp;
@@ -1031,7 +1009,7 @@ int ssh2_save_userkey(char *filename, struct ssh2_userkey *key,
     }
     priv_encrypted_len = priv_blob_len + cipherblk - 1;
     priv_encrypted_len -= priv_encrypted_len % cipherblk;
-    priv_blob_encrypted = smalloc(priv_encrypted_len);
+    priv_blob_encrypted = snewn(priv_encrypted_len, unsigned char);
     memset(priv_blob_encrypted, 0, priv_encrypted_len);
     memcpy(priv_blob_encrypted, priv_blob, priv_blob_len);
     /* Create padding based on the SHA hash of the unpadded blob. This prevents
@@ -1058,7 +1036,7 @@ int ssh2_save_userkey(char *filename, struct ssh2_userkey *key,
                  4 + commlen +
                  4 + pub_blob_len +
                  4 + priv_encrypted_len);
-       macdata = smalloc(maclen);
+       macdata = snewn(maclen, unsigned char);
        p = macdata;
 #define DO_STR(s,len) PUT_32BIT(p,(len));memcpy(p+4,(s),(len));p+=4+(len)
        DO_STR(key->alg->name, namelen);
@@ -1080,7 +1058,7 @@ int ssh2_save_userkey(char *filename, struct ssh2_userkey *key,
     }
 
     if (passphrase) {
-       char key[40];
+       unsigned char key[40];
        SHA_State s;
 
        passlen = strlen(passphrase);
@@ -1100,7 +1078,7 @@ int ssh2_save_userkey(char *filename, struct ssh2_userkey *key,
        memset(&s, 0, sizeof(s));
     }
 
-    fp = fopen(filename, "w");
+    fp = f_open(*filename, "w");
     if (!fp)
        return 0;
     fprintf(fp, "PuTTY-User-Key-File-2: %s\n", key->alg->name);
@@ -1127,7 +1105,7 @@ int ssh2_save_userkey(char *filename, struct ssh2_userkey *key,
  * A function to determine the type of a private key file. Returns
  * 0 on failure, 1 or 2 on success.
  */
-int key_type(char *filename)
+int key_type(const Filename *filename)
 {
     FILE *fp;
     char buf[32];
@@ -1136,7 +1114,7 @@ int key_type(char *filename)
     const char openssh_sig[] = "-----BEGIN ";
     int i;
 
-    fp = fopen(filename, "r");
+    fp = f_open(*filename, "r");
     if (!fp)
        return SSH_KEYTYPE_UNOPENABLE;
     i = fread(buf, 1, sizeof(buf), fp);