monitor.c (128460) | monitor.c (137019) |
---|---|
1/* 2 * Copyright 2002 Niels Provos <provos@citi.umich.edu> 3 * Copyright 2002 Markus Friedl <markus@openbsd.org> 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 11 unchanged lines hidden (view full) --- 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include "includes.h" | 1/* 2 * Copyright 2002 Niels Provos <provos@citi.umich.edu> 3 * Copyright 2002 Markus Friedl <markus@openbsd.org> 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 11 unchanged lines hidden (view full) --- 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include "includes.h" |
28RCSID("$OpenBSD: monitor.c,v 1.55 2004/02/05 05:37:17 dtucker Exp $"); 29RCSID("$FreeBSD: head/crypto/openssh/monitor.c 128460 2004-04-20 09:46:41Z des $"); | 28RCSID("$OpenBSD: monitor.c,v 1.61 2004/07/17 05:31:41 dtucker Exp $"); 29RCSID("$FreeBSD: head/crypto/openssh/monitor.c 137019 2004-10-28 16:11:31Z des $"); |
30 31#include <openssl/dh.h> 32 33#ifdef SKEY 34#ifdef OPIE 35#include <opie.h> 36#define skey opie 37#define skeychallenge(k, u, c) opiechallenge((k), (u), (c)) --- 29 unchanged lines hidden (view full) --- 67#include "monitor_wrap.h" 68#include "monitor_fdpass.h" 69#include "xmalloc.h" 70#include "misc.h" 71#include "buffer.h" 72#include "bufaux.h" 73#include "compat.h" 74#include "ssh2.h" | 30 31#include <openssl/dh.h> 32 33#ifdef SKEY 34#ifdef OPIE 35#include <opie.h> 36#define skey opie 37#define skeychallenge(k, u, c) opiechallenge((k), (u), (c)) --- 29 unchanged lines hidden (view full) --- 67#include "monitor_wrap.h" 68#include "monitor_fdpass.h" 69#include "xmalloc.h" 70#include "misc.h" 71#include "buffer.h" 72#include "bufaux.h" 73#include "compat.h" 74#include "ssh2.h" |
75#include "mpaux.h" | |
76 77#ifdef GSSAPI 78#include "ssh-gss.h" 79static Gssctxt *gsscontext = NULL; 80#endif 81 82/* Imports */ 83extern ServerOptions options; 84extern u_int utmp_len; 85extern Newkeys *current_keys[]; 86extern z_stream incoming_stream; 87extern z_stream outgoing_stream; 88extern u_char session_id[]; 89extern Buffer input, output; 90extern Buffer auth_debug; 91extern int auth_debug_init; | 75 76#ifdef GSSAPI 77#include "ssh-gss.h" 78static Gssctxt *gsscontext = NULL; 79#endif 80 81/* Imports */ 82extern ServerOptions options; 83extern u_int utmp_len; 84extern Newkeys *current_keys[]; 85extern z_stream incoming_stream; 86extern z_stream outgoing_stream; 87extern u_char session_id[]; 88extern Buffer input, output; 89extern Buffer auth_debug; 90extern int auth_debug_init; |
91extern Buffer loginmsg; |
|
92 93/* State exported from the child */ 94 95struct { 96 z_stream incoming; 97 z_stream outgoing; 98 u_char *keyin; 99 u_int keyinlen; --- 255 unchanged lines hidden (view full) --- 355 356static void 357monitor_set_child_handler(pid_t pid) 358{ 359 monitor_child_pid = pid; 360} 361 362static void | 92 93/* State exported from the child */ 94 95struct { 96 z_stream incoming; 97 z_stream outgoing; 98 u_char *keyin; 99 u_int keyinlen; --- 255 unchanged lines hidden (view full) --- 355 356static void 357monitor_set_child_handler(pid_t pid) 358{ 359 monitor_child_pid = pid; 360} 361 362static void |
363monitor_child_handler(int signal) | 363monitor_child_handler(int sig) |
364{ | 364{ |
365 kill(monitor_child_pid, signal); | 365 kill(monitor_child_pid, sig); |
366} 367 368void 369monitor_child_postauth(struct monitor *pmonitor) 370{ 371 monitor_set_child_handler(pmonitor->m_pid); 372 signal(SIGHUP, &monitor_child_handler); 373 signal(SIGTERM, &monitor_child_handler); --- 98 unchanged lines hidden (view full) --- 472 key_blob = NULL; 473 key_bloblen = 0; 474 key_blobtype = MM_NOKEY; 475 hostbased_cuser = NULL; 476 hostbased_chost = NULL; 477} 478 479int | 366} 367 368void 369monitor_child_postauth(struct monitor *pmonitor) 370{ 371 monitor_set_child_handler(pmonitor->m_pid); 372 signal(SIGHUP, &monitor_child_handler); 373 signal(SIGTERM, &monitor_child_handler); --- 98 unchanged lines hidden (view full) --- 472 key_blob = NULL; 473 key_bloblen = 0; 474 key_blobtype = MM_NOKEY; 475 hostbased_cuser = NULL; 476 hostbased_chost = NULL; 477} 478 479int |
480mm_answer_moduli(int socket, Buffer *m) | 480mm_answer_moduli(int sock, Buffer *m) |
481{ 482 DH *dh; 483 int min, want, max; 484 485 min = buffer_get_int(m); 486 want = buffer_get_int(m); 487 max = buffer_get_int(m); 488 --- 13 unchanged lines hidden (view full) --- 502 } else { 503 /* Send first bignum */ 504 buffer_put_char(m, 1); 505 buffer_put_bignum2(m, dh->p); 506 buffer_put_bignum2(m, dh->g); 507 508 DH_free(dh); 509 } | 481{ 482 DH *dh; 483 int min, want, max; 484 485 min = buffer_get_int(m); 486 want = buffer_get_int(m); 487 max = buffer_get_int(m); 488 --- 13 unchanged lines hidden (view full) --- 502 } else { 503 /* Send first bignum */ 504 buffer_put_char(m, 1); 505 buffer_put_bignum2(m, dh->p); 506 buffer_put_bignum2(m, dh->g); 507 508 DH_free(dh); 509 } |
510 mm_request_send(socket, MONITOR_ANS_MODULI, m); | 510 mm_request_send(sock, MONITOR_ANS_MODULI, m); |
511 return (0); 512} 513 514int | 511 return (0); 512} 513 514int |
515mm_answer_sign(int socket, Buffer *m) | 515mm_answer_sign(int sock, Buffer *m) |
516{ 517 Key *key; 518 u_char *p; 519 u_char *signature; 520 u_int siglen, datlen; 521 int keyid; 522 523 debug3("%s", __func__); --- 19 unchanged lines hidden (view full) --- 543 debug3("%s: signature %p(%u)", __func__, signature, siglen); 544 545 buffer_clear(m); 546 buffer_put_string(m, signature, siglen); 547 548 xfree(p); 549 xfree(signature); 550 | 516{ 517 Key *key; 518 u_char *p; 519 u_char *signature; 520 u_int siglen, datlen; 521 int keyid; 522 523 debug3("%s", __func__); --- 19 unchanged lines hidden (view full) --- 543 debug3("%s: signature %p(%u)", __func__, signature, siglen); 544 545 buffer_clear(m); 546 buffer_put_string(m, signature, siglen); 547 548 xfree(p); 549 xfree(signature); 550 |
551 mm_request_send(socket, MONITOR_ANS_SIGN, m); | 551 mm_request_send(sock, MONITOR_ANS_SIGN, m); |
552 553 /* Turn on permissions for getpwnam */ 554 monitor_permit(mon_dispatch, MONITOR_REQ_PWNAM, 1); 555 556 return (0); 557} 558 559/* Retrieves the password entry and also checks if the user is permitted */ 560 561int | 552 553 /* Turn on permissions for getpwnam */ 554 monitor_permit(mon_dispatch, MONITOR_REQ_PWNAM, 1); 555 556 return (0); 557} 558 559/* Retrieves the password entry and also checks if the user is permitted */ 560 561int |
562mm_answer_pwnamallow(int socket, Buffer *m) | 562mm_answer_pwnamallow(int sock, Buffer *m) |
563{ | 563{ |
564 char *login; | 564 char *username; |
565 struct passwd *pwent; 566 int allowed = 0; 567 568 debug3("%s", __func__); 569 570 if (authctxt->attempt++ != 0) 571 fatal("%s: multiple attempts for getpwnam", __func__); 572 | 565 struct passwd *pwent; 566 int allowed = 0; 567 568 debug3("%s", __func__); 569 570 if (authctxt->attempt++ != 0) 571 fatal("%s: multiple attempts for getpwnam", __func__); 572 |
573 login = buffer_get_string(m, NULL); | 573 username = buffer_get_string(m, NULL); |
574 | 574 |
575 pwent = getpwnamallow(login); | 575 pwent = getpwnamallow(username); |
576 | 576 |
577 authctxt->user = xstrdup(login); 578 setproctitle("%s [priv]", pwent ? login : "unknown"); 579 xfree(login); | 577 authctxt->user = xstrdup(username); 578 setproctitle("%s [priv]", pwent ? username : "unknown"); 579 xfree(username); |
580 581 buffer_clear(m); 582 583 if (pwent == NULL) { 584 buffer_put_char(m, 0); 585 authctxt->pw = fakepw(); 586 goto out; 587 } --- 10 unchanged lines hidden (view full) --- 598#ifdef HAVE_PW_CLASS_IN_PASSWD 599 buffer_put_cstring(m, pwent->pw_class); 600#endif 601 buffer_put_cstring(m, pwent->pw_dir); 602 buffer_put_cstring(m, pwent->pw_shell); 603 604 out: 605 debug3("%s: sending MONITOR_ANS_PWNAM: %d", __func__, allowed); | 580 581 buffer_clear(m); 582 583 if (pwent == NULL) { 584 buffer_put_char(m, 0); 585 authctxt->pw = fakepw(); 586 goto out; 587 } --- 10 unchanged lines hidden (view full) --- 598#ifdef HAVE_PW_CLASS_IN_PASSWD 599 buffer_put_cstring(m, pwent->pw_class); 600#endif 601 buffer_put_cstring(m, pwent->pw_dir); 602 buffer_put_cstring(m, pwent->pw_shell); 603 604 out: 605 debug3("%s: sending MONITOR_ANS_PWNAM: %d", __func__, allowed); |
606 mm_request_send(socket, MONITOR_ANS_PWNAM, m); | 606 mm_request_send(sock, MONITOR_ANS_PWNAM, m); |
607 608 /* For SSHv1 allow authentication now */ 609 if (!compat20) 610 monitor_permit_authentications(1); 611 else { 612 /* Allow service/style information on the auth context */ 613 monitor_permit(mon_dispatch, MONITOR_REQ_AUTHSERV, 1); 614 monitor_permit(mon_dispatch, MONITOR_REQ_AUTH2_READ_BANNER, 1); 615 } 616 617#ifdef USE_PAM 618 if (options.use_pam) 619 monitor_permit(mon_dispatch, MONITOR_REQ_PAM_START, 1); 620#endif 621 622 return (0); 623} 624 | 607 608 /* For SSHv1 allow authentication now */ 609 if (!compat20) 610 monitor_permit_authentications(1); 611 else { 612 /* Allow service/style information on the auth context */ 613 monitor_permit(mon_dispatch, MONITOR_REQ_AUTHSERV, 1); 614 monitor_permit(mon_dispatch, MONITOR_REQ_AUTH2_READ_BANNER, 1); 615 } 616 617#ifdef USE_PAM 618 if (options.use_pam) 619 monitor_permit(mon_dispatch, MONITOR_REQ_PAM_START, 1); 620#endif 621 622 return (0); 623} 624 |
625int mm_answer_auth2_read_banner(int socket, Buffer *m) | 625int mm_answer_auth2_read_banner(int sock, Buffer *m) |
626{ 627 char *banner; 628 629 buffer_clear(m); 630 banner = auth2_read_banner(); 631 buffer_put_cstring(m, banner != NULL ? banner : ""); | 626{ 627 char *banner; 628 629 buffer_clear(m); 630 banner = auth2_read_banner(); 631 buffer_put_cstring(m, banner != NULL ? banner : ""); |
632 mm_request_send(socket, MONITOR_ANS_AUTH2_READ_BANNER, m); | 632 mm_request_send(sock, MONITOR_ANS_AUTH2_READ_BANNER, m); |
633 634 if (banner != NULL) 635 xfree(banner); 636 637 return (0); 638} 639 640int | 633 634 if (banner != NULL) 635 xfree(banner); 636 637 return (0); 638} 639 640int |
641mm_answer_authserv(int socket, Buffer *m) | 641mm_answer_authserv(int sock, Buffer *m) |
642{ 643 monitor_permit_authentications(1); 644 645 authctxt->service = buffer_get_string(m, NULL); 646 authctxt->style = buffer_get_string(m, NULL); 647 debug3("%s: service=%s, style=%s", 648 __func__, authctxt->service, authctxt->style); 649 650 if (strlen(authctxt->style) == 0) { 651 xfree(authctxt->style); 652 authctxt->style = NULL; 653 } 654 655 return (0); 656} 657 658int | 642{ 643 monitor_permit_authentications(1); 644 645 authctxt->service = buffer_get_string(m, NULL); 646 authctxt->style = buffer_get_string(m, NULL); 647 debug3("%s: service=%s, style=%s", 648 __func__, authctxt->service, authctxt->style); 649 650 if (strlen(authctxt->style) == 0) { 651 xfree(authctxt->style); 652 authctxt->style = NULL; 653 } 654 655 return (0); 656} 657 658int |
659mm_answer_authpassword(int socket, Buffer *m) | 659mm_answer_authpassword(int sock, Buffer *m) |
660{ 661 static int call_count; 662 char *passwd; 663 int authenticated; 664 u_int plen; 665 666 passwd = buffer_get_string(m, &plen); 667 /* Only authenticate if the context is valid */ 668 authenticated = options.password_authentication && 669 auth_password(authctxt, passwd); 670 memset(passwd, 0, strlen(passwd)); 671 xfree(passwd); 672 673 buffer_clear(m); 674 buffer_put_int(m, authenticated); 675 676 debug3("%s: sending result %d", __func__, authenticated); | 660{ 661 static int call_count; 662 char *passwd; 663 int authenticated; 664 u_int plen; 665 666 passwd = buffer_get_string(m, &plen); 667 /* Only authenticate if the context is valid */ 668 authenticated = options.password_authentication && 669 auth_password(authctxt, passwd); 670 memset(passwd, 0, strlen(passwd)); 671 xfree(passwd); 672 673 buffer_clear(m); 674 buffer_put_int(m, authenticated); 675 676 debug3("%s: sending result %d", __func__, authenticated); |
677 mm_request_send(socket, MONITOR_ANS_AUTHPASSWORD, m); | 677 mm_request_send(sock, MONITOR_ANS_AUTHPASSWORD, m); |
678 679 call_count++; 680 if (plen == 0 && call_count == 1) 681 auth_method = "none"; 682 else 683 auth_method = "password"; 684 685 /* Causes monitor loop to terminate if authenticated */ 686 return (authenticated); 687} 688 689#ifdef BSD_AUTH 690int | 678 679 call_count++; 680 if (plen == 0 && call_count == 1) 681 auth_method = "none"; 682 else 683 auth_method = "password"; 684 685 /* Causes monitor loop to terminate if authenticated */ 686 return (authenticated); 687} 688 689#ifdef BSD_AUTH 690int |
691mm_answer_bsdauthquery(int socket, Buffer *m) | 691mm_answer_bsdauthquery(int sock, Buffer *m) |
692{ 693 char *name, *infotxt; 694 u_int numprompts; 695 u_int *echo_on; 696 char **prompts; 697 u_int success; 698 699 success = bsdauth_query(authctxt, &name, &infotxt, &numprompts, 700 &prompts, &echo_on) < 0 ? 0 : 1; 701 702 buffer_clear(m); 703 buffer_put_int(m, success); 704 if (success) 705 buffer_put_cstring(m, prompts[0]); 706 707 debug3("%s: sending challenge success: %u", __func__, success); | 692{ 693 char *name, *infotxt; 694 u_int numprompts; 695 u_int *echo_on; 696 char **prompts; 697 u_int success; 698 699 success = bsdauth_query(authctxt, &name, &infotxt, &numprompts, 700 &prompts, &echo_on) < 0 ? 0 : 1; 701 702 buffer_clear(m); 703 buffer_put_int(m, success); 704 if (success) 705 buffer_put_cstring(m, prompts[0]); 706 707 debug3("%s: sending challenge success: %u", __func__, success); |
708 mm_request_send(socket, MONITOR_ANS_BSDAUTHQUERY, m); | 708 mm_request_send(sock, MONITOR_ANS_BSDAUTHQUERY, m); |
709 710 if (success) { 711 xfree(name); 712 xfree(infotxt); 713 xfree(prompts); 714 xfree(echo_on); 715 } 716 717 return (0); 718} 719 720int | 709 710 if (success) { 711 xfree(name); 712 xfree(infotxt); 713 xfree(prompts); 714 xfree(echo_on); 715 } 716 717 return (0); 718} 719 720int |
721mm_answer_bsdauthrespond(int socket, Buffer *m) | 721mm_answer_bsdauthrespond(int sock, Buffer *m) |
722{ 723 char *response; 724 int authok; 725 726 if (authctxt->as == 0) 727 fatal("%s: no bsd auth session", __func__); 728 729 response = buffer_get_string(m, NULL); 730 authok = options.challenge_response_authentication && 731 auth_userresponse(authctxt->as, response, 0); 732 authctxt->as = NULL; 733 debug3("%s: <%s> = <%d>", __func__, response, authok); 734 xfree(response); 735 736 buffer_clear(m); 737 buffer_put_int(m, authok); 738 739 debug3("%s: sending authenticated: %d", __func__, authok); | 722{ 723 char *response; 724 int authok; 725 726 if (authctxt->as == 0) 727 fatal("%s: no bsd auth session", __func__); 728 729 response = buffer_get_string(m, NULL); 730 authok = options.challenge_response_authentication && 731 auth_userresponse(authctxt->as, response, 0); 732 authctxt->as = NULL; 733 debug3("%s: <%s> = <%d>", __func__, response, authok); 734 xfree(response); 735 736 buffer_clear(m); 737 buffer_put_int(m, authok); 738 739 debug3("%s: sending authenticated: %d", __func__, authok); |
740 mm_request_send(socket, MONITOR_ANS_BSDAUTHRESPOND, m); | 740 mm_request_send(sock, MONITOR_ANS_BSDAUTHRESPOND, m); |
741 742 auth_method = "bsdauth"; 743 744 return (authok != 0); 745} 746#endif 747 748#ifdef SKEY 749int | 741 742 auth_method = "bsdauth"; 743 744 return (authok != 0); 745} 746#endif 747 748#ifdef SKEY 749int |
750mm_answer_skeyquery(int socket, Buffer *m) | 750mm_answer_skeyquery(int sock, Buffer *m) |
751{ 752 struct skey skey; 753 char challenge[1024]; 754 u_int success; 755 756 success = _compat_skeychallenge(&skey, authctxt->user, challenge, 757 sizeof(challenge)) < 0 ? 0 : 1; 758 759 buffer_clear(m); 760 buffer_put_int(m, success); 761 if (success) 762 buffer_put_cstring(m, challenge); 763 764 debug3("%s: sending challenge success: %u", __func__, success); | 751{ 752 struct skey skey; 753 char challenge[1024]; 754 u_int success; 755 756 success = _compat_skeychallenge(&skey, authctxt->user, challenge, 757 sizeof(challenge)) < 0 ? 0 : 1; 758 759 buffer_clear(m); 760 buffer_put_int(m, success); 761 if (success) 762 buffer_put_cstring(m, challenge); 763 764 debug3("%s: sending challenge success: %u", __func__, success); |
765 mm_request_send(socket, MONITOR_ANS_SKEYQUERY, m); | 765 mm_request_send(sock, MONITOR_ANS_SKEYQUERY, m); |
766 767 return (0); 768} 769 770int | 766 767 return (0); 768} 769 770int |
771mm_answer_skeyrespond(int socket, Buffer *m) | 771mm_answer_skeyrespond(int sock, Buffer *m) |
772{ 773 char *response; 774 int authok; 775 776 response = buffer_get_string(m, NULL); 777 778 authok = (options.challenge_response_authentication && 779 authctxt->valid && 780 skey_haskey(authctxt->pw->pw_name) == 0 && 781 skey_passcheck(authctxt->pw->pw_name, response) != -1); 782 783 xfree(response); 784 785 buffer_clear(m); 786 buffer_put_int(m, authok); 787 788 debug3("%s: sending authenticated: %d", __func__, authok); | 772{ 773 char *response; 774 int authok; 775 776 response = buffer_get_string(m, NULL); 777 778 authok = (options.challenge_response_authentication && 779 authctxt->valid && 780 skey_haskey(authctxt->pw->pw_name) == 0 && 781 skey_passcheck(authctxt->pw->pw_name, response) != -1); 782 783 xfree(response); 784 785 buffer_clear(m); 786 buffer_put_int(m, authok); 787 788 debug3("%s: sending authenticated: %d", __func__, authok); |
789 mm_request_send(socket, MONITOR_ANS_SKEYRESPOND, m); | 789 mm_request_send(sock, MONITOR_ANS_SKEYRESPOND, m); |
790 791 auth_method = "skey"; 792 793 return (authok != 0); 794} 795#endif 796 797#ifdef USE_PAM 798int | 790 791 auth_method = "skey"; 792 793 return (authok != 0); 794} 795#endif 796 797#ifdef USE_PAM 798int |
799mm_answer_pam_start(int socket, Buffer *m) | 799mm_answer_pam_start(int sock, Buffer *m) |
800{ 801 if (!options.use_pam) 802 fatal("UsePAM not set, but ended up in %s anyway", __func__); 803 804 start_pam(authctxt); 805 806 monitor_permit(mon_dispatch, MONITOR_REQ_PAM_ACCOUNT, 1); 807 808 return (0); 809} 810 811int | 800{ 801 if (!options.use_pam) 802 fatal("UsePAM not set, but ended up in %s anyway", __func__); 803 804 start_pam(authctxt); 805 806 monitor_permit(mon_dispatch, MONITOR_REQ_PAM_ACCOUNT, 1); 807 808 return (0); 809} 810 811int |
812mm_answer_pam_account(int socket, Buffer *m) | 812mm_answer_pam_account(int sock, Buffer *m) |
813{ 814 u_int ret; 815 816 if (!options.use_pam) 817 fatal("UsePAM not set, but ended up in %s anyway", __func__); 818 819 ret = do_pam_account(); 820 821 buffer_put_int(m, ret); 822 | 813{ 814 u_int ret; 815 816 if (!options.use_pam) 817 fatal("UsePAM not set, but ended up in %s anyway", __func__); 818 819 ret = do_pam_account(); 820 821 buffer_put_int(m, ret); 822 |
823 mm_request_send(socket, MONITOR_ANS_PAM_ACCOUNT, m); | 823 mm_request_send(sock, MONITOR_ANS_PAM_ACCOUNT, m); |
824 825 return (ret); 826} 827 828static void *sshpam_ctxt, *sshpam_authok; 829extern KbdintDevice sshpam_device; 830 831int | 824 825 return (ret); 826} 827 828static void *sshpam_ctxt, *sshpam_authok; 829extern KbdintDevice sshpam_device; 830 831int |
832mm_answer_pam_init_ctx(int socket, Buffer *m) | 832mm_answer_pam_init_ctx(int sock, Buffer *m) |
833{ 834 835 debug3("%s", __func__); 836 authctxt->user = buffer_get_string(m, NULL); 837 sshpam_ctxt = (sshpam_device.init_ctx)(authctxt); 838 sshpam_authok = NULL; 839 buffer_clear(m); 840 if (sshpam_ctxt != NULL) { 841 monitor_permit(mon_dispatch, MONITOR_REQ_PAM_FREE_CTX, 1); 842 buffer_put_int(m, 1); 843 } else { 844 buffer_put_int(m, 0); 845 } | 833{ 834 835 debug3("%s", __func__); 836 authctxt->user = buffer_get_string(m, NULL); 837 sshpam_ctxt = (sshpam_device.init_ctx)(authctxt); 838 sshpam_authok = NULL; 839 buffer_clear(m); 840 if (sshpam_ctxt != NULL) { 841 monitor_permit(mon_dispatch, MONITOR_REQ_PAM_FREE_CTX, 1); 842 buffer_put_int(m, 1); 843 } else { 844 buffer_put_int(m, 0); 845 } |
846 mm_request_send(socket, MONITOR_ANS_PAM_INIT_CTX, m); | 846 mm_request_send(sock, MONITOR_ANS_PAM_INIT_CTX, m); |
847 return (0); 848} 849 850int | 847 return (0); 848} 849 850int |
851mm_answer_pam_query(int socket, Buffer *m) | 851mm_answer_pam_query(int sock, Buffer *m) |
852{ 853 char *name, *info, **prompts; 854 u_int num, *echo_on; 855 int i, ret; 856 857 debug3("%s", __func__); 858 sshpam_authok = NULL; 859 ret = (sshpam_device.query)(sshpam_ctxt, &name, &info, &num, &prompts, &echo_on); --- 12 unchanged lines hidden (view full) --- 872 buffer_put_cstring(m, prompts[i]); 873 xfree(prompts[i]); 874 buffer_put_int(m, echo_on[i]); 875 } 876 if (prompts != NULL) 877 xfree(prompts); 878 if (echo_on != NULL) 879 xfree(echo_on); | 852{ 853 char *name, *info, **prompts; 854 u_int num, *echo_on; 855 int i, ret; 856 857 debug3("%s", __func__); 858 sshpam_authok = NULL; 859 ret = (sshpam_device.query)(sshpam_ctxt, &name, &info, &num, &prompts, &echo_on); --- 12 unchanged lines hidden (view full) --- 872 buffer_put_cstring(m, prompts[i]); 873 xfree(prompts[i]); 874 buffer_put_int(m, echo_on[i]); 875 } 876 if (prompts != NULL) 877 xfree(prompts); 878 if (echo_on != NULL) 879 xfree(echo_on); |
880 mm_request_send(socket, MONITOR_ANS_PAM_QUERY, m); | 880 mm_request_send(sock, MONITOR_ANS_PAM_QUERY, m); |
881 return (0); 882} 883 884int | 881 return (0); 882} 883 884int |
885mm_answer_pam_respond(int socket, Buffer *m) | 885mm_answer_pam_respond(int sock, Buffer *m) |
886{ 887 char **resp; 888 u_int num; 889 int i, ret; 890 891 debug3("%s", __func__); 892 sshpam_authok = NULL; 893 num = buffer_get_int(m); --- 5 unchanged lines hidden (view full) --- 899 for (i = 0; i < num; ++i) 900 xfree(resp[i]); 901 xfree(resp); 902 } else { 903 ret = (sshpam_device.respond)(sshpam_ctxt, num, NULL); 904 } 905 buffer_clear(m); 906 buffer_put_int(m, ret); | 886{ 887 char **resp; 888 u_int num; 889 int i, ret; 890 891 debug3("%s", __func__); 892 sshpam_authok = NULL; 893 num = buffer_get_int(m); --- 5 unchanged lines hidden (view full) --- 899 for (i = 0; i < num; ++i) 900 xfree(resp[i]); 901 xfree(resp); 902 } else { 903 ret = (sshpam_device.respond)(sshpam_ctxt, num, NULL); 904 } 905 buffer_clear(m); 906 buffer_put_int(m, ret); |
907 mm_request_send(socket, MONITOR_ANS_PAM_RESPOND, m); | 907 mm_request_send(sock, MONITOR_ANS_PAM_RESPOND, m); |
908 auth_method = "keyboard-interactive/pam"; 909 if (ret == 0) 910 sshpam_authok = sshpam_ctxt; 911 return (0); 912} 913 914int | 908 auth_method = "keyboard-interactive/pam"; 909 if (ret == 0) 910 sshpam_authok = sshpam_ctxt; 911 return (0); 912} 913 914int |
915mm_answer_pam_free_ctx(int socket, Buffer *m) | 915mm_answer_pam_free_ctx(int sock, Buffer *m) |
916{ 917 918 debug3("%s", __func__); 919 (sshpam_device.free_ctx)(sshpam_ctxt); 920 buffer_clear(m); | 916{ 917 918 debug3("%s", __func__); 919 (sshpam_device.free_ctx)(sshpam_ctxt); 920 buffer_clear(m); |
921 mm_request_send(socket, MONITOR_ANS_PAM_FREE_CTX, m); | 921 mm_request_send(sock, MONITOR_ANS_PAM_FREE_CTX, m); |
922 return (sshpam_authok == sshpam_ctxt); 923} 924#endif 925 926static void 927mm_append_debug(Buffer *m) 928{ 929 if (auth_debug_init && buffer_len(&auth_debug)) { 930 debug3("%s: Appending debug messages for child", __func__); 931 buffer_append(m, buffer_ptr(&auth_debug), 932 buffer_len(&auth_debug)); 933 buffer_clear(&auth_debug); 934 } 935} 936 937int | 922 return (sshpam_authok == sshpam_ctxt); 923} 924#endif 925 926static void 927mm_append_debug(Buffer *m) 928{ 929 if (auth_debug_init && buffer_len(&auth_debug)) { 930 debug3("%s: Appending debug messages for child", __func__); 931 buffer_append(m, buffer_ptr(&auth_debug), 932 buffer_len(&auth_debug)); 933 buffer_clear(&auth_debug); 934 } 935} 936 937int |
938mm_answer_keyallowed(int socket, Buffer *m) | 938mm_answer_keyallowed(int sock, Buffer *m) |
939{ 940 Key *key; 941 char *cuser, *chost; 942 u_char *blob; 943 u_int bloblen; 944 enum mm_keytype type = 0; 945 int allowed = 0; 946 --- 53 unchanged lines hidden (view full) --- 1000 __func__, key, allowed ? "allowed" : "disallowed"); 1001 1002 buffer_clear(m); 1003 buffer_put_int(m, allowed); 1004 buffer_put_int(m, forced_command != NULL); 1005 1006 mm_append_debug(m); 1007 | 939{ 940 Key *key; 941 char *cuser, *chost; 942 u_char *blob; 943 u_int bloblen; 944 enum mm_keytype type = 0; 945 int allowed = 0; 946 --- 53 unchanged lines hidden (view full) --- 1000 __func__, key, allowed ? "allowed" : "disallowed"); 1001 1002 buffer_clear(m); 1003 buffer_put_int(m, allowed); 1004 buffer_put_int(m, forced_command != NULL); 1005 1006 mm_append_debug(m); 1007 |
1008 mm_request_send(socket, MONITOR_ANS_KEYALLOWED, m); | 1008 mm_request_send(sock, MONITOR_ANS_KEYALLOWED, m); |
1009 1010 if (type == MM_RSAHOSTKEY) 1011 monitor_permit(mon_dispatch, MONITOR_REQ_RSACHALLENGE, allowed); 1012 1013 return (0); 1014} 1015 1016static int --- 104 unchanged lines hidden (view full) --- 1121 1122 if (buffer_len(&b) != 0) 1123 fail++; 1124 buffer_free(&b); 1125 return (fail == 0); 1126} 1127 1128int | 1009 1010 if (type == MM_RSAHOSTKEY) 1011 monitor_permit(mon_dispatch, MONITOR_REQ_RSACHALLENGE, allowed); 1012 1013 return (0); 1014} 1015 1016static int --- 104 unchanged lines hidden (view full) --- 1121 1122 if (buffer_len(&b) != 0) 1123 fail++; 1124 buffer_free(&b); 1125 return (fail == 0); 1126} 1127 1128int |
1129mm_answer_keyverify(int socket, Buffer *m) | 1129mm_answer_keyverify(int sock, Buffer *m) |
1130{ 1131 Key *key; 1132 u_char *signature, *data, *blob; 1133 u_int signaturelen, datalen, bloblen; 1134 int verified = 0; 1135 int valid_data = 0; 1136 1137 blob = buffer_get_string(m, &bloblen); --- 33 unchanged lines hidden (view full) --- 1171 xfree(data); 1172 1173 auth_method = key_blobtype == MM_USERKEY ? "publickey" : "hostbased"; 1174 1175 monitor_reset_key_state(); 1176 1177 buffer_clear(m); 1178 buffer_put_int(m, verified); | 1130{ 1131 Key *key; 1132 u_char *signature, *data, *blob; 1133 u_int signaturelen, datalen, bloblen; 1134 int verified = 0; 1135 int valid_data = 0; 1136 1137 blob = buffer_get_string(m, &bloblen); --- 33 unchanged lines hidden (view full) --- 1171 xfree(data); 1172 1173 auth_method = key_blobtype == MM_USERKEY ? "publickey" : "hostbased"; 1174 1175 monitor_reset_key_state(); 1176 1177 buffer_clear(m); 1178 buffer_put_int(m, verified); |
1179 mm_request_send(socket, MONITOR_ANS_KEYVERIFY, m); | 1179 mm_request_send(sock, MONITOR_ANS_KEYVERIFY, m); |
1180 1181 return (verified); 1182} 1183 1184static void 1185mm_record_login(Session *s, struct passwd *pw) 1186{ 1187 socklen_t fromlen; --- 25 unchanged lines hidden (view full) --- 1213 if (s->ttyfd != -1) { 1214 debug3("%s: tty %s ptyfd %d", __func__, s->tty, s->ptyfd); 1215 session_pty_cleanup2(s); 1216 } 1217 s->used = 0; 1218} 1219 1220int | 1180 1181 return (verified); 1182} 1183 1184static void 1185mm_record_login(Session *s, struct passwd *pw) 1186{ 1187 socklen_t fromlen; --- 25 unchanged lines hidden (view full) --- 1213 if (s->ttyfd != -1) { 1214 debug3("%s: tty %s ptyfd %d", __func__, s->tty, s->ptyfd); 1215 session_pty_cleanup2(s); 1216 } 1217 s->used = 0; 1218} 1219 1220int |
1221mm_answer_pty(int socket, Buffer *m) | 1221mm_answer_pty(int sock, Buffer *m) |
1222{ 1223 extern struct monitor *pmonitor; 1224 Session *s; 1225 int res, fd0; 1226 1227 debug3("%s entering", __func__); 1228 1229 buffer_clear(m); --- 5 unchanged lines hidden (view full) --- 1235 s->pid = pmonitor->m_pid; 1236 res = pty_allocate(&s->ptyfd, &s->ttyfd, s->tty, sizeof(s->tty)); 1237 if (res == 0) 1238 goto error; 1239 pty_setowner(authctxt->pw, s->tty); 1240 1241 buffer_put_int(m, 1); 1242 buffer_put_cstring(m, s->tty); | 1222{ 1223 extern struct monitor *pmonitor; 1224 Session *s; 1225 int res, fd0; 1226 1227 debug3("%s entering", __func__); 1228 1229 buffer_clear(m); --- 5 unchanged lines hidden (view full) --- 1235 s->pid = pmonitor->m_pid; 1236 res = pty_allocate(&s->ptyfd, &s->ttyfd, s->tty, sizeof(s->tty)); 1237 if (res == 0) 1238 goto error; 1239 pty_setowner(authctxt->pw, s->tty); 1240 1241 buffer_put_int(m, 1); 1242 buffer_put_cstring(m, s->tty); |
1243 mm_request_send(socket, MONITOR_ANS_PTY, m); | |
1244 | 1243 |
1245 mm_send_fd(socket, s->ptyfd); 1246 mm_send_fd(socket, s->ttyfd); 1247 | |
1248 /* We need to trick ttyslot */ 1249 if (dup2(s->ttyfd, 0) == -1) 1250 fatal("%s: dup2", __func__); 1251 1252 mm_record_login(s, authctxt->pw); 1253 1254 /* Now we can close the file descriptor again */ 1255 close(0); 1256 | 1244 /* We need to trick ttyslot */ 1245 if (dup2(s->ttyfd, 0) == -1) 1246 fatal("%s: dup2", __func__); 1247 1248 mm_record_login(s, authctxt->pw); 1249 1250 /* Now we can close the file descriptor again */ 1251 close(0); 1252 |
1253 /* send messages generated by record_login */ 1254 buffer_put_string(m, buffer_ptr(&loginmsg), buffer_len(&loginmsg)); 1255 buffer_clear(&loginmsg); 1256 1257 mm_request_send(sock, MONITOR_ANS_PTY, m); 1258 1259 mm_send_fd(sock, s->ptyfd); 1260 mm_send_fd(sock, s->ttyfd); 1261 |
|
1257 /* make sure nothing uses fd 0 */ 1258 if ((fd0 = open(_PATH_DEVNULL, O_RDONLY)) < 0) 1259 fatal("%s: open(/dev/null): %s", __func__, strerror(errno)); 1260 if (fd0 != 0) 1261 error("%s: fd0 %d != 0", __func__, fd0); 1262 1263 /* slave is not needed */ 1264 close(s->ttyfd); --- 4 unchanged lines hidden (view full) --- 1269 debug3("%s: tty %s ptyfd %d", __func__, s->tty, s->ttyfd); 1270 1271 return (0); 1272 1273 error: 1274 if (s != NULL) 1275 mm_session_close(s); 1276 buffer_put_int(m, 0); | 1262 /* make sure nothing uses fd 0 */ 1263 if ((fd0 = open(_PATH_DEVNULL, O_RDONLY)) < 0) 1264 fatal("%s: open(/dev/null): %s", __func__, strerror(errno)); 1265 if (fd0 != 0) 1266 error("%s: fd0 %d != 0", __func__, fd0); 1267 1268 /* slave is not needed */ 1269 close(s->ttyfd); --- 4 unchanged lines hidden (view full) --- 1274 debug3("%s: tty %s ptyfd %d", __func__, s->tty, s->ttyfd); 1275 1276 return (0); 1277 1278 error: 1279 if (s != NULL) 1280 mm_session_close(s); 1281 buffer_put_int(m, 0); |
1277 mm_request_send(socket, MONITOR_ANS_PTY, m); | 1282 mm_request_send(sock, MONITOR_ANS_PTY, m); |
1278 return (0); 1279} 1280 1281int | 1283 return (0); 1284} 1285 1286int |
1282mm_answer_pty_cleanup(int socket, Buffer *m) | 1287mm_answer_pty_cleanup(int sock, Buffer *m) |
1283{ 1284 Session *s; 1285 char *tty; 1286 1287 debug3("%s entering", __func__); 1288 1289 tty = buffer_get_string(m, NULL); 1290 if ((s = session_by_tty(tty)) != NULL) 1291 mm_session_close(s); 1292 buffer_clear(m); 1293 xfree(tty); 1294 return (0); 1295} 1296 1297int | 1288{ 1289 Session *s; 1290 char *tty; 1291 1292 debug3("%s entering", __func__); 1293 1294 tty = buffer_get_string(m, NULL); 1295 if ((s = session_by_tty(tty)) != NULL) 1296 mm_session_close(s); 1297 buffer_clear(m); 1298 xfree(tty); 1299 return (0); 1300} 1301 1302int |
1298mm_answer_sesskey(int socket, Buffer *m) | 1303mm_answer_sesskey(int sock, Buffer *m) |
1299{ 1300 BIGNUM *p; 1301 int rsafail; 1302 1303 /* Turn off permissions */ 1304 monitor_permit(mon_dispatch, MONITOR_REQ_SESSKEY, 1); 1305 1306 if ((p = BN_new()) == NULL) --- 4 unchanged lines hidden (view full) --- 1311 rsafail = ssh1_session_key(p); 1312 1313 buffer_clear(m); 1314 buffer_put_int(m, rsafail); 1315 buffer_put_bignum2(m, p); 1316 1317 BN_clear_free(p); 1318 | 1304{ 1305 BIGNUM *p; 1306 int rsafail; 1307 1308 /* Turn off permissions */ 1309 monitor_permit(mon_dispatch, MONITOR_REQ_SESSKEY, 1); 1310 1311 if ((p = BN_new()) == NULL) --- 4 unchanged lines hidden (view full) --- 1316 rsafail = ssh1_session_key(p); 1317 1318 buffer_clear(m); 1319 buffer_put_int(m, rsafail); 1320 buffer_put_bignum2(m, p); 1321 1322 BN_clear_free(p); 1323 |
1319 mm_request_send(socket, MONITOR_ANS_SESSKEY, m); | 1324 mm_request_send(sock, MONITOR_ANS_SESSKEY, m); |
1320 1321 /* Turn on permissions for sessid passing */ 1322 monitor_permit(mon_dispatch, MONITOR_REQ_SESSID, 1); 1323 1324 return (0); 1325} 1326 1327int | 1325 1326 /* Turn on permissions for sessid passing */ 1327 monitor_permit(mon_dispatch, MONITOR_REQ_SESSID, 1); 1328 1329 return (0); 1330} 1331 1332int |
1328mm_answer_sessid(int socket, Buffer *m) | 1333mm_answer_sessid(int sock, Buffer *m) |
1329{ 1330 int i; 1331 1332 debug3("%s entering", __func__); 1333 1334 if (buffer_len(m) != 16) 1335 fatal("%s: bad ssh1 session id", __func__); 1336 for (i = 0; i < 16; i++) 1337 session_id[i] = buffer_get_char(m); 1338 1339 /* Turn on permissions for getpwnam */ 1340 monitor_permit(mon_dispatch, MONITOR_REQ_PWNAM, 1); 1341 1342 return (0); 1343} 1344 1345int | 1334{ 1335 int i; 1336 1337 debug3("%s entering", __func__); 1338 1339 if (buffer_len(m) != 16) 1340 fatal("%s: bad ssh1 session id", __func__); 1341 for (i = 0; i < 16; i++) 1342 session_id[i] = buffer_get_char(m); 1343 1344 /* Turn on permissions for getpwnam */ 1345 monitor_permit(mon_dispatch, MONITOR_REQ_PWNAM, 1); 1346 1347 return (0); 1348} 1349 1350int |
1346mm_answer_rsa_keyallowed(int socket, Buffer *m) | 1351mm_answer_rsa_keyallowed(int sock, Buffer *m) |
1347{ 1348 BIGNUM *client_n; 1349 Key *key = NULL; 1350 u_char *blob = NULL; 1351 u_int blen = 0; 1352 int allowed = 0; 1353 1354 debug3("%s entering", __func__); --- 23 unchanged lines hidden (view full) --- 1378 key_bloblen = blen; 1379 key_blobtype = MM_RSAUSERKEY; 1380 } 1381 if (key != NULL) 1382 key_free(key); 1383 1384 mm_append_debug(m); 1385 | 1352{ 1353 BIGNUM *client_n; 1354 Key *key = NULL; 1355 u_char *blob = NULL; 1356 u_int blen = 0; 1357 int allowed = 0; 1358 1359 debug3("%s entering", __func__); --- 23 unchanged lines hidden (view full) --- 1383 key_bloblen = blen; 1384 key_blobtype = MM_RSAUSERKEY; 1385 } 1386 if (key != NULL) 1387 key_free(key); 1388 1389 mm_append_debug(m); 1390 |
1386 mm_request_send(socket, MONITOR_ANS_RSAKEYALLOWED, m); | 1391 mm_request_send(sock, MONITOR_ANS_RSAKEYALLOWED, m); |
1387 1388 monitor_permit(mon_dispatch, MONITOR_REQ_RSACHALLENGE, allowed); 1389 monitor_permit(mon_dispatch, MONITOR_REQ_RSARESPONSE, 0); 1390 return (0); 1391} 1392 1393int | 1392 1393 monitor_permit(mon_dispatch, MONITOR_REQ_RSACHALLENGE, allowed); 1394 monitor_permit(mon_dispatch, MONITOR_REQ_RSARESPONSE, 0); 1395 return (0); 1396} 1397 1398int |
1394mm_answer_rsa_challenge(int socket, Buffer *m) | 1399mm_answer_rsa_challenge(int sock, Buffer *m) |
1395{ 1396 Key *key = NULL; 1397 u_char *blob; 1398 u_int blen; 1399 1400 debug3("%s entering", __func__); 1401 1402 if (!authctxt->valid) --- 9 unchanged lines hidden (view full) --- 1412 if (ssh1_challenge) 1413 BN_clear_free(ssh1_challenge); 1414 ssh1_challenge = auth_rsa_generate_challenge(key); 1415 1416 buffer_clear(m); 1417 buffer_put_bignum2(m, ssh1_challenge); 1418 1419 debug3("%s sending reply", __func__); | 1400{ 1401 Key *key = NULL; 1402 u_char *blob; 1403 u_int blen; 1404 1405 debug3("%s entering", __func__); 1406 1407 if (!authctxt->valid) --- 9 unchanged lines hidden (view full) --- 1417 if (ssh1_challenge) 1418 BN_clear_free(ssh1_challenge); 1419 ssh1_challenge = auth_rsa_generate_challenge(key); 1420 1421 buffer_clear(m); 1422 buffer_put_bignum2(m, ssh1_challenge); 1423 1424 debug3("%s sending reply", __func__); |
1420 mm_request_send(socket, MONITOR_ANS_RSACHALLENGE, m); | 1425 mm_request_send(sock, MONITOR_ANS_RSACHALLENGE, m); |
1421 1422 monitor_permit(mon_dispatch, MONITOR_REQ_RSARESPONSE, 1); 1423 1424 xfree(blob); 1425 key_free(key); 1426 return (0); 1427} 1428 1429int | 1426 1427 monitor_permit(mon_dispatch, MONITOR_REQ_RSARESPONSE, 1); 1428 1429 xfree(blob); 1430 key_free(key); 1431 return (0); 1432} 1433 1434int |
1430mm_answer_rsa_response(int socket, Buffer *m) | 1435mm_answer_rsa_response(int sock, Buffer *m) |
1431{ 1432 Key *key = NULL; 1433 u_char *blob, *response; 1434 u_int blen, len; 1435 int success; 1436 1437 debug3("%s entering", __func__); 1438 --- 22 unchanged lines hidden (view full) --- 1461 1462 /* reset state */ 1463 BN_clear_free(ssh1_challenge); 1464 ssh1_challenge = NULL; 1465 monitor_reset_key_state(); 1466 1467 buffer_clear(m); 1468 buffer_put_int(m, success); | 1436{ 1437 Key *key = NULL; 1438 u_char *blob, *response; 1439 u_int blen, len; 1440 int success; 1441 1442 debug3("%s entering", __func__); 1443 --- 22 unchanged lines hidden (view full) --- 1466 1467 /* reset state */ 1468 BN_clear_free(ssh1_challenge); 1469 ssh1_challenge = NULL; 1470 monitor_reset_key_state(); 1471 1472 buffer_clear(m); 1473 buffer_put_int(m, success); |
1469 mm_request_send(socket, MONITOR_ANS_RSARESPONSE, m); | 1474 mm_request_send(sock, MONITOR_ANS_RSARESPONSE, m); |
1470 1471 return (success); 1472} 1473 1474int | 1475 1476 return (success); 1477} 1478 1479int |
1475mm_answer_term(int socket, Buffer *req) | 1480mm_answer_term(int sock, Buffer *req) |
1476{ 1477 extern struct monitor *pmonitor; 1478 int res, status; 1479 1480 debug3("%s: tearing down sessions", __func__); 1481 1482 /* The child is terminating */ 1483 session_destroy_all(&mm_session_close); 1484 1485 while (waitpid(pmonitor->m_pid, &status, 0) == -1) 1486 if (errno != EINTR) 1487 exit(1); 1488 1489 res = WIFEXITED(status) ? WEXITSTATUS(status) : 1; 1490 1491 /* Terminate process */ | 1481{ 1482 extern struct monitor *pmonitor; 1483 int res, status; 1484 1485 debug3("%s: tearing down sessions", __func__); 1486 1487 /* The child is terminating */ 1488 session_destroy_all(&mm_session_close); 1489 1490 while (waitpid(pmonitor->m_pid, &status, 0) == -1) 1491 if (errno != EINTR) 1492 exit(1); 1493 1494 res = WIFEXITED(status) ? WEXITSTATUS(status) : 1; 1495 1496 /* Terminate process */ |
1492 exit (res); | 1497 exit(res); |
1493} 1494 1495void 1496monitor_apply_keystate(struct monitor *pmonitor) 1497{ 1498 if (compat20) { 1499 set_newkeys(MODE_IN); 1500 set_newkeys(MODE_OUT); --- 50 unchanged lines hidden (view full) --- 1551 memset(kex, 0, sizeof(*kex)); 1552 kex->session_id = buffer_get_string(m, &kex->session_id_len); 1553 if ((session_id2 == NULL) || 1554 (kex->session_id_len != session_id2_len) || 1555 (memcmp(kex->session_id, session_id2, session_id2_len) != 0)) 1556 fatal("mm_get_get: internal error: bad session id"); 1557 kex->we_need = buffer_get_int(m); 1558 kex->kex[KEX_DH_GRP1_SHA1] = kexdh_server; | 1498} 1499 1500void 1501monitor_apply_keystate(struct monitor *pmonitor) 1502{ 1503 if (compat20) { 1504 set_newkeys(MODE_IN); 1505 set_newkeys(MODE_OUT); --- 50 unchanged lines hidden (view full) --- 1556 memset(kex, 0, sizeof(*kex)); 1557 kex->session_id = buffer_get_string(m, &kex->session_id_len); 1558 if ((session_id2 == NULL) || 1559 (kex->session_id_len != session_id2_len) || 1560 (memcmp(kex->session_id, session_id2, session_id2_len) != 0)) 1561 fatal("mm_get_get: internal error: bad session id"); 1562 kex->we_need = buffer_get_int(m); 1563 kex->kex[KEX_DH_GRP1_SHA1] = kexdh_server; |
1564 kex->kex[KEX_DH_GRP14_SHA1] = kexdh_server; |
|
1559 kex->kex[KEX_DH_GEX_SHA1] = kexgex_server; 1560 kex->server = 1; 1561 kex->hostkey_type = buffer_get_int(m); 1562 kex->kex_type = buffer_get_int(m); 1563 blob = buffer_get_string(m, &bloblen); 1564 buffer_init(&kex->my); 1565 buffer_append(&kex->my, blob, bloblen); 1566 xfree(blob); --- 177 unchanged lines hidden (view full) --- 1744 monitor_socketpair(pair); 1745 1746 mon->m_recvfd = pair[0]; 1747 mon->m_sendfd = pair[1]; 1748} 1749 1750#ifdef GSSAPI 1751int | 1565 kex->kex[KEX_DH_GEX_SHA1] = kexgex_server; 1566 kex->server = 1; 1567 kex->hostkey_type = buffer_get_int(m); 1568 kex->kex_type = buffer_get_int(m); 1569 blob = buffer_get_string(m, &bloblen); 1570 buffer_init(&kex->my); 1571 buffer_append(&kex->my, blob, bloblen); 1572 xfree(blob); --- 177 unchanged lines hidden (view full) --- 1750 monitor_socketpair(pair); 1751 1752 mon->m_recvfd = pair[0]; 1753 mon->m_sendfd = pair[1]; 1754} 1755 1756#ifdef GSSAPI 1757int |
1752mm_answer_gss_setup_ctx(int socket, Buffer *m) | 1758mm_answer_gss_setup_ctx(int sock, Buffer *m) |
1753{ | 1759{ |
1754 gss_OID_desc oid; | 1760 gss_OID_desc goid; |
1755 OM_uint32 major; 1756 u_int len; 1757 | 1761 OM_uint32 major; 1762 u_int len; 1763 |
1758 oid.elements = buffer_get_string(m, &len); 1759 oid.length = len; | 1764 goid.elements = buffer_get_string(m, &len); 1765 goid.length = len; |
1760 | 1766 |
1761 major = ssh_gssapi_server_ctx(&gsscontext, &oid); | 1767 major = ssh_gssapi_server_ctx(&gsscontext, &goid); |
1762 | 1768 |
1763 xfree(oid.elements); | 1769 xfree(goid.elements); |
1764 1765 buffer_clear(m); 1766 buffer_put_int(m, major); 1767 | 1770 1771 buffer_clear(m); 1772 buffer_put_int(m, major); 1773 |
1768 mm_request_send(socket,MONITOR_ANS_GSSSETUP, m); | 1774 mm_request_send(sock,MONITOR_ANS_GSSSETUP, m); |
1769 1770 /* Now we have a context, enable the step */ 1771 monitor_permit(mon_dispatch, MONITOR_REQ_GSSSTEP, 1); 1772 1773 return (0); 1774} 1775 1776int | 1775 1776 /* Now we have a context, enable the step */ 1777 monitor_permit(mon_dispatch, MONITOR_REQ_GSSSTEP, 1); 1778 1779 return (0); 1780} 1781 1782int |
1777mm_answer_gss_accept_ctx(int socket, Buffer *m) | 1783mm_answer_gss_accept_ctx(int sock, Buffer *m) |
1778{ 1779 gss_buffer_desc in; 1780 gss_buffer_desc out = GSS_C_EMPTY_BUFFER; 1781 OM_uint32 major,minor; 1782 OM_uint32 flags = 0; /* GSI needs this */ 1783 u_int len; 1784 1785 in.value = buffer_get_string(m, &len); 1786 in.length = len; 1787 major = ssh_gssapi_accept_ctx(gsscontext, &in, &out, &flags); 1788 xfree(in.value); 1789 1790 buffer_clear(m); 1791 buffer_put_int(m, major); 1792 buffer_put_string(m, out.value, out.length); 1793 buffer_put_int(m, flags); | 1784{ 1785 gss_buffer_desc in; 1786 gss_buffer_desc out = GSS_C_EMPTY_BUFFER; 1787 OM_uint32 major,minor; 1788 OM_uint32 flags = 0; /* GSI needs this */ 1789 u_int len; 1790 1791 in.value = buffer_get_string(m, &len); 1792 in.length = len; 1793 major = ssh_gssapi_accept_ctx(gsscontext, &in, &out, &flags); 1794 xfree(in.value); 1795 1796 buffer_clear(m); 1797 buffer_put_int(m, major); 1798 buffer_put_string(m, out.value, out.length); 1799 buffer_put_int(m, flags); |
1794 mm_request_send(socket, MONITOR_ANS_GSSSTEP, m); | 1800 mm_request_send(sock, MONITOR_ANS_GSSSTEP, m); |
1795 1796 gss_release_buffer(&minor, &out); 1797 1798 if (major==GSS_S_COMPLETE) { 1799 monitor_permit(mon_dispatch, MONITOR_REQ_GSSSTEP, 0); 1800 monitor_permit(mon_dispatch, MONITOR_REQ_GSSUSEROK, 1); 1801 monitor_permit(mon_dispatch, MONITOR_REQ_GSSCHECKMIC, 1); 1802 } 1803 return (0); 1804} 1805 1806int | 1801 1802 gss_release_buffer(&minor, &out); 1803 1804 if (major==GSS_S_COMPLETE) { 1805 monitor_permit(mon_dispatch, MONITOR_REQ_GSSSTEP, 0); 1806 monitor_permit(mon_dispatch, MONITOR_REQ_GSSUSEROK, 1); 1807 monitor_permit(mon_dispatch, MONITOR_REQ_GSSCHECKMIC, 1); 1808 } 1809 return (0); 1810} 1811 1812int |
1807mm_answer_gss_checkmic(int socket, Buffer *m) | 1813mm_answer_gss_checkmic(int sock, Buffer *m) |
1808{ 1809 gss_buffer_desc gssbuf, mic; 1810 OM_uint32 ret; 1811 u_int len; 1812 1813 gssbuf.value = buffer_get_string(m, &len); 1814 gssbuf.length = len; 1815 mic.value = buffer_get_string(m, &len); 1816 mic.length = len; 1817 1818 ret = ssh_gssapi_checkmic(gsscontext, &gssbuf, &mic); 1819 1820 xfree(gssbuf.value); 1821 xfree(mic.value); 1822 1823 buffer_clear(m); 1824 buffer_put_int(m, ret); 1825 | 1814{ 1815 gss_buffer_desc gssbuf, mic; 1816 OM_uint32 ret; 1817 u_int len; 1818 1819 gssbuf.value = buffer_get_string(m, &len); 1820 gssbuf.length = len; 1821 mic.value = buffer_get_string(m, &len); 1822 mic.length = len; 1823 1824 ret = ssh_gssapi_checkmic(gsscontext, &gssbuf, &mic); 1825 1826 xfree(gssbuf.value); 1827 xfree(mic.value); 1828 1829 buffer_clear(m); 1830 buffer_put_int(m, ret); 1831 |
1826 mm_request_send(socket, MONITOR_ANS_GSSCHECKMIC, m); | 1832 mm_request_send(sock, MONITOR_ANS_GSSCHECKMIC, m); |
1827 1828 if (!GSS_ERROR(ret)) 1829 monitor_permit(mon_dispatch, MONITOR_REQ_GSSUSEROK, 1); 1830 1831 return (0); 1832} 1833 1834int | 1833 1834 if (!GSS_ERROR(ret)) 1835 monitor_permit(mon_dispatch, MONITOR_REQ_GSSUSEROK, 1); 1836 1837 return (0); 1838} 1839 1840int |
1835mm_answer_gss_userok(int socket, Buffer *m) | 1841mm_answer_gss_userok(int sock, Buffer *m) |
1836{ 1837 int authenticated; 1838 1839 authenticated = authctxt->valid && ssh_gssapi_userok(authctxt->user); 1840 1841 buffer_clear(m); 1842 buffer_put_int(m, authenticated); 1843 1844 debug3("%s: sending result %d", __func__, authenticated); | 1842{ 1843 int authenticated; 1844 1845 authenticated = authctxt->valid && ssh_gssapi_userok(authctxt->user); 1846 1847 buffer_clear(m); 1848 buffer_put_int(m, authenticated); 1849 1850 debug3("%s: sending result %d", __func__, authenticated); |
1845 mm_request_send(socket, MONITOR_ANS_GSSUSEROK, m); | 1851 mm_request_send(sock, MONITOR_ANS_GSSUSEROK, m); |
1846 1847 auth_method="gssapi-with-mic"; 1848 1849 /* Monitor loop will terminate if authenticated */ 1850 return (authenticated); 1851} 1852#endif /* GSSAPI */ | 1852 1853 auth_method="gssapi-with-mic"; 1854 1855 /* Monitor loop will terminate if authenticated */ 1856 return (authenticated); 1857} 1858#endif /* GSSAPI */ |