Deleted Added
full compact
monitor_wrap.c (113911) monitor_wrap.c (124211)
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_wrap.c,v 1.24 2003/04/01 10:22:21 markus Exp $");
29RCSID("$FreeBSD: head/crypto/openssh/monitor_wrap.c 113911 2003-04-23 17:13:13Z des $");
28RCSID("$OpenBSD: monitor_wrap.c,v 1.31 2003/08/28 12:54:34 markus Exp $");
29RCSID("$FreeBSD: head/crypto/openssh/monitor_wrap.c 124211 2004-01-07 11:16:27Z des $");
30
31#include <openssl/bn.h>
32#include <openssl/dh.h>
33
34#include "ssh.h"
35#include "dh.h"
36#include "kex.h"
37#include "auth.h"

--- 5 unchanged lines hidden (view full) ---

43#include "log.h"
44#include "zlib.h"
45#include "monitor.h"
46#include "monitor_wrap.h"
47#include "xmalloc.h"
48#include "atomicio.h"
49#include "monitor_fdpass.h"
50#include "getput.h"
30
31#include <openssl/bn.h>
32#include <openssl/dh.h>
33
34#include "ssh.h"
35#include "dh.h"
36#include "kex.h"
37#include "auth.h"

--- 5 unchanged lines hidden (view full) ---

