X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/6ef154366ba43387f0326a12f11a122f079a9152..875e0b16f64f7b97171d58fe34ebcd57314eb739:/import.c diff --git a/import.c b/import.c index ff438161..d00f31fd 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) @@ -122,11 +129,6 @@ int export_ssh2(char *filename, int type, (c) == '+' || (c) == '/' || (c) == '=' \ ) -extern int base64_decode_atom(char *atom, unsigned char *out); -extern int base64_lines(int datalen); -extern void base64_encode_atom(unsigned char *data, int n, char *out); -extern void base64_encode(FILE *fp, unsigned char *data, int datalen, int cpl); - /* * Read an ASN.1/BER identifier and length pair. * @@ -146,8 +148,8 @@ extern void base64_encode(FILE *fp, unsigned char *data, int datalen, int cpl); /* 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; @@ -196,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; @@ -280,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; @@ -314,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; @@ -330,7 +332,7 @@ struct openssh_key *load_openssh_key(char *filename) 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; @@ -456,7 +458,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; @@ -471,7 +473,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; @@ -503,20 +505,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)); @@ -598,7 +600,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); @@ -660,7 +662,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; @@ -842,13 +845,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); @@ -865,7 +868,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); @@ -982,7 +985,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; @@ -998,7 +1001,7 @@ struct sshcom_key *load_sshcom_key(char *filename) 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; @@ -1100,7 +1103,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; @@ -1140,7 +1143,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; @@ -1182,7 +1185,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; @@ -1256,7 +1259,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"; @@ -1285,11 +1288,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); @@ -1297,7 +1300,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)); @@ -1412,7 +1416,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; @@ -1528,7 +1533,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. */ @@ -1554,11 +1559,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); @@ -1566,7 +1571,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)); @@ -1576,7 +1582,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);