]> andersk Git - openssh.git/blob - sshconnect2.c
646bb18f326b50e7cb2f7a115833fa6efd6f9e86
[openssh.git] / sshconnect2.c
1 /*
2  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #include "includes.h"
26 RCSID("$OpenBSD: sshconnect2.c,v 1.52 2001/03/10 12:48:27 markus Exp $");
27
28 #include <openssl/bn.h>
29 #include <openssl/md5.h>
30 #include <openssl/dh.h>
31 #include <openssl/hmac.h>
32
33 #include "ssh.h"
34 #include "ssh2.h"
35 #include "xmalloc.h"
36 #include "rsa.h"
37 #include "buffer.h"
38 #include "packet.h"
39 #include "uidswap.h"
40 #include "compat.h"
41 #include "bufaux.h"
42 #include "cipher.h"
43 #include "kex.h"
44 #include "myproposal.h"
45 #include "key.h"
46 #include "sshconnect.h"
47 #include "authfile.h"
48 #include "cli.h"
49 #include "dispatch.h"
50 #include "authfd.h"
51 #include "log.h"
52 #include "readconf.h"
53 #include "readpass.h"
54
55 void ssh_dh1_client(Kex *, char *, struct sockaddr *, Buffer *, Buffer *);
56 void ssh_dhgex_client(Kex *, char *, struct sockaddr *, Buffer *, Buffer *);
57
58 /* import */
59 extern char *client_version_string;
60 extern char *server_version_string;
61 extern Options options;
62
63 /*
64  * SSH2 key exchange
65  */
66
67 u_char *session_id2 = NULL;
68 int session_id2_len = 0;
69
70 void
71 ssh_kex2(char *host, struct sockaddr *hostaddr)
72 {
73         int i, plen;
74         Kex *kex;
75         Buffer *client_kexinit, *server_kexinit;
76         char *sprop[PROPOSAL_MAX];
77
78         if (options.ciphers == (char *)-1) {
79                 log("No valid ciphers for protocol version 2 given, using defaults.");
80                 options.ciphers = NULL;
81         }
82         if (options.ciphers != NULL) {
83                 myproposal[PROPOSAL_ENC_ALGS_CTOS] =
84                 myproposal[PROPOSAL_ENC_ALGS_STOC] = options.ciphers;
85         }
86         if (options.compression) {
87                 myproposal[PROPOSAL_COMP_ALGS_CTOS] =
88                 myproposal[PROPOSAL_COMP_ALGS_STOC] = "zlib";
89         } else {
90                 myproposal[PROPOSAL_COMP_ALGS_CTOS] =
91                 myproposal[PROPOSAL_COMP_ALGS_STOC] = "none";
92         }
93         if (options.macs != NULL) {
94                 myproposal[PROPOSAL_MAC_ALGS_CTOS] =
95                 myproposal[PROPOSAL_MAC_ALGS_STOC] = options.macs;
96         }
97
98         /* buffers with raw kexinit messages */
99         server_kexinit = xmalloc(sizeof(*server_kexinit));
100         buffer_init(server_kexinit);
101         client_kexinit = kex_init(myproposal);
102
103         /* algorithm negotiation */
104         kex_exchange_kexinit(client_kexinit, server_kexinit, sprop);
105         kex = kex_choose_conf(myproposal, sprop, 0);
106         for (i = 0; i < PROPOSAL_MAX; i++)
107                 xfree(sprop[i]);
108
109         /* server authentication and session key agreement */
110         switch(kex->kex_type) {
111         case DH_GRP1_SHA1:
112                 ssh_dh1_client(kex, host, hostaddr,
113                                client_kexinit, server_kexinit);
114                 break;
115         case DH_GEX_SHA1:
116                 ssh_dhgex_client(kex, host, hostaddr, client_kexinit,
117                                  server_kexinit);
118                 break;
119         default:
120                 fatal("Unsupported key exchange %d", kex->kex_type);
121         }
122
123         buffer_free(client_kexinit);
124         buffer_free(server_kexinit);
125         xfree(client_kexinit);
126         xfree(server_kexinit);
127
128         debug("Wait SSH2_MSG_NEWKEYS.");
129         packet_read_expect(&plen, SSH2_MSG_NEWKEYS);
130         packet_done();
131         debug("GOT SSH2_MSG_NEWKEYS.");
132
133         debug("send SSH2_MSG_NEWKEYS.");
134         packet_start(SSH2_MSG_NEWKEYS);
135         packet_send();
136         packet_write_wait();
137         debug("done: send SSH2_MSG_NEWKEYS.");
138
139 #ifdef DEBUG_KEXDH
140         /* send 1st encrypted/maced/compressed message */
141         packet_start(SSH2_MSG_IGNORE);
142         packet_put_cstring("markus");
143         packet_send();
144         packet_write_wait();
145 #endif
146         debug("done: KEX2.");
147 }
148
149 /* diffie-hellman-group1-sha1 */
150
151 void
152 ssh_dh1_client(Kex *kex, char *host, struct sockaddr *hostaddr,
153                Buffer *client_kexinit, Buffer *server_kexinit)
154 {
155 #ifdef DEBUG_KEXDH
156         int i;
157 #endif
158         int plen, dlen;
159         u_int klen, kout;
160         char *signature = NULL;
161         u_int slen;
162         char *server_host_key_blob = NULL;
163         Key *server_host_key;
164         u_int sbloblen;
165         DH *dh;
166         BIGNUM *dh_server_pub = 0;
167         BIGNUM *shared_secret = 0;
168         u_char *kbuf;
169         u_char *hash;
170
171         debug("Sending SSH2_MSG_KEXDH_INIT.");
172         /* generate and send 'e', client DH public key */
173         dh = dh_new_group1();
174         dh_gen_key(dh, kex->we_need * 8);
175         packet_start(SSH2_MSG_KEXDH_INIT);
176         packet_put_bignum2(dh->pub_key);
177         packet_send();
178         packet_write_wait();
179
180 #ifdef DEBUG_KEXDH
181         fprintf(stderr, "\np= ");
182         BN_print_fp(stderr, dh->p);
183         fprintf(stderr, "\ng= ");
184         BN_print_fp(stderr, dh->g);
185         fprintf(stderr, "\npub= ");
186         BN_print_fp(stderr, dh->pub_key);
187         fprintf(stderr, "\n");
188         DHparams_print_fp(stderr, dh);
189 #endif
190
191         debug("Wait SSH2_MSG_KEXDH_REPLY.");
192
193         packet_read_expect(&plen, SSH2_MSG_KEXDH_REPLY);
194
195         debug("Got SSH2_MSG_KEXDH_REPLY.");
196
197         /* key, cert */
198         server_host_key_blob = packet_get_string(&sbloblen);
199         server_host_key = key_from_blob(server_host_key_blob, sbloblen);
200         if (server_host_key == NULL)
201                 fatal("cannot decode server_host_key_blob");
202
203         check_host_key(host, hostaddr, server_host_key,
204                        options.user_hostfile2, options.system_hostfile2);
205
206         /* DH paramter f, server public DH key */
207         dh_server_pub = BN_new();
208         if (dh_server_pub == NULL)
209                 fatal("dh_server_pub == NULL");
210         packet_get_bignum2(dh_server_pub, &dlen);
211
212 #ifdef DEBUG_KEXDH
213         fprintf(stderr, "\ndh_server_pub= ");
214         BN_print_fp(stderr, dh_server_pub);
215         fprintf(stderr, "\n");
216         debug("bits %d", BN_num_bits(dh_server_pub));
217 #endif
218
219         /* signed H */
220         signature = packet_get_string(&slen);
221         packet_done();
222
223         if (!dh_pub_is_valid(dh, dh_server_pub))
224                 packet_disconnect("bad server public DH value");
225
226         klen = DH_size(dh);
227         kbuf = xmalloc(klen);
228         kout = DH_compute_key(kbuf, dh_server_pub, dh);
229 #ifdef DEBUG_KEXDH
230         debug("shared secret: len %d/%d", klen, kout);
231         fprintf(stderr, "shared secret == ");
232         for (i = 0; i< kout; i++)
233                 fprintf(stderr, "%02x", (kbuf[i])&0xff);
234         fprintf(stderr, "\n");
235 #endif
236         shared_secret = BN_new();
237
238         BN_bin2bn(kbuf, kout, shared_secret);
239         memset(kbuf, 0, klen);
240         xfree(kbuf);
241
242         /* calc and verify H */
243         hash = kex_hash(
244             client_version_string,
245             server_version_string,
246             buffer_ptr(client_kexinit), buffer_len(client_kexinit),
247             buffer_ptr(server_kexinit), buffer_len(server_kexinit),
248             server_host_key_blob, sbloblen,
249             dh->pub_key,
250             dh_server_pub,
251             shared_secret
252         );
253         xfree(server_host_key_blob);
254         DH_free(dh);
255         BN_free(dh_server_pub);
256 #ifdef DEBUG_KEXDH
257         fprintf(stderr, "hash == ");
258         for (i = 0; i< 20; i++)
259                 fprintf(stderr, "%02x", (hash[i])&0xff);
260         fprintf(stderr, "\n");
261 #endif
262         if (key_verify(server_host_key, (u_char *)signature, slen, hash, 20) != 1)
263                 fatal("key_verify failed for server_host_key");
264         key_free(server_host_key);
265         xfree(signature);
266
267         kex_derive_keys(kex, hash, shared_secret);
268         BN_clear_free(shared_secret);
269         packet_set_kex(kex);
270
271         /* save session id */
272         session_id2_len = 20;
273         session_id2 = xmalloc(session_id2_len);
274         memcpy(session_id2, hash, session_id2_len);
275 }
276
277 /* diffie-hellman-group-exchange-sha1 */
278
279 /*
280  * Estimates the group order for a Diffie-Hellman group that has an
281  * attack complexity approximately the same as O(2**bits).  Estimate
282  * with:  O(exp(1.9223 * (ln q)^(1/3) (ln ln q)^(2/3)))
283  */
284
285 int
286 dh_estimate(int bits)
287 {
288
289         if (bits < 64)
290                 return (512);   /* O(2**63) */
291         if (bits < 128)
292                 return (1024);  /* O(2**86) */
293         if (bits < 192)
294                 return (2048);  /* O(2**116) */
295         return (4096);          /* O(2**156) */
296 }
297
298 void
299 ssh_dhgex_client(Kex *kex, char *host, struct sockaddr *hostaddr,
300                  Buffer *client_kexinit, Buffer *server_kexinit)
301 {
302 #ifdef DEBUG_KEXDH
303         int i;
304 #endif
305         int plen, dlen;
306         u_int klen, kout;
307         char *signature = NULL;
308         u_int slen, nbits;
309         char *server_host_key_blob = NULL;
310         Key *server_host_key;
311         u_int sbloblen;
312         DH *dh;
313         BIGNUM *dh_server_pub = 0;
314         BIGNUM *shared_secret = 0;
315         BIGNUM *p = 0, *g = 0;
316         u_char *kbuf;
317         u_char *hash;
318
319         nbits = dh_estimate(kex->we_need * 8);
320
321         debug("Sending SSH2_MSG_KEX_DH_GEX_REQUEST.");
322         packet_start(SSH2_MSG_KEX_DH_GEX_REQUEST);
323         packet_put_int(nbits);
324         packet_send();
325         packet_write_wait();
326
327 #ifdef DEBUG_KEXDH
328         fprintf(stderr, "\nnbits = %d", nbits);
329 #endif
330
331         debug("Wait SSH2_MSG_KEX_DH_GEX_GROUP.");
332
333         packet_read_expect(&plen, SSH2_MSG_KEX_DH_GEX_GROUP);
334
335         debug("Got SSH2_MSG_KEX_DH_GEX_GROUP.");
336
337         if ((p = BN_new()) == NULL)
338                 fatal("BN_new");
339         packet_get_bignum2(p, &dlen);
340         if ((g = BN_new()) == NULL)
341                 fatal("BN_new");
342         packet_get_bignum2(g, &dlen);
343         dh = dh_new_group(g, p);
344
345         dh_gen_key(dh, kex->we_need * 8);
346
347 #ifdef DEBUG_KEXDH
348         fprintf(stderr, "\np= ");
349         BN_print_fp(stderr, dh->p);
350         fprintf(stderr, "\ng= ");
351         BN_print_fp(stderr, dh->g);
352         fprintf(stderr, "\npub= ");
353         BN_print_fp(stderr, dh->pub_key);
354         fprintf(stderr, "\n");
355         DHparams_print_fp(stderr, dh);
356 #endif
357
358         debug("Sending SSH2_MSG_KEX_DH_GEX_INIT.");
359         /* generate and send 'e', client DH public key */
360         packet_start(SSH2_MSG_KEX_DH_GEX_INIT);
361         packet_put_bignum2(dh->pub_key);
362         packet_send();
363         packet_write_wait();
364
365         debug("Wait SSH2_MSG_KEX_DH_GEX_REPLY.");
366
367         packet_read_expect(&plen, SSH2_MSG_KEX_DH_GEX_REPLY);
368
369         debug("Got SSH2_MSG_KEXDH_REPLY.");
370
371         /* key, cert */
372         server_host_key_blob = packet_get_string(&sbloblen);
373         server_host_key = key_from_blob(server_host_key_blob, sbloblen);
374         if (server_host_key == NULL)
375                 fatal("cannot decode server_host_key_blob");
376
377         check_host_key(host, hostaddr, server_host_key,
378                        options.user_hostfile2, options.system_hostfile2);
379
380         /* DH paramter f, server public DH key */
381         dh_server_pub = BN_new();
382         if (dh_server_pub == NULL)
383                 fatal("dh_server_pub == NULL");
384         packet_get_bignum2(dh_server_pub, &dlen);
385
386 #ifdef DEBUG_KEXDH
387         fprintf(stderr, "\ndh_server_pub= ");
388         BN_print_fp(stderr, dh_server_pub);
389         fprintf(stderr, "\n");
390         debug("bits %d", BN_num_bits(dh_server_pub));
391 #endif
392
393         /* signed H */
394         signature = packet_get_string(&slen);
395         packet_done();
396
397         if (!dh_pub_is_valid(dh, dh_server_pub))
398                 packet_disconnect("bad server public DH value");
399
400         klen = DH_size(dh);
401         kbuf = xmalloc(klen);
402         kout = DH_compute_key(kbuf, dh_server_pub, dh);
403 #ifdef DEBUG_KEXDH
404         debug("shared secret: len %d/%d", klen, kout);
405         fprintf(stderr, "shared secret == ");
406         for (i = 0; i< kout; i++)
407                 fprintf(stderr, "%02x", (kbuf[i])&0xff);
408         fprintf(stderr, "\n");
409 #endif
410         shared_secret = BN_new();
411
412         BN_bin2bn(kbuf, kout, shared_secret);
413         memset(kbuf, 0, klen);
414         xfree(kbuf);
415
416         /* calc and verify H */
417         hash = kex_hash_gex(
418             client_version_string,
419             server_version_string,
420             buffer_ptr(client_kexinit), buffer_len(client_kexinit),
421             buffer_ptr(server_kexinit), buffer_len(server_kexinit),
422             server_host_key_blob, sbloblen,
423             nbits, dh->p, dh->g,
424             dh->pub_key,
425             dh_server_pub,
426             shared_secret
427         );
428         xfree(server_host_key_blob);
429         DH_free(dh);
430         BN_free(dh_server_pub);
431 #ifdef DEBUG_KEXDH
432         fprintf(stderr, "hash == ");
433         for (i = 0; i< 20; i++)
434                 fprintf(stderr, "%02x", (hash[i])&0xff);
435         fprintf(stderr, "\n");
436 #endif
437         if (key_verify(server_host_key, (u_char *)signature, slen, hash, 20) != 1)
438                 fatal("key_verify failed for server_host_key");
439         key_free(server_host_key);
440         xfree(signature);
441
442         kex_derive_keys(kex, hash, shared_secret);
443         BN_clear_free(shared_secret);
444         packet_set_kex(kex);
445
446         /* save session id */
447         session_id2_len = 20;
448         session_id2 = xmalloc(session_id2_len);
449         memcpy(session_id2, hash, session_id2_len);
450 }
451
452 /*
453  * Authenticate user
454  */
455
456 typedef struct Authctxt Authctxt;
457 typedef struct Authmethod Authmethod;
458
459 typedef int sign_cb_fn(
460     Authctxt *authctxt, Key *key,
461     u_char **sigp, int *lenp, u_char *data, int datalen);
462
463 struct Authctxt {
464         const char *server_user;
465         const char *host;
466         const char *service;
467         AuthenticationConnection *agent;
468         Authmethod *method;
469         int success;
470         char *authlist;
471         Key *last_key;
472         sign_cb_fn *last_key_sign;
473         int last_key_hint;
474 };
475 struct Authmethod {
476         char    *name;          /* string to compare against server's list */
477         int     (*userauth)(Authctxt *authctxt);
478         int     *enabled;       /* flag in option struct that enables method */
479         int     *batch_flag;    /* flag in option struct that disables method */
480 };
481
482 void    input_userauth_success(int type, int plen, void *ctxt);
483 void    input_userauth_failure(int type, int plen, void *ctxt);
484 void    input_userauth_banner(int type, int plen, void *ctxt);
485 void    input_userauth_error(int type, int plen, void *ctxt);
486 void    input_userauth_info_req(int type, int plen, void *ctxt);
487 void    input_userauth_pk_ok(int type, int plen, void *ctxt);
488
489 int     userauth_none(Authctxt *authctxt);
490 int     userauth_pubkey(Authctxt *authctxt);
491 int     userauth_passwd(Authctxt *authctxt);
492 int     userauth_kbdint(Authctxt *authctxt);
493
494 void    userauth(Authctxt *authctxt, char *authlist);
495
496 int
497 sign_and_send_pubkey(Authctxt *authctxt, Key *k,
498     sign_cb_fn *sign_callback);
499 void    clear_auth_state(Authctxt *authctxt);
500
501 void    authmethod_clear(void);
502 Authmethod *authmethod_get(char *authlist);
503 Authmethod *authmethod_lookup(const char *name);
504
505 Authmethod authmethods[] = {
506         {"publickey",
507                 userauth_pubkey,
508                 &options.pubkey_authentication,
509                 NULL},
510         {"password",
511                 userauth_passwd,
512                 &options.password_authentication,
513                 &options.batch_mode},
514         {"keyboard-interactive",
515                 userauth_kbdint,
516                 &options.kbd_interactive_authentication,
517                 &options.batch_mode},
518         {"none",
519                 userauth_none,
520                 NULL,
521                 NULL},
522         {NULL, NULL, NULL, NULL}
523 };
524
525 void
526 ssh_userauth2(const char *server_user, char *host)
527 {
528         Authctxt authctxt;
529         int type;
530         int plen;
531
532         if (options.challenge_reponse_authentication)
533                 options.kbd_interactive_authentication = 1;
534
535         debug("send SSH2_MSG_SERVICE_REQUEST");
536         packet_start(SSH2_MSG_SERVICE_REQUEST);
537         packet_put_cstring("ssh-userauth");
538         packet_send();
539         packet_write_wait();
540         type = packet_read(&plen);
541         if (type != SSH2_MSG_SERVICE_ACCEPT) {
542                 fatal("denied SSH2_MSG_SERVICE_ACCEPT: %d", type);
543         }
544         if (packet_remaining() > 0) {
545                 char *reply = packet_get_string(&plen);
546                 debug("service_accept: %s", reply);
547                 xfree(reply);
548         } else {
549                 debug("buggy server: service_accept w/o service");
550         }
551         packet_done();
552         debug("got SSH2_MSG_SERVICE_ACCEPT");
553
554         /* setup authentication context */
555         authctxt.agent = ssh_get_authentication_connection();
556         authctxt.server_user = server_user;
557         authctxt.host = host;
558         authctxt.service = "ssh-connection";            /* service name */
559         authctxt.success = 0;
560         authctxt.method = authmethod_lookup("none");
561         authctxt.authlist = NULL;
562         if (authctxt.method == NULL)
563                 fatal("ssh_userauth2: internal error: cannot send userauth none request");
564         authmethod_clear();
565
566         /* initial userauth request */
567         userauth_none(&authctxt);
568
569         dispatch_init(&input_userauth_error);
570         dispatch_set(SSH2_MSG_USERAUTH_SUCCESS, &input_userauth_success);
571         dispatch_set(SSH2_MSG_USERAUTH_FAILURE, &input_userauth_failure);
572         dispatch_set(SSH2_MSG_USERAUTH_BANNER, &input_userauth_banner);
573         dispatch_run(DISPATCH_BLOCK, &authctxt.success, &authctxt);     /* loop until success */
574
575         if (authctxt.agent != NULL)
576                 ssh_close_authentication_connection(authctxt.agent);
577
578         debug("ssh-userauth2 successful: method %s", authctxt.method->name);
579 }
580 void
581 userauth(Authctxt *authctxt, char *authlist)
582 {
583         if (authlist == NULL) {
584                 authlist = authctxt->authlist;
585         } else {
586                 if (authctxt->authlist)
587                         xfree(authctxt->authlist);
588                 authctxt->authlist = authlist;
589         }
590         for (;;) {
591                 Authmethod *method = authmethod_get(authlist);
592                 if (method == NULL)
593                         fatal("Permission denied (%s).", authlist);
594                 authctxt->method = method;
595                 if (method->userauth(authctxt) != 0) {
596                         debug2("we sent a %s packet, wait for reply", method->name);
597                         break;
598                 } else {
599                         debug2("we did not send a packet, disable method");
600                         method->enabled = NULL;
601                 }
602         }
603 }
604 void
605 input_userauth_error(int type, int plen, void *ctxt)
606 {
607         fatal("input_userauth_error: bad message during authentication: "
608            "type %d", type);
609 }
610 void
611 input_userauth_banner(int type, int plen, void *ctxt)
612 {
613         char *msg, *lang;
614         debug3("input_userauth_banner");
615         msg = packet_get_string(NULL);
616         lang = packet_get_string(NULL);
617         fprintf(stderr, "%s", msg);
618         xfree(msg);
619         xfree(lang);
620 }
621 void
622 input_userauth_success(int type, int plen, void *ctxt)
623 {
624         Authctxt *authctxt = ctxt;
625         if (authctxt == NULL)
626                 fatal("input_userauth_success: no authentication context");
627         if (authctxt->authlist)
628                 xfree(authctxt->authlist);
629         clear_auth_state(authctxt);
630         authctxt->success = 1;                  /* break out */
631 }
632 void
633 input_userauth_failure(int type, int plen, void *ctxt)
634 {
635         Authctxt *authctxt = ctxt;
636         char *authlist = NULL;
637         int partial;
638
639         if (authctxt == NULL)
640                 fatal("input_userauth_failure: no authentication context");
641
642         authlist = packet_get_string(NULL);
643         partial = packet_get_char();
644         packet_done();
645
646         if (partial != 0)
647                 log("Authenticated with partial success.");
648         debug("authentications that can continue: %s", authlist);
649
650         clear_auth_state(authctxt);
651         userauth(authctxt, authlist);
652 }
653 void
654 input_userauth_pk_ok(int type, int plen, void *ctxt)
655 {
656         Authctxt *authctxt = ctxt;
657         Key *key = NULL;
658         Buffer b;
659         int alen, blen, pktype, sent = 0;
660         char *pkalg, *pkblob;
661
662         if (authctxt == NULL)
663                 fatal("input_userauth_pk_ok: no authentication context");
664         if (datafellows & SSH_BUG_PKOK) {
665                 /* this is similar to SSH_BUG_PKAUTH */
666                 debug2("input_userauth_pk_ok: SSH_BUG_PKOK");
667                 pkblob = packet_get_string(&blen);
668                 buffer_init(&b);
669                 buffer_append(&b, pkblob, blen);
670                 pkalg = buffer_get_string(&b, &alen);
671                 buffer_free(&b);
672         } else {
673                 pkalg = packet_get_string(&alen);
674                 pkblob = packet_get_string(&blen);
675         }
676         packet_done();
677
678         debug("input_userauth_pk_ok: pkalg %s blen %d lastkey %p hint %d",
679             pkalg, blen, authctxt->last_key, authctxt->last_key_hint);
680
681         do {
682                 if (authctxt->last_key == NULL ||
683                     authctxt->last_key_sign == NULL) {
684                         debug("no last key or no sign cb");
685                         break;
686                 }
687                 debug2("last_key %s", key_fingerprint(authctxt->last_key));
688                 if ((pktype = key_type_from_name(pkalg)) == KEY_UNSPEC) {
689                         debug("unknown pkalg %s", pkalg);
690                         break;
691                 }
692                 if ((key = key_from_blob(pkblob, blen)) == NULL) {
693                         debug("no key from blob. pkalg %s", pkalg);
694                         break;
695                 }
696                 debug2("input_userauth_pk_ok: fp %s", key_fingerprint(key));
697                 if (!key_equal(key, authctxt->last_key)) {
698                         debug("key != last_key");
699                         break;
700                 }
701                 sent = sign_and_send_pubkey(authctxt, key,
702                    authctxt->last_key_sign);
703         } while(0);
704
705         if (key != NULL)
706                 key_free(key);
707         xfree(pkalg);
708         xfree(pkblob);
709
710         /* unregister */
711         clear_auth_state(authctxt);
712         dispatch_set(SSH2_MSG_USERAUTH_PK_OK, NULL);
713
714         /* try another method if we did not send a packet*/
715         if (sent == 0)
716                 userauth(authctxt, NULL);
717
718 }
719
720 int
721 userauth_none(Authctxt *authctxt)
722 {
723         /* initial userauth request */
724         packet_start(SSH2_MSG_USERAUTH_REQUEST);
725         packet_put_cstring(authctxt->server_user);
726         packet_put_cstring(authctxt->service);
727         packet_put_cstring(authctxt->method->name);
728         packet_send();
729         return 1;
730 }
731
732 int
733 userauth_passwd(Authctxt *authctxt)
734 {
735         static int attempt = 0;
736         char prompt[80];
737         char *password;
738
739         if (attempt++ >= options.number_of_password_prompts)
740                 return 0;
741
742         if(attempt != 1)
743                 error("Permission denied, please try again.");
744
745         snprintf(prompt, sizeof(prompt), "%.30s@%.128s's password: ",
746             authctxt->server_user, authctxt->host);
747         password = read_passphrase(prompt, 0);
748         packet_start(SSH2_MSG_USERAUTH_REQUEST);
749         packet_put_cstring(authctxt->server_user);
750         packet_put_cstring(authctxt->service);
751         packet_put_cstring(authctxt->method->name);
752         packet_put_char(0);
753         packet_put_cstring(password);
754         memset(password, 0, strlen(password));
755         xfree(password);
756         packet_inject_ignore(64);
757         packet_send();
758         return 1;
759 }
760
761 void
762 clear_auth_state(Authctxt *authctxt)
763 {
764         /* XXX clear authentication state */
765         if (authctxt->last_key != NULL && authctxt->last_key_hint == -1) {
766                 debug3("clear_auth_state: key_free %p", authctxt->last_key);
767                 key_free(authctxt->last_key);
768         }
769         authctxt->last_key = NULL;
770         authctxt->last_key_hint = -2;
771         authctxt->last_key_sign = NULL;
772 }
773
774 int
775 sign_and_send_pubkey(Authctxt *authctxt, Key *k, sign_cb_fn *sign_callback)
776 {
777         Buffer b;
778         u_char *blob, *signature;
779         int bloblen, slen;
780         int skip = 0;
781         int ret = -1;
782         int have_sig = 1;
783
784         debug3("sign_and_send_pubkey");
785
786         if (key_to_blob(k, &blob, &bloblen) == 0) {
787                 /* we cannot handle this key */
788                 debug3("sign_and_send_pubkey: cannot handle key");
789                 return 0;
790         }
791         /* data to be signed */
792         buffer_init(&b);
793         if (datafellows & SSH_OLD_SESSIONID) {
794                 buffer_append(&b, session_id2, session_id2_len);
795                 skip = session_id2_len;
796         } else {
797                 buffer_put_string(&b, session_id2, session_id2_len);
798                 skip = buffer_len(&b);
799         }
800         buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);
801         buffer_put_cstring(&b, authctxt->server_user);
802         buffer_put_cstring(&b,
803             datafellows & SSH_BUG_PKSERVICE ?
804             "ssh-userauth" :
805             authctxt->service);
806         if (datafellows & SSH_BUG_PKAUTH) {
807                 buffer_put_char(&b, have_sig);
808         } else {
809                 buffer_put_cstring(&b, authctxt->method->name);
810                 buffer_put_char(&b, have_sig);
811                 buffer_put_cstring(&b, key_ssh_name(k));
812         }
813         buffer_put_string(&b, blob, bloblen);
814
815         /* generate signature */
816         ret = (*sign_callback)(authctxt, k, &signature, &slen,
817             buffer_ptr(&b), buffer_len(&b));
818         if (ret == -1) {
819                 xfree(blob);
820                 buffer_free(&b);
821                 return 0;
822         }
823 #ifdef DEBUG_PK
824         buffer_dump(&b);
825 #endif
826         if (datafellows & SSH_BUG_PKSERVICE) {
827                 buffer_clear(&b);
828                 buffer_append(&b, session_id2, session_id2_len);
829                 skip = session_id2_len;
830                 buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);
831                 buffer_put_cstring(&b, authctxt->server_user);
832                 buffer_put_cstring(&b, authctxt->service);
833                 buffer_put_cstring(&b, authctxt->method->name);
834                 buffer_put_char(&b, have_sig);
835                 if (!(datafellows & SSH_BUG_PKAUTH))
836                         buffer_put_cstring(&b, key_ssh_name(k));
837                 buffer_put_string(&b, blob, bloblen);
838         }
839         xfree(blob);
840
841         /* append signature */
842         buffer_put_string(&b, signature, slen);
843         xfree(signature);
844
845         /* skip session id and packet type */
846         if (buffer_len(&b) < skip + 1)
847                 fatal("userauth_pubkey: internal error");
848         buffer_consume(&b, skip + 1);
849
850         /* put remaining data from buffer into packet */
851         packet_start(SSH2_MSG_USERAUTH_REQUEST);
852         packet_put_raw(buffer_ptr(&b), buffer_len(&b));
853         buffer_free(&b);
854         packet_send();
855
856         return 1;
857 }
858
859 int
860 send_pubkey_test(Authctxt *authctxt, Key *k, sign_cb_fn *sign_callback,
861     int hint)
862 {
863         u_char *blob;
864         int bloblen, have_sig = 0;
865
866         debug3("send_pubkey_test");
867
868         if (key_to_blob(k, &blob, &bloblen) == 0) {
869                 /* we cannot handle this key */
870                 debug3("send_pubkey_test: cannot handle key");
871                 return 0;
872         }
873         /* register callback for USERAUTH_PK_OK message */
874         authctxt->last_key_sign = sign_callback;
875         authctxt->last_key_hint = hint;
876         authctxt->last_key = k;
877         dispatch_set(SSH2_MSG_USERAUTH_PK_OK, &input_userauth_pk_ok);
878
879         packet_start(SSH2_MSG_USERAUTH_REQUEST);
880         packet_put_cstring(authctxt->server_user);
881         packet_put_cstring(authctxt->service);
882         packet_put_cstring(authctxt->method->name);
883         packet_put_char(have_sig);
884         if (!(datafellows & SSH_BUG_PKAUTH))
885                 packet_put_cstring(key_ssh_name(k));
886         packet_put_string(blob, bloblen);
887         xfree(blob);
888         packet_send();
889         return 1;
890 }
891
892 Key *
893 load_identity_file(char *filename)
894 {
895         Key *private;
896         char prompt[300], *passphrase;
897         int success = 0, quit, i;
898         struct stat st;
899
900         if (stat(filename, &st) < 0) {
901                 debug3("no such identity: %s", filename);
902                 return NULL;
903         }
904         private = key_new(KEY_UNSPEC);
905         if (!load_private_key(filename, "", private, NULL)) {
906                 if (options.batch_mode) {
907                         key_free(private);
908                         return NULL;
909                 }
910                 snprintf(prompt, sizeof prompt,
911                      "Enter passphrase for key '%.100s': ", filename);
912                 for (i = 0; i < options.number_of_password_prompts; i++) {
913                         passphrase = read_passphrase(prompt, 0);
914                         if (strcmp(passphrase, "") != 0) {
915                                 success = load_private_key(filename,
916                                     passphrase, private, NULL);
917                                 quit = 0;
918                         } else {
919                                 debug2("no passphrase given, try next key");
920                                 quit = 1;
921                         }
922                         memset(passphrase, 0, strlen(passphrase));
923                         xfree(passphrase);
924                         if (success || quit)
925                                 break;
926                         debug2("bad passphrase given, try again...");
927                 }
928                 if (!success) {
929                         key_free(private);
930                         return NULL;
931                 }
932         }
933         return private;
934 }
935
936 int
937 identity_sign_cb(Authctxt *authctxt, Key *key, u_char **sigp, int *lenp,
938     u_char *data, int datalen)
939 {
940         Key *private;
941         int idx, ret;
942
943         idx = authctxt->last_key_hint;
944         if (idx < 0)
945                 return -1;
946         private = load_identity_file(options.identity_files[idx]);
947         if (private == NULL)
948                 return -1;
949         ret = key_sign(private, sigp, lenp, data, datalen);
950         key_free(private);
951         return ret;
952 }
953
954 int agent_sign_cb(Authctxt *authctxt, Key *key, u_char **sigp, int *lenp,
955     u_char *data, int datalen)
956 {
957         return ssh_agent_sign(authctxt->agent, key, sigp, lenp, data, datalen);
958 }
959
960 int key_sign_cb(Authctxt *authctxt, Key *key, u_char **sigp, int *lenp,
961     u_char *data, int datalen)
962 {
963         return key_sign(key, sigp, lenp, data, datalen);
964 }
965
966 int
967 userauth_pubkey_agent(Authctxt *authctxt)
968 {
969         static int called = 0;
970         int ret = 0;
971         char *comment;
972         Key *k;
973
974         if (called == 0) {
975                 if (ssh_get_num_identities(authctxt->agent, 2) == 0)
976                         debug2("userauth_pubkey_agent: no keys at all");
977                 called = 1;
978         }
979         k = ssh_get_next_identity(authctxt->agent, &comment, 2);
980         if (k == NULL) {
981                 debug2("userauth_pubkey_agent: no more keys");
982         } else {
983                 debug("userauth_pubkey_agent: testing agent key %s", comment);
984                 xfree(comment);
985                 ret = send_pubkey_test(authctxt, k, agent_sign_cb, -1);
986                 if (ret == 0)
987                         key_free(k);
988         }
989         if (ret == 0)
990                 debug2("userauth_pubkey_agent: no message sent");
991         return ret;
992 }
993
994 int
995 userauth_pubkey(Authctxt *authctxt)
996 {
997         static int idx = 0;
998         int sent = 0;
999         Key *key;
1000         char *filename;
1001
1002         if (authctxt->agent != NULL) {
1003                 do {
1004                         sent = userauth_pubkey_agent(authctxt);
1005                 } while(!sent && authctxt->agent->howmany > 0);
1006         }
1007         while (!sent && idx < options.num_identity_files) {
1008                 key = options.identity_keys[idx];
1009                 filename = options.identity_files[idx];
1010                 if (key == NULL) {
1011                         debug("try privkey: %s", filename);
1012                         key = load_identity_file(filename);
1013                         if (key != NULL) {
1014                                 sent = sign_and_send_pubkey(authctxt, key,
1015                                     key_sign_cb);
1016                                 key_free(key);
1017                         }
1018                 } else if (key->type != KEY_RSA1) {
1019                         debug("try pubkey: %s", filename);
1020                         sent = send_pubkey_test(authctxt, key,
1021                             identity_sign_cb, idx);
1022                 }
1023                 idx++;
1024         }
1025         return sent;
1026 }
1027
1028 /*
1029  * Send userauth request message specifying keyboard-interactive method.
1030  */
1031 int
1032 userauth_kbdint(Authctxt *authctxt)
1033 {
1034         static int attempt = 0;
1035
1036         if (attempt++ >= options.number_of_password_prompts)
1037                 return 0;
1038
1039         debug2("userauth_kbdint");
1040         packet_start(SSH2_MSG_USERAUTH_REQUEST);
1041         packet_put_cstring(authctxt->server_user);
1042         packet_put_cstring(authctxt->service);
1043         packet_put_cstring(authctxt->method->name);
1044         packet_put_cstring("");                                 /* lang */
1045         packet_put_cstring(options.kbd_interactive_devices ?
1046             options.kbd_interactive_devices : "");
1047         packet_send();
1048
1049         dispatch_set(SSH2_MSG_USERAUTH_INFO_REQUEST, &input_userauth_info_req);
1050         return 1;
1051 }
1052
1053 /*
1054  * parse INFO_REQUEST, prompt user and send INFO_RESPONSE
1055  */
1056 void
1057 input_userauth_info_req(int type, int plen, void *ctxt)
1058 {
1059         Authctxt *authctxt = ctxt;
1060         char *name, *inst, *lang, *prompt, *response;
1061         u_int num_prompts, i;
1062         int echo = 0;
1063
1064         debug2("input_userauth_info_req");
1065
1066         if (authctxt == NULL)
1067                 fatal("input_userauth_info_req: no authentication context");
1068
1069         name = packet_get_string(NULL);
1070         inst = packet_get_string(NULL);
1071         lang = packet_get_string(NULL);
1072         if (strlen(name) > 0)
1073                 cli_mesg(name);
1074         if (strlen(inst) > 0)
1075                 cli_mesg(inst);
1076         xfree(name);
1077         xfree(inst);
1078         xfree(lang);
1079
1080         num_prompts = packet_get_int();
1081         /*
1082          * Begin to build info response packet based on prompts requested.
1083          * We commit to providing the correct number of responses, so if
1084          * further on we run into a problem that prevents this, we have to
1085          * be sure and clean this up and send a correct error response.
1086          */
1087         packet_start(SSH2_MSG_USERAUTH_INFO_RESPONSE);
1088         packet_put_int(num_prompts);
1089
1090         for (i = 0; i < num_prompts; i++) {
1091                 prompt = packet_get_string(NULL);
1092                 echo = packet_get_char();
1093
1094                 response = cli_prompt(prompt, echo);
1095
1096                 packet_put_cstring(response);
1097                 memset(response, 0, strlen(response));
1098                 xfree(response);
1099                 xfree(prompt);
1100         }
1101         packet_done(); /* done with parsing incoming message. */
1102
1103         packet_inject_ignore(64);
1104         packet_send();
1105 }
1106
1107 /* find auth method */
1108
1109 #define DELIM   ","
1110
1111 static char *def_authlist = "publickey,password";
1112 static char *authlist_current = NULL;    /* clean copy used for comparison */
1113 static char *authname_current = NULL;    /* last used auth method */
1114 static char *authlist_working = NULL;    /* copy that gets modified by strtok_r() */
1115 static char *authlist_state = NULL;      /* state variable for strtok_r() */
1116
1117 /*
1118  * Before starting to use a new authentication method list sent by the
1119  * server, reset internal variables.  This should also be called when
1120  * finished processing server list to free resources.
1121  */
1122 void
1123 authmethod_clear(void)
1124 {
1125         if (authlist_current != NULL) {
1126                 xfree(authlist_current);
1127                 authlist_current = NULL;
1128         }
1129         if (authlist_working != NULL) {
1130                 xfree(authlist_working);
1131                 authlist_working = NULL;
1132         }
1133         if (authname_current != NULL) {
1134                 xfree(authname_current);
1135                 authname_current = NULL;
1136         }
1137         if (authlist_state != NULL)
1138                 authlist_state = NULL;
1139         return;
1140 }
1141
1142 /*
1143  * given auth method name, if configurable options permit this method fill
1144  * in auth_ident field and return true, otherwise return false.
1145  */
1146 int
1147 authmethod_is_enabled(Authmethod *method)
1148 {
1149         if (method == NULL)
1150                 return 0;
1151         /* return false if options indicate this method is disabled */
1152         if  (method->enabled == NULL || *method->enabled == 0)
1153                 return 0;
1154         /* return false if batch mode is enabled but method needs interactive mode */
1155         if  (method->batch_flag != NULL && *method->batch_flag != 0)
1156                 return 0;
1157         return 1;
1158 }
1159
1160 Authmethod *
1161 authmethod_lookup(const char *name)
1162 {
1163         Authmethod *method = NULL;
1164         if (name != NULL)
1165                 for (method = authmethods; method->name != NULL; method++)
1166                         if (strcmp(name, method->name) == 0)
1167                                 return method;
1168         debug2("Unrecognized authentication method name: %s", name ? name : "NULL");
1169         return NULL;
1170 }
1171
1172 /*
1173  * Given the authentication method list sent by the server, return the
1174  * next method we should try.  If the server initially sends a nil list,
1175  * use a built-in default list.  If the server sends a nil list after
1176  * previously sending a valid list, continue using the list originally
1177  * sent.
1178  */
1179
1180 Authmethod *
1181 authmethod_get(char *authlist)
1182 {
1183         char *name = NULL, *authname_old;
1184         Authmethod *method = NULL;
1185
1186         /* Use a suitable default if we're passed a nil list.  */
1187         if (authlist == NULL || strlen(authlist) == 0)
1188                 authlist = def_authlist;
1189
1190         if (authlist_current == NULL || strcmp(authlist, authlist_current) != 0) {
1191                 /* start over if passed a different list */
1192                 debug3("start over, passed a different list");
1193                 authmethod_clear();
1194                 authlist_current = xstrdup(authlist);
1195                 authlist_working = xstrdup(authlist);
1196                 name = strtok_r(authlist_working, DELIM, &authlist_state);
1197         } else {
1198                 /*
1199                  * try to use previously used authentication method
1200                  * or continue to use previously passed list
1201                  */
1202                 name = (authname_current != NULL) ?
1203                     authname_current : strtok_r(NULL, DELIM, &authlist_state);
1204         }
1205
1206         while (name != NULL) {
1207                 debug3("authmethod_lookup %s", name);
1208                 method = authmethod_lookup(name);
1209                 if (method != NULL && authmethod_is_enabled(method)) {
1210                         debug3("authmethod_is_enabled %s", name);
1211                         break;
1212                 }
1213                 name = strtok_r(NULL, DELIM, &authlist_state);
1214                 method = NULL;
1215         }
1216
1217         authname_old = authname_current;
1218         if (method != NULL) {
1219                 debug("next auth method to try is %s", name);
1220                 authname_current = xstrdup(name);
1221         } else {
1222                 debug("no more auth methods to try");
1223                 authname_current = NULL;
1224         }
1225
1226         if (authname_old != NULL)
1227                 xfree(authname_old);
1228
1229         return (method);
1230 }
This page took 0.155869 seconds and 3 git commands to generate.