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