43#include "log.h"
44#include "zlib.h"
45#include "monitor.h"
46#include "monitor_wrap.h"
47#include "xmalloc.h"
48#include "atomicio.h"
49#include "monitor_fdpass.h"
50#include "getput.h"
51#include "servconf.h"
51
52#include "auth.h"
53#include "channels.h"
54#include "session.h"
55
52
53#include "auth.h"
54#include "channels.h"
55#include "session.h"
56
57#ifdef GSSAPI
58#include "ssh-gss.h"
59#endif
60
56/* Imports */
57extern int compat20;
58extern Newkeys *newkeys[];
59extern z_stream incoming_stream;
60extern z_stream outgoing_stream;
61extern struct monitor *pmonitor;
62extern Buffer input, output;
61/* Imports */
62extern int compat20;
63extern Newkeys *newkeys[];
64extern z_stream incoming_stream;
65extern z_stream outgoing_stream;
66extern struct monitor *pmonitor;
67extern Buffer input, output;
68extern ServerOptions options;
63
64void
65mm_request_send(int socket, enum monitor_reqtype type, Buffer *m)
66{
67 u_int mlen = buffer_len(m);
68 u_char buf[5];
69
70 debug3("%s entering: type %d", __func__, type);
71
72 PUT_32BIT(buf, mlen + 1);
73 buf[4] = (u_char) type; /* 1st byte of payload is mesg-type */
69
70void
71mm_request_send(int socket, enum monitor_reqtype type, Buffer *m)
72{
73 u_int mlen = buffer_len(m);
74 u_char buf[5];
75
76 debug3("%s entering: type %d", __func__, type);
77
78 PUT_32BIT(buf, mlen + 1);
79 buf[4] = (u_char) type; /* 1st byte of payload is mesg-type */
74 if (atomicio(write, socket, buf, sizeof(buf)) != sizeof(buf))
80 if (atomicio(vwrite, socket, buf, sizeof(buf)) != sizeof(buf))
75 fatal("%s: write", __func__);
81 fatal("%s: write", __func__);
76 if (atomicio(write, socket, buffer_ptr(m), mlen) != mlen)
82 if (atomicio(vwrite, socket, buffer_ptr(m), mlen) != mlen)
77 fatal("%s: write", __func__);
78}
79
80void
81mm_request_receive(int socket, Buffer *m)
82{
83 u_char buf[4];
84 u_int msg_len;

--- 431 unchanged lines hidden (view full) ---

516}
517
518void
519mm_send_keystate(struct monitor *pmonitor)
520{
521 Buffer m;
522 u_char *blob, *p;
523 u_int bloblen, plen;
83 fatal("%s: write", __func__);
84}
85
86void
87mm_request_receive(int socket, Buffer *m)
88{
89 u_char buf[4];
90 u_int msg_len;

--- 431 unchanged lines hidden (view full) ---

522}
523
524void
525mm_send_keystate(struct monitor *pmonitor)
526{
527 Buffer m;
528 u_char *blob, *p;
529 u_int bloblen, plen;
530 u_int32_t seqnr, packets;
531 u_int64_t blocks;
524
525 buffer_init(&m);
526
527 if (!compat20) {
528 u_char iv[24];
529 u_char *key;
530 u_int ivlen, keylen;
531

--- 32 unchanged lines hidden (view full) ---

564 xfree(blob);
565
566 if (!mm_newkeys_to_blob(MODE_IN, &blob, &bloblen))
567 fatal("%s: conversion of newkeys failed", __func__);
568
569 buffer_put_string(&m, blob, bloblen);
570 xfree(blob);
571
532
533 buffer_init(&m);
534
535 if (!compat20) {
536 u_char iv[24];
537 u_char *key;
538 u_int ivlen, keylen;
539

--- 32 unchanged lines hidden (view full) ---

572 xfree(blob);
573
574 if (!mm_newkeys_to_blob(MODE_IN, &blob, &bloblen))
575 fatal("%s: conversion of newkeys failed", __func__);
576
577 buffer_put_string(&m, blob, bloblen);
578 xfree(blob);
579
572 buffer_put_int(&m, packet_get_seqnr(MODE_OUT));
573 buffer_put_int(&m, packet_get_seqnr(MODE_IN));
580 packet_get_state(MODE_OUT, &seqnr, &blocks, &packets);
581 buffer_put_int(&m, seqnr);
582 buffer_put_int64(&m, blocks);
583 buffer_put_int(&m, packets);
584 packet_get_state(MODE_IN, &seqnr, &blocks, &packets);
585 buffer_put_int(&m, seqnr);
586 buffer_put_int64(&m, blocks);
587 buffer_put_int(&m, packets);
574
575 debug3("%s: New keys have been sent", __func__);
576 skip:
577 /* More key context */
578 plen = packet_get_keycontext(MODE_OUT, NULL);
579 p = xmalloc(plen+1);
580 packet_get_keycontext(MODE_OUT, p);
581 buffer_put_string(&m, p, plen);

--- 75 unchanged lines hidden (view full) ---

657
658#ifdef USE_PAM
659void
660mm_start_pam(char *user)
661{
662 Buffer m;
663
664 debug3("%s entering", __func__);
588
589 debug3("%s: New keys have been sent", __func__);
590 skip:
591 /* More key context */
592 plen = packet_get_keycontext(MODE_OUT, NULL);
593 p = xmalloc(plen+1);
594 packet_get_keycontext(MODE_OUT, p);
595 buffer_put_string(&m, p, plen);

--- 75 unchanged lines hidden (view full) ---

671
672#ifdef USE_PAM
673void
674mm_start_pam(char *user)
675{
676 Buffer m;
677
678 debug3("%s entering", __func__);
679 if (!options.use_pam)
680 fatal("UsePAM=no, but ended up in %s anyway", __func__);
665
666 buffer_init(&m);
667 buffer_put_cstring(&m, user);
668
669 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_START, &m);
670
671 buffer_free(&m);
672}
673
681
682 buffer_init(&m);
683 buffer_put_cstring(&m, user);
684
685 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_START, &m);
686
687 buffer_free(&m);
688}
689
690u_int
691mm_do_pam_account(void)
692{
693 Buffer m;
694 u_int ret;
695
696 debug3("%s entering", __func__);
697 if (!options.use_pam)
698 fatal("UsePAM=no, but ended up in %s anyway", __func__);
699
700 buffer_init(&m);
701 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_ACCOUNT, &m);
702
703 mm_request_receive_expect(pmonitor->m_recvfd,
704 MONITOR_ANS_PAM_ACCOUNT, &m);
705 ret = buffer_get_int(&m);
706
707 buffer_free(&m);
708
709 debug3("%s returning %d", __func__, ret);
710
711 return (ret);
712}
713
674void *
714void *
675mm_pam_init_ctx(Authctxt *authctxt)
715mm_sshpam_init_ctx(Authctxt *authctxt)
676{
677 Buffer m;
678 int success;
679
680 debug3("%s", __func__);
681 buffer_init(&m);
682 buffer_put_cstring(&m, authctxt->user);
683 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_INIT_CTX, &m);

--- 5 unchanged lines hidden (view full) ---

689 buffer_free(&m);
690 return (NULL);
691 }
692 buffer_free(&m);
693 return (authctxt);
694}
695
696int
716{
717 Buffer m;
718 int success;
719
720 debug3("%s", __func__);
721 buffer_init(&m);
722 buffer_put_cstring(&m, authctxt->user);
723 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_INIT_CTX, &m);

