Import OpenSSH-5.6p1.
[dragonfly.git] / crypto / openssh / key.c
1 /* $OpenBSD: key.c,v 1.90 2010/07/13 23:13:16 djm 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  * Copyright (c) 2008 Alexander von Gernler.  All rights reserved.
15  *
16  * Redistribution and use in source and binary forms, with or without
17  * modification, are permitted provided that the following conditions
18  * are met:
19  * 1. Redistributions of source code must retain the above copyright
20  *    notice, this list of conditions and the following disclaimer.
21  * 2. Redistributions in binary form must reproduce the above copyright
22  *    notice, this list of conditions and the following disclaimer in the
23  *    documentation and/or other materials provided with the distribution.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
26  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
27  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
28  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
29  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
34  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35  */
36
37 #include "includes.h"
38
39 #include <sys/param.h>
40 #include <sys/types.h>
41
42 #include <openssl/evp.h>
43 #include <openbsd-compat/openssl-compat.h>
44
45 #include <stdarg.h>
46 #include <stdio.h>
47 #include <string.h>
48
49 #include "xmalloc.h"
50 #include "key.h"
51 #include "rsa.h"
52 #include "uuencode.h"
53 #include "buffer.h"
54 #include "log.h"
55 #include "misc.h"
56 #include "ssh2.h"
57
58 static struct KeyCert *
59 cert_new(void)
60 {
61         struct KeyCert *cert;
62
63         cert = xcalloc(1, sizeof(*cert));
64         buffer_init(&cert->certblob);
65         buffer_init(&cert->critical);
66         buffer_init(&cert->extensions);
67         cert->key_id = NULL;
68         cert->principals = NULL;
69         cert->signature_key = NULL;
70         return cert;
71 }
72
73 Key *
74 key_new(int type)
75 {
76         Key *k;
77         RSA *rsa;
78         DSA *dsa;
79         k = xcalloc(1, sizeof(*k));
80         k->type = type;
81         k->dsa = NULL;
82         k->rsa = NULL;
83         k->cert = NULL;
84         switch (k->type) {
85         case KEY_RSA1:
86         case KEY_RSA:
87         case KEY_RSA_CERT_V00:
88         case KEY_RSA_CERT:
89                 if ((rsa = RSA_new()) == NULL)
90                         fatal("key_new: RSA_new failed");
91                 if ((rsa->n = BN_new()) == NULL)
92                         fatal("key_new: BN_new failed");
93                 if ((rsa->e = BN_new()) == NULL)
94                         fatal("key_new: BN_new failed");
95                 k->rsa = rsa;
96                 break;
97         case KEY_DSA:
98         case KEY_DSA_CERT_V00:
99         case KEY_DSA_CERT:
100                 if ((dsa = DSA_new()) == NULL)
101                         fatal("key_new: DSA_new failed");
102                 if ((dsa->p = BN_new()) == NULL)
103                         fatal("key_new: BN_new failed");
104                 if ((dsa->q = BN_new()) == NULL)
105                         fatal("key_new: BN_new failed");
106                 if ((dsa->g = BN_new()) == NULL)
107                         fatal("key_new: BN_new failed");
108                 if ((dsa->pub_key = BN_new()) == NULL)
109                         fatal("key_new: BN_new failed");
110                 k->dsa = dsa;
111                 break;
112         case KEY_UNSPEC:
113                 break;
114         default:
115                 fatal("key_new: bad key type %d", k->type);
116                 break;
117         }
118
119         if (key_is_cert(k))
120                 k->cert = cert_new();
121
122         return k;
123 }
124
125 void
126 key_add_private(Key *k)
127 {
128         switch (k->type) {
129         case KEY_RSA1:
130         case KEY_RSA:
131         case KEY_RSA_CERT_V00:
132         case KEY_RSA_CERT:
133                 if ((k->rsa->d = BN_new()) == NULL)
134                         fatal("key_new_private: BN_new failed");
135                 if ((k->rsa->iqmp = BN_new()) == NULL)
136                         fatal("key_new_private: BN_new failed");
137                 if ((k->rsa->q = BN_new()) == NULL)
138                         fatal("key_new_private: BN_new failed");
139                 if ((k->rsa->p = BN_new()) == NULL)
140                         fatal("key_new_private: BN_new failed");
141                 if ((k->rsa->dmq1 = BN_new()) == NULL)
142                         fatal("key_new_private: BN_new failed");
143                 if ((k->rsa->dmp1 = BN_new()) == NULL)
144                         fatal("key_new_private: BN_new failed");
145                 break;
146         case KEY_DSA:
147         case KEY_DSA_CERT_V00:
148         case KEY_DSA_CERT:
149                 if ((k->dsa->priv_key = BN_new()) == NULL)
150                         fatal("key_new_private: BN_new failed");
151                 break;
152         case KEY_UNSPEC:
153                 break;
154         default:
155                 break;
156         }
157 }
158
159 Key *
160 key_new_private(int type)
161 {
162         Key *k = key_new(type);
163
164         key_add_private(k);
165         return k;
166 }
167
168 static void
169 cert_free(struct KeyCert *cert)
170 {
171         u_int i;
172
173         buffer_free(&cert->certblob);
174         buffer_free(&cert->critical);
175         buffer_free(&cert->extensions);
176         if (cert->key_id != NULL)
177                 xfree(cert->key_id);
178         for (i = 0; i < cert->nprincipals; i++)
179                 xfree(cert->principals[i]);
180         if (cert->principals != NULL)
181                 xfree(cert->principals);
182         if (cert->signature_key != NULL)
183                 key_free(cert->signature_key);
184 }
185
186 void
187 key_free(Key *k)
188 {
189         if (k == NULL)
190                 fatal("key_free: key is NULL");
191         switch (k->type) {
192         case KEY_RSA1:
193         case KEY_RSA:
194         case KEY_RSA_CERT_V00:
195         case KEY_RSA_CERT:
196                 if (k->rsa != NULL)
197                         RSA_free(k->rsa);
198                 k->rsa = NULL;
199                 break;
200         case KEY_DSA:
201         case KEY_DSA_CERT_V00:
202         case KEY_DSA_CERT:
203                 if (k->dsa != NULL)
204                         DSA_free(k->dsa);
205                 k->dsa = NULL;
206                 break;
207         case KEY_UNSPEC:
208                 break;
209         default:
210                 fatal("key_free: bad key type %d", k->type);
211                 break;
212         }
213         if (key_is_cert(k)) {
214                 if (k->cert != NULL)
215                         cert_free(k->cert);
216                 k->cert = NULL;
217         }
218
219         xfree(k);
220 }
221
222 static int
223 cert_compare(struct KeyCert *a, struct KeyCert *b)
224 {
225         if (a == NULL && b == NULL)
226                 return 1;
227         if (a == NULL || b == NULL)
228                 return 0;
229         if (buffer_len(&a->certblob) != buffer_len(&b->certblob))
230                 return 0;
231         if (timingsafe_bcmp(buffer_ptr(&a->certblob), buffer_ptr(&b->certblob),
232             buffer_len(&a->certblob)) != 0)
233                 return 0;
234         return 1;
235 }
236
237 /*
238  * Compare public portions of key only, allowing comparisons between
239  * certificates and plain keys too.
240  */
241 int
242 key_equal_public(const Key *a, const Key *b)
243 {
244         if (a == NULL || b == NULL ||
245             key_type_plain(a->type) != key_type_plain(b->type))
246                 return 0;
247
248         switch (a->type) {
249         case KEY_RSA1:
250         case KEY_RSA_CERT_V00:
251         case KEY_RSA_CERT:
252         case KEY_RSA:
253                 return a->rsa != NULL && b->rsa != NULL &&
254                     BN_cmp(a->rsa->e, b->rsa->e) == 0 &&
255                     BN_cmp(a->rsa->n, b->rsa->n) == 0;
256         case KEY_DSA_CERT_V00:
257         case KEY_DSA_CERT:
258         case KEY_DSA:
259                 return a->dsa != NULL && b->dsa != NULL &&
260                     BN_cmp(a->dsa->p, b->dsa->p) == 0 &&
261                     BN_cmp(a->dsa->q, b->dsa->q) == 0 &&
262                     BN_cmp(a->dsa->g, b->dsa->g) == 0 &&
263                     BN_cmp(a->dsa->pub_key, b->dsa->pub_key) == 0;
264         default:
265                 fatal("key_equal: bad key type %d", a->type);
266         }
267         /* NOTREACHED */
268 }
269
270 int
271 key_equal(const Key *a, const Key *b)
272 {
273         if (a == NULL || b == NULL || a->type != b->type)
274                 return 0;
275         if (key_is_cert(a)) {
276                 if (!cert_compare(a->cert, b->cert))
277                         return 0;
278         }
279         return key_equal_public(a, b);
280 }
281
282 u_char*
283 key_fingerprint_raw(Key *k, enum fp_type dgst_type, u_int *dgst_raw_length)
284 {
285         const EVP_MD *md = NULL;
286         EVP_MD_CTX ctx;
287         u_char *blob = NULL;
288         u_char *retval = NULL;
289         u_int len = 0;
290         int nlen, elen, otype;
291
292         *dgst_raw_length = 0;
293
294         switch (dgst_type) {
295         case SSH_FP_MD5:
296                 md = EVP_md5();
297                 break;
298         case SSH_FP_SHA1:
299                 md = EVP_sha1();
300                 break;
301         default:
302                 fatal("key_fingerprint_raw: bad digest type %d",
303                     dgst_type);
304         }
305         switch (k->type) {
306         case KEY_RSA1:
307                 nlen = BN_num_bytes(k->rsa->n);
308                 elen = BN_num_bytes(k->rsa->e);
309                 len = nlen + elen;
310                 blob = xmalloc(len);
311                 BN_bn2bin(k->rsa->n, blob);
312                 BN_bn2bin(k->rsa->e, blob + nlen);
313                 break;
314         case KEY_DSA:
315         case KEY_RSA:
316                 key_to_blob(k, &blob, &len);
317                 break;
318         case KEY_DSA_CERT_V00:
319         case KEY_RSA_CERT_V00:
320         case KEY_DSA_CERT:
321         case KEY_RSA_CERT:
322                 /* We want a fingerprint of the _key_ not of the cert */
323                 otype = k->type;
324                 k->type = key_type_plain(k->type);
325                 key_to_blob(k, &blob, &len);
326                 k->type = otype;
327                 break;
328         case KEY_UNSPEC:
329                 return retval;
330         default:
331                 fatal("key_fingerprint_raw: bad key type %d", k->type);
332                 break;
333         }
334         if (blob != NULL) {
335                 retval = xmalloc(EVP_MAX_MD_SIZE);
336                 EVP_DigestInit(&ctx, md);
337                 EVP_DigestUpdate(&ctx, blob, len);
338                 EVP_DigestFinal(&ctx, retval, dgst_raw_length);
339                 memset(blob, 0, len);
340                 xfree(blob);
341         } else {
342                 fatal("key_fingerprint_raw: blob is null");
343         }
344         return retval;
345 }
346
347 static char *
348 key_fingerprint_hex(u_char *dgst_raw, u_int dgst_raw_len)
349 {
350         char *retval;
351         u_int i;
352
353         retval = xcalloc(1, dgst_raw_len * 3 + 1);
354         for (i = 0; i < dgst_raw_len; i++) {
355                 char hex[4];
356                 snprintf(hex, sizeof(hex), "%02x:", dgst_raw[i]);
357                 strlcat(retval, hex, dgst_raw_len * 3 + 1);
358         }
359
360         /* Remove the trailing ':' character */
361         retval[(dgst_raw_len * 3) - 1] = '\0';
362         return retval;
363 }
364
365 static char *
366 key_fingerprint_bubblebabble(u_char *dgst_raw, u_int dgst_raw_len)
367 {
368         char vowels[] = { 'a', 'e', 'i', 'o', 'u', 'y' };
369         char consonants[] = { 'b', 'c', 'd', 'f', 'g', 'h', 'k', 'l', 'm',
370             'n', 'p', 'r', 's', 't', 'v', 'z', 'x' };
371         u_int i, j = 0, rounds, seed = 1;
372         char *retval;
373
374         rounds = (dgst_raw_len / 2) + 1;
375         retval = xcalloc((rounds * 6), sizeof(char));
376         retval[j++] = 'x';
377         for (i = 0; i < rounds; i++) {
378                 u_int idx0, idx1, idx2, idx3, idx4;
379                 if ((i + 1 < rounds) || (dgst_raw_len % 2 != 0)) {
380                         idx0 = (((((u_int)(dgst_raw[2 * i])) >> 6) & 3) +
381                             seed) % 6;
382                         idx1 = (((u_int)(dgst_raw[2 * i])) >> 2) & 15;
383                         idx2 = ((((u_int)(dgst_raw[2 * i])) & 3) +
384                             (seed / 6)) % 6;
385                         retval[j++] = vowels[idx0];
386                         retval[j++] = consonants[idx1];
387                         retval[j++] = vowels[idx2];
388                         if ((i + 1) < rounds) {
389                                 idx3 = (((u_int)(dgst_raw[(2 * i) + 1])) >> 4) & 15;
390                                 idx4 = (((u_int)(dgst_raw[(2 * i) + 1]))) & 15;
391                                 retval[j++] = consonants[idx3];
392                                 retval[j++] = '-';
393                                 retval[j++] = consonants[idx4];
394                                 seed = ((seed * 5) +
395                                     ((((u_int)(dgst_raw[2 * i])) * 7) +
396                                     ((u_int)(dgst_raw[(2 * i) + 1])))) % 36;
397                         }
398                 } else {
399                         idx0 = seed % 6;
400                         idx1 = 16;
401                         idx2 = seed / 6;
402                         retval[j++] = vowels[idx0];
403                         retval[j++] = consonants[idx1];
404                         retval[j++] = vowels[idx2];
405                 }
406         }
407         retval[j++] = 'x';
408         retval[j++] = '\0';
409         return retval;
410 }
411
412 /*
413  * Draw an ASCII-Art representing the fingerprint so human brain can
414  * profit from its built-in pattern recognition ability.
415  * This technique is called "random art" and can be found in some
416  * scientific publications like this original paper:
417  *
418  * "Hash Visualization: a New Technique to improve Real-World Security",
419  * Perrig A. and Song D., 1999, International Workshop on Cryptographic
420  * Techniques and E-Commerce (CrypTEC '99)
421  * sparrow.ece.cmu.edu/~adrian/projects/validation/validation.pdf
422  *
423  * The subject came up in a talk by Dan Kaminsky, too.
424  *
425  * If you see the picture is different, the key is different.
426  * If the picture looks the same, you still know nothing.
427  *
428  * The algorithm used here is a worm crawling over a discrete plane,
429  * leaving a trace (augmenting the field) everywhere it goes.
430  * Movement is taken from dgst_raw 2bit-wise.  Bumping into walls
431  * makes the respective movement vector be ignored for this turn.
432  * Graphs are not unambiguous, because circles in graphs can be
433  * walked in either direction.
434  */
435
436 /*
437  * Field sizes for the random art.  Have to be odd, so the starting point
438  * can be in the exact middle of the picture, and FLDBASE should be >=8 .
439  * Else pictures would be too dense, and drawing the frame would
440  * fail, too, because the key type would not fit in anymore.
441  */
442 #define FLDBASE         8
443 #define FLDSIZE_Y       (FLDBASE + 1)
444 #define FLDSIZE_X       (FLDBASE * 2 + 1)
445 static char *
446 key_fingerprint_randomart(u_char *dgst_raw, u_int dgst_raw_len, const Key *k)
447 {
448         /*
449          * Chars to be used after each other every time the worm
450          * intersects with itself.  Matter of taste.
451          */
452         char    *augmentation_string = " .o+=*BOX@%&#/^SE";
453         char    *retval, *p;
454         u_char   field[FLDSIZE_X][FLDSIZE_Y];
455         u_int    i, b;
456         int      x, y;
457         size_t   len = strlen(augmentation_string) - 1;
458
459         retval = xcalloc(1, (FLDSIZE_X + 3) * (FLDSIZE_Y + 2));
460
461         /* initialize field */
462         memset(field, 0, FLDSIZE_X * FLDSIZE_Y * sizeof(char));
463         x = FLDSIZE_X / 2;
464         y = FLDSIZE_Y / 2;
465
466         /* process raw key */
467         for (i = 0; i < dgst_raw_len; i++) {
468                 int input;
469                 /* each byte conveys four 2-bit move commands */
470                 input = dgst_raw[i];
471                 for (b = 0; b < 4; b++) {
472                         /* evaluate 2 bit, rest is shifted later */
473                         x += (input & 0x1) ? 1 : -1;
474                         y += (input & 0x2) ? 1 : -1;
475
476                         /* assure we are still in bounds */
477                         x = MAX(x, 0);
478                         y = MAX(y, 0);
479                         x = MIN(x, FLDSIZE_X - 1);
480                         y = MIN(y, FLDSIZE_Y - 1);
481
482                         /* augment the field */
483                         if (field[x][y] < len - 2)
484                                 field[x][y]++;
485                         input = input >> 2;
486                 }
487         }
488
489         /* mark starting point and end point*/
490         field[FLDSIZE_X / 2][FLDSIZE_Y / 2] = len - 1;
491         field[x][y] = len;
492
493         /* fill in retval */
494         snprintf(retval, FLDSIZE_X, "+--[%4s %4u]", key_type(k), key_size(k));
495         p = strchr(retval, '\0');
496
497         /* output upper border */
498         for (i = p - retval - 1; i < FLDSIZE_X; i++)
499                 *p++ = '-';
500         *p++ = '+';
501         *p++ = '\n';
502
503         /* output content */
504         for (y = 0; y < FLDSIZE_Y; y++) {
505                 *p++ = '|';
506                 for (x = 0; x < FLDSIZE_X; x++)
507                         *p++ = augmentation_string[MIN(field[x][y], len)];
508                 *p++ = '|';
509                 *p++ = '\n';
510         }
511
512         /* output lower border */
513         *p++ = '+';
514         for (i = 0; i < FLDSIZE_X; i++)
515                 *p++ = '-';
516         *p++ = '+';
517
518         return retval;
519 }
520
521 char *
522 key_fingerprint(Key *k, enum fp_type dgst_type, enum fp_rep dgst_rep)
523 {
524         char *retval = NULL;
525         u_char *dgst_raw;
526         u_int dgst_raw_len;
527
528         dgst_raw = key_fingerprint_raw(k, dgst_type, &dgst_raw_len);
529         if (!dgst_raw)
530                 fatal("key_fingerprint: null from key_fingerprint_raw()");
531         switch (dgst_rep) {
532         case SSH_FP_HEX:
533                 retval = key_fingerprint_hex(dgst_raw, dgst_raw_len);
534                 break;
535         case SSH_FP_BUBBLEBABBLE:
536                 retval = key_fingerprint_bubblebabble(dgst_raw, dgst_raw_len);
537                 break;
538         case SSH_FP_RANDOMART:
539                 retval = key_fingerprint_randomart(dgst_raw, dgst_raw_len, k);
540                 break;
541         default:
542                 fatal("key_fingerprint: bad digest representation %d",
543                     dgst_rep);
544                 break;
545         }
546         memset(dgst_raw, 0, dgst_raw_len);
547         xfree(dgst_raw);
548         return retval;
549 }
550
551 /*
552  * Reads a multiple-precision integer in decimal from the buffer, and advances
553  * the pointer.  The integer must already be initialized.  This function is
554  * permitted to modify the buffer.  This leaves *cpp to point just beyond the
555  * last processed (and maybe modified) character.  Note that this may modify
556  * the buffer containing the number.
557  */
558 static int
559 read_bignum(char **cpp, BIGNUM * value)
560 {
561         char *cp = *cpp;
562         int old;
563
564         /* Skip any leading whitespace. */
565         for (; *cp == ' ' || *cp == '\t'; cp++)
566                 ;
567
568         /* Check that it begins with a decimal digit. */
569         if (*cp < '0' || *cp > '9')
570                 return 0;
571
572         /* Save starting position. */
573         *cpp = cp;
574
575         /* Move forward until all decimal digits skipped. */
576         for (; *cp >= '0' && *cp <= '9'; cp++)
577                 ;
578
579         /* Save the old terminating character, and replace it by \0. */
580         old = *cp;
581         *cp = 0;
582
583         /* Parse the number. */
584         if (BN_dec2bn(&value, *cpp) == 0)
585                 return 0;
586
587         /* Restore old terminating character. */
588         *cp = old;
589
590         /* Move beyond the number and return success. */
591         *cpp = cp;
592         return 1;
593 }
594
595 static int
596 write_bignum(FILE *f, BIGNUM *num)
597 {
598         char *buf = BN_bn2dec(num);
599         if (buf == NULL) {
600                 error("write_bignum: BN_bn2dec() failed");
601                 return 0;
602         }
603         fprintf(f, " %s", buf);
604         OPENSSL_free(buf);
605         return 1;
606 }
607
608 /* returns 1 ok, -1 error */
609 int
610 key_read(Key *ret, char **cpp)
611 {
612         Key *k;
613         int success = -1;
614         char *cp, *space;
615         int len, n, type;
616         u_int bits;
617         u_char *blob;
618
619         cp = *cpp;
620
621         switch (ret->type) {
622         case KEY_RSA1:
623                 /* Get number of bits. */
624                 if (*cp < '0' || *cp > '9')
625                         return -1;      /* Bad bit count... */
626                 for (bits = 0; *cp >= '0' && *cp <= '9'; cp++)
627                         bits = 10 * bits + *cp - '0';
628                 if (bits == 0)
629                         return -1;
630                 *cpp = cp;
631                 /* Get public exponent, public modulus. */
632                 if (!read_bignum(cpp, ret->rsa->e))
633                         return -1;
634                 if (!read_bignum(cpp, ret->rsa->n))
635                         return -1;
636                 /* validate the claimed number of bits */
637                 if ((u_int)BN_num_bits(ret->rsa->n) != bits) {
638                         verbose("key_read: claimed key size %d does not match "
639                            "actual %d", bits, BN_num_bits(ret->rsa->n));
640                         return -1;
641                 }
642                 success = 1;
643                 break;
644         case KEY_UNSPEC:
645         case KEY_RSA:
646         case KEY_DSA:
647         case KEY_DSA_CERT_V00:
648         case KEY_RSA_CERT_V00:
649         case KEY_DSA_CERT:
650         case KEY_RSA_CERT:
651                 space = strchr(cp, ' ');
652                 if (space == NULL) {
653                         debug3("key_read: missing whitespace");
654                         return -1;
655                 }
656                 *space = '\0';
657                 type = key_type_from_name(cp);
658                 *space = ' ';
659                 if (type == KEY_UNSPEC) {
660                         debug3("key_read: missing keytype");
661                         return -1;
662                 }
663                 cp = space+1;
664                 if (*cp == '\0') {
665                         debug3("key_read: short string");
666                         return -1;
667                 }
668                 if (ret->type == KEY_UNSPEC) {
669                         ret->type = type;
670                 } else if (ret->type != type) {
671                         /* is a key, but different type */
672                         debug3("key_read: type mismatch");
673                         return -1;
674                 }
675                 len = 2*strlen(cp);
676                 blob = xmalloc(len);
677                 n = uudecode(cp, blob, len);
678                 if (n < 0) {
679                         error("key_read: uudecode %s failed", cp);
680                         xfree(blob);
681                         return -1;
682                 }
683                 k = key_from_blob(blob, (u_int)n);
684                 xfree(blob);
685                 if (k == NULL) {
686                         error("key_read: key_from_blob %s failed", cp);
687                         return -1;
688                 }
689                 if (k->type != type) {
690                         error("key_read: type mismatch: encoding error");
691                         key_free(k);
692                         return -1;
693                 }
694 /*XXXX*/
695                 if (key_is_cert(ret)) {
696                         if (!key_is_cert(k)) {
697                                 error("key_read: loaded key is not a cert");
698                                 key_free(k);
699                                 return -1;
700                         }
701                         if (ret->cert != NULL)
702                                 cert_free(ret->cert);
703                         ret->cert = k->cert;
704                         k->cert = NULL;
705                 }
706                 if (key_type_plain(ret->type) == KEY_RSA) {
707                         if (ret->rsa != NULL)
708                                 RSA_free(ret->rsa);
709                         ret->rsa = k->rsa;
710                         k->rsa = NULL;
711 #ifdef DEBUG_PK
712                         RSA_print_fp(stderr, ret->rsa, 8);
713 #endif
714                 }
715                 if (key_type_plain(ret->type) == KEY_DSA) {
716                         if (ret->dsa != NULL)
717                                 DSA_free(ret->dsa);
718                         ret->dsa = k->dsa;
719                         k->dsa = NULL;
720 #ifdef DEBUG_PK
721                         DSA_print_fp(stderr, ret->dsa, 8);
722 #endif
723                 }
724                 success = 1;
725 /*XXXX*/
726                 key_free(k);
727                 if (success != 1)
728                         break;
729                 /* advance cp: skip whitespace and data */
730                 while (*cp == ' ' || *cp == '\t')
731                         cp++;
732                 while (*cp != '\0' && *cp != ' ' && *cp != '\t')
733                         cp++;
734                 *cpp = cp;
735                 break;
736         default:
737                 fatal("key_read: bad key type: %d", ret->type);
738                 break;
739         }
740         return success;
741 }
742
743 int
744 key_write(const Key *key, FILE *f)
745 {
746         int n, success = 0;
747         u_int len, bits = 0;
748         u_char *blob;
749         char *uu;
750
751         if (key_is_cert(key)) {
752                 if (key->cert == NULL) {
753                         error("%s: no cert data", __func__);
754                         return 0;
755                 }
756                 if (buffer_len(&key->cert->certblob) == 0) {
757                         error("%s: no signed certificate blob", __func__);
758                         return 0;
759                 }
760         }
761
762         switch (key->type) {
763         case KEY_RSA1:
764                 if (key->rsa == NULL)
765                         return 0;
766                 /* size of modulus 'n' */
767                 bits = BN_num_bits(key->rsa->n);
768                 fprintf(f, "%u", bits);
769                 if (write_bignum(f, key->rsa->e) &&
770                     write_bignum(f, key->rsa->n))
771                         return 1;
772                 error("key_write: failed for RSA key");
773                 return 0;
774         case KEY_DSA:
775         case KEY_DSA_CERT_V00:
776         case KEY_DSA_CERT:
777                 if (key->dsa == NULL)
778                         return 0;
779                 break;
780         case KEY_RSA:
781         case KEY_RSA_CERT_V00:
782         case KEY_RSA_CERT:
783                 if (key->rsa == NULL)
784                         return 0;
785                 break;
786         default:
787                 return 0;
788         }
789
790         key_to_blob(key, &blob, &len);
791         uu = xmalloc(2*len);
792         n = uuencode(blob, len, uu, 2*len);
793         if (n > 0) {
794                 fprintf(f, "%s %s", key_ssh_name(key), uu);
795                 success = 1;
796         }
797         xfree(blob);
798         xfree(uu);
799
800         return success;
801 }
802
803 const char *
804 key_type(const Key *k)
805 {
806         switch (k->type) {
807         case KEY_RSA1:
808                 return "RSA1";
809         case KEY_RSA:
810                 return "RSA";
811         case KEY_DSA:
812                 return "DSA";
813         case KEY_RSA_CERT_V00:
814                 return "RSA-CERT-V00";
815         case KEY_DSA_CERT_V00:
816                 return "DSA-CERT-V00";
817         case KEY_RSA_CERT:
818                 return "RSA-CERT";
819         case KEY_DSA_CERT:
820                 return "DSA-CERT";
821         }
822         return "unknown";
823 }
824
825 const char *
826 key_cert_type(const Key *k)
827 {
828         switch (k->cert->type) {
829         case SSH2_CERT_TYPE_USER:
830                 return "user";
831         case SSH2_CERT_TYPE_HOST:
832                 return "host";
833         default:
834                 return "unknown";
835         }
836 }
837
838 const char *
839 key_ssh_name(const Key *k)
840 {
841         switch (k->type) {
842         case KEY_RSA:
843                 return "ssh-rsa";
844         case KEY_DSA:
845                 return "ssh-dss";
846         case KEY_RSA_CERT_V00:
847                 return "ssh-rsa-cert-v00@openssh.com";
848         case KEY_DSA_CERT_V00:
849                 return "ssh-dss-cert-v00@openssh.com";
850         case KEY_RSA_CERT:
851                 return "ssh-rsa-cert-v01@openssh.com";
852         case KEY_DSA_CERT:
853                 return "ssh-dss-cert-v01@openssh.com";
854         }
855         return "ssh-unknown";
856 }
857
858 u_int
859 key_size(const Key *k)
860 {
861         switch (k->type) {
862         case KEY_RSA1:
863         case KEY_RSA:
864         case KEY_RSA_CERT_V00:
865         case KEY_RSA_CERT:
866                 return BN_num_bits(k->rsa->n);
867         case KEY_DSA:
868         case KEY_DSA_CERT_V00:
869         case KEY_DSA_CERT:
870                 return BN_num_bits(k->dsa->p);
871         }
872         return 0;
873 }
874
875 static RSA *
876 rsa_generate_private_key(u_int bits)
877 {
878         RSA *private;
879
880         private = RSA_generate_key(bits, RSA_F4, NULL, NULL);
881         if (private == NULL)
882                 fatal("rsa_generate_private_key: key generation failed.");
883         return private;
884 }
885
886 static DSA*
887 dsa_generate_private_key(u_int bits)
888 {
889         DSA *private = DSA_generate_parameters(bits, NULL, 0, NULL, NULL, NULL, NULL);
890
891         if (private == NULL)
892                 fatal("dsa_generate_private_key: DSA_generate_parameters failed");
893         if (!DSA_generate_key(private))
894                 fatal("dsa_generate_private_key: DSA_generate_key failed.");
895         if (private == NULL)
896                 fatal("dsa_generate_private_key: NULL.");
897         return private;
898 }
899
900 Key *
901 key_generate(int type, u_int bits)
902 {
903         Key *k = key_new(KEY_UNSPEC);
904         switch (type) {
905         case KEY_DSA:
906                 k->dsa = dsa_generate_private_key(bits);
907                 break;
908         case KEY_RSA:
909         case KEY_RSA1:
910                 k->rsa = rsa_generate_private_key(bits);
911                 break;
912         case KEY_RSA_CERT_V00:
913         case KEY_DSA_CERT_V00:
914         case KEY_RSA_CERT:
915         case KEY_DSA_CERT:
916                 fatal("key_generate: cert keys cannot be generated directly");
917         default:
918                 fatal("key_generate: unknown type %d", type);
919         }
920         k->type = type;
921         return k;
922 }
923
924 void
925 key_cert_copy(const Key *from_key, struct Key *to_key)
926 {
927         u_int i;
928         const struct KeyCert *from;
929         struct KeyCert *to;
930
931         if (to_key->cert != NULL) {
932                 cert_free(to_key->cert);
933                 to_key->cert = NULL;
934         }
935
936         if ((from = from_key->cert) == NULL)
937                 return;
938
939         to = to_key->cert = cert_new();
940
941         buffer_append(&to->certblob, buffer_ptr(&from->certblob),
942             buffer_len(&from->certblob));
943
944         buffer_append(&to->critical,
945             buffer_ptr(&from->critical), buffer_len(&from->critical));
946         buffer_append(&to->extensions,
947             buffer_ptr(&from->extensions), buffer_len(&from->extensions));
948
949         to->serial = from->serial;
950         to->type = from->type;
951         to->key_id = from->key_id == NULL ? NULL : xstrdup(from->key_id);
952         to->valid_after = from->valid_after;
953         to->valid_before = from->valid_before;
954         to->signature_key = from->signature_key == NULL ?
955             NULL : key_from_private(from->signature_key);
956
957         to->nprincipals = from->nprincipals;
958         if (to->nprincipals > CERT_MAX_PRINCIPALS)
959                 fatal("%s: nprincipals (%u) > CERT_MAX_PRINCIPALS (%u)",
960                     __func__, to->nprincipals, CERT_MAX_PRINCIPALS);
961         if (to->nprincipals > 0) {
962                 to->principals = xcalloc(from->nprincipals,
963                     sizeof(*to->principals));
964                 for (i = 0; i < to->nprincipals; i++)
965                         to->principals[i] = xstrdup(from->principals[i]);
966         }
967 }
968
969 Key *
970 key_from_private(const Key *k)
971 {
972         Key *n = NULL;
973         switch (k->type) {
974         case KEY_DSA:
975         case KEY_DSA_CERT_V00:
976         case KEY_DSA_CERT:
977                 n = key_new(k->type);
978                 if ((BN_copy(n->dsa->p, k->dsa->p) == NULL) ||
979                     (BN_copy(n->dsa->q, k->dsa->q) == NULL) ||
980                     (BN_copy(n->dsa->g, k->dsa->g) == NULL) ||
981                     (BN_copy(n->dsa->pub_key, k->dsa->pub_key) == NULL))
982                         fatal("key_from_private: BN_copy failed");
983                 break;
984         case KEY_RSA:
985         case KEY_RSA1:
986         case KEY_RSA_CERT_V00:
987         case KEY_RSA_CERT:
988                 n = key_new(k->type);
989                 if ((BN_copy(n->rsa->n, k->rsa->n) == NULL) ||
990                     (BN_copy(n->rsa->e, k->rsa->e) == NULL))
991                         fatal("key_from_private: BN_copy failed");
992                 break;
993         default:
994                 fatal("key_from_private: unknown type %d", k->type);
995                 break;
996         }
997         if (key_is_cert(k))
998                 key_cert_copy(k, n);
999         return n;
1000 }
1001
1002 int
1003 key_type_from_name(char *name)
1004 {
1005         if (strcmp(name, "rsa1") == 0) {
1006                 return KEY_RSA1;
1007         } else if (strcmp(name, "rsa") == 0) {
1008                 return KEY_RSA;
1009         } else if (strcmp(name, "dsa") == 0) {
1010                 return KEY_DSA;
1011         } else if (strcmp(name, "ssh-rsa") == 0) {
1012                 return KEY_RSA;
1013         } else if (strcmp(name, "ssh-dss") == 0) {
1014                 return KEY_DSA;
1015         } else if (strcmp(name, "ssh-rsa-cert-v00@openssh.com") == 0) {
1016                 return KEY_RSA_CERT_V00;
1017         } else if (strcmp(name, "ssh-dss-cert-v00@openssh.com") == 0) {
1018                 return KEY_DSA_CERT_V00;
1019         } else if (strcmp(name, "ssh-rsa-cert-v01@openssh.com") == 0) {
1020                 return KEY_RSA_CERT;
1021         } else if (strcmp(name, "ssh-dss-cert-v01@openssh.com") == 0) {
1022                 return KEY_DSA_CERT;
1023         }
1024         debug2("key_type_from_name: unknown key type '%s'", name);
1025         return KEY_UNSPEC;
1026 }
1027
1028 int
1029 key_names_valid2(const char *names)
1030 {
1031         char *s, *cp, *p;
1032
1033         if (names == NULL || strcmp(names, "") == 0)
1034                 return 0;
1035         s = cp = xstrdup(names);
1036         for ((p = strsep(&cp, ",")); p && *p != '\0';
1037             (p = strsep(&cp, ","))) {
1038                 switch (key_type_from_name(p)) {
1039                 case KEY_RSA1:
1040                 case KEY_UNSPEC:
1041                         xfree(s);
1042                         return 0;
1043                 }
1044         }
1045         debug3("key names ok: [%s]", names);
1046         xfree(s);
1047         return 1;
1048 }
1049
1050 static int
1051 cert_parse(Buffer *b, Key *key, const u_char *blob, u_int blen)
1052 {
1053         u_char *principals, *critical, *exts, *sig_key, *sig;
1054         u_int signed_len, plen, clen, sklen, slen, kidlen, elen;
1055         Buffer tmp;
1056         char *principal;
1057         int ret = -1;
1058         int v00 = key->type == KEY_DSA_CERT_V00 ||
1059             key->type == KEY_RSA_CERT_V00;
1060
1061         buffer_init(&tmp);
1062
1063         /* Copy the entire key blob for verification and later serialisation */
1064         buffer_append(&key->cert->certblob, blob, blen);
1065
1066         elen = 0; /* Not touched for v00 certs */
1067         principals = exts = critical = sig_key = sig = NULL;
1068         if ((!v00 && buffer_get_int64_ret(&key->cert->serial, b) != 0) ||
1069             buffer_get_int_ret(&key->cert->type, b) != 0 ||
1070             (key->cert->key_id = buffer_get_string_ret(b, &kidlen)) == NULL ||
1071             (principals = buffer_get_string_ret(b, &plen)) == NULL ||
1072             buffer_get_int64_ret(&key->cert->valid_after, b) != 0 ||
1073             buffer_get_int64_ret(&key->cert->valid_before, b) != 0 ||
1074             (critical = buffer_get_string_ret(b, &clen)) == NULL ||
1075             (!v00 && (exts = buffer_get_string_ret(b, &elen)) == NULL) ||
1076             (v00 && buffer_get_string_ptr_ret(b, NULL) == NULL) || /* nonce */
1077             buffer_get_string_ptr_ret(b, NULL) == NULL || /* reserved */
1078             (sig_key = buffer_get_string_ret(b, &sklen)) == NULL) {
1079                 error("%s: parse error", __func__);
1080                 goto out;
1081         }
1082
1083         if (kidlen != strlen(key->cert->key_id)) {
1084                 error("%s: key ID contains \\0 character", __func__);
1085                 goto out;
1086         }
1087
1088         /* Signature is left in the buffer so we can calculate this length */
1089         signed_len = buffer_len(&key->cert->certblob) - buffer_len(b);
1090
1091         if ((sig = buffer_get_string_ret(b, &slen)) == NULL) {
1092                 error("%s: parse error", __func__);
1093                 goto out;
1094         }
1095
1096         if (key->cert->type != SSH2_CERT_TYPE_USER &&
1097             key->cert->type != SSH2_CERT_TYPE_HOST) {
1098                 error("Unknown certificate type %u", key->cert->type);
1099                 goto out;
1100         }
1101
1102         buffer_append(&tmp, principals, plen);
1103         while (buffer_len(&tmp) > 0) {
1104                 if (key->cert->nprincipals >= CERT_MAX_PRINCIPALS) {
1105                         error("%s: Too many principals", __func__);
1106                         goto out;
1107                 }
1108                 if ((principal = buffer_get_string_ret(&tmp, &plen)) == NULL) {
1109                         error("%s: Principals data invalid", __func__);
1110                         goto out;
1111                 }
1112                 if (strlen(principal) != plen) {
1113                         error("%s: Principal contains \\0 character",
1114                             __func__);
1115                         goto out;
1116                 }
1117                 key->cert->principals = xrealloc(key->cert->principals,
1118                     key->cert->nprincipals + 1, sizeof(*key->cert->principals));
1119                 key->cert->principals[key->cert->nprincipals++] = principal;
1120         }
1121
1122         buffer_clear(&tmp);
1123
1124         buffer_append(&key->cert->critical, critical, clen);
1125         buffer_append(&tmp, critical, clen);
1126         /* validate structure */
1127         while (buffer_len(&tmp) != 0) {
1128                 if (buffer_get_string_ptr_ret(&tmp, NULL) == NULL ||
1129                     buffer_get_string_ptr_ret(&tmp, NULL) == NULL) {
1130                         error("%s: critical option data invalid", __func__);
1131                         goto out;
1132                 }
1133         }
1134         buffer_clear(&tmp);
1135
1136         buffer_append(&key->cert->extensions, exts, elen);
1137         buffer_append(&tmp, exts, elen);
1138         /* validate structure */
1139         while (buffer_len(&tmp) != 0) {
1140                 if (buffer_get_string_ptr_ret(&tmp, NULL) == NULL ||
1141                     buffer_get_string_ptr_ret(&tmp, NULL) == NULL) {
1142                         error("%s: extension data invalid", __func__);
1143                         goto out;
1144                 }
1145         }
1146         buffer_clear(&tmp);
1147
1148         if ((key->cert->signature_key = key_from_blob(sig_key,
1149             sklen)) == NULL) {
1150                 error("%s: Signature key invalid", __func__);
1151                 goto out;
1152         }
1153         if (key->cert->signature_key->type != KEY_RSA &&
1154             key->cert->signature_key->type != KEY_DSA) {
1155                 error("%s: Invalid signature key type %s (%d)", __func__,
1156                     key_type(key->cert->signature_key),
1157                     key->cert->signature_key->type);
1158                 goto out;
1159         }
1160
1161         switch (key_verify(key->cert->signature_key, sig, slen, 
1162             buffer_ptr(&key->cert->certblob), signed_len)) {
1163         case 1:
1164                 ret = 0;
1165                 break; /* Good signature */
1166         case 0:
1167                 error("%s: Invalid signature on certificate", __func__);
1168                 goto out;
1169         case -1:
1170                 error("%s: Certificate signature verification failed",
1171                     __func__);
1172                 goto out;
1173         }
1174
1175  out:
1176         buffer_free(&tmp);
1177         if (principals != NULL)
1178                 xfree(principals);
1179         if (critical != NULL)
1180                 xfree(critical);
1181         if (exts != NULL)
1182                 xfree(exts);
1183         if (sig_key != NULL)
1184                 xfree(sig_key);
1185         if (sig != NULL)
1186                 xfree(sig);
1187         return ret;
1188 }
1189
1190 Key *
1191 key_from_blob(const u_char *blob, u_int blen)
1192 {
1193         Buffer b;
1194         int rlen, type;
1195         char *ktype = NULL;
1196         Key *key = NULL;
1197
1198 #ifdef DEBUG_PK
1199         dump_base64(stderr, blob, blen);
1200 #endif
1201         buffer_init(&b);
1202         buffer_append(&b, blob, blen);
1203         if ((ktype = buffer_get_string_ret(&b, NULL)) == NULL) {
1204                 error("key_from_blob: can't read key type");
1205                 goto out;
1206         }
1207
1208         type = key_type_from_name(ktype);
1209
1210         switch (type) {
1211         case KEY_RSA_CERT:
1212                 (void)buffer_get_string_ptr_ret(&b, NULL); /* Skip nonce */
1213                 /* FALLTHROUGH */
1214         case KEY_RSA:
1215         case KEY_RSA_CERT_V00:
1216                 key = key_new(type);
1217                 if (buffer_get_bignum2_ret(&b, key->rsa->e) == -1 ||
1218                     buffer_get_bignum2_ret(&b, key->rsa->n) == -1) {
1219                         error("key_from_blob: can't read rsa key");
1220  badkey:
1221                         key_free(key);
1222                         key = NULL;
1223                         goto out;
1224                 }
1225 #ifdef DEBUG_PK
1226                 RSA_print_fp(stderr, key->rsa, 8);
1227 #endif
1228                 break;
1229         case KEY_DSA_CERT:
1230                 (void)buffer_get_string_ptr_ret(&b, NULL); /* Skip nonce */
1231                 /* FALLTHROUGH */
1232         case KEY_DSA:
1233         case KEY_DSA_CERT_V00:
1234                 key = key_new(type);
1235                 if (buffer_get_bignum2_ret(&b, key->dsa->p) == -1 ||
1236                     buffer_get_bignum2_ret(&b, key->dsa->q) == -1 ||
1237                     buffer_get_bignum2_ret(&b, key->dsa->g) == -1 ||
1238                     buffer_get_bignum2_ret(&b, key->dsa->pub_key) == -1) {
1239                         error("key_from_blob: can't read dsa key");
1240                         goto badkey;
1241                 }
1242 #ifdef DEBUG_PK
1243                 DSA_print_fp(stderr, key->dsa, 8);
1244 #endif
1245                 break;
1246         case KEY_UNSPEC:
1247                 key = key_new(type);
1248                 break;
1249         default:
1250                 error("key_from_blob: cannot handle type %s", ktype);
1251                 goto out;
1252         }
1253         if (key_is_cert(key) && cert_parse(&b, key, blob, blen) == -1) {
1254                 error("key_from_blob: can't parse cert data");
1255                 goto badkey;
1256         }
1257         rlen = buffer_len(&b);
1258         if (key != NULL && rlen != 0)
1259                 error("key_from_blob: remaining bytes in key blob %d", rlen);
1260  out:
1261         if (ktype != NULL)
1262                 xfree(ktype);
1263         buffer_free(&b);
1264         return key;
1265 }
1266
1267 int
1268 key_to_blob(const Key *key, u_char **blobp, u_int *lenp)
1269 {
1270         Buffer b;
1271         int len;
1272
1273         if (key == NULL) {
1274                 error("key_to_blob: key == NULL");
1275                 return 0;
1276         }
1277         buffer_init(&b);
1278         switch (key->type) {
1279         case KEY_DSA_CERT_V00:
1280         case KEY_RSA_CERT_V00:
1281         case KEY_DSA_CERT:
1282         case KEY_RSA_CERT:
1283                 /* Use the existing blob */
1284                 buffer_append(&b, buffer_ptr(&key->cert->certblob),
1285                     buffer_len(&key->cert->certblob));
1286                 break;
1287         case KEY_DSA:
1288                 buffer_put_cstring(&b, key_ssh_name(key));
1289                 buffer_put_bignum2(&b, key->dsa->p);
1290                 buffer_put_bignum2(&b, key->dsa->q);
1291                 buffer_put_bignum2(&b, key->dsa->g);
1292                 buffer_put_bignum2(&b, key->dsa->pub_key);
1293                 break;
1294         case KEY_RSA:
1295                 buffer_put_cstring(&b, key_ssh_name(key));
1296                 buffer_put_bignum2(&b, key->rsa->e);
1297                 buffer_put_bignum2(&b, key->rsa->n);
1298                 break;
1299         default:
1300                 error("key_to_blob: unsupported key type %d", key->type);
1301                 buffer_free(&b);
1302                 return 0;
1303         }
1304         len = buffer_len(&b);
1305         if (lenp != NULL)
1306                 *lenp = len;
1307         if (blobp != NULL) {
1308                 *blobp = xmalloc(len);
1309                 memcpy(*blobp, buffer_ptr(&b), len);
1310         }
1311         memset(buffer_ptr(&b), 0, len);
1312         buffer_free(&b);
1313         return len;
1314 }
1315
1316 int
1317 key_sign(
1318     const Key *key,
1319     u_char **sigp, u_int *lenp,
1320     const u_char *data, u_int datalen)
1321 {
1322         switch (key->type) {
1323         case KEY_DSA_CERT_V00:
1324         case KEY_DSA_CERT:
1325         case KEY_DSA:
1326                 return ssh_dss_sign(key, sigp, lenp, data, datalen);
1327         case KEY_RSA_CERT_V00:
1328         case KEY_RSA_CERT:
1329         case KEY_RSA:
1330                 return ssh_rsa_sign(key, sigp, lenp, data, datalen);
1331         default:
1332                 error("key_sign: invalid key type %d", key->type);
1333                 return -1;
1334         }
1335 }
1336
1337 /*
1338  * key_verify returns 1 for a correct signature, 0 for an incorrect signature
1339  * and -1 on error.
1340  */
1341 int
1342 key_verify(
1343     const Key *key,
1344     const u_char *signature, u_int signaturelen,
1345     const u_char *data, u_int datalen)
1346 {
1347         if (signaturelen == 0)
1348                 return -1;
1349
1350         switch (key->type) {
1351         case KEY_DSA_CERT_V00:
1352         case KEY_DSA_CERT:
1353         case KEY_DSA:
1354                 return ssh_dss_verify(key, signature, signaturelen, data, datalen);
1355         case KEY_RSA_CERT_V00:
1356         case KEY_RSA_CERT:
1357         case KEY_RSA:
1358                 return ssh_rsa_verify(key, signature, signaturelen, data, datalen);
1359         default:
1360                 error("key_verify: invalid key type %d", key->type);
1361                 return -1;
1362         }
1363 }
1364
1365 /* Converts a private to a public key */
1366 Key *
1367 key_demote(const Key *k)
1368 {
1369         Key *pk;
1370
1371         pk = xcalloc(1, sizeof(*pk));
1372         pk->type = k->type;
1373         pk->flags = k->flags;
1374         pk->dsa = NULL;
1375         pk->rsa = NULL;
1376
1377         switch (k->type) {
1378         case KEY_RSA_CERT_V00:
1379         case KEY_RSA_CERT:
1380                 key_cert_copy(k, pk);
1381                 /* FALLTHROUGH */
1382         case KEY_RSA1:
1383         case KEY_RSA:
1384                 if ((pk->rsa = RSA_new()) == NULL)
1385                         fatal("key_demote: RSA_new failed");
1386                 if ((pk->rsa->e = BN_dup(k->rsa->e)) == NULL)
1387                         fatal("key_demote: BN_dup failed");
1388                 if ((pk->rsa->n = BN_dup(k->rsa->n)) == NULL)
1389                         fatal("key_demote: BN_dup failed");
1390                 break;
1391         case KEY_DSA_CERT_V00:
1392         case KEY_DSA_CERT:
1393                 key_cert_copy(k, pk);
1394                 /* FALLTHROUGH */
1395         case KEY_DSA:
1396                 if ((pk->dsa = DSA_new()) == NULL)
1397                         fatal("key_demote: DSA_new failed");
1398                 if ((pk->dsa->p = BN_dup(k->dsa->p)) == NULL)
1399                         fatal("key_demote: BN_dup failed");
1400                 if ((pk->dsa->q = BN_dup(k->dsa->q)) == NULL)
1401                         fatal("key_demote: BN_dup failed");
1402                 if ((pk->dsa->g = BN_dup(k->dsa->g)) == NULL)
1403                         fatal("key_demote: BN_dup failed");
1404                 if ((pk->dsa->pub_key = BN_dup(k->dsa->pub_key)) == NULL)
1405                         fatal("key_demote: BN_dup failed");
1406                 break;
1407         default:
1408                 fatal("key_free: bad key type %d", k->type);
1409                 break;
1410         }
1411
1412         return (pk);
1413 }
1414
1415 int
1416 key_is_cert(const Key *k)
1417 {
1418         if (k == NULL)
1419                 return 0;
1420         switch (k->type) {
1421         case KEY_RSA_CERT_V00:
1422         case KEY_DSA_CERT_V00:
1423         case KEY_RSA_CERT:
1424         case KEY_DSA_CERT:
1425                 return 1;
1426         default:
1427                 return 0;
1428         }
1429 }
1430
1431 /* Return the cert-less equivalent to a certified key type */
1432 int
1433 key_type_plain(int type)
1434 {
1435         switch (type) {
1436         case KEY_RSA_CERT_V00:
1437         case KEY_RSA_CERT:
1438                 return KEY_RSA;
1439         case KEY_DSA_CERT_V00:
1440         case KEY_DSA_CERT:
1441                 return KEY_DSA;
1442         default:
1443                 return type;
1444         }
1445 }
1446
1447 /* Convert a KEY_RSA or KEY_DSA to their _CERT equivalent */
1448 int
1449 key_to_certified(Key *k, int legacy)
1450 {
1451         switch (k->type) {
1452         case KEY_RSA:
1453                 k->cert = cert_new();
1454                 k->type = legacy ? KEY_RSA_CERT_V00 : KEY_RSA_CERT;
1455                 return 0;
1456         case KEY_DSA:
1457                 k->cert = cert_new();
1458                 k->type = legacy ? KEY_DSA_CERT_V00 : KEY_DSA_CERT;
1459                 return 0;
1460         default:
1461                 error("%s: key has incorrect type %s", __func__, key_type(k));
1462                 return -1;
1463         }
1464 }
1465
1466 /* Convert a KEY_RSA_CERT or KEY_DSA_CERT to their raw key equivalent */
1467 int
1468 key_drop_cert(Key *k)
1469 {
1470         switch (k->type) {
1471         case KEY_RSA_CERT_V00:
1472         case KEY_RSA_CERT:
1473                 cert_free(k->cert);
1474                 k->type = KEY_RSA;
1475                 return 0;
1476         case KEY_DSA_CERT_V00:
1477         case KEY_DSA_CERT:
1478                 cert_free(k->cert);
1479                 k->type = KEY_DSA;
1480                 return 0;
1481         default:
1482                 error("%s: key has incorrect type %s", __func__, key_type(k));
1483                 return -1;
1484         }
1485 }
1486
1487 /* Sign a KEY_RSA_CERT or KEY_DSA_CERT, (re-)generating the signed certblob */
1488 int
1489 key_certify(Key *k, Key *ca)
1490 {
1491         Buffer principals;
1492         u_char *ca_blob, *sig_blob, nonce[32];
1493         u_int i, ca_len, sig_len;
1494
1495         if (k->cert == NULL) {
1496                 error("%s: key lacks cert info", __func__);
1497                 return -1;
1498         }
1499
1500         if (!key_is_cert(k)) {
1501                 error("%s: certificate has unknown type %d", __func__,
1502                     k->cert->type);
1503                 return -1;
1504         }
1505
1506         if (ca->type != KEY_RSA && ca->type != KEY_DSA) {
1507                 error("%s: CA key has unsupported type %s", __func__,
1508                     key_type(ca));
1509                 return -1;
1510         }
1511
1512         key_to_blob(ca, &ca_blob, &ca_len);
1513
1514         buffer_clear(&k->cert->certblob);
1515         buffer_put_cstring(&k->cert->certblob, key_ssh_name(k));
1516
1517         /* -v01 certs put nonce first */
1518         if (k->type == KEY_DSA_CERT || k->type == KEY_RSA_CERT) {
1519                 arc4random_buf(&nonce, sizeof(nonce));
1520                 buffer_put_string(&k->cert->certblob, nonce, sizeof(nonce));
1521         }
1522
1523         switch (k->type) {
1524         case KEY_DSA_CERT_V00:
1525         case KEY_DSA_CERT:
1526                 buffer_put_bignum2(&k->cert->certblob, k->dsa->p);
1527                 buffer_put_bignum2(&k->cert->certblob, k->dsa->q);
1528                 buffer_put_bignum2(&k->cert->certblob, k->dsa->g);
1529                 buffer_put_bignum2(&k->cert->certblob, k->dsa->pub_key);
1530                 break;
1531         case KEY_RSA_CERT_V00:
1532         case KEY_RSA_CERT:
1533                 buffer_put_bignum2(&k->cert->certblob, k->rsa->e);
1534                 buffer_put_bignum2(&k->cert->certblob, k->rsa->n);
1535                 break;
1536         default:
1537                 error("%s: key has incorrect type %s", __func__, key_type(k));
1538                 buffer_clear(&k->cert->certblob);
1539                 xfree(ca_blob);
1540                 return -1;
1541         }
1542
1543         /* -v01 certs have a serial number next */
1544         if (k->type == KEY_DSA_CERT || k->type == KEY_RSA_CERT)
1545                 buffer_put_int64(&k->cert->certblob, k->cert->serial);
1546
1547         buffer_put_int(&k->cert->certblob, k->cert->type);
1548         buffer_put_cstring(&k->cert->certblob, k->cert->key_id);
1549
1550         buffer_init(&principals);
1551         for (i = 0; i < k->cert->nprincipals; i++)
1552                 buffer_put_cstring(&principals, k->cert->principals[i]);
1553         buffer_put_string(&k->cert->certblob, buffer_ptr(&principals),
1554             buffer_len(&principals));
1555         buffer_free(&principals);
1556
1557         buffer_put_int64(&k->cert->certblob, k->cert->valid_after);
1558         buffer_put_int64(&k->cert->certblob, k->cert->valid_before);
1559         buffer_put_string(&k->cert->certblob,
1560             buffer_ptr(&k->cert->critical), buffer_len(&k->cert->critical));
1561
1562         /* -v01 certs have non-critical options here */
1563         if (k->type == KEY_DSA_CERT || k->type == KEY_RSA_CERT) {
1564                 buffer_put_string(&k->cert->certblob,
1565                     buffer_ptr(&k->cert->extensions),
1566                     buffer_len(&k->cert->extensions));
1567         }
1568
1569         /* -v00 certs put the nonce at the end */
1570         if (k->type == KEY_DSA_CERT_V00 || k->type == KEY_RSA_CERT_V00)
1571                 buffer_put_string(&k->cert->certblob, nonce, sizeof(nonce));
1572
1573         buffer_put_string(&k->cert->certblob, NULL, 0); /* reserved */
1574         buffer_put_string(&k->cert->certblob, ca_blob, ca_len);
1575         xfree(ca_blob);
1576
1577         /* Sign the whole mess */
1578         if (key_sign(ca, &sig_blob, &sig_len, buffer_ptr(&k->cert->certblob),
1579             buffer_len(&k->cert->certblob)) != 0) {
1580                 error("%s: signature operation failed", __func__);
1581                 buffer_clear(&k->cert->certblob);
1582                 return -1;
1583         }
1584         /* Append signature and we are done */
1585         buffer_put_string(&k->cert->certblob, sig_blob, sig_len);
1586         xfree(sig_blob);
1587
1588         return 0;
1589 }
1590
1591 int
1592 key_cert_check_authority(const Key *k, int want_host, int require_principal,
1593     const char *name, const char **reason)
1594 {
1595         u_int i, principal_matches;
1596         time_t now = time(NULL);
1597
1598         if (want_host) {
1599                 if (k->cert->type != SSH2_CERT_TYPE_HOST) {
1600                         *reason = "Certificate invalid: not a host certificate";
1601                         return -1;
1602                 }
1603         } else {
1604                 if (k->cert->type != SSH2_CERT_TYPE_USER) {
1605                         *reason = "Certificate invalid: not a user certificate";
1606                         return -1;
1607                 }
1608         }
1609         if (now < 0) {
1610                 error("%s: system clock lies before epoch", __func__);
1611                 *reason = "Certificate invalid: not yet valid";
1612                 return -1;
1613         }
1614         if ((u_int64_t)now < k->cert->valid_after) {
1615                 *reason = "Certificate invalid: not yet valid";
1616                 return -1;
1617         }
1618         if ((u_int64_t)now >= k->cert->valid_before) {
1619                 *reason = "Certificate invalid: expired";
1620                 return -1;
1621         }
1622         if (k->cert->nprincipals == 0) {
1623                 if (require_principal) {
1624                         *reason = "Certificate lacks principal list";
1625                         return -1;
1626                 }
1627         } else if (name != NULL) {
1628                 principal_matches = 0;
1629                 for (i = 0; i < k->cert->nprincipals; i++) {
1630                         if (strcmp(name, k->cert->principals[i]) == 0) {
1631                                 principal_matches = 1;
1632                                 break;
1633                         }
1634                 }
1635                 if (!principal_matches) {
1636                         *reason = "Certificate invalid: name is not a listed "
1637                             "principal";
1638                         return -1;
1639                 }
1640         }
1641         return 0;
1642 }
1643
1644 int
1645 key_cert_is_legacy(Key *k)
1646 {
1647         switch (k->type) {
1648         case KEY_DSA_CERT_V00:
1649         case KEY_RSA_CERT_V00:
1650                 return 1;
1651         default:
1652                 return 0;
1653         }
1654 }