]> andersk Git - openssh.git/blobdiff - key.c
- djm@cvs.openbsd.org 2001/12/21 10:06:43
[openssh.git] / key.c
diff --git a/key.c b/key.c
index d05c86ae7f245781743ccbaec3005dbf880b8712..1013578e1b0bdf8ddc255b7fc4ed1652eed0545c 100644 (file)
--- a/key.c
+++ b/key.c
@@ -9,7 +9,7 @@
  * called by a name other than "ssh" or "Secure Shell".
  *
  *
- * Copyright (c) 2000 Markus Friedl.  All rights reserved.
+ * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -32,7 +32,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #include "includes.h"
-RCSID("$OpenBSD: key.c,v 1.21 2001/03/11 18:29:51 markus Exp $");
+RCSID("$OpenBSD: key.c,v 1.36 2001/12/19 07:18:56 deraadt Exp $");
 
 #include <openssl/evp.h>
 
@@ -54,6 +54,7 @@ key_new(int type)
        DSA *dsa;
        k = xmalloc(sizeof(*k));
        k->type = type;
+       k->flags = 0;
        k->dsa = NULL;
        k->rsa = NULL;
        switch (k->type) {
@@ -153,7 +154,7 @@ key_equal(Key *a, Key *b)
        return 0;
 }
 
-u_char*
+static u_char*
 key_fingerprint_raw(Key *k, enum fp_type dgst_type, size_t *dgst_raw_length)
 {
        EVP_MD *md = NULL;
@@ -210,15 +211,15 @@ key_fingerprint_raw(Key *k, enum fp_type dgst_type, size_t *dgst_raw_length)
        return retval;
 }
 
