Annotation of src/usr.bin/ssh/sshconnect2.c, Revision 1.43
1.1 markus 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"
1.43 ! itojun 26: RCSID("$OpenBSD: sshconnect2.c,v 1.42 2001/02/06 22:26:17 markus Exp $");
1.1 markus 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"
1.37 markus 34: #include "ssh2.h"
1.1 markus 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"
1.37 markus 42: #include "cipher.h"
1.1 markus 43: #include "kex.h"
44: #include "myproposal.h"
45: #include "key.h"
46: #include "sshconnect.h"
47: #include "authfile.h"
1.23 markus 48: #include "cli.h"
1.20 markus 49: #include "dispatch.h"
1.17 markus 50: #include "authfd.h"
1.37 markus 51: #include "log.h"
52: #include "readconf.h"
53: #include "readpass.h"
1.1 markus 54:
1.22 provos 55: void ssh_dh1_client(Kex *, char *, struct sockaddr *, Buffer *, Buffer *);
56: void ssh_dhgex_client(Kex *, char *, struct sockaddr *, Buffer *, Buffer *);
57:
1.1 markus 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:
1.32 markus 67: u_char *session_id2 = NULL;
1.1 markus 68: int session_id2_len = 0;
69:
70: void
1.22 provos 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:
1.29 markus 78: if (options.ciphers == (char *)-1) {
79: log("No valid ciphers for protocol version 2 given, using defaults.");
80: options.ciphers = NULL;
1.24 markus 81: }
1.22 provos 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] = "zlib";
88: myproposal[PROPOSAL_COMP_ALGS_STOC] = "zlib";
89: } else {
90: myproposal[PROPOSAL_COMP_ALGS_CTOS] = "none";
91: myproposal[PROPOSAL_COMP_ALGS_STOC] = "none";
92: }
93:
94: /* buffers with raw kexinit messages */
95: server_kexinit = xmalloc(sizeof(*server_kexinit));
96: buffer_init(server_kexinit);
97: client_kexinit = kex_init(myproposal);
98:
99: /* algorithm negotiation */
100: kex_exchange_kexinit(client_kexinit, server_kexinit, sprop);
101: kex = kex_choose_conf(myproposal, sprop, 0);
102: for (i = 0; i < PROPOSAL_MAX; i++)
103: xfree(sprop[i]);
104:
105: /* server authentication and session key agreement */
106: switch(kex->kex_type) {
107: case DH_GRP1_SHA1:
108: ssh_dh1_client(kex, host, hostaddr,
109: client_kexinit, server_kexinit);
110: break;
111: case DH_GEX_SHA1:
112: ssh_dhgex_client(kex, host, hostaddr, client_kexinit,
113: server_kexinit);
114: break;
115: default:
116: fatal("Unsupported key exchange %d", kex->kex_type);
117: }
118:
119: buffer_free(client_kexinit);
120: buffer_free(server_kexinit);
121: xfree(client_kexinit);
122: xfree(server_kexinit);
123:
124: debug("Wait SSH2_MSG_NEWKEYS.");
125: packet_read_expect(&plen, SSH2_MSG_NEWKEYS);
126: packet_done();
127: debug("GOT SSH2_MSG_NEWKEYS.");
128:
129: debug("send SSH2_MSG_NEWKEYS.");
130: packet_start(SSH2_MSG_NEWKEYS);
131: packet_send();
132: packet_write_wait();
133: debug("done: send SSH2_MSG_NEWKEYS.");
134:
135: #ifdef DEBUG_KEXDH
136: /* send 1st encrypted/maced/compressed message */
137: packet_start(SSH2_MSG_IGNORE);
138: packet_put_cstring("markus");
139: packet_send();
140: packet_write_wait();
141: #endif
142: debug("done: KEX2.");
143: }
144:
145: /* diffie-hellman-group1-sha1 */
146:
147: void
1.41 stevesk 148: ssh_dh1_client(Kex *kex, char *host, struct sockaddr *hostaddr,
1.22 provos 149: Buffer *client_kexinit, Buffer *server_kexinit)
1.1 markus 150: {
1.19 markus 151: #ifdef DEBUG_KEXDH
152: int i;
153: #endif
1.11 markus 154: int plen, dlen;
1.32 markus 155: u_int klen, kout;
1.1 markus 156: char *signature = NULL;
1.32 markus 157: u_int slen;
1.1 markus 158: char *server_host_key_blob = NULL;
159: Key *server_host_key;
1.32 markus 160: u_int sbloblen;
1.1 markus 161: DH *dh;
162: BIGNUM *dh_server_pub = 0;
163: BIGNUM *shared_secret = 0;
1.32 markus 164: u_char *kbuf;
165: u_char *hash;
1.1 markus 166:
167: debug("Sending SSH2_MSG_KEXDH_INIT.");
168: /* generate and send 'e', client DH public key */
169: dh = dh_new_group1();
1.31 provos 170: dh_gen_key(dh);
1.1 markus 171: packet_start(SSH2_MSG_KEXDH_INIT);
172: packet_put_bignum2(dh->pub_key);
173: packet_send();
174: packet_write_wait();
175:
176: #ifdef DEBUG_KEXDH
177: fprintf(stderr, "\np= ");
1.19 markus 178: BN_print_fp(stderr, dh->p);
1.1 markus 179: fprintf(stderr, "\ng= ");
1.19 markus 180: BN_print_fp(stderr, dh->g);
1.1 markus 181: fprintf(stderr, "\npub= ");
1.19 markus 182: BN_print_fp(stderr, dh->pub_key);
1.1 markus 183: fprintf(stderr, "\n");
184: DHparams_print_fp(stderr, dh);
185: #endif
186:
187: debug("Wait SSH2_MSG_KEXDH_REPLY.");
188:
1.11 markus 189: packet_read_expect(&plen, SSH2_MSG_KEXDH_REPLY);
1.1 markus 190:
191: debug("Got SSH2_MSG_KEXDH_REPLY.");
192:
193: /* key, cert */
194: server_host_key_blob = packet_get_string(&sbloblen);
1.28 markus 195: server_host_key = key_from_blob(server_host_key_blob, sbloblen);
1.1 markus 196: if (server_host_key == NULL)
197: fatal("cannot decode server_host_key_blob");
198:
199: check_host_key(host, hostaddr, server_host_key,
1.22 provos 200: options.user_hostfile2, options.system_hostfile2);
1.1 markus 201:
202: /* DH paramter f, server public DH key */
203: dh_server_pub = BN_new();
204: if (dh_server_pub == NULL)
205: fatal("dh_server_pub == NULL");
206: packet_get_bignum2(dh_server_pub, &dlen);
207:
208: #ifdef DEBUG_KEXDH
209: fprintf(stderr, "\ndh_server_pub= ");
1.19 markus 210: BN_print_fp(stderr, dh_server_pub);
1.1 markus 211: fprintf(stderr, "\n");
212: debug("bits %d", BN_num_bits(dh_server_pub));
213: #endif
214:
215: /* signed H */
216: signature = packet_get_string(&slen);
217: packet_done();
218:
219: if (!dh_pub_is_valid(dh, dh_server_pub))
220: packet_disconnect("bad server public DH value");
221:
222: klen = DH_size(dh);
223: kbuf = xmalloc(klen);
224: kout = DH_compute_key(kbuf, dh_server_pub, dh);
225: #ifdef DEBUG_KEXDH
226: debug("shared secret: len %d/%d", klen, kout);
227: fprintf(stderr, "shared secret == ");
228: for (i = 0; i< kout; i++)
229: fprintf(stderr, "%02x", (kbuf[i])&0xff);
230: fprintf(stderr, "\n");
231: #endif
232: shared_secret = BN_new();
233:
234: BN_bin2bn(kbuf, kout, shared_secret);
235: memset(kbuf, 0, klen);
236: xfree(kbuf);
237:
238: /* calc and verify H */
239: hash = kex_hash(
240: client_version_string,
241: server_version_string,
242: buffer_ptr(client_kexinit), buffer_len(client_kexinit),
243: buffer_ptr(server_kexinit), buffer_len(server_kexinit),
244: server_host_key_blob, sbloblen,
245: dh->pub_key,
246: dh_server_pub,
247: shared_secret
248: );
1.3 markus 249: xfree(server_host_key_blob);
1.11 markus 250: DH_free(dh);
1.38 stevesk 251: BN_free(dh_server_pub);
1.1 markus 252: #ifdef DEBUG_KEXDH
253: fprintf(stderr, "hash == ");
254: for (i = 0; i< 20; i++)
255: fprintf(stderr, "%02x", (hash[i])&0xff);
256: fprintf(stderr, "\n");
257: #endif
1.32 markus 258: if (key_verify(server_host_key, (u_char *)signature, slen, hash, 20) != 1)
1.28 markus 259: fatal("key_verify failed for server_host_key");
1.1 markus 260: key_free(server_host_key);
1.38 stevesk 261: xfree(signature);
1.1 markus 262:
263: kex_derive_keys(kex, hash, shared_secret);
1.38 stevesk 264: BN_clear_free(shared_secret);
1.1 markus 265: packet_set_kex(kex);
266:
267: /* save session id */
268: session_id2_len = 20;
269: session_id2 = xmalloc(session_id2_len);
270: memcpy(session_id2, hash, session_id2_len);
1.11 markus 271: }
272:
1.22 provos 273: /* diffie-hellman-group-exchange-sha1 */
274:
275: /*
276: * Estimates the group order for a Diffie-Hellman group that has an
277: * attack complexity approximately the same as O(2**bits). Estimate
278: * with: O(exp(1.9223 * (ln q)^(1/3) (ln ln q)^(2/3)))
279: */
280:
281: int
282: dh_estimate(int bits)
283: {
1.41 stevesk 284:
1.22 provos 285: if (bits < 64)
286: return (512); /* O(2**63) */
287: if (bits < 128)
288: return (1024); /* O(2**86) */
289: if (bits < 192)
290: return (2048); /* O(2**116) */
291: return (4096); /* O(2**156) */
292: }
293:
1.11 markus 294: void
1.22 provos 295: ssh_dhgex_client(Kex *kex, char *host, struct sockaddr *hostaddr,
296: Buffer *client_kexinit, Buffer *server_kexinit)
1.11 markus 297: {
1.22 provos 298: #ifdef DEBUG_KEXDH
299: int i;
300: #endif
301: int plen, dlen;
1.32 markus 302: u_int klen, kout;
1.22 provos 303: char *signature = NULL;
1.32 markus 304: u_int slen, nbits;
1.22 provos 305: char *server_host_key_blob = NULL;
306: Key *server_host_key;
1.32 markus 307: u_int sbloblen;
1.22 provos 308: DH *dh;
309: BIGNUM *dh_server_pub = 0;
310: BIGNUM *shared_secret = 0;
311: BIGNUM *p = 0, *g = 0;
1.32 markus 312: u_char *kbuf;
313: u_char *hash;
1.22 provos 314:
1.24 markus 315: nbits = dh_estimate(kex->enc[MODE_OUT].cipher->key_len * 8);
1.22 provos 316:
317: debug("Sending SSH2_MSG_KEX_DH_GEX_REQUEST.");
318: packet_start(SSH2_MSG_KEX_DH_GEX_REQUEST);
319: packet_put_int(nbits);
320: packet_send();
321: packet_write_wait();
1.11 markus 322:
1.22 provos 323: #ifdef DEBUG_KEXDH
324: fprintf(stderr, "\nnbits = %d", nbits);
325: #endif
1.11 markus 326:
1.22 provos 327: debug("Wait SSH2_MSG_KEX_DH_GEX_GROUP.");
1.11 markus 328:
1.22 provos 329: packet_read_expect(&plen, SSH2_MSG_KEX_DH_GEX_GROUP);
1.11 markus 330:
1.22 provos 331: debug("Got SSH2_MSG_KEX_DH_GEX_GROUP.");
1.11 markus 332:
1.22 provos 333: if ((p = BN_new()) == NULL)
334: fatal("BN_new");
335: packet_get_bignum2(p, &dlen);
336: if ((g = BN_new()) == NULL)
337: fatal("BN_new");
338: packet_get_bignum2(g, &dlen);
1.36 stevesk 339: dh = dh_new_group(g, p);
1.31 provos 340:
341: dh_gen_key(dh);
1.1 markus 342:
1.22 provos 343: #ifdef DEBUG_KEXDH
344: fprintf(stderr, "\np= ");
345: BN_print_fp(stderr, dh->p);
346: fprintf(stderr, "\ng= ");
347: BN_print_fp(stderr, dh->g);
348: fprintf(stderr, "\npub= ");
349: BN_print_fp(stderr, dh->pub_key);
350: fprintf(stderr, "\n");
351: DHparams_print_fp(stderr, dh);
352: #endif
1.1 markus 353:
1.22 provos 354: debug("Sending SSH2_MSG_KEX_DH_GEX_INIT.");
355: /* generate and send 'e', client DH public key */
356: packet_start(SSH2_MSG_KEX_DH_GEX_INIT);
357: packet_put_bignum2(dh->pub_key);
1.1 markus 358: packet_send();
359: packet_write_wait();
360:
1.22 provos 361: debug("Wait SSH2_MSG_KEX_DH_GEX_REPLY.");
362:
363: packet_read_expect(&plen, SSH2_MSG_KEX_DH_GEX_REPLY);
364:
365: debug("Got SSH2_MSG_KEXDH_REPLY.");
366:
367: /* key, cert */
368: server_host_key_blob = packet_get_string(&sbloblen);
1.28 markus 369: server_host_key = key_from_blob(server_host_key_blob, sbloblen);
1.22 provos 370: if (server_host_key == NULL)
371: fatal("cannot decode server_host_key_blob");
372:
373: check_host_key(host, hostaddr, server_host_key,
374: options.user_hostfile2, options.system_hostfile2);
375:
376: /* DH paramter f, server public DH key */
377: dh_server_pub = BN_new();
378: if (dh_server_pub == NULL)
379: fatal("dh_server_pub == NULL");
380: packet_get_bignum2(dh_server_pub, &dlen);
381:
382: #ifdef DEBUG_KEXDH
383: fprintf(stderr, "\ndh_server_pub= ");
384: BN_print_fp(stderr, dh_server_pub);
385: fprintf(stderr, "\n");
386: debug("bits %d", BN_num_bits(dh_server_pub));
387: #endif
388:
389: /* signed H */
390: signature = packet_get_string(&slen);
391: packet_done();
392:
393: if (!dh_pub_is_valid(dh, dh_server_pub))
394: packet_disconnect("bad server public DH value");
395:
396: klen = DH_size(dh);
397: kbuf = xmalloc(klen);
398: kout = DH_compute_key(kbuf, dh_server_pub, dh);
399: #ifdef DEBUG_KEXDH
400: debug("shared secret: len %d/%d", klen, kout);
401: fprintf(stderr, "shared secret == ");
402: for (i = 0; i< kout; i++)
403: fprintf(stderr, "%02x", (kbuf[i])&0xff);
404: fprintf(stderr, "\n");
405: #endif
406: shared_secret = BN_new();
407:
408: BN_bin2bn(kbuf, kout, shared_secret);
409: memset(kbuf, 0, klen);
410: xfree(kbuf);
411:
412: /* calc and verify H */
413: hash = kex_hash_gex(
414: client_version_string,
415: server_version_string,
416: buffer_ptr(client_kexinit), buffer_len(client_kexinit),
417: buffer_ptr(server_kexinit), buffer_len(server_kexinit),
418: server_host_key_blob, sbloblen,
1.41 stevesk 419: nbits, dh->p, dh->g,
1.22 provos 420: dh->pub_key,
421: dh_server_pub,
422: shared_secret
423: );
424: xfree(server_host_key_blob);
425: DH_free(dh);
1.38 stevesk 426: BN_free(dh_server_pub);
1.1 markus 427: #ifdef DEBUG_KEXDH
1.22 provos 428: fprintf(stderr, "hash == ");
429: for (i = 0; i< 20; i++)
430: fprintf(stderr, "%02x", (hash[i])&0xff);
431: fprintf(stderr, "\n");
1.1 markus 432: #endif
1.32 markus 433: if (key_verify(server_host_key, (u_char *)signature, slen, hash, 20) != 1)
1.28 markus 434: fatal("key_verify failed for server_host_key");
1.22 provos 435: key_free(server_host_key);
1.38 stevesk 436: xfree(signature);
1.22 provos 437:
438: kex_derive_keys(kex, hash, shared_secret);
1.38 stevesk 439: BN_clear_free(shared_secret);
1.22 provos 440: packet_set_kex(kex);
441:
442: /* save session id */
443: session_id2_len = 20;
444: session_id2 = xmalloc(session_id2_len);
445: memcpy(session_id2, hash, session_id2_len);
1.1 markus 446: }
1.11 markus 447:
1.1 markus 448: /*
449: * Authenticate user
450: */
1.20 markus 451:
452: typedef struct Authctxt Authctxt;
453: typedef struct Authmethod Authmethod;
454:
455: typedef int sign_cb_fn(
456: Authctxt *authctxt, Key *key,
1.32 markus 457: u_char **sigp, int *lenp, u_char *data, int datalen);
1.20 markus 458:
459: struct Authctxt {
460: const char *server_user;
461: const char *host;
462: const char *service;
463: AuthenticationConnection *agent;
1.23 markus 464: Authmethod *method;
1.20 markus 465: int success;
466: };
467: struct Authmethod {
468: char *name; /* string to compare against server's list */
469: int (*userauth)(Authctxt *authctxt);
470: int *enabled; /* flag in option struct that enables method */
471: int *batch_flag; /* flag in option struct that disables method */
472: };
473:
474: void input_userauth_success(int type, int plen, void *ctxt);
475: void input_userauth_failure(int type, int plen, void *ctxt);
1.35 markus 476: void input_userauth_banner(int type, int plen, void *ctxt);
1.20 markus 477: void input_userauth_error(int type, int plen, void *ctxt);
1.23 markus 478: void input_userauth_info_req(int type, int plen, void *ctxt);
479:
480: int userauth_none(Authctxt *authctxt);
1.20 markus 481: int userauth_pubkey(Authctxt *authctxt);
482: int userauth_passwd(Authctxt *authctxt);
1.23 markus 483: int userauth_kbdint(Authctxt *authctxt);
1.20 markus 484:
1.33 markus 485: void authmethod_clear(void);
1.23 markus 486: Authmethod *authmethod_get(char *authlist);
487: Authmethod *authmethod_lookup(const char *name);
1.20 markus 488:
489: Authmethod authmethods[] = {
490: {"publickey",
491: userauth_pubkey,
1.28 markus 492: &options.pubkey_authentication,
1.20 markus 493: NULL},
494: {"password",
495: userauth_passwd,
496: &options.password_authentication,
497: &options.batch_mode},
1.23 markus 498: {"keyboard-interactive",
499: userauth_kbdint,
500: &options.kbd_interactive_authentication,
501: &options.batch_mode},
502: {"none",
503: userauth_none,
504: NULL,
505: NULL},
1.20 markus 506: {NULL, NULL, NULL, NULL}
507: };
508:
509: void
510: ssh_userauth2(const char *server_user, char *host)
511: {
512: Authctxt authctxt;
513: int type;
514: int plen;
1.39 markus 515:
516: if (options.challenge_reponse_authentication)
517: options.kbd_interactive_authentication = 1;
1.20 markus 518:
519: debug("send SSH2_MSG_SERVICE_REQUEST");
520: packet_start(SSH2_MSG_SERVICE_REQUEST);
521: packet_put_cstring("ssh-userauth");
522: packet_send();
523: packet_write_wait();
524: type = packet_read(&plen);
525: if (type != SSH2_MSG_SERVICE_ACCEPT) {
526: fatal("denied SSH2_MSG_SERVICE_ACCEPT: %d", type);
527: }
528: if (packet_remaining() > 0) {
529: char *reply = packet_get_string(&plen);
530: debug("service_accept: %s", reply);
531: xfree(reply);
532: } else {
533: debug("buggy server: service_accept w/o service");
534: }
535: packet_done();
536: debug("got SSH2_MSG_SERVICE_ACCEPT");
537:
538: /* setup authentication context */
539: authctxt.agent = ssh_get_authentication_connection();
540: authctxt.server_user = server_user;
541: authctxt.host = host;
542: authctxt.service = "ssh-connection"; /* service name */
543: authctxt.success = 0;
1.23 markus 544: authctxt.method = authmethod_lookup("none");
545: if (authctxt.method == NULL)
546: fatal("ssh_userauth2: internal error: cannot send userauth none request");
547: authmethod_clear();
1.20 markus 548:
549: /* initial userauth request */
1.23 markus 550: userauth_none(&authctxt);
1.20 markus 551:
552: dispatch_init(&input_userauth_error);
553: dispatch_set(SSH2_MSG_USERAUTH_SUCCESS, &input_userauth_success);
554: dispatch_set(SSH2_MSG_USERAUTH_FAILURE, &input_userauth_failure);
1.35 markus 555: dispatch_set(SSH2_MSG_USERAUTH_BANNER, &input_userauth_banner);
1.20 markus 556: dispatch_run(DISPATCH_BLOCK, &authctxt.success, &authctxt); /* loop until success */
557:
558: if (authctxt.agent != NULL)
559: ssh_close_authentication_connection(authctxt.agent);
560:
1.34 markus 561: debug("ssh-userauth2 successful: method %s", authctxt.method->name);
1.20 markus 562: }
563: void
564: input_userauth_error(int type, int plen, void *ctxt)
565: {
1.35 markus 566: fatal("input_userauth_error: bad message during authentication: "
567: "type %d", type);
568: }
569: void
570: input_userauth_banner(int type, int plen, void *ctxt)
571: {
572: char *msg, *lang;
573: debug3("input_userauth_banner");
574: msg = packet_get_string(NULL);
575: lang = packet_get_string(NULL);
576: fprintf(stderr, "%s", msg);
577: xfree(msg);
578: xfree(lang);
1.20 markus 579: }
580: void
581: input_userauth_success(int type, int plen, void *ctxt)
582: {
583: Authctxt *authctxt = ctxt;
584: if (authctxt == NULL)
585: fatal("input_userauth_success: no authentication context");
586: authctxt->success = 1; /* break out */
587: }
588: void
589: input_userauth_failure(int type, int plen, void *ctxt)
590: {
591: Authmethod *method = NULL;
592: Authctxt *authctxt = ctxt;
593: char *authlist = NULL;
594: int partial;
595:
596: if (authctxt == NULL)
597: fatal("input_userauth_failure: no authentication context");
598:
1.23 markus 599: authlist = packet_get_string(NULL);
1.20 markus 600: partial = packet_get_char();
601: packet_done();
602:
603: if (partial != 0)
604: debug("partial success");
605: debug("authentications that can continue: %s", authlist);
606:
607: for (;;) {
608: method = authmethod_get(authlist);
609: if (method == NULL)
1.41 stevesk 610: fatal("Unable to find an authentication method");
1.23 markus 611: authctxt->method = method;
1.20 markus 612: if (method->userauth(authctxt) != 0) {
1.23 markus 613: debug2("we sent a %s packet, wait for reply", method->name);
1.20 markus 614: break;
615: } else {
616: debug2("we did not send a packet, disable method");
617: method->enabled = NULL;
618: }
1.41 stevesk 619: }
1.20 markus 620: xfree(authlist);
621: }
622:
1.1 markus 623: int
1.23 markus 624: userauth_none(Authctxt *authctxt)
625: {
626: /* initial userauth request */
627: packet_start(SSH2_MSG_USERAUTH_REQUEST);
628: packet_put_cstring(authctxt->server_user);
629: packet_put_cstring(authctxt->service);
630: packet_put_cstring(authctxt->method->name);
631: packet_send();
632: packet_write_wait();
633: return 1;
634: }
635:
636: int
1.20 markus 637: userauth_passwd(Authctxt *authctxt)
1.1 markus 638: {
1.6 markus 639: static int attempt = 0;
1.1 markus 640: char prompt[80];
641: char *password;
1.6 markus 642:
1.13 todd 643: if (attempt++ >= options.number_of_password_prompts)
1.6 markus 644: return 0;
1.13 todd 645:
646: if(attempt != 1)
647: error("Permission denied, please try again.");
1.1 markus 648:
1.43 ! itojun 649: snprintf(prompt, sizeof(prompt), "%.30s@%.128s's password: ",
1.20 markus 650: authctxt->server_user, authctxt->host);
1.1 markus 651: password = read_passphrase(prompt, 0);
652: packet_start(SSH2_MSG_USERAUTH_REQUEST);
1.20 markus 653: packet_put_cstring(authctxt->server_user);
654: packet_put_cstring(authctxt->service);
1.23 markus 655: packet_put_cstring(authctxt->method->name);
1.1 markus 656: packet_put_char(0);
657: packet_put_cstring(password);
658: memset(password, 0, strlen(password));
659: xfree(password);
660: packet_send();
661: packet_write_wait();
662: return 1;
663: }
664:
1.17 markus 665: int
1.20 markus 666: sign_and_send_pubkey(Authctxt *authctxt, Key *k, sign_cb_fn *sign_callback)
1.1 markus 667: {
668: Buffer b;
1.32 markus 669: u_char *blob, *signature;
1.1 markus 670: int bloblen, slen;
1.14 markus 671: int skip = 0;
1.17 markus 672: int ret = -1;
1.23 markus 673: int have_sig = 1;
1.1 markus 674:
1.30 markus 675: debug3("sign_and_send_pubkey");
1.28 markus 676: if (key_to_blob(k, &blob, &bloblen) == 0) {
677: /* we cannot handle this key */
1.30 markus 678: debug3("sign_and_send_pubkey: cannot handle key");
1.28 markus 679: return 0;
680: }
1.1 markus 681: /* data to be signed */
682: buffer_init(&b);
1.26 markus 683: if (datafellows & SSH_OLD_SESSIONID) {
684: buffer_append(&b, session_id2, session_id2_len);
1.41 stevesk 685: skip = session_id2_len;
1.26 markus 686: } else {
1.14 markus 687: buffer_put_string(&b, session_id2, session_id2_len);
688: skip = buffer_len(&b);
689: }
1.1 markus 690: buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);
1.20 markus 691: buffer_put_cstring(&b, authctxt->server_user);
1.10 markus 692: buffer_put_cstring(&b,
1.30 markus 693: datafellows & SSH_BUG_PKSERVICE ?
1.10 markus 694: "ssh-userauth" :
1.20 markus 695: authctxt->service);
1.30 markus 696: if (datafellows & SSH_BUG_PKAUTH) {
697: buffer_put_char(&b, have_sig);
698: } else {
699: buffer_put_cstring(&b, authctxt->method->name);
700: buffer_put_char(&b, have_sig);
1.41 stevesk 701: buffer_put_cstring(&b, key_ssh_name(k));
1.30 markus 702: }
1.1 markus 703: buffer_put_string(&b, blob, bloblen);
704:
705: /* generate signature */
1.20 markus 706: ret = (*sign_callback)(authctxt, k, &signature, &slen, buffer_ptr(&b), buffer_len(&b));
1.17 markus 707: if (ret == -1) {
708: xfree(blob);
709: buffer_free(&b);
710: return 0;
711: }
1.28 markus 712: #ifdef DEBUG_PK
1.1 markus 713: buffer_dump(&b);
714: #endif
1.30 markus 715: if (datafellows & SSH_BUG_PKSERVICE) {
1.10 markus 716: buffer_clear(&b);
717: buffer_append(&b, session_id2, session_id2_len);
718: buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);
1.20 markus 719: buffer_put_cstring(&b, authctxt->server_user);
720: buffer_put_cstring(&b, authctxt->service);
1.23 markus 721: buffer_put_cstring(&b, authctxt->method->name);
722: buffer_put_char(&b, have_sig);
1.30 markus 723: if (!(datafellows & SSH_BUG_PKAUTH))
1.41 stevesk 724: buffer_put_cstring(&b, key_ssh_name(k));
1.10 markus 725: buffer_put_string(&b, blob, bloblen);
726: }
727: xfree(blob);
1.1 markus 728: /* append signature */
729: buffer_put_string(&b, signature, slen);
730: xfree(signature);
731:
732: /* skip session id and packet type */
1.14 markus 733: if (buffer_len(&b) < skip + 1)
1.20 markus 734: fatal("userauth_pubkey: internal error");
1.14 markus 735: buffer_consume(&b, skip + 1);
1.1 markus 736:
737: /* put remaining data from buffer into packet */
738: packet_start(SSH2_MSG_USERAUTH_REQUEST);
739: packet_put_raw(buffer_ptr(&b), buffer_len(&b));
740: buffer_free(&b);
741:
742: /* send */
743: packet_send();
744: packet_write_wait();
1.17 markus 745:
746: return 1;
1.16 markus 747: }
748:
1.20 markus 749: /* sign callback */
1.32 markus 750: int key_sign_cb(Authctxt *authctxt, Key *key, u_char **sigp, int *lenp,
751: u_char *data, int datalen)
1.20 markus 752: {
1.28 markus 753: return key_sign(key, sigp, lenp, data, datalen);
1.20 markus 754: }
755:
1.16 markus 756: int
1.20 markus 757: userauth_pubkey_identity(Authctxt *authctxt, char *filename)
1.16 markus 758: {
759: Key *k;
1.42 markus 760: int i, ret, try_next, success = 0;
1.16 markus 761: struct stat st;
1.42 markus 762: char *passphrase;
763: char prompt[300];
1.16 markus 764:
765: if (stat(filename, &st) != 0) {
766: debug("key does not exist: %s", filename);
767: return 0;
768: }
769: debug("try pubkey: %s", filename);
770:
1.28 markus 771: k = key_new(KEY_UNSPEC);
1.16 markus 772: if (!load_private_key(filename, "", k, NULL)) {
1.42 markus 773: if (options.batch_mode) {
774: key_free(k);
775: return 0;
776: }
1.16 markus 777: snprintf(prompt, sizeof prompt,
1.28 markus 778: "Enter passphrase for key '%.100s': ", filename);
1.20 markus 779: for (i = 0; i < options.number_of_password_prompts; i++) {
780: passphrase = read_passphrase(prompt, 0);
781: if (strcmp(passphrase, "") != 0) {
782: success = load_private_key(filename, passphrase, k, NULL);
783: try_next = 0;
784: } else {
785: debug2("no passphrase given, try next key");
786: try_next = 1;
787: }
788: memset(passphrase, 0, strlen(passphrase));
789: xfree(passphrase);
790: if (success || try_next)
791: break;
792: debug2("bad passphrase given, try again...");
793: }
1.16 markus 794: if (!success) {
795: key_free(k);
796: return 0;
797: }
798: }
1.28 markus 799: ret = sign_and_send_pubkey(authctxt, k, key_sign_cb);
1.17 markus 800: key_free(k);
801: return ret;
802: }
803:
1.20 markus 804: /* sign callback */
1.32 markus 805: int agent_sign_cb(Authctxt *authctxt, Key *key, u_char **sigp, int *lenp,
806: u_char *data, int datalen)
1.17 markus 807: {
1.20 markus 808: return ssh_agent_sign(authctxt->agent, key, sigp, lenp, data, datalen);
1.17 markus 809: }
810:
811: int
1.20 markus 812: userauth_pubkey_agent(Authctxt *authctxt)
1.17 markus 813: {
814: static int called = 0;
1.28 markus 815: int ret = 0;
1.17 markus 816: char *comment;
817: Key *k;
818:
819: if (called == 0) {
1.28 markus 820: if (ssh_get_num_identities(authctxt->agent, 2) == 0)
821: debug2("userauth_pubkey_agent: no keys at all");
1.20 markus 822: called = 1;
1.17 markus 823: }
1.28 markus 824: k = ssh_get_next_identity(authctxt->agent, &comment, 2);
1.20 markus 825: if (k == NULL) {
1.28 markus 826: debug2("userauth_pubkey_agent: no more keys");
827: } else {
828: debug("userauth_pubkey_agent: trying agent key %s", comment);
829: xfree(comment);
830: ret = sign_and_send_pubkey(authctxt, k, agent_sign_cb);
831: key_free(k);
1.20 markus 832: }
1.28 markus 833: if (ret == 0)
834: debug2("userauth_pubkey_agent: no message sent");
1.17 markus 835: return ret;
1.1 markus 836: }
837:
1.20 markus 838: int
839: userauth_pubkey(Authctxt *authctxt)
840: {
841: static int idx = 0;
842: int sent = 0;
843:
1.28 markus 844: if (authctxt->agent != NULL) {
845: do {
846: sent = userauth_pubkey_agent(authctxt);
847: } while(!sent && authctxt->agent->howmany > 0);
848: }
849: while (!sent && idx < options.num_identity_files) {
850: if (options.identity_files_type[idx] != KEY_RSA1)
851: sent = userauth_pubkey_identity(authctxt,
852: options.identity_files[idx]);
853: idx++;
854: }
1.20 markus 855: return sent;
856: }
857:
1.23 markus 858: /*
859: * Send userauth request message specifying keyboard-interactive method.
860: */
861: int
862: userauth_kbdint(Authctxt *authctxt)
863: {
864: static int attempt = 0;
865:
866: if (attempt++ >= options.number_of_password_prompts)
867: return 0;
868:
869: debug2("userauth_kbdint");
870: packet_start(SSH2_MSG_USERAUTH_REQUEST);
871: packet_put_cstring(authctxt->server_user);
872: packet_put_cstring(authctxt->service);
873: packet_put_cstring(authctxt->method->name);
874: packet_put_cstring(""); /* lang */
875: packet_put_cstring(options.kbd_interactive_devices ?
876: options.kbd_interactive_devices : "");
877: packet_send();
878: packet_write_wait();
879:
880: dispatch_set(SSH2_MSG_USERAUTH_INFO_REQUEST, &input_userauth_info_req);
881: return 1;
882: }
883:
884: /*
885: * parse SSH2_MSG_USERAUTH_INFO_REQUEST, prompt user and send
886: * SSH2_MSG_USERAUTH_INFO_RESPONSE
887: */
888: void
889: input_userauth_info_req(int type, int plen, void *ctxt)
890: {
891: Authctxt *authctxt = ctxt;
892: char *name = NULL;
893: char *inst = NULL;
894: char *lang = NULL;
895: char *prompt = NULL;
896: char *response = NULL;
1.32 markus 897: u_int num_prompts, i;
1.23 markus 898: int echo = 0;
899:
900: debug2("input_userauth_info_req");
901:
902: if (authctxt == NULL)
903: fatal("input_userauth_info_req: no authentication context");
904:
905: name = packet_get_string(NULL);
906: inst = packet_get_string(NULL);
907: lang = packet_get_string(NULL);
908:
909: if (strlen(name) > 0)
910: cli_mesg(name);
911: xfree(name);
912:
913: if (strlen(inst) > 0)
914: cli_mesg(inst);
915: xfree(inst);
916: xfree(lang); /* unused */
917:
918: num_prompts = packet_get_int();
919: /*
920: * Begin to build info response packet based on prompts requested.
921: * We commit to providing the correct number of responses, so if
922: * further on we run into a problem that prevents this, we have to
923: * be sure and clean this up and send a correct error response.
924: */
925: packet_start(SSH2_MSG_USERAUTH_INFO_RESPONSE);
926: packet_put_int(num_prompts);
927:
928: for (i = 0; i < num_prompts; i++) {
929: prompt = packet_get_string(NULL);
930: echo = packet_get_char();
931:
932: response = cli_prompt(prompt, echo);
933:
934: packet_put_cstring(response);
935: memset(response, 0, strlen(response));
936: xfree(response);
937: xfree(prompt);
938: }
939: packet_done(); /* done with parsing incoming message. */
940:
941: packet_send();
942: packet_write_wait();
943: }
1.20 markus 944:
945: /* find auth method */
946:
947: #define DELIM ","
948:
949: static char *def_authlist = "publickey,password";
950: static char *authlist_current = NULL; /* clean copy used for comparison */
951: static char *authname_current = NULL; /* last used auth method */
952: static char *authlist_working = NULL; /* copy that gets modified by strtok_r() */
953: static char *authlist_state = NULL; /* state variable for strtok_r() */
954:
955: /*
956: * Before starting to use a new authentication method list sent by the
957: * server, reset internal variables. This should also be called when
958: * finished processing server list to free resources.
959: */
1.1 markus 960: void
1.33 markus 961: authmethod_clear(void)
1.20 markus 962: {
963: if (authlist_current != NULL) {
964: xfree(authlist_current);
965: authlist_current = NULL;
966: }
967: if (authlist_working != NULL) {
968: xfree(authlist_working);
969: authlist_working = NULL;
970: }
971: if (authname_current != NULL) {
972: xfree(authname_current);
973: authlist_state = NULL;
974: }
975: if (authlist_state != NULL)
976: authlist_state = NULL;
977: return;
978: }
979:
980: /*
981: * given auth method name, if configurable options permit this method fill
982: * in auth_ident field and return true, otherwise return false.
983: */
984: int
985: authmethod_is_enabled(Authmethod *method)
986: {
987: if (method == NULL)
988: return 0;
989: /* return false if options indicate this method is disabled */
990: if (method->enabled == NULL || *method->enabled == 0)
991: return 0;
992: /* return false if batch mode is enabled but method needs interactive mode */
993: if (method->batch_flag != NULL && *method->batch_flag != 0)
994: return 0;
995: return 1;
996: }
997:
998: Authmethod *
999: authmethod_lookup(const char *name)
1.1 markus 1000: {
1.20 markus 1001: Authmethod *method = NULL;
1002: if (name != NULL)
1003: for (method = authmethods; method->name != NULL; method++)
1004: if (strcmp(name, method->name) == 0)
1005: return method;
1006: debug2("Unrecognized authentication method name: %s", name ? name : "NULL");
1007: return NULL;
1008: }
1.1 markus 1009:
1.20 markus 1010: /*
1011: * Given the authentication method list sent by the server, return the
1012: * next method we should try. If the server initially sends a nil list,
1013: * use a built-in default list. If the server sends a nil list after
1014: * previously sending a valid list, continue using the list originally
1015: * sent.
1.41 stevesk 1016: */
1.1 markus 1017:
1.20 markus 1018: Authmethod *
1019: authmethod_get(char *authlist)
1020: {
1.27 provos 1021: char *name = NULL, *authname_old;
1.20 markus 1022: Authmethod *method = NULL;
1.41 stevesk 1023:
1.20 markus 1024: /* Use a suitable default if we're passed a nil list. */
1025: if (authlist == NULL || strlen(authlist) == 0)
1026: authlist = def_authlist;
1027:
1028: if (authlist_current == NULL || strcmp(authlist, authlist_current) != 0) {
1029: /* start over if passed a different list */
1.23 markus 1030: debug3("start over, passed a different list");
1.20 markus 1031: authmethod_clear();
1032: authlist_current = xstrdup(authlist);
1033: authlist_working = xstrdup(authlist);
1034: name = strtok_r(authlist_working, DELIM, &authlist_state);
1035: } else {
1036: /*
1037: * try to use previously used authentication method
1038: * or continue to use previously passed list
1039: */
1040: name = (authname_current != NULL) ?
1041: authname_current : strtok_r(NULL, DELIM, &authlist_state);
1.1 markus 1042: }
1.20 markus 1043:
1044: while (name != NULL) {
1.23 markus 1045: debug3("authmethod_lookup %s", name);
1.20 markus 1046: method = authmethod_lookup(name);
1.23 markus 1047: if (method != NULL && authmethod_is_enabled(method)) {
1048: debug3("authmethod_is_enabled %s", name);
1.20 markus 1049: break;
1.23 markus 1050: }
1.20 markus 1051: name = strtok_r(NULL, DELIM, &authlist_state);
1.23 markus 1052: method = NULL;
1.1 markus 1053: }
1054:
1.27 provos 1055: authname_old = authname_current;
1.23 markus 1056: if (method != NULL) {
1.20 markus 1057: debug("next auth method to try is %s", name);
1058: authname_current = xstrdup(name);
1059: } else {
1060: debug("no more auth methods to try");
1061: authname_current = NULL;
1.1 markus 1062: }
1.27 provos 1063:
1064: if (authname_old != NULL)
1065: xfree(authname_old);
1066:
1067: return (method);
1.1 markus 1068: }