projects
/
u
/
mdw
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Make modinv able to return NULL if its inputs are not coprime, and
[u/mdw/putty]
/
sshpubk.c
diff --git
a/sshpubk.c
b/sshpubk.c
index
fddc6e5
..
ac9e0fa
100644
(file)
--- a/
sshpubk.c
+++ b/
sshpubk.c
@@
-67,19
+67,15
@@
static int loadrsakey_main(FILE * fp, struct RSAKey *key, int pub_only,
i += 4;
/* Now the serious stuff. An ordinary SSH-1 public key. */
i += 4;
/* Now the serious stuff. An ordinary SSH-1 public key. */
-
i +
= makekey(buf + i, len, key, NULL, 1);
- if (
i
< 0)
+
j
= makekey(buf + i, len, key, NULL, 1);
+ if (
j
< 0)
goto end; /* overran */
goto end; /* overran */
-
- if (pub_only) {
- ret = 1;
- goto end;
- }
+ i += j;
/* Next, the comment field. */
/* Next, the comment field. */
- j =
GET_32BIT(buf + i
);
+ j =
toint(GET_32BIT(buf + i)
);
i += 4;
i += 4;
- if (len - i < j)
+ if (
j < 0 ||
len - i < j)
goto end;
comment = snewn(j + 1, char);
if (comment) {
goto end;
comment = snewn(j + 1, char);
if (comment) {
@@
-88,9
+84,17
@@
static int loadrsakey_main(FILE * fp, struct RSAKey *key, int pub_only,
}
i += j;
if (commentptr)
}
i += j;
if (commentptr)
- *commentptr =
comment
;
+ *commentptr =
dupstr(comment)
;
if (key)
key->comment = comment;
if (key)
key->comment = comment;
+ else
+ sfree(comment);
+
+ if (pub_only) {
+ ret = 1;
+ goto end;
+ }
+
if (!key) {
ret = ciphertype != 0;
*error = NULL;
if (!key) {
ret = ciphertype != 0;
*error = NULL;
@@
-105,7
+109,7
@@
static int loadrsakey_main(FILE * fp, struct RSAKey *key, int pub_only,
MD5Update(&md5c, (unsigned char *)passphrase, strlen(passphrase));
MD5Final(keybuf, &md5c);
des3_decrypt_pubkey(keybuf, buf + i, (len - i + 7) & ~7);
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 */
+
smemclr(keybuf, sizeof(keybuf));
/* burn the evidence */
}
/*
}
/*
@@
-147,7
+151,7
@@
static int loadrsakey_main(FILE * fp, struct RSAKey *key, int pub_only,
ret = 1;
end:
ret = 1;
end:
-
memset(buf, 0
, sizeof(buf)); /* burn the evidence */
+
smemclr(buf
, sizeof(buf)); /* burn the evidence */
return ret;
}
return ret;
}
@@
-159,7
+163,7
@@
int loadrsakey(const Filename *filename, struct RSAKey *key, char *passphrase,
int ret = 0;
const char *error = NULL;
int ret = 0;
const char *error = NULL;
- fp = f_open(
*filename, "rb"
);
+ fp = f_open(
filename, "rb", FALSE
);
if (!fp) {
error = "can't open file";
goto end;
if (!fp) {
error = "can't open file";
goto end;
@@
-200,7
+204,7
@@
int rsakey_encrypted(const Filename *filename, char **comment)
FILE *fp;
char buf[64];
FILE *fp;
char buf[64];
- fp = f_open(
*filename, "rb"
);
+ fp = f_open(
filename, "rb", FALSE
);
if (!fp)
return 0; /* doesn't even exist */
if (!fp)
return 0; /* doesn't even exist */
@@
-238,7
+242,7
@@
int rsakey_pubblob(const Filename *filename, void **blob, int *bloblen,
*bloblen = 0;
ret = 0;
*bloblen = 0;
ret = 0;
- fp = f_open(
*filename, "rb"
);
+ fp = f_open(
filename, "rb", FALSE
);
if (!fp) {
error = "can't open file";
goto end;
if (!fp) {
error = "can't open file";
goto end;
@@
-254,8
+258,8
@@
int rsakey_pubblob(const Filename *filename, void **blob, int *bloblen,
*blob = rsa_public_blob(&key, bloblen);
freersakey(&key);
ret = 1;
*blob = rsa_public_blob(&key, bloblen);
freersakey(&key);
ret = 1;
- fp = NULL;
}
}
+ fp = NULL; /* loadrsakey_main unconditionally closes fp */
} else {
error = "not an SSH-1 RSA file";
}
} else {
error = "not an SSH-1 RSA file";
}
@@
-355,13
+359,13
@@
int saversakey(const Filename *filename, struct RSAKey *key, char *passphrase)
MD5Update(&md5c, (unsigned char *)passphrase, strlen(passphrase));
MD5Final(keybuf, &md5c);
des3_encrypt_pubkey(keybuf, estart, p - estart);
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 */
+
smemclr(keybuf, sizeof(keybuf));
/* burn the evidence */
}
/*
* Done. Write the result to the file.
*/
}
/*
* Done. Write the result to the file.
*/
- fp = f_open(
*filename, "wb"
);
+ fp = f_open(
filename, "wb", TRUE
);
if (fp) {
int ret = (fwrite(buf, 1, p - buf, fp) == (size_t) (p - buf));
if (fclose(fp))
if (fp) {
int ret = (fwrite(buf, 1, p - buf, fp) == (size_t) (p - buf));
if (fclose(fp))
@@
-459,7
+463,7
@@
static int read_header(FILE * fp, char *header)
int len = 39;
int c;
int len = 39;
int c;
- while (
len > 0
) {
+ while (
1
) {
c = fgetc(fp);
if (c == '\n' || c == '\r' || c == EOF)
return 0; /* failure */
c = fgetc(fp);
if (c == '\n' || c == '\r' || c == EOF)
return 0; /* failure */
@@
-492,16
+496,14
@@
static char *read_body(FILE * fp)
while (1) {
c = fgetc(fp);
while (1) {
c = fgetc(fp);
- if (c == '\r' || c == '\n') {
- c = fgetc(fp);
- if (c != '\r' && c != '\n' && c != EOF)
- ungetc(c, fp);
+ if (c == '\r' || c == '\n' || c == EOF) {
+ if (c != EOF) {
+ c = fgetc(fp);
+ if (c != '\r' && c != '\n')
+ ungetc(c, fp);
+ }
return text;
}
return text;
}
- if (c == EOF) {
- sfree(text);
- return NULL;
- }
if (len + 1 >= size) {
size += 128;
text = sresize(text, size, char);
if (len + 1 >= size) {
size += 128;
text = sresize(text, size, char);
@@
-631,7
+633,7
@@
struct ssh2_userkey *ssh2_load_userkey(const Filename *filename,
encryption = comment = mac = NULL;
public_blob = private_blob = NULL;
encryption = comment = mac = NULL;
public_blob = private_blob = NULL;
- fp = f_open(
*filename, "rb"
);
+ fp = f_open(
filename, "rb", FALSE
);
if (!fp) {
error = "can't open file";
goto error;
if (!fp) {
error = "can't open file";
goto error;
@@
-646,6
+648,11
@@
struct ssh2_userkey *ssh2_load_userkey(const Filename *filename,
/* this is an old key file; warn and then continue */
old_keyfile_warning();
old_fmt = 1;
/* this is an old key file; warn and then continue */
old_keyfile_warning();
old_fmt = 1;
+ } else if (0 == strncmp(header, "PuTTY-User-Key-File-", 20)) {
+ /* this is a key file FROM THE FUTURE; refuse it, but with a
+ * more specific error message than the generic one below */
+ error = "PuTTY key format too new";
+ goto error;
} else {
error = "not a PuTTY SSH-2 private key";
goto error;
} else {
error = "not a PuTTY SSH-2 private key";
goto error;
@@
-673,7
+680,6
@@
struct ssh2_userkey *ssh2_load_userkey(const Filename *filename,
cipher = 0;
cipherblk = 1;
} else {
cipher = 0;
cipherblk = 1;
} else {
- sfree(encryption);
goto error;
}
goto error;
}
@@
-793,14
+799,14
@@
struct ssh2_userkey *ssh2_load_userkey(const Filename *filename,
hmac_sha1_simple(mackey, 20, macdata, maclen, binary);
hmac_sha1_simple(mackey, 20, macdata, maclen, binary);
-
memset(mackey, 0
, sizeof(mackey));
-
memset(&s, 0
, sizeof(s));
+
smemclr(mackey
, sizeof(mackey));
+
smemclr(&s
, sizeof(s));
} else {
SHA_Simple(macdata, maclen, binary);
}
if (free_macdata) {
} else {
SHA_Simple(macdata, maclen, binary);
}
if (free_macdata) {
-
memset(macdata, 0
, maclen);
+
smemclr(macdata
, maclen);
sfree(macdata);
}
sfree(macdata);
}
@@
-865,9
+871,9
@@
struct ssh2_userkey *ssh2_load_userkey(const Filename *filename,
return ret;
}
return ret;
}
-char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm,
- int *pub_blob_len, char **commentptr,
- const char **errorstr)
+
unsigned
char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm,
+
int *pub_blob_len, char **commentptr,
+
const char **errorstr)
{
FILE *fp;
char header[40], *b;
{
FILE *fp;
char header[40], *b;
@@
-880,7
+886,7
@@
char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm,
public_blob = NULL;
public_blob = NULL;
- fp = f_open(
*filename, "rb"
);
+ fp = f_open(
filename, "rb", FALSE
);
if (!fp) {
error = "can't open file";
goto error;
if (!fp) {
error = "can't open file";
goto error;
@@
-890,7
+896,10
@@
char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm,
if (!read_header(fp, header)
|| (0 != strcmp(header, "PuTTY-User-Key-File-2") &&
0 != strcmp(header, "PuTTY-User-Key-File-1"))) {
if (!read_header(fp, header)
|| (0 != strcmp(header, "PuTTY-User-Key-File-2") &&
0 != strcmp(header, "PuTTY-User-Key-File-1"))) {
- error = "not a PuTTY SSH-2 private key";
+ if (0 == strncmp(header, "PuTTY-User-Key-File-", 20))
+ error = "PuTTY key format too new";
+ else
+ error = "not a PuTTY SSH-2 private key";
goto error;
}
error = "file format error";
goto error;
}
error = "file format error";
@@
-937,7
+946,7
@@
char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm,
*pub_blob_len = public_blob_len;
if (algorithm)
*algorithm = alg->name;
*pub_blob_len = public_blob_len;
if (algorithm)
*algorithm = alg->name;
- return
(char *)
public_blob;
+ return public_blob;
/*
* Error processing.
/*
* Error processing.
@@
-961,7
+970,7
@@
int ssh2_userkey_encrypted(const Filename *filename, char **commentptr)
if (commentptr)
*commentptr = NULL;
if (commentptr)
*commentptr = NULL;
- fp = f_open(
*filename, "rb"
);
+ fp = f_open(
filename, "rb", FALSE
);
if (!fp)
return 0;
if (!read_header(fp, header)
if (!fp)
return 0;
if (!read_header(fp, header)
@@
-999,6
+1008,8
@@
int ssh2_userkey_encrypted(const Filename *filename, char **commentptr)
if (commentptr)
*commentptr = comment;
if (commentptr)
*commentptr = comment;
+ else
+ sfree(comment);
fclose(fp);
if (!strcmp(b, "aes256-cbc"))
fclose(fp);
if (!strcmp(b, "aes256-cbc"))
@@
-1115,10
+1126,10
@@
int ssh2_save_userkey(const Filename *filename, struct ssh2_userkey *key,
SHA_Bytes(&s, passphrase, strlen(passphrase));
SHA_Final(&s, mackey);
hmac_sha1_simple(mackey, 20, macdata, maclen, priv_mac);
SHA_Bytes(&s, passphrase, strlen(passphrase));
SHA_Final(&s, mackey);
hmac_sha1_simple(mackey, 20, macdata, maclen, priv_mac);
-
memset(macdata, 0
, maclen);
+
smemclr(macdata
, maclen);
sfree(macdata);
sfree(macdata);
-
memset(mackey, 0
, sizeof(mackey));
-
memset(&s, 0
, sizeof(s));
+
smemclr(mackey
, sizeof(mackey));
+
smemclr(&s
, sizeof(s));
}
if (passphrase) {
}
if (passphrase) {
@@
-1138,11
+1149,11
@@
int ssh2_save_userkey(const Filename *filename, struct ssh2_userkey *key,
aes256_encrypt_pubkey(key, priv_blob_encrypted,
priv_encrypted_len);
aes256_encrypt_pubkey(key, priv_blob_encrypted,
priv_encrypted_len);
-
memset(key, 0
, sizeof(key));
-
memset(&s, 0
, sizeof(s));
+
smemclr(key
, sizeof(key));
+
smemclr(&s
, sizeof(s));
}
}
- fp = f_open(
*filename, "w"
);
+ fp = f_open(
filename, "w", TRUE
);
if (!fp)
return 0;
fprintf(fp, "PuTTY-User-Key-File-2: %s\n", key->alg->name);
if (!fp)
return 0;
fprintf(fp, "PuTTY-User-Key-File-2: %s\n", key->alg->name);
@@
-1159,7
+1170,7
@@
int ssh2_save_userkey(const Filename *filename, struct ssh2_userkey *key,
fclose(fp);
sfree(pub_blob);
fclose(fp);
sfree(pub_blob);
-
memset(priv_blob, 0
, priv_blob_len);
+
smemclr(priv_blob
, priv_blob_len);
sfree(priv_blob);
sfree(priv_blob_encrypted);
return 1;
sfree(priv_blob);
sfree(priv_blob_encrypted);
return 1;
@@
-1178,7
+1189,7
@@
int key_type(const Filename *filename)
const char openssh_sig[] = "-----BEGIN ";
int i;
const char openssh_sig[] = "-----BEGIN ";
int i;
- fp = f_open(
*filename, "r"
);
+ fp = f_open(
filename, "r", FALSE
);
if (!fp)
return SSH_KEYTYPE_UNOPENABLE;
i = fread(buf, 1, sizeof(buf), fp);
if (!fp)
return SSH_KEYTYPE_UNOPENABLE;
i = fread(buf, 1, sizeof(buf), fp);