#include <stdlib.h>
#include <assert.h>
+#include "putty.h"
#include "ssh.h"
#include "misc.h"
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';
*/
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 */
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 */
* 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 */
* 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;
*bloblen = 0;
ret = 0;
- fp = fopen(filename, "rb");
+ fp = f_open(*filename, "rb");
if (!fp)
return 0; /* doesn't even exist */
/*
* 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];
*/
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 */
/*
* 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);
int c;
size = 128;
- text = smalloc(size);
+ text = snewn(size, char);
len = 0;
text[len] = '\0';
}
if (len + 1 > size) {
size += 128;
- text = srealloc(text, size);
+ text = sresize(text, size, char);
}
text[len++] = c;
text[len] = '\0';
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;
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);
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;
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;
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);
/*
* 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,
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;
public_blob = NULL;
- fp = fopen(filename, "rb");
+ fp = f_open(*filename, "rb");
if (!fp)
goto error;
*pub_blob_len = public_blob_len;
if (algorithm)
*algorithm = alg->name;
- return public_blob;
+ return (char *)public_blob;
/*
* Error processing.
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;
if (commentptr)
*commentptr = NULL;
- fp = fopen(filename, "rb");
+ fp = f_open(*filename, "rb");
if (!fp)
return 0;
if (!read_header(fp, header)
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;
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;
}
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
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);
}
if (passphrase) {
- char key[40];
+ unsigned char key[40];
SHA_State s;
passlen = strlen(passphrase);
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);
* 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];
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);