]> andersk Git - openssh.git/blob - sshconnect2.c
- (djm) Open Server 5 doesn't need BROKEN_SAVED_UIDS. Patch from Tim Rice
[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.48 2001/02/15 23:19:59 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);
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->enc[MODE_OUT].cipher->key_len * 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);
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 };
471 struct Authmethod {
472         char    *name;          /* string to compare against server's list */
473         int     (*userauth)(Authctxt *authctxt);
474         int     *enabled;       /* flag in option struct that enables method */
475         int     *batch_flag;    /* flag in option struct that disables method */
476 };
477
478 void    input_userauth_success(int type, int plen, void *ctxt);
479 void    input_userauth_failure(int type, int plen, void *ctxt);
480 void    input_userauth_banner(int type, int plen, void *ctxt);
481 void    input_userauth_error(int type, int plen, void *ctxt);
482 void    input_userauth_info_req(int type, int plen, void *ctxt);
483
484 int     userauth_none(Authctxt *authctxt);
485 int     userauth_pubkey(Authctxt *authctxt);
486 int     userauth_passwd(Authctxt *authctxt);
487 int     userauth_kbdint(Authctxt *authctxt);
488
489 void    authmethod_clear(void);
490 Authmethod *authmethod_get(char *authlist);
491 Authmethod *authmethod_lookup(const char *name);
492
493 Authmethod authmethods[] = {
494         {"publickey",
495                 userauth_pubkey,
496                 &options.pubkey_authentication,
497                 NULL},
498         {"password",
499                 userauth_passwd,
500                 &options.password_authentication,
501                 &options.batch_mode},
502         {"keyboard-interactive",
503                 userauth_kbdint,
504                 &options.kbd_interactive_authentication,
505                 &options.batch_mode},
506         {"none",
507                 userauth_none,
508                 NULL,
509                 NULL},
510         {NULL, NULL, NULL, NULL}
511 };
512
513 void
514 ssh_userauth2(const char *server_user, char *host)
515 {
516         Authctxt authctxt;
517         int type;
518         int plen;
519
520         if (options.challenge_reponse_authentication)
521                 options.kbd_interactive_authentication = 1;
522
523         debug("send SSH2_MSG_SERVICE_REQUEST");
524         packet_start(SSH2_MSG_SERVICE_REQUEST);
525         packet_put_cstring("ssh-userauth");
526         packet_send();
527         packet_write_wait();
528         type = packet_read(&plen);
529         if (type != SSH2_MSG_SERVICE_ACCEPT) {
530                 fatal("denied SSH2_MSG_SERVICE_ACCEPT: %d", type);
531         }
532         if (packet_remaining() > 0) {
533                 char *reply = packet_get_string(&plen);
534                 debug("service_accept: %s", reply);
535                 xfree(reply);
536         } else {
537                 debug("buggy server: service_accept w/o service");
538         }
539         packet_done();
540         debug("got SSH2_MSG_SERVICE_ACCEPT");
541
542         /* setup authentication context */
543         authctxt.agent = ssh_get_authentication_connection();
544         authctxt.server_user = server_user;
545         authctxt.host = host;
546         authctxt.service = "ssh-connection";            /* service name */
547         authctxt.success = 0;
548         authctxt.method = authmethod_lookup("none");
549         if (authctxt.method == NULL)
550                 fatal("ssh_userauth2: internal error: cannot send userauth none request");
551         authmethod_clear();
552
553         /* initial userauth request */
554         userauth_none(&authctxt);
555
556         dispatch_init(&input_userauth_error);
557         dispatch_set(SSH2_MSG_USERAUTH_SUCCESS, &input_userauth_success);
558         dispatch_set(SSH2_MSG_USERAUTH_FAILURE, &input_userauth_failure);
559         dispatch_set(SSH2_MSG_USERAUTH_BANNER, &input_userauth_banner);
560         dispatch_run(DISPATCH_BLOCK, &authctxt.success, &authctxt);     /* loop until success */
561
562         if (authctxt.agent != NULL)
563                 ssh_close_authentication_connection(authctxt.agent);
564
565         debug("ssh-userauth2 successful: method %s", authctxt.method->name);
566 }
567 void
568 input_userauth_error(int type, int plen, void *ctxt)
569 {
570         fatal("input_userauth_error: bad message during authentication: "
571            "type %d", type);
572 }
573 void
574 input_userauth_banner(int type, int plen, void *ctxt)
575 {
576         char *msg, *lang;
577         debug3("input_userauth_banner");
578         msg = packet_get_string(NULL);
579         lang = packet_get_string(NULL);
580         fprintf(stderr, "%s", msg);
581         xfree(msg);
582         xfree(lang);
583 }
584 void
585 input_userauth_success(int type, int plen, void *ctxt)
586 {
587         Authctxt *authctxt = ctxt;
588         if (authctxt == NULL)
589                 fatal("input_userauth_success: no authentication context");
590         authctxt->success = 1;                  /* break out */
591 }
592 void
593 input_userauth_failure(int type, int plen, void *ctxt)
594 {
595         Authmethod *method = NULL;
596         Authctxt *authctxt = ctxt;
597         char *authlist = NULL;
598         int partial;
599
600         if (authctxt == NULL)
601                 fatal("input_userauth_failure: no authentication context");
602
603         authlist = packet_get_string(NULL);
604         partial = packet_get_char();
605         packet_done();
606
607         if (partial != 0)
608                 log("Authenticated with partial success.");
609         debug("authentications that can continue: %s", authlist);
610
611         for (;;) {
612                 method = authmethod_get(authlist);
613                 if (method == NULL)
614                         fatal("Permission denied (%s).", authlist);
615                 authctxt->method = method;
616                 if (method->userauth(authctxt) != 0) {
617                         debug2("we sent a %s packet, wait for reply", method->name);
618                         break;
619                 } else {
620                         debug2("we did not send a packet, disable method");
621                         method->enabled = NULL;
622                 }
623         }
624         xfree(authlist);
625 }
626
627 int
628 userauth_none(Authctxt *authctxt)
629 {
630         /* initial userauth request */
631         packet_start(SSH2_MSG_USERAUTH_REQUEST);
632         packet_put_cstring(authctxt->server_user);
633         packet_put_cstring(authctxt->service);
634         packet_put_cstring(authctxt->method->name);
635         packet_send();
636         packet_write_wait();
637         return 1;
638 }
639
640 int
641 userauth_passwd(Authctxt *authctxt)
642 {
643         static int attempt = 0;
644         char prompt[80];
645         char *password;
646
647         if (attempt++ >= options.number_of_password_prompts)
648                 return 0;
649
650         if(attempt != 1)
651                 error("Permission denied, please try again.");
652
653         snprintf(prompt, sizeof(prompt), "%.30s@%.128s's password: ",
654             authctxt->server_user, authctxt->host);
655         password = read_passphrase(prompt, 0);
656         packet_start(SSH2_MSG_USERAUTH_REQUEST);
657         packet_put_cstring(authctxt->server_user);
658         packet_put_cstring(authctxt->service);
659         packet_put_cstring(authctxt->method->name);
660         packet_put_char(0);
661         ssh_put_password(password);
662         memset(password, 0, strlen(password));
663         xfree(password);
664         packet_send();
665         packet_write_wait();
666         return 1;
667 }
668
669 int
670 sign_and_send_pubkey(Authctxt *authctxt, Key *k, sign_cb_fn *sign_callback)
671 {
672         Buffer b;
673         u_char *blob, *signature;
674         int bloblen, slen;
675         int skip = 0;
676         int ret = -1;
677         int have_sig = 1;
678
679         debug3("sign_and_send_pubkey");
680         if (key_to_blob(k, &blob, &bloblen) == 0) {
681                 /* we cannot handle this key */
682                 debug3("sign_and_send_pubkey: cannot handle key");
683                 return 0;
684         }
685         /* data to be signed */
686         buffer_init(&b);
687         if (datafellows & SSH_OLD_SESSIONID) {
688                 buffer_append(&b, session_id2, session_id2_len);
689                 skip = session_id2_len;
690         } else {
691                 buffer_put_string(&b, session_id2, session_id2_len);
692                 skip = buffer_len(&b);
693         }
694         buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);
695         buffer_put_cstring(&b, authctxt->server_user);
696         buffer_put_cstring(&b,
697             datafellows & SSH_BUG_PKSERVICE ?
698             "ssh-userauth" :
699             authctxt->service);
700         if (datafellows & SSH_BUG_PKAUTH) {
701                 buffer_put_char(&b, have_sig);
702         } else {
703                 buffer_put_cstring(&b, authctxt->method->name);
704                 buffer_put_char(&b, have_sig);
705                 buffer_put_cstring(&b, key_ssh_name(k));
706         }
707         buffer_put_string(&b, blob, bloblen);
708
709         /* generate signature */
710         ret = (*sign_callback)(authctxt, k, &signature, &slen, buffer_ptr(&b), buffer_len(&b));
711         if (ret == -1) {
712                 xfree(blob);
713                 buffer_free(&b);
714                 return 0;
715         }
716 #ifdef DEBUG_PK
717         buffer_dump(&b);
718 #endif
719         if (datafellows & SSH_BUG_PKSERVICE) {
720                 buffer_clear(&b);
721                 buffer_append(&b, session_id2, session_id2_len);
722                 buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);
723                 buffer_put_cstring(&b, authctxt->server_user);
724                 buffer_put_cstring(&b, authctxt->service);
725                 buffer_put_cstring(&b, authctxt->method->name);
726                 buffer_put_char(&b, have_sig);
727                 if (!(datafellows & SSH_BUG_PKAUTH))
728                         buffer_put_cstring(&b, key_ssh_name(k));
729                 buffer_put_string(&b, blob, bloblen);
730         }
731         xfree(blob);
732         /* append signature */
733         buffer_put_string(&b, signature, slen);
734         xfree(signature);
735
736         /* skip session id and packet type */
737         if (buffer_len(&b) < skip + 1)
738                 fatal("userauth_pubkey: internal error");
739         buffer_consume(&b, skip + 1);
740
741         /* put remaining data from buffer into packet */
742         packet_start(SSH2_MSG_USERAUTH_REQUEST);
743         packet_put_raw(buffer_ptr(&b), buffer_len(&b));
744         buffer_free(&b);
745
746         /* send */
747         packet_send();
748         packet_write_wait();
749
750         return 1;
751 }
752
753 /* sign callback */
754 int key_sign_cb(Authctxt *authctxt, Key *key, u_char **sigp, int *lenp,
755     u_char *data, int datalen)
756 {
757         return key_sign(key, sigp, lenp, data, datalen);
758 }
759
760 int
761 userauth_pubkey_identity(Authctxt *authctxt, char *filename)
762 {
763         Key *k;
764         int i, ret, try_next, success = 0;
765         struct stat st;
766         char *passphrase;
767         char prompt[300];
768
769         if (stat(filename, &st) != 0) {
770                 debug("key does not exist: %s", filename);
771                 return 0;
772         }
773         debug("try pubkey: %s", filename);
774
775         k = key_new(KEY_UNSPEC);
776         if (!load_private_key(filename, "", k, NULL)) {
777                 if (options.batch_mode) {
778                         key_free(k);
779                         return 0;
780                 }
781                 snprintf(prompt, sizeof prompt,
782                      "Enter passphrase for key '%.100s': ", filename);
783                 for (i = 0; i < options.number_of_password_prompts; i++) {
784                         passphrase = read_passphrase(prompt, 0);
785                         if (strcmp(passphrase, "") != 0) {
786                                 success = load_private_key(filename, passphrase, k, NULL);
787                                 try_next = 0;
788                         } else {
789                                 debug2("no passphrase given, try next key");
790                                 try_next = 1;
791                         }
792                         memset(passphrase, 0, strlen(passphrase));
793                         xfree(passphrase);
794                         if (success || try_next)
795                                 break;
796                         debug2("bad passphrase given, try again...");
797                 }
798                 if (!success) {
799                         key_free(k);
800                         return 0;
801                 }
802         }
803         ret = sign_and_send_pubkey(authctxt, k, key_sign_cb);
804         key_free(k);
805         return ret;
806 }
807
808 /* sign callback */
809 int agent_sign_cb(Authctxt *authctxt, Key *key, u_char **sigp, int *lenp,
810     u_char *data, int datalen)
811 {
812         return ssh_agent_sign(authctxt->agent, key, sigp, lenp, data, datalen);
813 }
814
815 int
816 userauth_pubkey_agent(Authctxt *authctxt)
817 {
818         static int called = 0;
819         int ret = 0;
820         char *comment;
821         Key *k;
822
823         if (called == 0) {
824                 if (ssh_get_num_identities(authctxt->agent, 2) == 0)
825                         debug2("userauth_pubkey_agent: no keys at all");
826                 called = 1;
827         }
828         k = ssh_get_next_identity(authctxt->agent, &comment, 2);
829         if (k == NULL) {
830                 debug2("userauth_pubkey_agent: no more keys");
831         } else {
832                 debug("userauth_pubkey_agent: trying agent key %s", comment);
833                 xfree(comment);
834                 ret = sign_and_send_pubkey(authctxt, k, agent_sign_cb);
835                 key_free(k);
836         }
837         if (ret == 0)
838                 debug2("userauth_pubkey_agent: no message sent");
839         return ret;
840 }
841
842 int
843 userauth_pubkey(Authctxt *authctxt)
844 {
845         static int idx = 0;
846         int sent = 0;
847
848         if (authctxt->agent != NULL) {
849                 do {
850                         sent = userauth_pubkey_agent(authctxt);
851                 } while(!sent && authctxt->agent->howmany > 0);
852         }
853         while (!sent && idx < options.num_identity_files) {
854                 if (options.identity_files_type[idx] != KEY_RSA1)
855                         sent = userauth_pubkey_identity(authctxt,
856                             options.identity_files[idx]);
857                 idx++;
858         }
859         return sent;
860 }
861
862 /*
863  * Send userauth request message specifying keyboard-interactive method.
864  */
865 int
866 userauth_kbdint(Authctxt *authctxt)
867 {
868         static int attempt = 0;
869
870         if (attempt++ >= options.number_of_password_prompts)
871                 return 0;
872
873         debug2("userauth_kbdint");
874         packet_start(SSH2_MSG_USERAUTH_REQUEST);
875         packet_put_cstring(authctxt->server_user);
876         packet_put_cstring(authctxt->service);
877         packet_put_cstring(authctxt->method->name);
878         packet_put_cstring("");                                 /* lang */
879         packet_put_cstring(options.kbd_interactive_devices ?
880             options.kbd_interactive_devices : "");
881         packet_send();
882         packet_write_wait();
883
884         dispatch_set(SSH2_MSG_USERAUTH_INFO_REQUEST, &input_userauth_info_req);
885         return 1;
886 }
887
888 /*
889  * parse INFO_REQUEST, prompt user and send INFO_RESPONSE
890  */
891 void
892 input_userauth_info_req(int type, int plen, void *ctxt)
893 {
894         Authctxt *authctxt = ctxt;
895         char *name, *inst, *lang, *prompt, *response;
896         u_int num_prompts, i;
897         int echo = 0;
898
899         debug2("input_userauth_info_req");
900
901         if (authctxt == NULL)
902                 fatal("input_userauth_info_req: no authentication context");
903
904         name = packet_get_string(NULL);
905         inst = packet_get_string(NULL);
906         lang = packet_get_string(NULL);
907         if (strlen(name) > 0)
908                 cli_mesg(name);
909         if (strlen(inst) > 0)
910                 cli_mesg(inst);
911         xfree(name);
912         xfree(inst);
913         xfree(lang);
914
915         num_prompts = packet_get_int();
916         /*
917          * Begin to build info response packet based on prompts requested.
918          * We commit to providing the correct number of responses, so if
919          * further on we run into a problem that prevents this, we have to
920          * be sure and clean this up and send a correct error response.
921          */
922         packet_start(SSH2_MSG_USERAUTH_INFO_RESPONSE);
923         packet_put_int(num_prompts);
924
925         for (i = 0; i < num_prompts; i++) {
926                 prompt = packet_get_string(NULL);
927                 echo = packet_get_char();
928
929                 response = cli_prompt(prompt, echo);
930
931                 ssh_put_password(response);
932                 memset(response, 0, strlen(response));
933                 xfree(response);
934                 xfree(prompt);
935         }
936         packet_done(); /* done with parsing incoming message. */
937
938         packet_send();
939         packet_write_wait();
940 }
941
942 /* find auth method */
943
944 #define DELIM   ","
945
946 static char *def_authlist = "publickey,password";
947 static char *authlist_current = NULL;    /* clean copy used for comparison */
948 static char *authname_current = NULL;    /* last used auth method */
949 static char *authlist_working = NULL;    /* copy that gets modified by strtok_r() */
950 static char *authlist_state = NULL;      /* state variable for strtok_r() */
951
952 /*
953  * Before starting to use a new authentication method list sent by the
954  * server, reset internal variables.  This should also be called when
955  * finished processing server list to free resources.
956  */
957 void
958 authmethod_clear(void)
959 {
960         if (authlist_current != NULL) {
961                 xfree(authlist_current);
962                 authlist_current = NULL;
963         }
964         if (authlist_working != NULL) {
965                 xfree(authlist_working);
966                 authlist_working = NULL;
967         }
968         if (authname_current != NULL) {
969                 xfree(authname_current);
970                 authname_current = NULL;
971         }
972         if (authlist_state != NULL)
973                 authlist_state = NULL;
974         return;
975 }
976
977 /*
978  * given auth method name, if configurable options permit this method fill
979  * in auth_ident field and return true, otherwise return false.
980  */
981 int
982 authmethod_is_enabled(Authmethod *method)
983 {
984         if (method == NULL)
985                 return 0;
986         /* return false if options indicate this method is disabled */
987         if  (method->enabled == NULL || *method->enabled == 0)
988                 return 0;
989         /* return false if batch mode is enabled but method needs interactive mode */
990         if  (method->batch_flag != NULL && *method->batch_flag != 0)
991                 return 0;
992         return 1;
993 }
994
995 Authmethod *
996 authmethod_lookup(const char *name)
997 {
998         Authmethod *method = NULL;
999         if (name != NULL)
1000                 for (method = authmethods; method->name != NULL; method++)
1001                         if (strcmp(name, method->name) == 0)
1002                                 return method;
1003         debug2("Unrecognized authentication method name: %s", name ? name : "NULL");
1004         return NULL;
1005 }
1006
1007 /*
1008  * Given the authentication method list sent by the server, return the
1009  * next method we should try.  If the server initially sends a nil list,
1010  * use a built-in default list.  If the server sends a nil list after
1011  * previously sending a valid list, continue using the list originally
1012  * sent.
1013  */
1014
1015 Authmethod *
1016 authmethod_get(char *authlist)
1017 {
1018         char *name = NULL, *authname_old;
1019         Authmethod *method = NULL;
1020
1021         /* Use a suitable default if we're passed a nil list.  */
1022         if (authlist == NULL || strlen(authlist) == 0)
1023                 authlist = def_authlist;
1024
1025         if (authlist_current == NULL || strcmp(authlist, authlist_current) != 0) {
1026                 /* start over if passed a different list */
1027                 debug3("start over, passed a different list");
1028                 authmethod_clear();
1029                 authlist_current = xstrdup(authlist);
1030                 authlist_working = xstrdup(authlist);
1031                 name = strtok_r(authlist_working, DELIM, &authlist_state);
1032         } else {
1033                 /*
1034                  * try to use previously used authentication method
1035                  * or continue to use previously passed list
1036                  */
1037                 name = (authname_current != NULL) ?
1038                     authname_current : strtok_r(NULL, DELIM, &authlist_state);
1039         }
1040
1041         while (name != NULL) {
1042                 debug3("authmethod_lookup %s", name);
1043                 method = authmethod_lookup(name);
1044                 if (method != NULL && authmethod_is_enabled(method)) {
1045                         debug3("authmethod_is_enabled %s", name);
1046                         break;
1047                 }
1048                 name = strtok_r(NULL, DELIM, &authlist_state);
1049                 method = NULL;
1050         }
1051
1052         authname_old = authname_current;
1053         if (method != NULL) {
1054                 debug("next auth method to try is %s", name);
1055                 authname_current = xstrdup(name);
1056         } else {
1057                 debug("no more auth methods to try");
1058                 authname_current = NULL;
1059         }
1060
1061         if (authname_old != NULL)
1062                 xfree(authname_old);
1063
1064         return (method);
1065 }
This page took 0.137814 seconds and 5 git commands to generate.