--- 5 unchanged lines hidden (view full) ---

729 buffer_free(&m);
730 return (NULL);
731 }
732 buffer_free(&m);
733 return (authctxt);
734}
735
736int
697mm_pam_query(void *ctx, char **name, char **info,
737mm_sshpam_query(void *ctx, char **name, char **info,
698 u_int *num, char ***prompts, u_int **echo_on)
699{
700 Buffer m;
701 int i, ret;
702
703 debug3("%s", __func__);
704 buffer_init(&m);
705 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_QUERY, &m);

--- 10 unchanged lines hidden (view full) ---

716 (*prompts)[i] = buffer_get_string(&m, NULL);
717 (*echo_on)[i] = buffer_get_int(&m);
718 }
719 buffer_free(&m);
720 return (ret);
721}
722
723int
738 u_int *num, char ***prompts, u_int **echo_on)
739{
740 Buffer m;
741 int i, ret;
742
743 debug3("%s", __func__);
744 buffer_init(&m);
745 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_QUERY, &m);

--- 10 unchanged lines hidden (view full) ---

756 (*prompts)[i] = buffer_get_string(&m, NULL);
757 (*echo_on)[i] = buffer_get_int(&m);
758 }
759 buffer_free(&m);
760 return (ret);
761}
762
763int
724mm_pam_respond(void *ctx, u_int num, char **resp)
764mm_sshpam_respond(void *ctx, u_int num, char **resp)
725{
726 Buffer m;
727 int i, ret;
728
729 debug3("%s", __func__);
730 buffer_init(&m);
731 buffer_put_int(&m, num);
732 for (i = 0; i < num; ++i)
733 buffer_put_cstring(&m, resp[i]);
734 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_RESPOND, &m);
735 debug3("%s: waiting for MONITOR_ANS_PAM_RESPOND", __func__);
736 mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_RESPOND, &m);
737 ret = buffer_get_int(&m);
738 debug3("%s: pam_respond returned %d", __func__, ret);
739 buffer_free(&m);
740 return (ret);
741}
742
743void
765{
766 Buffer m;
767 int i, ret;
768
769 debug3("%s", __func__);
770 buffer_init(&m);
771 buffer_put_int(&m, num);
772 for (i = 0; i < num; ++i)
773 buffer_put_cstring(&m, resp[i]);
774 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_RESPOND, &m);
775 debug3("%s: waiting for MONITOR_ANS_PAM_RESPOND", __func__);
776 mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_RESPOND, &m);
777 ret = buffer_get_int(&m);
778 debug3("%s: pam_respond returned %d", __func__, ret);
779 buffer_free(&m);
780 return (ret);
781}
782
783void
744mm_pam_free_ctx(void *ctxtp)
784mm_sshpam_free_ctx(void *ctxtp)
745{
746 Buffer m;
747
748 debug3("%s", __func__);
749 buffer_init(&m);
750 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_FREE_CTX, &m);
751 debug3("%s: waiting for MONITOR_ANS_PAM_FREE_CTX", __func__);
752 mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_FREE_CTX, &m);

--- 276 unchanged lines hidden (view full) ---

1029 mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_RSARESPONSE, &m);
1030
1031 success = buffer_get_int(&m);
1032 buffer_free(&m);
1033
1034 return (success);
1035}
1036
785{
786 Buffer m;
787
788 debug3("%s", __func__);
789 buffer_init(&m);
790 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_FREE_CTX, &m);
791 debug3("%s: waiting for MONITOR_ANS_PAM_FREE_CTX", __func__);
792 mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_FREE_CTX, &m);

--- 276 unchanged lines hidden (view full) ---