-char*
-key_fingerprint_hex(u_char* dgst_raw, size_t dgst_raw_len) 
+static char*
+key_fingerprint_hex(u_char* dgst_raw, size_t dgst_raw_len)
 {
        char *retval;
        int i;
 
-       retval = xmalloc(dgst_raw_len * 3);
+       retval = xmalloc(dgst_raw_len * 3 + 1);
        retval[0] = '\0';
-       for(i = 0; i < dgst_raw_len; i++) {
+       for (i = 0; i < dgst_raw_len; i++) {
                char hex[4];
                snprintf(hex, sizeof(hex), "%02x:", dgst_raw[i]);
                strlcat(retval, hex, dgst_raw_len * 3);
@@ -227,8 +228,8 @@ key_fingerprint_hex(u_char* dgst_raw, size_t dgst_raw_len)
        return retval;
 }
 
-char*
-key_fingerprint_bubblebabble(u_char* dgst_raw, size_t dgst_raw_len) 
+static char*
+key_fingerprint_bubblebabble(u_char* dgst_raw, size_t dgst_raw_len)
 {
        char vowels[] = { 'a', 'e', 'i', 'o', 'u', 'y' };
        char consonants[] = { 'b', 'c', 'd', 'f', 'g', 'h', 'k', 'l', 'm',
@@ -275,16 +276,16 @@ key_fingerprint_bubblebabble(u_char* dgst_raw, size_t dgst_raw_len)
 }
 
 char*
-key_fingerprint_ex(Key *k, enum fp_type dgst_type, enum fp_rep dgst_rep)
+key_fingerprint(Key *k, enum fp_type dgst_type, enum fp_rep dgst_rep)
 {
-       char *retval = NULL; 
+       char *retval = NULL;
        u_char *dgst_raw;
-       size_t dgst_raw_len; 
-       
+       size_t dgst_raw_len;
+
        dgst_raw = key_fingerprint_raw(k, dgst_type, &dgst_raw_len);
        if (!dgst_raw)
-               fatal("key_fingerprint_ex: null value returned from key_fingerprint_raw()");
-       switch(dgst_rep) {
+               fatal("key_fingerprint: null from key_fingerprint_raw()");
+       switch (dgst_rep) {
        case SSH_FP_HEX:
                retval = key_fingerprint_hex(dgst_raw, dgst_raw_len);
                break;
@@ -301,18 +302,6 @@ key_fingerprint_ex(Key *k, enum fp_type dgst_type, enum fp_rep dgst_rep)
        return retval;
 }
 
-char *
-key_fingerprint(Key *k)
-{
-       static char retval[(EVP_MAX_MD_SIZE + 1) * 3];
-       char *digest;
-
-       digest = key_fingerprint_ex(k, SSH_FP_MD5, SSH_FP_HEX);
-       strlcpy(retval, digest, sizeof(retval));
-       xfree(digest);
-       return retval;
-}
-
 /*
  * Reads a multiple-precision integer in decimal from the buffer, and advances
  * the pointer.  The integer must already be initialized.  This function is
@@ -320,7 +309,7 @@ key_fingerprint(Key *k)
  * last processed (and maybe modified) character.  Note that this may modify
  * the buffer containing the number.
  */
-int
+static int
 read_bignum(char **cpp, BIGNUM * value)
 {
        char *cp = *cpp;
@@ -356,7 +345,7 @@ read_bignum(char **cpp, BIGNUM * value)
        *cpp = cp;
        return 1;
 }
-int
+static int
 write_bignum(FILE *f, BIGNUM *num)
 {
        char *buf = BN_bn2dec(num);
@@ -365,11 +354,11 @@ write_bignum(FILE *f, BIGNUM *num)
                return 0;
        }
        fprintf(f, " %s", buf);
-       xfree(buf);
+       OPENSSL_free(buf);
        return 1;
 }
 
-/* returns 1 ok, -1 error, 0 type mismatch */
+/* returns 1 ok, -1 error */
 int
 key_read(Key *ret, char **cpp)
 {
@@ -382,7 +371,7 @@ key_read(Key *ret, char **cpp)
 
        cp = *cpp;
 
-       switch(ret->type) {
+       switch (ret->type) {
        case KEY_RSA1:
                /* Get number of bits. */
                if (*cp < '0' || *cp > '9')
@@ -424,21 +413,22 @@ key_read(Key *ret, char **cpp)
                } else if (ret->type != type) {
                        /* is a key, but different type */
                        debug3("key_read: type mismatch");
-                       return 0;
+                       return -1;
                }
                len = 2*strlen(cp);
                blob = xmalloc(len);
                n = uudecode(cp, blob, len);
                if (n < 0) {
                        error("key_read: uudecode %s failed", cp);
+                       xfree(blob);
                        return -1;
                }
                k = key_from_blob(blob, n);
+               xfree(blob);
                if (k == NULL) {
                        error("key_read: key_from_blob %s failed", cp);
                        return -1;
                }
-               xfree(blob);
                if (k->type != type) {
                        error("key_read: type mismatch: encoding error");
                        key_free(k);
@@ -465,9 +455,9 @@ key_read(Key *ret, char **cpp)
 #endif
                }
 /*XXXX*/
+               key_free(k);
                if (success != 1)
                        break;
-               key_free(k);
                /* advance cp: skip whitespace and data */
                while (*cp == ' ' || *cp == '\t')
                        cp++;
@@ -543,7 +533,8 @@ key_ssh_name(Key *k)
        return "ssh-unknown";
 }
 u_int
-key_size(Key *k){
+key_size(Key *k)
+{
        switch (k->type) {
        case KEY_RSA1:
        case KEY_RSA:
@@ -556,7 +547,7 @@ key_size(Key *k){
        return 0;
 }
 
-RSA *
+static RSA *
 rsa_generate_private_key(u_int bits)
 {
        RSA *private;
@@ -566,7 +557,7 @@ rsa_generate_private_key(u_int bits)
        return private;
 }
 
-DSA*
+static DSA*
 dsa_generate_private_key(u_int bits)
 {
        DSA *private = DSA_generate_parameters(bits, NULL, 0, NULL, NULL, NULL, NULL);
@@ -626,23 +617,45 @@ key_from_private(Key *k)
 int
 key_type_from_name(char *name)
 {
-       if (strcmp(name, "rsa1") == 0){
+       if (strcmp(name, "rsa1") == 0) {
                return KEY_RSA1;
-       } else if (strcmp(name, "rsa") == 0){
+       } else if (strcmp(name, "rsa") == 0) {
                return KEY_RSA;
-       } else if (strcmp(name, "dsa") == 0){
+       } else if (strcmp(name, "dsa") == 0) {
                return KEY_DSA;
-       } else if (strcmp(name, "ssh-rsa") == 0){
+       } else if (strcmp(name, "ssh-rsa") == 0) {
                return KEY_RSA;
-       } else if (strcmp(name, "ssh-dss") == 0){
+       } else if (strcmp(name, "ssh-dss") == 0) {
                return KEY_DSA;
        }
        debug2("key_type_from_name: unknown key type '%s'", name);
        return KEY_UNSPEC;
 }
 
+int
+key_names_valid2(const char *names)
+{
+       char *s, *cp, *p;
+
+       if (names == NULL || strcmp(names, "") == 0)
+               return 0;
+       s = cp = xstrdup(names);
+       for ((p = strsep(&cp, ",")); p && *p != '\0';
+           (p = strsep(&cp, ","))) {
+               switch (key_type_from_name(p)) {
+               case KEY_RSA1:
+               case KEY_UNSPEC:
+                       xfree(s);
+                       return 0;
+               }
+       }
+       debug3("key names ok: [%s]", names);
+       xfree(s);
+       return 1;
+}
+
 Key *
-key_from_blob(char *blob, int blen)
+key_from_blob(u_char *blob, int blen)
 {
        Buffer b;
        char *ktype;
@@ -657,7 +670,7 @@ key_from_blob(char *blob, int blen)
        ktype = buffer_get_string(&b, NULL);
        type = key_type_from_name(ktype);
 
-       switch(type){
+       switch (type) {
        case KEY_RSA:
                key = key_new(type);
                buffer_get_bignum2(&b, key->rsa->e);
@@ -703,7 +716,7 @@ key_to_blob(Key *key, u_char **blobp, u_int *lenp)
                return 0;
        }
        buffer_init(&b);
-       switch(key->type){
+       switch (key->type) {
        case KEY_DSA:
                buffer_put_cstring(&b, key_ssh_name(key));
                buffer_put_bignum2(&b, key->dsa->p);
@@ -717,8 +730,9 @@ key_to_blob(Key *key, u_char **blobp, u_int *lenp)
                buffer_put_bignum2(&b, key->rsa->n);
                break;
        default:
-               error("key_to_blob: illegal key type %d", key->type);
-               break;
+               error("key_to_blob: unsupported key type %d", key->type);
+               buffer_free(&b);
+               return 0;
        }
        len = buffer_len(&b);
        buf = xmalloc(len);
@@ -738,7 +752,7 @@ key_sign(
     u_char **sigp, int *lenp,
     u_char *data, int datalen)
 {
-       switch(key->type){
+       switch (key->type) {
        case KEY_DSA:
                return ssh_dss_sign(key, sigp, lenp, data, datalen);
                break;
@@ -758,7 +772,10 @@ key_verify(
     u_char *signature, int signaturelen,
     u_char *data, int datalen)
 {
-       switch(key->type){
+       if (signaturelen == 0)
+               return -1;
+
+       switch (key->type) {
        case KEY_DSA:
                return ssh_dss_verify(key, signature, signaturelen, data, datalen);
                break;
This page took 0.10976 seconds and 4 git commands to generate.