]> andersk Git - openssh.git/blob - key.c
- otto@cvs.openbsd.org 2008/06/12 00:13:13
[openssh.git] / key.c
1 /* $OpenBSD: key.c,v 1.73 2008/06/12 00:13:13 otto Exp $ */
2 /*
3  * read_bignum():
4  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
5  *
6  * As far as I am concerned, the code I have written for this software
7  * can be used freely for any purpose.  Any derived versions of this
8  * software must be clearly marked as such, and if the derived work is
9  * incompatible with the protocol description in the RFC file, it must be
10  * called by a name other than "ssh" or "Secure Shell".
11  *
12  *
13  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
14  *
15  * Redistribution and use in source and binary forms, with or without
16  * modification, are permitted provided that the following conditions
17  * are met:
18  * 1. Redistributions of source code must retain the above copyright
19  *    notice, this list of conditions and the following disclaimer.
20  * 2. Redistributions in binary form must reproduce the above copyright
21  *    notice, this list of conditions and the following disclaimer in the
22  *    documentation and/or other materials provided with the distribution.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
25  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
28  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35
36 #include "includes.h"
37
38 #include <sys/param.h>
39 #include <sys/types.h>
40
41 #include <openssl/evp.h>
42 #include <openbsd-compat/openssl-compat.h>
43
44 #include <stdarg.h>
45 #include <stdio.h>
46 #include <string.h>
47
48 #include "xmalloc.h"
49 #include "key.h"
50 #include "rsa.h"
51 #include "uuencode.h"
52 #include "buffer.h"
53 #include "log.h"
54
55 Key *
56 key_new(int type)
57 {
58         Key *k;
59         RSA *rsa;
60         DSA *dsa;
61         k = xcalloc(1, sizeof(*k));
62         k->type = type;
63         k->dsa = NULL;
64         k->rsa = NULL;
65         switch (k->type) {
66         case KEY_RSA1:
67         case KEY_RSA:
68                 if ((rsa = RSA_new()) == NULL)
69                         fatal("key_new: RSA_new failed");
70                 if ((rsa->n = BN_new()) == NULL)
71                         fatal("key_new: BN_new failed");
72                 if ((rsa->e = BN_new()) == NULL)
73                         fatal("key_new: BN_new failed");
74                 k->rsa = rsa;
75                 break;
76         case KEY_DSA:
77                 if ((dsa = DSA_new()) == NULL)
78                         fatal("key_new: DSA_new failed");
79                 if ((dsa->p = BN_new()) == NULL)
80                         fatal("key_new: BN_new failed");
81                 if ((dsa->q = BN_new()) == NULL)
82                         fatal("key_new: BN_new failed");
83                 if ((dsa->g = BN_new()) == NULL)
84                         fatal("key_new: BN_new failed");
85                 if ((dsa->pub_key = BN_new()) == NULL)
86                         fatal("key_new: BN_new failed");
87                 k->dsa = dsa;
88                 break;
89         case KEY_UNSPEC:
90                 break;
91         default:
92                 fatal("key_new: bad key type %d", k->type);
93                 break;
94         }
95         return k;
96 }
97
98 Key *
99 key_new_private(int type)
100 {
101         Key *k = key_new(type);
102         switch (k->type) {
103         case KEY_RSA1:
104         case KEY_RSA:
105                 if ((k->rsa->d = BN_new()) == NULL)
106                         fatal("key_new_private: BN_new failed");
107                 if ((k->rsa->iqmp = BN_new()) == NULL)
108                         fatal("key_new_private: BN_new failed");
109                 if ((k->rsa->q = BN_new()) == NULL)
110                         fatal("key_new_private: BN_new failed");
111                 if ((k->rsa->p = BN_new()) == NULL)
112                         fatal("key_new_private: BN_new failed");
113                 if ((k->rsa->dmq1 = BN_new()) == NULL)
114                         fatal("key_new_private: BN_new failed");
115                 if ((k->rsa->dmp1 = BN_new()) == NULL)
116                         fatal("key_new_private: BN_new failed");
117                 break;
118         case KEY_DSA:
119                 if ((k->dsa->priv_key = BN_new()) == NULL)
120                         fatal("key_new_private: BN_new failed");
121                 break;
122         case KEY_UNSPEC:
123                 break;
124         default:
125                 break;
126         }
127         return k;
128 }
129
130 void
131 key_free(Key *k)
132 {
133         if (k == NULL)
134                 fatal("key_free: key is NULL");
135         switch (k->type) {
136         case KEY_RSA1:
137         case KEY_RSA:
138                 if (k->rsa != NULL)
139                         RSA_free(k->rsa);
140                 k->rsa = NULL;
141                 break;
142         case KEY_DSA:
143                 if (k->dsa != NULL)
144                         DSA_free(k->dsa);
145                 k->dsa = NULL;
146                 break;
147         case KEY_UNSPEC:
148                 break;
149         default:
150                 fatal("key_free: bad key type %d", k->type);
151                 break;
152         }
153         xfree(k);
154 }
155
156 int
157 key_equal(const Key *a, const Key *b)
158 {
159         if (a == NULL || b == NULL || a->type != b->type)
160                 return 0;
161         switch (a->type) {
162         case KEY_RSA1:
163         case KEY_RSA:
164                 return a->rsa != NULL && b->rsa != NULL &&
165                     BN_cmp(a->rsa->e, b->rsa->e) == 0 &&
166                     BN_cmp(a->rsa->n, b->rsa->n) == 0;
167         case KEY_DSA:
168                 return a->dsa != NULL && b->dsa != NULL &&
169                     BN_cmp(a->dsa->p, b->dsa->p) == 0 &&
170                     BN_cmp(a->dsa->q, b->dsa->q) == 0 &&
171                     BN_cmp(a->dsa->g, b->dsa->g) == 0 &&
172                     BN_cmp(a->dsa->pub_key, b->dsa->pub_key) == 0;
173         default:
174                 fatal("key_equal: bad key type %d", a->type);
175         }
176 }
177
178 u_char*
179 key_fingerprint_raw(const Key *k, enum fp_type dgst_type,
180     u_int *dgst_raw_length)
181 {
182         const EVP_MD *md = NULL;
183         EVP_MD_CTX ctx;
184         u_char *blob = NULL;
185         u_char *retval = NULL;
186         u_int len = 0;
187         int nlen, elen;
188
189         *dgst_raw_length = 0;
190
191         switch (dgst_type) {
192         case SSH_FP_MD5:
193                 md = EVP_md5();
194                 break;
195         case SSH_FP_SHA1:
196                 md = EVP_sha1();
197                 break;
198         default:
199                 fatal("key_fingerprint_raw: bad digest type %d",
200                     dgst_type);
201         }
202         switch (k->type) {
203         case KEY_RSA1:
204                 nlen = BN_num_bytes(k->rsa->n);
205                 elen = BN_num_bytes(k->rsa->e);
206                 len = nlen + elen;
207                 blob = xmalloc(len);
208                 BN_bn2bin(k->rsa->n, blob);
209                 BN_bn2bin(k->rsa->e, blob + nlen);
210                 break;
211         case KEY_DSA:
212         case KEY_RSA:
213                 key_to_blob(k, &blob, &len);
214                 break;
215         case KEY_UNSPEC:
216                 return retval;
217         default:
218                 fatal("key_fingerprint_raw: bad key type %d", k->type);
219                 break;
220         }
221         if (blob != NULL) {
222                 retval = xmalloc(EVP_MAX_MD_SIZE);
223                 EVP_DigestInit(&ctx, md);
224                 EVP_DigestUpdate(&ctx, blob, len);
225                 EVP_DigestFinal(&ctx, retval, dgst_raw_length);
226                 memset(blob, 0, len);
227                 xfree(blob);
228         } else {
229                 fatal("key_fingerprint_raw: blob is null");
230         }
231         return retval;
232 }
233
234 static char *
235 key_fingerprint_hex(u_char *dgst_raw, u_int dgst_raw_len)
236 {
237         char *retval;
238         u_int i;
239
240         retval = xcalloc(1, dgst_raw_len * 3 + 1);
241         for (i = 0; i < dgst_raw_len; i++) {
242                 char hex[4];
243                 snprintf(hex, sizeof(hex), "%02x:", dgst_raw[i]);
244                 strlcat(retval, hex, dgst_raw_len * 3 + 1);
245         }
246
247         /* Remove the trailing ':' character */
248         retval[(dgst_raw_len * 3) - 1] = '\0';
249         return retval;
250 }
251
252 static char *
253 key_fingerprint_bubblebabble(u_char *dgst_raw, u_int dgst_raw_len)
254 {
255         char vowels[] = { 'a', 'e', 'i', 'o', 'u', 'y' };
256         char consonants[] = { 'b', 'c', 'd', 'f', 'g', 'h', 'k', 'l', 'm',
257             'n', 'p', 'r', 's', 't', 'v', 'z', 'x' };
258         u_int i, j = 0, rounds, seed = 1;
259         char *retval;
260
261         rounds = (dgst_raw_len / 2) + 1;
262         retval = xcalloc((rounds * 6), sizeof(char));
263         retval[j++] = 'x';
264         for (i = 0; i < rounds; i++) {
265                 u_int idx0, idx1, idx2, idx3, idx4;
266                 if ((i + 1 < rounds) || (dgst_raw_len % 2 != 0)) {
267                         idx0 = (((((u_int)(dgst_raw[2 * i])) >> 6) & 3) +
268                             seed) % 6;
269                         idx1 = (((u_int)(dgst_raw[2 * i])) >> 2) & 15;
270                         idx2 = ((((u_int)(dgst_raw[2 * i])) & 3) +
271                             (seed / 6)) % 6;
272                         retval[j++] = vowels[idx0];
273                         retval[j++] = consonants[idx1];
274                         retval[j++] = vowels[idx2];
275                         if ((i + 1) < rounds) {
276                                 idx3 = (((u_int)(dgst_raw[(2 * i) + 1])) >> 4) & 15;
277                                 idx4 = (((u_int)(dgst_raw[(2 * i) + 1]))) & 15;
278                                 retval[j++] = consonants[idx3];
279                                 retval[j++] = '-';
280                                 retval[j++] = consonants[idx4];
281                                 seed = ((seed * 5) +
282                                     ((((u_int)(dgst_raw[2 * i])) * 7) +
283                                     ((u_int)(dgst_raw[(2 * i) + 1])))) % 36;
284                         }
285                 } else {
286                         idx0 = seed % 6;
287                         idx1 = 16;
288                         idx2 = seed / 6;
289                         retval[j++] = vowels[idx0];
290                         retval[j++] = consonants[idx1];
291                         retval[j++] = vowels[idx2];
292                 }
293         }
294         retval[j++] = 'x';
295         retval[j++] = '\0';
296         return retval;
297 }
298
299 /*
300  * Draw an ASCII-Art representing the fingerprint so human brain can
301  * profit from its built-in pattern recognition ability.
302  * This technique is called "random art" and can be found in some
303  * scientific publications like this original paper:
304  *
305  * "Hash Visualization: a New Technique to improve Real-World Security",
306  * Perrig A. and Song D., 1999, International Workshop on Cryptographic
307  * Techniques and E-Commerce (CrypTEC '99)
308  * sparrow.ece.cmu.edu/~adrian/projects/validation/validation.pdf
309  *
310  * The subject came up in a talk by Dan Kaminsky, too.
311  *
312  * If you see the picture is different, the key is different.
313  * If the picture looks the same, you still know nothing.
314  *
315  * The algorithm used here is a worm crawling over a discrete plane,
316  * leaving a trace (augmenting the field) everywhere it goes.
317  * Movement is taken from dgst_raw 2bit-wise.  Bumping into walls
318  * makes the respective movement vector be ignored for this turn.
319  * Graphs are not unambiguous, because circles in graphs can be
320  * walked in either direction.
321  */
322 #define FLDSIZE_Y       (8 + 1)
323 #define FLDSIZE_X       (8 * 2 + 1)
324 static char *
325 key_fingerprint_randomart(u_char *dgst_raw, u_int dgst_raw_len)
326 {
327         /*
328          * Chars to be used after each other every time the worm
329          * intersects with itself.  Matter of taste.
330          */
331         char    *augmentation_string = " .o+=*BOX@%&#/^S";
332         char    *retval, *p;
333         u_char   field[FLDSIZE_X][FLDSIZE_Y];
334         u_int    i, b;
335         int      x, y;
336         size_t   len = strlen(augmentation_string) - 1;
337
338         retval = xcalloc(1, (FLDSIZE_X + 3) * (FLDSIZE_Y + 2));
339
340         /* initialize field */
341         memset(field, 0, FLDSIZE_X * FLDSIZE_Y * sizeof(char));
342         x = FLDSIZE_X / 2;
343         y = FLDSIZE_Y / 2;
344
345         /* process raw key */
346         for (i = 0; i < dgst_raw_len; i++) {
347                 int input;
348                 /* each byte conveys four 2-bit move commands */
349                 input = dgst_raw[i];
350                 for (b = 0; b < 4; b++) {
351                         /* evaluate 2 bit, rest is shifted later */
352                         x += (input & 0x1) ? 1 : -1;
353                         y += (input & 0x2) ? 1 : -1;
354
355                         /* assure we are still in bounds */
356                         x = MAX(x, 0);
357                         y = MAX(y, 0);
358                         x = MIN(x, FLDSIZE_X - 1);
359                         y = MIN(y, FLDSIZE_Y - 1);
360
361                         /* augment the field */
362                         field[x][y]++;
363                         input = input >> 2;
364                 }
365         }
366         field[FLDSIZE_X / 2][FLDSIZE_Y / 2] = len;
367
368         /* fill in retval */
369         p = retval;
370
371         /* output upper border */
372         *p++ = '+';
373         for (i = 0; i < FLDSIZE_X; i++)
374                 *p++ = '-';
375         *p++ = '+';
376         *p++ = '\n';
377
378         /* output content */
379         for (y = 0; y < FLDSIZE_Y; y++) {
380                 *p++ = '|';
381                 for (x = 0; x < FLDSIZE_X; x++)
382                         *p++ = augmentation_string[MIN(field[x][y], len)];
383                 *p++ = '|';
384                 *p++ = '\n';
385         }
386
387         /* output lower border */
388         *p++ = '+';
389         for (i = 0; i < FLDSIZE_X; i++)
390                 *p++ = '-';
391         *p++ = '+';
392
393         return retval;
394 }
395
396 char *
397 key_fingerprint(const Key *k, enum fp_type dgst_type, enum fp_rep dgst_rep)
398 {
399         char *retval = NULL;
400         u_char *dgst_raw;
401         u_int dgst_raw_len;
402
403         dgst_raw = key_fingerprint_raw(k, dgst_type, &dgst_raw_len);
404         if (!dgst_raw)
405                 fatal("key_fingerprint: null from key_fingerprint_raw()");
406         switch (dgst_rep) {
407         case SSH_FP_HEX:
408                 retval = key_fingerprint_hex(dgst_raw, dgst_raw_len);
409                 break;
410         case SSH_FP_BUBBLEBABBLE:
411                 retval = key_fingerprint_bubblebabble(dgst_raw, dgst_raw_len);
412                 break;
413         case SSH_FP_RANDOMART:
414                 retval = key_fingerprint_randomart(dgst_raw, dgst_raw_len);
415                 break;
416         default:
417                 fatal("key_fingerprint_ex: bad digest representation %d",
418                     dgst_rep);
419                 break;
420         }
421         memset(dgst_raw, 0, dgst_raw_len);
422         xfree(dgst_raw);
423         return retval;
424 }
425
426 /*
427  * Reads a multiple-precision integer in decimal from the buffer, and advances
428  * the pointer.  The integer must already be initialized.  This function is
429  * permitted to modify the buffer.  This leaves *cpp to point just beyond the
430  * last processed (and maybe modified) character.  Note that this may modify
431  * the buffer containing the number.
432  */
433 static int
434 read_bignum(char **cpp, BIGNUM * value)
435 {
436         char *cp = *cpp;
437         int old;
438
439         /* Skip any leading whitespace. */
440         for (; *cp == ' ' || *cp == '\t'; cp++)
441                 ;
442
443         /* Check that it begins with a decimal digit. */
444         if (*cp < '0' || *cp > '9')
445                 return 0;
446
447         /* Save starting position. */
448         *cpp = cp;
449
450         /* Move forward until all decimal digits skipped. */
451         for (; *cp >= '0' && *cp <= '9'; cp++)
452                 ;
453
454         /* Save the old terminating character, and replace it by \0. */
455         old = *cp;
456         *cp = 0;
457
458         /* Parse the number. */
459         if (BN_dec2bn(&value, *cpp) == 0)
460                 return 0;
461
462         /* Restore old terminating character. */
463         *cp = old;
464
465         /* Move beyond the number and return success. */
466         *cpp = cp;
467         return 1;
468 }
469
470 static int
471 write_bignum(FILE *f, BIGNUM *num)
472 {
473         char *buf = BN_bn2dec(num);
474         if (buf == NULL) {
475                 error("write_bignum: BN_bn2dec() failed");
476                 return 0;
477         }
478         fprintf(f, " %s", buf);
479         OPENSSL_free(buf);
480         return 1;
481 }
482
483 /* returns 1 ok, -1 error */
484 int
485 key_read(Key *ret, char **cpp)
486 {
487         Key *k;
488         int success = -1;
489         char *cp, *space;
490         int len, n, type;
491         u_int bits;
492         u_char *blob;
493
494         cp = *cpp;
495
496         switch (ret->type) {
497         case KEY_RSA1:
498                 /* Get number of bits. */
499                 if (*cp < '0' || *cp > '9')
500                         return -1;      /* Bad bit count... */
501                 for (bits = 0; *cp >= '0' && *cp <= '9'; cp++)
502                         bits = 10 * bits + *cp - '0';
503                 if (bits == 0)
504                         return -1;
505                 *cpp = cp;
506                 /* Get public exponent, public modulus. */
507                 if (!read_bignum(cpp, ret->rsa->e))
508                         return -1;
509                 if (!read_bignum(cpp, ret->rsa->n))
510                         return -1;
511                 success = 1;
512                 break;
513         case KEY_UNSPEC:
514         case KEY_RSA:
515         case KEY_DSA:
516                 space = strchr(cp, ' ');
517                 if (space == NULL) {
518                         debug3("key_read: missing whitespace");
519                         return -1;
520                 }
521                 *space = '\0';
522                 type = key_type_from_name(cp);
523                 *space = ' ';
524                 if (type == KEY_UNSPEC) {
525                         debug3("key_read: missing keytype");
526                         return -1;
527                 }
528                 cp = space+1;
529                 if (*cp == '\0') {
530                         debug3("key_read: short string");
531                         return -1;
532                 }
533                 if (ret->type == KEY_UNSPEC) {
534                         ret->type = type;
535                 } else if (ret->type != type) {
536                         /* is a key, but different type */
537                         debug3("key_read: type mismatch");
538                         return -1;
539                 }
540                 len = 2*strlen(cp);
541                 blob = xmalloc(len);
542                 n = uudecode(cp, blob, len);
543                 if (n < 0) {
544                         error("key_read: uudecode %s failed", cp);
545                         xfree(blob);
546                         return -1;
547                 }
548                 k = key_from_blob(blob, (u_int)n);
549                 xfree(blob);
550                 if (k == NULL) {
551                         error("key_read: key_from_blob %s failed", cp);
552                         return -1;
553                 }
554                 if (k->type != type) {
555                         error("key_read: type mismatch: encoding error");
556                         key_free(k);
557                         return -1;
558                 }
559 /*XXXX*/
560                 if (ret->type == KEY_RSA) {
561                         if (ret->rsa != NULL)
562                                 RSA_free(ret->rsa);
563                         ret->rsa = k->rsa;
564                         k->rsa = NULL;
565                         success = 1;
566 #ifdef DEBUG_PK
567                         RSA_print_fp(stderr, ret->rsa, 8);
568 #endif
569                 } else {
570                         if (ret->dsa != NULL)
571                                 DSA_free(ret->dsa);
572                         ret->dsa = k->dsa;
573                         k->dsa = NULL;
574                         success = 1;
575 #ifdef DEBUG_PK
576                         DSA_print_fp(stderr, ret->dsa, 8);
577 #endif
578                 }
579 /*XXXX*/
580                 key_free(k);
581                 if (success != 1)
582                         break;
583                 /* advance cp: skip whitespace and data */
584                 while (*cp == ' ' || *cp == '\t')
585                         cp++;
586                 while (*cp != '\0' && *cp != ' ' && *cp != '\t')
587                         cp++;
588                 *cpp = cp;
589                 break;
590         default:
591                 fatal("key_read: bad key type: %d", ret->type);
592                 break;
593         }
594         return success;
595 }
596
597 int
598 key_write(const Key *key, FILE *f)
599 {
600         int n, success = 0;
601         u_int len, bits = 0;
602         u_char *blob;
603         char *uu;
604
605         if (key->type == KEY_RSA1 && key->rsa != NULL) {
606                 /* size of modulus 'n' */
607                 bits = BN_num_bits(key->rsa->n);
608                 fprintf(f, "%u", bits);
609                 if (write_bignum(f, key->rsa->e) &&
610                     write_bignum(f, key->rsa->n)) {
611                         success = 1;
612                 } else {
613                         error("key_write: failed for RSA key");
614                 }
615         } else if ((key->type == KEY_DSA && key->dsa != NULL) ||
616             (key->type == KEY_RSA && key->rsa != NULL)) {
617                 key_to_blob(key, &blob, &len);
618                 uu = xmalloc(2*len);
619                 n = uuencode(blob, len, uu, 2*len);
620                 if (n > 0) {
621                         fprintf(f, "%s %s", key_ssh_name(key), uu);
622                         success = 1;
623                 }
624                 xfree(blob);
625                 xfree(uu);
626         }
627         return success;
628 }
629
630 const char *
631 key_type(const Key *k)
632 {
633         switch (k->type) {
634         case KEY_RSA1:
635                 return "RSA1";
636         case KEY_RSA:
637                 return "RSA";
638         case KEY_DSA:
639                 return "DSA";
640         }
641         return "unknown";
642 }
643
644 const char *
645 key_ssh_name(const Key *k)
646 {
647         switch (k->type) {
648         case KEY_RSA:
649                 return "ssh-rsa";
650         case KEY_DSA:
651                 return "ssh-dss";
652         }
653         return "ssh-unknown";
654 }
655
656 u_int
657 key_size(const Key *k)
658 {
659         switch (k->type) {
660         case KEY_RSA1:
661         case KEY_RSA:
662                 return BN_num_bits(k->rsa->n);
663         case KEY_DSA:
664                 return BN_num_bits(k->dsa->p);
665         }
666         return 0;
667 }
668
669 static RSA *
670 rsa_generate_private_key(u_int bits)
671 {
672         RSA *private;
673
674         private = RSA_generate_key(bits, 35, NULL, NULL);
675         if (private == NULL)
676                 fatal("rsa_generate_private_key: key generation failed.");
677         return private;
678 }
679
680 static DSA*
681 dsa_generate_private_key(u_int bits)
682 {
683         DSA *private = DSA_generate_parameters(bits, NULL, 0, NULL, NULL, NULL, NULL);
684
685         if (private == NULL)
686                 fatal("dsa_generate_private_key: DSA_generate_parameters failed");
687         if (!DSA_generate_key(private))
688                 fatal("dsa_generate_private_key: DSA_generate_key failed.");
689         if (private == NULL)
690                 fatal("dsa_generate_private_key: NULL.");
691         return private;
692 }
693
694 Key *
695 key_generate(int type, u_int bits)
696 {
697         Key *k = key_new(KEY_UNSPEC);
698         switch (type) {
699         case KEY_DSA:
700                 k->dsa = dsa_generate_private_key(bits);
701                 break;
702         case KEY_RSA:
703         case KEY_RSA1:
704                 k->rsa = rsa_generate_private_key(bits);
705                 break;
706         default:
707                 fatal("key_generate: unknown type %d", type);
708         }
709         k->type = type;
710         return k;
711 }
712
713 Key *
714 key_from_private(const Key *k)
715 {
716         Key *n = NULL;
717         switch (k->type) {
718         case KEY_DSA:
719                 n = key_new(k->type);
720                 if ((BN_copy(n->dsa->p, k->dsa->p) == NULL) ||
721                     (BN_copy(n->dsa->q, k->dsa->q) == NULL) ||
722                     (BN_copy(n->dsa->g, k->dsa->g) == NULL) ||
723                     (BN_copy(n->dsa->pub_key, k->dsa->pub_key) == NULL))
724                         fatal("key_from_private: BN_copy failed");
725                 break;
726         case KEY_RSA:
727         case KEY_RSA1:
728                 n = key_new(k->type);
729                 if ((BN_copy(n->rsa->n, k->rsa->n) == NULL) ||
730                     (BN_copy(n->rsa->e, k->rsa->e) == NULL))
731                         fatal("key_from_private: BN_copy failed");
732                 break;
733         default:
734                 fatal("key_from_private: unknown type %d", k->type);
735                 break;
736         }
737         return n;
738 }
739
740 int
741 key_type_from_name(char *name)
742 {
743         if (strcmp(name, "rsa1") == 0) {
744                 return KEY_RSA1;
745         } else if (strcmp(name, "rsa") == 0) {
746                 return KEY_RSA;
747         } else if (strcmp(name, "dsa") == 0) {
748                 return KEY_DSA;
749         } else if (strcmp(name, "ssh-rsa") == 0) {
750                 return KEY_RSA;
751         } else if (strcmp(name, "ssh-dss") == 0) {
752                 return KEY_DSA;
753         }
754         debug2("key_type_from_name: unknown key type '%s'", name);
755         return KEY_UNSPEC;
756 }
757
758 int
759 key_names_valid2(const char *names)
760 {
761         char *s, *cp, *p;
762
763         if (names == NULL || strcmp(names, "") == 0)
764                 return 0;
765         s = cp = xstrdup(names);
766         for ((p = strsep(&cp, ",")); p && *p != '\0';
767             (p = strsep(&cp, ","))) {
768                 switch (key_type_from_name(p)) {
769                 case KEY_RSA1:
770                 case KEY_UNSPEC:
771                         xfree(s);
772                         return 0;
773                 }
774         }
775         debug3("key names ok: [%s]", names);
776         xfree(s);
777         return 1;
778 }
779
780 Key *
781 key_from_blob(const u_char *blob, u_int blen)
782 {
783         Buffer b;
784         int rlen, type;
785         char *ktype = NULL;
786         Key *key = NULL;
787
788 #ifdef DEBUG_PK
789         dump_base64(stderr, blob, blen);
790 #endif
791         buffer_init(&b);
792         buffer_append(&b, blob, blen);
793         if ((ktype = buffer_get_string_ret(&b, NULL)) == NULL) {
794                 error("key_from_blob: can't read key type");
795                 goto out;
796         }
797
798         type = key_type_from_name(ktype);
799
800         switch (type) {
801         case KEY_RSA:
802                 key = key_new(type);
803                 if (buffer_get_bignum2_ret(&b, key->rsa->e) == -1 ||
804                     buffer_get_bignum2_ret(&b, key->rsa->n) == -1) {
805                         error("key_from_blob: can't read rsa key");
806                         key_free(key);
807                         key = NULL;
808                         goto out;
809                 }
810 #ifdef DEBUG_PK
811                 RSA_print_fp(stderr, key->rsa, 8);
812 #endif
813                 break;
814         case KEY_DSA:
815                 key = key_new(type);
816                 if (buffer_get_bignum2_ret(&b, key->dsa->p) == -1 ||
817                     buffer_get_bignum2_ret(&b, key->dsa->q) == -1 ||
818                     buffer_get_bignum2_ret(&b, key->dsa->g) == -1 ||
819                     buffer_get_bignum2_ret(&b, key->dsa->pub_key) == -1) {
820                         error("key_from_blob: can't read dsa key");
821                         key_free(key);
822                         key = NULL;
823                         goto out;
824                 }
825 #ifdef DEBUG_PK
826                 DSA_print_fp(stderr, key->dsa, 8);
827 #endif
828                 break;
829         case KEY_UNSPEC:
830                 key = key_new(type);
831                 break;
832         default:
833                 error("key_from_blob: cannot handle type %s", ktype);
834                 goto out;
835         }
836         rlen = buffer_len(&b);
837         if (key != NULL && rlen != 0)
838                 error("key_from_blob: remaining bytes in key blob %d", rlen);
839  out:
840         if (ktype != NULL)
841                 xfree(ktype);
842         buffer_free(&b);
843         return key;
844 }
845
846 int
847 key_to_blob(const Key *key, u_char **blobp, u_int *lenp)
848 {
849         Buffer b;
850         int len;
851
852         if (key == NULL) {
853                 error("key_to_blob: key == NULL");
854                 return 0;
855         }
856         buffer_init(&b);
857         switch (key->type) {
858         case KEY_DSA:
859                 buffer_put_cstring(&b, key_ssh_name(key));
860                 buffer_put_bignum2(&b, key->dsa->p);
861                 buffer_put_bignum2(&b, key->dsa->q);
862                 buffer_put_bignum2(&b, key->dsa->g);
863                 buffer_put_bignum2(&b, key->dsa->pub_key);
864                 break;
865         case KEY_RSA:
866                 buffer_put_cstring(&b, key_ssh_name(key));
867                 buffer_put_bignum2(&b, key->rsa->e);
868                 buffer_put_bignum2(&b, key->rsa->n);
869                 break;
870         default:
871                 error("key_to_blob: unsupported key type %d", key->type);
872                 buffer_free(&b);
873                 return 0;
874         }
875         len = buffer_len(&b);
876         if (lenp != NULL)
877                 *lenp = len;
878         if (blobp != NULL) {
879                 *blobp = xmalloc(len);
880                 memcpy(*blobp, buffer_ptr(&b), len);
881         }
882         memset(buffer_ptr(&b), 0, len);
883         buffer_free(&b);
884         return len;
885 }
886
887 int
888 key_sign(
889     const Key *key,
890     u_char **sigp, u_int *lenp,
891     const u_char *data, u_int datalen)
892 {
893         switch (key->type) {
894         case KEY_DSA:
895                 return ssh_dss_sign(key, sigp, lenp, data, datalen);
896         case KEY_RSA:
897                 return ssh_rsa_sign(key, sigp, lenp, data, datalen);
898         default:
899                 error("key_sign: invalid key type %d", key->type);
900                 return -1;
901         }
902 }
903
904 /*
905  * key_verify returns 1 for a correct signature, 0 for an incorrect signature
906  * and -1 on error.
907  */
908 int
909 key_verify(
910     const Key *key,
911     const u_char *signature, u_int signaturelen,
912     const u_char *data, u_int datalen)
913 {
914         if (signaturelen == 0)
915                 return -1;
916
917         switch (key->type) {
918         case KEY_DSA:
919                 return ssh_dss_verify(key, signature, signaturelen, data, datalen);
920         case KEY_RSA:
921                 return ssh_rsa_verify(key, signature, signaturelen, data, datalen);
922         default:
923                 error("key_verify: invalid key type %d", key->type);
924                 return -1;
925         }
926 }
927
928 /* Converts a private to a public key */
929 Key *
930 key_demote(const Key *k)
931 {
932         Key *pk;
933
934         pk = xcalloc(1, sizeof(*pk));
935         pk->type = k->type;
936         pk->flags = k->flags;
937         pk->dsa = NULL;
938         pk->rsa = NULL;
939
940         switch (k->type) {
941         case KEY_RSA1:
942         case KEY_RSA:
943                 if ((pk->rsa = RSA_new()) == NULL)
944                         fatal("key_demote: RSA_new failed");
945                 if ((pk->rsa->e = BN_dup(k->rsa->e)) == NULL)
946                         fatal("key_demote: BN_dup failed");
947                 if ((pk->rsa->n = BN_dup(k->rsa->n)) == NULL)
948                         fatal("key_demote: BN_dup failed");
949                 break;
950         case KEY_DSA:
951                 if ((pk->dsa = DSA_new()) == NULL)
952                         fatal("key_demote: DSA_new failed");
953                 if ((pk->dsa->p = BN_dup(k->dsa->p)) == NULL)
954                         fatal("key_demote: BN_dup failed");
955                 if ((pk->dsa->q = BN_dup(k->dsa->q)) == NULL)
956                         fatal("key_demote: BN_dup failed");
957                 if ((pk->dsa->g = BN_dup(k->dsa->g)) == NULL)
958                         fatal("key_demote: BN_dup failed");
959                 if ((pk->dsa->pub_key = BN_dup(k->dsa->pub_key)) == NULL)
960                         fatal("key_demote: BN_dup failed");
961                 break;
962         default:
963                 fatal("key_free: bad key type %d", k->type);
964                 break;
965         }
966
967         return (pk);
968 }
This page took 0.134551 seconds and 5 git commands to generate.