1069 mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_RSARESPONSE, &m);
1070
1071 success = buffer_get_int(&m);
1072 buffer_free(&m);
1073
1074 return (success);
1075}
1076
1037#ifdef KRB4
1038int
1039mm_auth_krb4(Authctxt *authctxt, void *_auth, char **client, void *_reply)
1077#ifdef GSSAPI
1078OM_uint32
1079mm_ssh_gssapi_server_ctx(Gssctxt **ctx, gss_OID oid)
1040{
1080{
1041 KTEXT auth, reply;
1042 Buffer m;
1043 u_int rlen;
1044 int success = 0;
1045 char *p;
1081 Buffer m;
1082 OM_uint32 major;
1046
1083
1047 debug3("%s entering", __func__);
1048 auth = _auth;
1049 reply = _reply;
1084 /* Client doesn't get to see the context */
1085 *ctx = NULL;
1050
1051 buffer_init(&m);
1086
1087 buffer_init(&m);
1052 buffer_put_string(&m, auth->dat, auth->length);
1088 buffer_put_string(&m, oid->elements, oid->length);
1053
1089
1054 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_KRB4, &m);
1055 mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_KRB4, &m);
1090 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSSETUP, &m);
1091 mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSSETUP, &m);
1056
1092
1057 success = buffer_get_int(&m);
1058 if (success) {
1059 *client = buffer_get_string(&m, NULL);
1060 p = buffer_get_string(&m, &rlen);
1061 if (rlen >= MAX_KTXT_LEN)
1062 fatal("%s: reply from monitor too large", __func__);
1063 reply->length = rlen;
1064 memcpy(reply->dat, p, rlen);
1065 memset(p, 0, rlen);
1066 xfree(p);
1067 }
1093 major = buffer_get_int(&m);
1094
1068 buffer_free(&m);
1095 buffer_free(&m);
1069 return (success);
1096 return (major);
1070}
1097}
1071#endif
1072
1098
1073#ifdef KRB5
1074int
1075mm_auth_krb5(void *ctx, void *argp, char **userp, void *resp)
1099OM_uint32
1100mm_ssh_gssapi_accept_ctx(Gssctxt *ctx, gss_buffer_desc *in,
1101 gss_buffer_desc *out, OM_uint32 *flags)
1076{
1102{
1077 krb5_data *tkt, *reply;
1078 Buffer m;
1103 Buffer m;
1079 int success;
1104 OM_uint32 major;
1105 u_int len;
1080
1106
1081 debug3("%s entering", __func__);
1082 tkt = (krb5_data *) argp;
1083 reply = (krb5_data *) resp;
1084
1085 buffer_init(&m);
1107 buffer_init(&m);
1086 buffer_put_string(&m, tkt->data, tkt->length);
1108 buffer_put_string(&m, in->value, in->length);
1087
1109
1088 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_KRB5, &m);
1089 mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_KRB5, &m);
1110 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSSTEP, &m);
1111 mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSSTEP, &m);
1090
1112
1091 success = buffer_get_int(&m);
1092 if (success) {
1093 u_int len;
1113 major = buffer_get_int(&m);
1114 out->value = buffer_get_string(&m, &len);
1115 out->length = len;
1116 if (flags)
1117 *flags = buffer_get_int(&m);
1094
1118
1095 *userp = buffer_get_string(&m, NULL);
1096 reply->data = buffer_get_string(&m, &len);
1097 reply->length = len;
1098 } else {
1099 memset(reply, 0, sizeof(*reply));
1100 *userp = NULL;
1101 }
1119 buffer_free(&m);
1102
1120
1121 return (major);
1122}
1123
1124int
1125mm_ssh_gssapi_userok(char *user)
1126{
1127 Buffer m;
1128 int authenticated = 0;
1129
1130 buffer_init(&m);
1131
1132 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSUSEROK, &m);
1133 mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSUSEROK,
1134 &m);
1135
1136 authenticated = buffer_get_int(&m);
1137
1103 buffer_free(&m);
1138 buffer_free(&m);
1104 return (success);
1139 debug3("%s: user %sauthenticated",__func__, authenticated ? "" : "not ");
1140 return (authenticated);
1105}
1141}
1106#endif
1142#endif /* GSSAPI */