X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/df3c4460d6b01d4f8b33119c795c1f7ca09bee1e..3d88e64dfcf5dc0fd361ce0c504c67a9196ce44c:/import.c diff --git a/import.c b/import.c index 2ec1fa2d..1210cc51 100644 --- a/import.c +++ b/import.c @@ -8,6 +8,7 @@ #include #include +#include "putty.h" #include "ssh.h" #include "misc.h" @@ -23,13 +24,15 @@ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) -int openssh_encrypted(char *filename); -struct ssh2_userkey *openssh_read(char *filename, char *passphrase); -int openssh_write(char *filename, struct ssh2_userkey *key, char *passphrase); +int openssh_encrypted(const Filename *filename); +struct ssh2_userkey *openssh_read(const Filename *filename, char *passphrase); +int openssh_write(const Filename *filename, struct ssh2_userkey *key, + char *passphrase); -int sshcom_encrypted(char *filename, char **comment); -struct ssh2_userkey *sshcom_read(char *filename, char *passphrase); -int sshcom_write(char *filename, struct ssh2_userkey *key, char *passphrase); +int sshcom_encrypted(const Filename *filename, char **comment); +struct ssh2_userkey *sshcom_read(const Filename *filename, char *passphrase); +int sshcom_write(const Filename *filename, struct ssh2_userkey *key, + char *passphrase); /* * Given a key type, determine whether we know how to import it. @@ -59,10 +62,11 @@ int import_target_type(int type) /* * Determine whether a foreign key is encrypted. */ -int import_encrypted(char *filename, int type, char **comment) +int import_encrypted(const Filename *filename, int type, char **comment) { if (type == SSH_KEYTYPE_OPENSSH) { - *comment = dupstr(filename); /* OpenSSH doesn't do key comments */ + /* OpenSSH doesn't do key comments */ + *comment = dupstr(filename_to_str(filename)); return openssh_encrypted(filename); } if (type == SSH_KEYTYPE_SSHCOM) { @@ -74,7 +78,8 @@ int import_encrypted(char *filename, int type, char **comment) /* * Import an SSH1 key. */ -int import_ssh1(char *filename, int type, struct RSAKey *key, char *passphrase) +int import_ssh1(const Filename *filename, int type, + struct RSAKey *key, char *passphrase) { return 0; } @@ -82,7 +87,8 @@ int import_ssh1(char *filename, int type, struct RSAKey *key, char *passphrase) /* * Import an SSH2 key. */ -struct ssh2_userkey *import_ssh2(char *filename, int type, char *passphrase) +struct ssh2_userkey *import_ssh2(const Filename *filename, int type, + char *passphrase) { if (type == SSH_KEYTYPE_OPENSSH) return openssh_read(filename, passphrase); @@ -94,7 +100,8 @@ struct ssh2_userkey *import_ssh2(char *filename, int type, char *passphrase) /* * Export an SSH1 key. */ -int export_ssh1(char *filename, int type, struct RSAKey *key, char *passphrase) +int export_ssh1(const Filename *filename, int type, struct RSAKey *key, + char *passphrase) { return 0; } @@ -102,7 +109,7 @@ int export_ssh1(char *filename, int type, struct RSAKey *key, char *passphrase) /* * Export an SSH2 key. */ -int export_ssh2(char *filename, int type, +int export_ssh2(const Filename *filename, int type, struct ssh2_userkey *key, char *passphrase) { if (type == SSH_KEYTYPE_OPENSSH) @@ -141,8 +148,8 @@ int export_ssh2(char *filename, int type, /* Primitive versus constructed bit. */ #define ASN1_CONSTRUCTED (1 << 5) -int ber_read_id_len(void *source, int sourcelen, - int *id, int *length, int *flags) +static int ber_read_id_len(void *source, int sourcelen, + int *id, int *length, int *flags) { unsigned char *p = (unsigned char *) source; @@ -191,7 +198,7 @@ int ber_read_id_len(void *source, int sourcelen, * Will avoid writing anything if dest is NULL, but still return * amount of space required. */ -int ber_write_id_len(void *dest, int id, int length, int flags) +static int ber_write_id_len(void *dest, int id, int length, int flags) { unsigned char *d = (unsigned char *)dest; int len = 0; @@ -275,7 +282,7 @@ static int put_mp(void *target, void *data, int len) /* Simple structure to point to an mp-int within a blob. */ struct mpint_pos { void *start; int bytes; }; -int ssh2_read_mpint(void *data, int len, struct mpint_pos *ret) +static int ssh2_read_mpint(void *data, int len, struct mpint_pos *ret) { int bytes; unsigned char *d = (unsigned char *) data; @@ -309,7 +316,7 @@ struct openssh_key { int keyblob_len, keyblob_size; }; -struct openssh_key *load_openssh_key(char *filename) +static struct openssh_key *load_openssh_key(const Filename *filename) { struct openssh_key *ret; FILE *fp; @@ -319,13 +326,13 @@ struct openssh_key *load_openssh_key(char *filename) char base64_bit[4]; int base64_chars = 0; - ret = smalloc(sizeof(*ret)); + ret = snew(struct openssh_key); ret->keyblob = NULL; ret->keyblob_len = ret->keyblob_size = 0; ret->encrypted = 0; memset(ret->iv, 0, sizeof(ret->iv)); - fp = fopen(filename, "r"); + fp = f_open(*filename, "r"); if (!fp) { errmsg = "Unable to open key file"; goto error; @@ -409,7 +416,8 @@ struct openssh_key *load_openssh_key(char *filename) if (ret->keyblob_len + len > ret->keyblob_size) { ret->keyblob_size = ret->keyblob_len + len + 256; - ret->keyblob = srealloc(ret->keyblob, ret->keyblob_size); + ret->keyblob = sresize(ret->keyblob, ret->keyblob_size, + unsigned char); } memcpy(ret->keyblob + ret->keyblob_len, out, len); @@ -451,7 +459,7 @@ struct openssh_key *load_openssh_key(char *filename) return NULL; } -int openssh_encrypted(char *filename) +int openssh_encrypted(const Filename *filename) { struct openssh_key *key = load_openssh_key(filename); int ret; @@ -466,7 +474,7 @@ int openssh_encrypted(char *filename) return ret; } -struct ssh2_userkey *openssh_read(char *filename, char *passphrase) +struct ssh2_userkey *openssh_read(const Filename *filename, char *passphrase) { struct openssh_key *key = load_openssh_key(filename); struct ssh2_userkey *retkey; @@ -498,20 +506,20 @@ struct ssh2_userkey *openssh_read(char *filename, char *passphrase) unsigned char keybuf[32]; MD5Init(&md5c); - MD5Update(&md5c, passphrase, strlen(passphrase)); - MD5Update(&md5c, key->iv, 8); + MD5Update(&md5c, (unsigned char *)passphrase, strlen(passphrase)); + MD5Update(&md5c, (unsigned char *)key->iv, 8); MD5Final(keybuf, &md5c); MD5Init(&md5c); MD5Update(&md5c, keybuf, 16); - MD5Update(&md5c, passphrase, strlen(passphrase)); - MD5Update(&md5c, key->iv, 8); + MD5Update(&md5c, (unsigned char *)passphrase, strlen(passphrase)); + MD5Update(&md5c, (unsigned char *)key->iv, 8); MD5Final(keybuf+16, &md5c); /* * Now decrypt the key blob. */ - des3_decrypt_pubkey_ossh(keybuf, key->iv, + des3_decrypt_pubkey_ossh(keybuf, (unsigned char *)key->iv, key->keyblob, key->keyblob_len); memset(&md5c, 0, sizeof(md5c)); @@ -557,7 +565,7 @@ struct ssh2_userkey *openssh_read(char *filename, char *passphrase) * Space to create key blob in. */ blobsize = 256+key->keyblob_len; - blob = smalloc(blobsize); + blob = snewn(blobsize, unsigned char); PUT_32BIT(blob, 7); if (key->type == OSSH_DSA) memcpy(blob+4, "ssh-dss", 7); @@ -593,7 +601,7 @@ struct ssh2_userkey *openssh_read(char *filename, char *passphrase) */ if (i == 1) { /* Save the details for after we deal with number 2. */ - modptr = p; + modptr = (char *)p; modlen = len; } else if (i != 6 && i != 7) { PUT_32BIT(blob+blobptr, len); @@ -629,7 +637,7 @@ struct ssh2_userkey *openssh_read(char *filename, char *passphrase) * the sanity checks for free. */ assert(privptr > 0); /* should have bombed by now if not */ - retkey = smalloc(sizeof(struct ssh2_userkey)); + retkey = snew(struct ssh2_userkey); retkey->alg = (key->type == OSSH_RSA ? &ssh_rsa : &ssh_dss); retkey->data = retkey->alg->createkey(blob, privptr, blob+privptr, blobptr-privptr); @@ -655,7 +663,8 @@ struct ssh2_userkey *openssh_read(char *filename, char *passphrase) return retval; } -int openssh_write(char *filename, struct ssh2_userkey *key, char *passphrase) +int openssh_write(const Filename *filename, struct ssh2_userkey *key, + char *passphrase) { unsigned char *pubblob, *privblob, *spareblob; int publen, privlen, sparelen; @@ -711,7 +720,7 @@ int openssh_write(char *filename, struct ssh2_userkey *key, char *passphrase) dmp1.bytes = (bignum_bitcount(bdmp1)+8)/8; dmq1.bytes = (bignum_bitcount(bdmq1)+8)/8; sparelen = dmp1.bytes + dmq1.bytes; - spareblob = smalloc(sparelen); + spareblob = snewn(sparelen, unsigned char); dmp1.start = spareblob; dmq1.start = spareblob + dmp1.bytes; for (i = 0; i < dmp1.bytes; i++) @@ -783,7 +792,7 @@ int openssh_write(char *filename, struct ssh2_userkey *key, char *passphrase) /* * Now we know how big outblob needs to be. Allocate it. */ - outblob = smalloc(outlen); + outblob = snewn(outlen, unsigned char); /* * And write the data into it. @@ -837,13 +846,13 @@ int openssh_write(char *filename, struct ssh2_userkey *key, char *passphrase) for (i = 0; i < 8; i++) iv[i] = random_byte(); MD5Init(&md5c); - MD5Update(&md5c, passphrase, strlen(passphrase)); + MD5Update(&md5c, (unsigned char *)passphrase, strlen(passphrase)); MD5Update(&md5c, iv, 8); MD5Final(keybuf, &md5c); MD5Init(&md5c); MD5Update(&md5c, keybuf, 16); - MD5Update(&md5c, passphrase, strlen(passphrase)); + MD5Update(&md5c, (unsigned char *)passphrase, strlen(passphrase)); MD5Update(&md5c, iv, 8); MD5Final(keybuf+16, &md5c); @@ -860,7 +869,7 @@ int openssh_write(char *filename, struct ssh2_userkey *key, char *passphrase) * And save it. We'll use Unix line endings just in case it's * subsequently transferred in binary mode. */ - fp = fopen(filename, "wb"); /* ensure Unix line endings */ + fp = f_open(*filename, "wb"); /* ensure Unix line endings */ if (!fp) goto error; fputs(header, fp); @@ -977,7 +986,7 @@ struct sshcom_key { int keyblob_len, keyblob_size; }; -struct sshcom_key *load_sshcom_key(char *filename) +static struct sshcom_key *load_sshcom_key(const Filename *filename) { struct sshcom_key *ret; FILE *fp; @@ -988,12 +997,12 @@ struct sshcom_key *load_sshcom_key(char *filename) char base64_bit[4]; int base64_chars = 0; - ret = smalloc(sizeof(*ret)); + ret = snew(struct sshcom_key); ret->comment[0] = '\0'; ret->keyblob = NULL; ret->keyblob_len = ret->keyblob_size = 0; - fp = fopen(filename, "r"); + fp = f_open(*filename, "r"); if (!fp) { errmsg = "Unable to open key file"; goto error; @@ -1064,7 +1073,8 @@ struct sshcom_key *load_sshcom_key(char *filename) if (ret->keyblob_len + len > ret->keyblob_size) { ret->keyblob_size = ret->keyblob_len + len + 256; - ret->keyblob = srealloc(ret->keyblob, ret->keyblob_size); + ret->keyblob = sresize(ret->keyblob, ret->keyblob_size, + unsigned char); } memcpy(ret->keyblob + ret->keyblob_len, out, len); @@ -1095,7 +1105,7 @@ struct sshcom_key *load_sshcom_key(char *filename) return NULL; } -int sshcom_encrypted(char *filename, char **comment) +int sshcom_encrypted(const Filename *filename, char **comment) { struct sshcom_key *key = load_sshcom_key(filename); int pos, len, answer; @@ -1135,7 +1145,7 @@ int sshcom_encrypted(char *filename, char **comment) return answer; } -int sshcom_read_mpint(void *data, int len, struct mpint_pos *ret) +static int sshcom_read_mpint(void *data, int len, struct mpint_pos *ret) { int bits; int bytes; @@ -1177,7 +1187,7 @@ static int sshcom_put_mpint(void *target, void *data, int len) return len+4; } -struct ssh2_userkey *sshcom_read(char *filename, char *passphrase) +struct ssh2_userkey *sshcom_read(const Filename *filename, char *passphrase) { struct sshcom_key *key = load_sshcom_key(filename); char *errmsg; @@ -1251,7 +1261,7 @@ struct ssh2_userkey *sshcom_read(char *filename, char *passphrase) errmsg = "Key blob does not contain actual key data"; goto error; } - ciphertext = key->keyblob + pos + 4; + ciphertext = (char *)key->keyblob + pos + 4; cipherlen = len; if (cipherlen == 0) { errmsg = "Length of key data is zero"; @@ -1280,11 +1290,11 @@ struct ssh2_userkey *sshcom_read(char *filename, char *passphrase) } MD5Init(&md5c); - MD5Update(&md5c, passphrase, strlen(passphrase)); + MD5Update(&md5c, (unsigned char *)passphrase, strlen(passphrase)); MD5Final(keybuf, &md5c); MD5Init(&md5c); - MD5Update(&md5c, passphrase, strlen(passphrase)); + MD5Update(&md5c, (unsigned char *)passphrase, strlen(passphrase)); MD5Update(&md5c, keybuf, 16); MD5Final(keybuf+16, &md5c); @@ -1292,7 +1302,8 @@ struct ssh2_userkey *sshcom_read(char *filename, char *passphrase) * Now decrypt the key blob. */ memset(iv, 0, sizeof(iv)); - des3_decrypt_pubkey_ossh(keybuf, iv, ciphertext, cipherlen); + des3_decrypt_pubkey_ossh(keybuf, iv, (unsigned char *)ciphertext, + cipherlen); memset(&md5c, 0, sizeof(md5c)); memset(keybuf, 0, sizeof(keybuf)); @@ -1324,7 +1335,7 @@ struct ssh2_userkey *sshcom_read(char *filename, char *passphrase) * end up feeding them to alg->createkey(). */ blobsize = cipherlen + 256; - blob = smalloc(blobsize); + blob = snewn(blobsize, unsigned char); privlen = 0; if (type == RSA) { struct mpint_pos n, e, d, u, p, q; @@ -1382,7 +1393,7 @@ struct ssh2_userkey *sshcom_read(char *filename, char *passphrase) assert(privlen > 0); /* should have bombed by now if not */ - retkey = smalloc(sizeof(struct ssh2_userkey)); + retkey = snew(struct ssh2_userkey); retkey->alg = alg; retkey->data = alg->createkey(blob, publen, blob+publen, privlen); if (!retkey->data) { @@ -1407,7 +1418,8 @@ struct ssh2_userkey *sshcom_read(char *filename, char *passphrase) return ret; } -int sshcom_write(char *filename, struct ssh2_userkey *key, char *passphrase) +int sshcom_write(const Filename *filename, struct ssh2_userkey *key, + char *passphrase) { unsigned char *pubblob, *privblob; int publen, privlen; @@ -1492,7 +1504,7 @@ int sshcom_write(char *filename, struct ssh2_userkey *key, char *passphrase) outlen = 512; for (i = 0; i < nnumbers; i++) outlen += 4 + numbers[i].bytes; - outblob = smalloc(outlen); + outblob = snewn(outlen, unsigned char); /* * Create the unencrypted key blob. @@ -1523,7 +1535,7 @@ int sshcom_write(char *filename, struct ssh2_userkey *key, char *passphrase) while (padding--) outblob[pos++] = random_byte(); } - ciphertext = outblob+lenpos+4; + ciphertext = (char *)outblob+lenpos+4; cipherlen = pos - (lenpos+4); assert(!passphrase || cipherlen % 8 == 0); /* Wrap up the encrypted blob string. */ @@ -1549,11 +1561,11 @@ int sshcom_write(char *filename, struct ssh2_userkey *key, char *passphrase) unsigned char keybuf[32], iv[8]; MD5Init(&md5c); - MD5Update(&md5c, passphrase, strlen(passphrase)); + MD5Update(&md5c, (unsigned char *)passphrase, strlen(passphrase)); MD5Final(keybuf, &md5c); MD5Init(&md5c); - MD5Update(&md5c, passphrase, strlen(passphrase)); + MD5Update(&md5c, (unsigned char *)passphrase, strlen(passphrase)); MD5Update(&md5c, keybuf, 16); MD5Final(keybuf+16, &md5c); @@ -1561,7 +1573,8 @@ int sshcom_write(char *filename, struct ssh2_userkey *key, char *passphrase) * Now decrypt the key blob. */ memset(iv, 0, sizeof(iv)); - des3_encrypt_pubkey_ossh(keybuf, iv, ciphertext, cipherlen); + des3_encrypt_pubkey_ossh(keybuf, iv, (unsigned char *)ciphertext, + cipherlen); memset(&md5c, 0, sizeof(md5c)); memset(keybuf, 0, sizeof(keybuf)); @@ -1571,7 +1584,7 @@ int sshcom_write(char *filename, struct ssh2_userkey *key, char *passphrase) * And save it. We'll use Unix line endings just in case it's * subsequently transferred in binary mode. */ - fp = fopen(filename, "wb"); /* ensure Unix line endings */ + fp = f_open(*filename, "wb"); /* ensure Unix line endings */ if (!fp) goto error; fputs("---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----\n", fp);