X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=sshpubk.c;h=923ebe9d9ebe81052b830135ee170d3b9fb9aec7;hb=49d2cf19accb059b3b68d1fc2b78e606a578c3e8;hp=9e89fe97cc5805430094060e127621c86743555e;hpb=15c96004a7404d3ee9dc10a29ab033bd5822223a;p=PuTTY.git diff --git a/sshpubk.c b/sshpubk.c index 9e89fe97..923ebe9d 100644 --- a/sshpubk.c +++ b/sshpubk.c @@ -1,7 +1,7 @@ /* * Generic SSH public-key handling operations. In particular, * reading of SSH public-key files, and also the generic `sign' - * operation for ssh2 (which checks the type of the key and + * operation for SSH-2 (which checks the type of the key and * dispatches to the appropriate key-type specific function). */ @@ -13,18 +13,6 @@ #include "ssh.h" #include "misc.h" -#define PUT_32BIT(cp, value) do { \ - (cp)[3] = (value); \ - (cp)[2] = (value) >> 8; \ - (cp)[1] = (value) >> 16; \ - (cp)[0] = (value) >> 24; } while (0) - -#define GET_32BIT(cp) \ - (((unsigned long)(unsigned char)(cp)[0] << 24) | \ - ((unsigned long)(unsigned char)(cp)[1] << 16) | \ - ((unsigned long)(unsigned char)(cp)[2] << 8) | \ - ((unsigned long)(unsigned char)(cp)[3])) - #define rsa_signature "SSH PRIVATE KEY FILE FORMAT 1.1\n" #define BASE64_TOINT(x) ( (x)-'A'<26 ? (x)-'A'+0 :\ @@ -78,7 +66,7 @@ static int loadrsakey_main(FILE * fp, struct RSAKey *key, int pub_only, || buf[i + 3] != 0) goto end; /* reserved field nonzero, panic! */ i += 4; - /* Now the serious stuff. An ordinary SSH 1 public key. */ + /* Now the serious stuff. An ordinary SSH-1 public key. */ i += makekey(buf + i, len, key, NULL, 1); if (i < 0) goto end; /* overran */ @@ -307,7 +295,7 @@ int saversakey(const Filename *filename, struct RSAKey *key, char *passphrase) p += 4; /* - * An ordinary SSH 1 public key consists of: a uint32 + * An ordinary SSH-1 public key consists of: a uint32 * containing the bit count, then two bignums containing the * modulus and exponent respectively. */ @@ -384,11 +372,11 @@ int saversakey(const Filename *filename, struct RSAKey *key, char *passphrase) } /* ---------------------------------------------------------------------- - * SSH2 private key load/store functions. + * SSH-2 private key load/store functions. */ /* - * PuTTY's own format for SSH2 keys is as follows: + * PuTTY's own format for SSH-2 keys is as follows: * * The file is text. Lines are terminated by CRLF, although CR-only * and LF-only are tolerated on input. @@ -404,7 +392,7 @@ int saversakey(const Filename *filename, struct RSAKey *key, char *passphrase) * * Next there is a line saying "Public-Lines: " plus a number N. * The following N lines contain a base64 encoding of the public - * part of the key. This is encoded as the standard SSH2 public key + * part of the key. This is encoded as the standard SSH-2 public key * blob (with no initial length): so for RSA, for example, it will * read * @@ -461,10 +449,9 @@ int saversakey(const Filename *filename, struct RSAKey *key, char *passphrase) * with "PuTTY-User-Key-File-1" (version number differs). In this * format the Private-MAC: field only covers the private-plaintext * field and nothing else (and without the 4-byte string length on - * the front too). Moreover, for RSA keys the Private-MAC: field - * can be replaced with a Private-Hash: field which is a plain - * SHA-1 hash instead of an HMAC. This is not allowable in DSA - * keys. (Yes, the old format was a mess. Guess why it changed :-) + * the front too). Moreover, the Private-MAC: field can be replaced + * with a Private-Hash: field which is a plain SHA-1 hash instead of + * an HMAC (this was generated for unencrypted keys). */ static int read_header(FILE * fp, char *header) @@ -515,7 +502,7 @@ static char *read_body(FILE * fp) sfree(text); return NULL; } - if (len + 1 > size) { + if (len + 1 >= size) { size += 128; text = sresize(text, size, char); } @@ -723,8 +710,7 @@ struct ssh2_userkey *ssh2_load_userkey(const Filename *filename, if ((mac = read_body(fp)) == NULL) goto error; is_mac = 1; - } else if (0 == strcmp(header, "Private-Hash") && - alg == &ssh_rsa && old_fmt) { + } else if (0 == strcmp(header, "Private-Hash") && old_fmt) { if ((mac = read_body(fp)) == NULL) goto error; is_mac = 0; @@ -880,7 +866,8 @@ struct ssh2_userkey *ssh2_load_userkey(const Filename *filename, } char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm, - int *pub_blob_len, const char **errorstr) + int *pub_blob_len, char **commentptr, + const char **errorstr) { FILE *fp; char header[40], *b; @@ -889,6 +876,7 @@ char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm, int public_blob_len; int i; const char *error = NULL; + char *comment; public_blob = NULL; @@ -908,7 +896,7 @@ char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm, error = "file format error"; if ((b = read_body(fp)) == NULL) goto error; - /* Select key algorithm structure. Currently only ssh-rsa. */ + /* Select key algorithm structure. */ alg = find_pubkey_alg(b); if (!alg) { sfree(b); @@ -926,9 +914,13 @@ char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm, /* Read the Comment header line. */ if (!read_header(fp, header) || 0 != strcmp(header, "Comment")) goto error; - if ((b = read_body(fp)) == NULL) + if ((comment = read_body(fp)) == NULL) goto error; - sfree(b); /* we don't care */ + + if (commentptr) + *commentptr = comment; + else + sfree(comment); /* Read the Public-Lines header line and the public blob. */ if (!read_header(fp, header) || 0 != strcmp(header, "Public-Lines")) @@ -1215,10 +1207,10 @@ char *key_type_to_str(int type) switch (type) { case SSH_KEYTYPE_UNOPENABLE: return "unable to open file"; break; case SSH_KEYTYPE_UNKNOWN: return "not a private key"; break; - case SSH_KEYTYPE_SSH1: return "SSH1 private key"; break; - case SSH_KEYTYPE_SSH2: return "PuTTY SSH2 private key"; break; - case SSH_KEYTYPE_OPENSSH: return "OpenSSH SSH2 private key"; break; - case SSH_KEYTYPE_SSHCOM: return "ssh.com SSH2 private key"; break; + case SSH_KEYTYPE_SSH1: return "SSH-1 private key"; break; + case SSH_KEYTYPE_SSH2: return "PuTTY SSH-2 private key"; break; + case SSH_KEYTYPE_OPENSSH: return "OpenSSH SSH-2 private key"; break; + case SSH_KEYTYPE_SSHCOM: return "ssh.com SSH-2 private key"; break; default: return "INTERNAL ERROR"; break; } }