Move code out of InitVariables() back into main(), to
[dragonfly.git] / crypto / openssh-3.9p1 / monitor_wrap.c
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:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
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"
28 RCSID("$OpenBSD: monitor_wrap.c,v 1.39 2004/07/17 05:31:41 dtucker Exp $");
29
30 #include <openssl/bn.h>
31 #include <openssl/dh.h>
32
33 #include "ssh.h"
34 #include "dh.h"
35 #include "kex.h"
36 #include "auth.h"
37 #include "auth-options.h"
38 #include "buffer.h"
39 #include "bufaux.h"
40 #include "packet.h"
41 #include "mac.h"
42 #include "log.h"
43 #ifdef TARGET_OS_MAC    /* XXX Broken krb5 headers on Mac */
44 #undef TARGET_OS_MAC
45 #include "zlib.h"
46 #define TARGET_OS_MAC 1
47 #else
48 #include "zlib.h"
49 #endif
50 #include "monitor.h"
51 #include "monitor_wrap.h"
52 #include "xmalloc.h"
53 #include "atomicio.h"
54 #include "monitor_fdpass.h"
55 #include "getput.h"
56 #include "servconf.h"
57
58 #include "auth.h"
59 #include "channels.h"
60 #include "session.h"
61
62 #ifdef GSSAPI
63 #include "ssh-gss.h"
64 #endif
65
66 /* Imports */
67 extern int compat20;
68 extern Newkeys *newkeys[];
69 extern z_stream incoming_stream;
70 extern z_stream outgoing_stream;
71 extern struct monitor *pmonitor;
72 extern Buffer input, output;
73 extern Buffer loginmsg;
74 extern ServerOptions options;
75
76 int
77 mm_is_monitor(void)
78 {
79         /*
80          * m_pid is only set in the privileged part, and
81          * points to the unprivileged child.
82          */
83         return (pmonitor && pmonitor->m_pid > 0);
84 }
85
86 void
87 mm_request_send(int sock, enum monitor_reqtype type, Buffer *m)
88 {
89         u_int mlen = buffer_len(m);
90         u_char buf[5];
91
92         debug3("%s entering: type %d", __func__, type);
93
94         PUT_32BIT(buf, mlen + 1);
95         buf[4] = (u_char) type;         /* 1st byte of payload is mesg-type */
96         if (atomicio(vwrite, sock, buf, sizeof(buf)) != sizeof(buf))
97                 fatal("%s: write", __func__);
98         if (atomicio(vwrite, sock, buffer_ptr(m), mlen) != mlen)
99                 fatal("%s: write", __func__);
100 }
101
102 void
103 mm_request_receive(int sock, Buffer *m)
104 {
105         u_char buf[4];
106         u_int msg_len;
107         ssize_t res;
108
109         debug3("%s entering", __func__);
110
111         res = atomicio(read, sock, buf, sizeof(buf));
112         if (res != sizeof(buf)) {
113                 if (res == 0)
114                         cleanup_exit(255);
115                 fatal("%s: read: %ld", __func__, (long)res);
116         }
117         msg_len = GET_32BIT(buf);
118         if (msg_len > 256 * 1024)
119                 fatal("%s: read: bad msg_len %d", __func__, msg_len);
120         buffer_clear(m);
121         buffer_append_space(m, msg_len);
122         res = atomicio(read, sock, buffer_ptr(m), msg_len);
123         if (res != msg_len)
124                 fatal("%s: read: %ld != msg_len", __func__, (long)res);
125 }
126
127 void
128 mm_request_receive_expect(int sock, enum monitor_reqtype type, Buffer *m)
129 {
130         u_char rtype;
131
132         debug3("%s entering: type %d", __func__, type);
133
134         mm_request_receive(sock, m);
135         rtype = buffer_get_char(m);
136         if (rtype != type)
137                 fatal("%s: read: rtype %d != type %d", __func__,
138                     rtype, type);
139 }
140
141 DH *
142 mm_choose_dh(int min, int nbits, int max)
143 {
144         BIGNUM *p, *g;
145         int success = 0;
146         Buffer m;
147
148         buffer_init(&m);
149         buffer_put_int(&m, min);
150         buffer_put_int(&m, nbits);
151         buffer_put_int(&m, max);
152
153         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_MODULI, &m);
154
155         debug3("%s: waiting for MONITOR_ANS_MODULI", __func__);
156         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_MODULI, &m);
157
158         success = buffer_get_char(&m);
159         if (success == 0)
160                 fatal("%s: MONITOR_ANS_MODULI failed", __func__);
161
162         if ((p = BN_new()) == NULL)
163                 fatal("%s: BN_new failed", __func__);
164         if ((g = BN_new()) == NULL)
165                 fatal("%s: BN_new failed", __func__);
166         buffer_get_bignum2(&m, p);
167         buffer_get_bignum2(&m, g);
168
169         debug3("%s: remaining %d", __func__, buffer_len(&m));
170         buffer_free(&m);
171
172         return (dh_new_group(g, p));
173 }
174
175 int
176 mm_key_sign(Key *key, u_char **sigp, u_int *lenp, u_char *data, u_int datalen)
177 {
178         Kex *kex = *pmonitor->m_pkex;
179         Buffer m;
180
181         debug3("%s entering", __func__);
182
183         buffer_init(&m);
184         buffer_put_int(&m, kex->host_key_index(key));
185         buffer_put_string(&m, data, datalen);
186
187         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_SIGN, &m);
188
189         debug3("%s: waiting for MONITOR_ANS_SIGN", __func__);
190         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_SIGN, &m);
191         *sigp  = buffer_get_string(&m, lenp);
192         buffer_free(&m);
193
194         return (0);
195 }
196
197 struct passwd *
198 mm_getpwnamallow(const char *username)
199 {
200         Buffer m;
201         struct passwd *pw;
202         u_int pwlen;
203
204         debug3("%s entering", __func__);
205
206         buffer_init(&m);
207         buffer_put_cstring(&m, username);
208
209         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PWNAM, &m);
210
211         debug3("%s: waiting for MONITOR_ANS_PWNAM", __func__);
212         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PWNAM, &m);
213
214         if (buffer_get_char(&m) == 0) {
215                 buffer_free(&m);
216                 return (NULL);
217         }
218         pw = buffer_get_string(&m, &pwlen);
219         if (pwlen != sizeof(struct passwd))
220                 fatal("%s: struct passwd size mismatch", __func__);
221         pw->pw_name = buffer_get_string(&m, NULL);
222         pw->pw_passwd = buffer_get_string(&m, NULL);
223         pw->pw_gecos = buffer_get_string(&m, NULL);
224 #ifdef HAVE_PW_CLASS_IN_PASSWD
225         pw->pw_class = buffer_get_string(&m, NULL);
226 #endif
227         pw->pw_dir = buffer_get_string(&m, NULL);
228         pw->pw_shell = buffer_get_string(&m, NULL);
229         buffer_free(&m);
230
231         return (pw);
232 }
233
234 char *
235 mm_auth2_read_banner(void)
236 {
237         Buffer m;
238         char *banner;
239
240         debug3("%s entering", __func__);
241
242         buffer_init(&m);
243         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUTH2_READ_BANNER, &m);
244         buffer_clear(&m);
245
246         mm_request_receive_expect(pmonitor->m_recvfd,
247             MONITOR_ANS_AUTH2_READ_BANNER, &m);
248         banner = buffer_get_string(&m, NULL);
249         buffer_free(&m);
250
251         /* treat empty banner as missing banner */
252         if (strlen(banner) == 0) {
253                 xfree(banner);
254                 banner = NULL;
255         }
256         return (banner);
257 }
258
259 /* Inform the privileged process about service and style */
260
261 void
262 mm_inform_authserv(char *service, char *style)
263 {
264         Buffer m;
265
266         debug3("%s entering", __func__);
267
268         buffer_init(&m);
269         buffer_put_cstring(&m, service);
270         buffer_put_cstring(&m, style ? style : "");
271
272         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUTHSERV, &m);
273
274         buffer_free(&m);
275 }
276
277 /* Do the password authentication */
278 int
279 mm_auth_password(Authctxt *authctxt, char *password)
280 {
281         Buffer m;
282         int authenticated = 0;
283
284         debug3("%s entering", __func__);
285
286         buffer_init(&m);
287         buffer_put_cstring(&m, password);
288         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUTHPASSWORD, &m);
289
290         debug3("%s: waiting for MONITOR_ANS_AUTHPASSWORD", __func__);
291         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_AUTHPASSWORD, &m);
292
293         authenticated = buffer_get_int(&m);
294
295         buffer_free(&m);
296
297         debug3("%s: user %sauthenticated",
298             __func__, authenticated ? "" : "not ");
299         return (authenticated);
300 }
301
302 int
303 mm_user_key_allowed(struct passwd *pw, Key *key)
304 {
305         return (mm_key_allowed(MM_USERKEY, NULL, NULL, key));
306 }
307
308 int
309 mm_hostbased_key_allowed(struct passwd *pw, char *user, char *host,
310     Key *key)
311 {
312         return (mm_key_allowed(MM_HOSTKEY, user, host, key));
313 }
314
315 int
316 mm_auth_rhosts_rsa_key_allowed(struct passwd *pw, char *user,
317     char *host, Key *key)
318 {
319         int ret;
320
321         key->type = KEY_RSA; /* XXX hack for key_to_blob */
322         ret = mm_key_allowed(MM_RSAHOSTKEY, user, host, key);
323         key->type = KEY_RSA1;
324         return (ret);
325 }
326
327 static void
328 mm_send_debug(Buffer *m)
329 {
330         char *msg;
331
332         while (buffer_len(m)) {
333                 msg = buffer_get_string(m, NULL);
334                 debug3("%s: Sending debug: %s", __func__, msg);
335                 packet_send_debug("%s", msg);
336                 xfree(msg);
337         }
338 }
339
340 int
341 mm_key_allowed(enum mm_keytype type, char *user, char *host, Key *key)
342 {
343         Buffer m;
344         u_char *blob;
345         u_int len;
346         int allowed = 0, have_forced = 0;
347
348         debug3("%s entering", __func__);
349
350         /* Convert the key to a blob and the pass it over */
351         if (!key_to_blob(key, &blob, &len))
352                 return (0);
353
354         buffer_init(&m);
355         buffer_put_int(&m, type);
356         buffer_put_cstring(&m, user ? user : "");
357         buffer_put_cstring(&m, host ? host : "");
358         buffer_put_string(&m, blob, len);
359         xfree(blob);
360
361         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_KEYALLOWED, &m);
362
363         debug3("%s: waiting for MONITOR_ANS_KEYALLOWED", __func__);
364         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_KEYALLOWED, &m);
365
366         allowed = buffer_get_int(&m);
367
368         /* fake forced command */
369         auth_clear_options();
370         have_forced = buffer_get_int(&m);
371         forced_command = have_forced ? xstrdup("true") : NULL;
372
373         /* Send potential debug messages */
374         mm_send_debug(&m);
375
376         buffer_free(&m);
377
378         return (allowed);
379 }
380
381 /*
382  * This key verify needs to send the key type along, because the
383  * privileged parent makes the decision if the key is allowed
384  * for authentication.
385  */
386
387 int
388 mm_key_verify(Key *key, u_char *sig, u_int siglen, u_char *data, u_int datalen)
389 {
390         Buffer m;
391         u_char *blob;
392         u_int len;
393         int verified = 0;
394
395         debug3("%s entering", __func__);
396
397         /* Convert the key to a blob and the pass it over */
398         if (!key_to_blob(key, &blob, &len))
399                 return (0);
400
401         buffer_init(&m);
402         buffer_put_string(&m, blob, len);
403         buffer_put_string(&m, sig, siglen);
404         buffer_put_string(&m, data, datalen);
405         xfree(blob);
406
407         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_KEYVERIFY, &m);
408
409         debug3("%s: waiting for MONITOR_ANS_KEYVERIFY", __func__);
410         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_KEYVERIFY, &m);
411
412         verified = buffer_get_int(&m);
413
414         buffer_free(&m);
415
416         return (verified);
417 }
418
419 /* Export key state after authentication */
420 Newkeys *
421 mm_newkeys_from_blob(u_char *blob, int blen)
422 {
423         Buffer b;
424         u_int len;
425         Newkeys *newkey = NULL;
426         Enc *enc;
427         Mac *mac;
428         Comp *comp;
429
430         debug3("%s: %p(%d)", __func__, blob, blen);
431 #ifdef DEBUG_PK
432         dump_base64(stderr, blob, blen);
433 #endif
434         buffer_init(&b);
435         buffer_append(&b, blob, blen);
436
437         newkey = xmalloc(sizeof(*newkey));
438         enc = &newkey->enc;
439         mac = &newkey->mac;
440         comp = &newkey->comp;
441
442         /* Enc structure */
443         enc->name = buffer_get_string(&b, NULL);
444         buffer_get(&b, &enc->cipher, sizeof(enc->cipher));
445         enc->enabled = buffer_get_int(&b);
446         enc->block_size = buffer_get_int(&b);
447         enc->key = buffer_get_string(&b, &enc->key_len);
448         enc->iv = buffer_get_string(&b, &len);
449         if (len != enc->block_size)
450                 fatal("%s: bad ivlen: expected %u != %u", __func__,
451                     enc->block_size, len);
452
453         if (enc->name == NULL || cipher_by_name(enc->name) != enc->cipher)
454                 fatal("%s: bad cipher name %s or pointer %p", __func__,
455                     enc->name, enc->cipher);
456
457         /* Mac structure */
458         mac->name = buffer_get_string(&b, NULL);
459         if (mac->name == NULL || mac_init(mac, mac->name) == -1)
460                 fatal("%s: can not init mac %s", __func__, mac->name);
461         mac->enabled = buffer_get_int(&b);
462         mac->key = buffer_get_string(&b, &len);
463         if (len > mac->key_len)
464                 fatal("%s: bad mac key length: %u > %d", __func__, len,
465                     mac->key_len);
466         mac->key_len = len;
467
468         /* Comp structure */
469         comp->type = buffer_get_int(&b);
470         comp->enabled = buffer_get_int(&b);
471         comp->name = buffer_get_string(&b, NULL);
472
473         len = buffer_len(&b);
474         if (len != 0)
475                 error("newkeys_from_blob: remaining bytes in blob %u", len);
476         buffer_free(&b);
477         return (newkey);
478 }
479
480 int
481 mm_newkeys_to_blob(int mode, u_char **blobp, u_int *lenp)
482 {
483         Buffer b;
484         int len;
485         Enc *enc;
486         Mac *mac;
487         Comp *comp;
488         Newkeys *newkey = newkeys[mode];
489
490         debug3("%s: converting %p", __func__, newkey);
491
492         if (newkey == NULL) {
493                 error("%s: newkey == NULL", __func__);
494                 return 0;
495         }
496         enc = &newkey->enc;
497         mac = &newkey->mac;
498         comp = &newkey->comp;
499
500         buffer_init(&b);
501         /* Enc structure */
502         buffer_put_cstring(&b, enc->name);
503         /* The cipher struct is constant and shared, you export pointer */
504         buffer_append(&b, &enc->cipher, sizeof(enc->cipher));
505         buffer_put_int(&b, enc->enabled);
506         buffer_put_int(&b, enc->block_size);
507         buffer_put_string(&b, enc->key, enc->key_len);
508         packet_get_keyiv(mode, enc->iv, enc->block_size);
509         buffer_put_string(&b, enc->iv, enc->block_size);
510
511         /* Mac structure */
512         buffer_put_cstring(&b, mac->name);
513         buffer_put_int(&b, mac->enabled);
514         buffer_put_string(&b, mac->key, mac->key_len);
515
516         /* Comp structure */
517         buffer_put_int(&b, comp->type);
518         buffer_put_int(&b, comp->enabled);
519         buffer_put_cstring(&b, comp->name);
520
521         len = buffer_len(&b);
522         if (lenp != NULL)
523                 *lenp = len;
524         if (blobp != NULL) {
525                 *blobp = xmalloc(len);
526                 memcpy(*blobp, buffer_ptr(&b), len);
527         }
528         memset(buffer_ptr(&b), 0, len);
529         buffer_free(&b);
530         return len;
531 }
532
533 static void
534 mm_send_kex(Buffer *m, Kex *kex)
535 {
536         buffer_put_string(m, kex->session_id, kex->session_id_len);
537         buffer_put_int(m, kex->we_need);
538         buffer_put_int(m, kex->hostkey_type);
539         buffer_put_int(m, kex->kex_type);
540         buffer_put_string(m, buffer_ptr(&kex->my), buffer_len(&kex->my));
541         buffer_put_string(m, buffer_ptr(&kex->peer), buffer_len(&kex->peer));
542         buffer_put_int(m, kex->flags);
543         buffer_put_cstring(m, kex->client_version_string);
544         buffer_put_cstring(m, kex->server_version_string);
545 }
546
547 void
548 mm_send_keystate(struct monitor *monitor)
549 {
550         Buffer m;
551         u_char *blob, *p;
552         u_int bloblen, plen;
553         u_int32_t seqnr, packets;
554         u_int64_t blocks;
555
556         buffer_init(&m);
557
558         if (!compat20) {
559                 u_char iv[24];
560                 u_char *key;
561                 u_int ivlen, keylen;
562
563                 buffer_put_int(&m, packet_get_protocol_flags());
564
565                 buffer_put_int(&m, packet_get_ssh1_cipher());
566
567                 debug3("%s: Sending ssh1 KEY+IV", __func__);
568                 keylen = packet_get_encryption_key(NULL);
569                 key = xmalloc(keylen+1);        /* add 1 if keylen == 0 */
570                 keylen = packet_get_encryption_key(key);
571                 buffer_put_string(&m, key, keylen);
572                 memset(key, 0, keylen);
573                 xfree(key);
574
575                 ivlen = packet_get_keyiv_len(MODE_OUT);
576                 packet_get_keyiv(MODE_OUT, iv, ivlen);
577                 buffer_put_string(&m, iv, ivlen);
578                 ivlen = packet_get_keyiv_len(MODE_OUT);
579                 packet_get_keyiv(MODE_IN, iv, ivlen);
580                 buffer_put_string(&m, iv, ivlen);
581                 goto skip;
582         } else {
583                 /* Kex for rekeying */
584                 mm_send_kex(&m, *monitor->m_pkex);
585         }
586
587         debug3("%s: Sending new keys: %p %p",
588             __func__, newkeys[MODE_OUT], newkeys[MODE_IN]);
589
590         /* Keys from Kex */
591         if (!mm_newkeys_to_blob(MODE_OUT, &blob, &bloblen))
592                 fatal("%s: conversion of newkeys failed", __func__);
593
594         buffer_put_string(&m, blob, bloblen);
595         xfree(blob);
596
597         if (!mm_newkeys_to_blob(MODE_IN, &blob, &bloblen))
598                 fatal("%s: conversion of newkeys failed", __func__);
599
600         buffer_put_string(&m, blob, bloblen);
601         xfree(blob);
602
603         packet_get_state(MODE_OUT, &seqnr, &blocks, &packets);
604         buffer_put_int(&m, seqnr);
605         buffer_put_int64(&m, blocks);
606         buffer_put_int(&m, packets);
607         packet_get_state(MODE_IN, &seqnr, &blocks, &packets);
608         buffer_put_int(&m, seqnr);
609         buffer_put_int64(&m, blocks);
610         buffer_put_int(&m, packets);
611
612         debug3("%s: New keys have been sent", __func__);
613  skip:
614         /* More key context */
615         plen = packet_get_keycontext(MODE_OUT, NULL);
616         p = xmalloc(plen+1);
617         packet_get_keycontext(MODE_OUT, p);
618         buffer_put_string(&m, p, plen);
619         xfree(p);
620
621         plen = packet_get_keycontext(MODE_IN, NULL);
622         p = xmalloc(plen+1);
623         packet_get_keycontext(MODE_IN, p);
624         buffer_put_string(&m, p, plen);
625         xfree(p);
626
627         /* Compression state */
628         debug3("%s: Sending compression state", __func__);
629         buffer_put_string(&m, &outgoing_stream, sizeof(outgoing_stream));
630         buffer_put_string(&m, &incoming_stream, sizeof(incoming_stream));
631
632         /* Network I/O buffers */
633         buffer_put_string(&m, buffer_ptr(&input), buffer_len(&input));
634         buffer_put_string(&m, buffer_ptr(&output), buffer_len(&output));
635
636         mm_request_send(monitor->m_recvfd, MONITOR_REQ_KEYEXPORT, &m);
637         debug3("%s: Finished sending state", __func__);
638
639         buffer_free(&m);
640 }
641
642 int
643 mm_pty_allocate(int *ptyfd, int *ttyfd, char *namebuf, int namebuflen)
644 {
645         Buffer m;
646         char *p, *msg;
647         int success = 0;
648
649         buffer_init(&m);
650         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PTY, &m);
651
652         debug3("%s: waiting for MONITOR_ANS_PTY", __func__);
653         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PTY, &m);
654
655         success = buffer_get_int(&m);
656         if (success == 0) {
657                 debug3("%s: pty alloc failed", __func__);
658                 buffer_free(&m);
659                 return (0);
660         }
661         p = buffer_get_string(&m, NULL);
662         msg = buffer_get_string(&m, NULL);
663         buffer_free(&m);
664
665         strlcpy(namebuf, p, namebuflen); /* Possible truncation */
666         xfree(p);
667
668         buffer_append(&loginmsg, msg, strlen(msg));
669         xfree(msg);
670
671         *ptyfd = mm_receive_fd(pmonitor->m_recvfd);
672         *ttyfd = mm_receive_fd(pmonitor->m_recvfd);
673
674         /* Success */
675         return (1);
676 }
677
678 void
679 mm_session_pty_cleanup2(Session *s)
680 {
681         Buffer m;
682
683         if (s->ttyfd == -1)
684                 return;
685         buffer_init(&m);
686         buffer_put_cstring(&m, s->tty);
687         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PTYCLEANUP, &m);
688         buffer_free(&m);
689
690         /* closed dup'ed master */
691         if (close(s->ptymaster) < 0)
692                 error("close(s->ptymaster): %s", strerror(errno));
693
694         /* unlink pty from session */
695         s->ttyfd = -1;
696 }
697
698 #ifdef USE_PAM
699 void
700 mm_start_pam(Authctxt *authctxt)
701 {
702         Buffer m;
703
704         debug3("%s entering", __func__);
705         if (!options.use_pam)
706                 fatal("UsePAM=no, but ended up in %s anyway", __func__);
707
708         buffer_init(&m);
709         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_START, &m);
710
711         buffer_free(&m);
712 }
713
714 u_int
715 mm_do_pam_account(void)
716 {
717         Buffer m;
718         u_int ret;
719
720         debug3("%s entering", __func__);
721         if (!options.use_pam)
722                 fatal("UsePAM=no, but ended up in %s anyway", __func__);
723
724         buffer_init(&m);
725         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_ACCOUNT, &m);
726
727         mm_request_receive_expect(pmonitor->m_recvfd,
728             MONITOR_ANS_PAM_ACCOUNT, &m);
729         ret = buffer_get_int(&m);
730
731         buffer_free(&m);
732
733         debug3("%s returning %d", __func__, ret);
734
735         return (ret);
736 }
737
738 void *
739 mm_sshpam_init_ctx(Authctxt *authctxt)
740 {
741         Buffer m;
742         int success;
743
744         debug3("%s", __func__);
745         buffer_init(&m);
746         buffer_put_cstring(&m, authctxt->user);
747         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_INIT_CTX, &m);
748         debug3("%s: waiting for MONITOR_ANS_PAM_INIT_CTX", __func__);
749         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_INIT_CTX, &m);
750         success = buffer_get_int(&m);
751         if (success == 0) {
752                 debug3("%s: pam_init_ctx failed", __func__);
753                 buffer_free(&m);
754                 return (NULL);
755         }
756         buffer_free(&m);
757         return (authctxt);
758 }
759
760 int
761 mm_sshpam_query(void *ctx, char **name, char **info,
762     u_int *num, char ***prompts, u_int **echo_on)
763 {
764         Buffer m;
765         int i, ret;
766
767         debug3("%s", __func__);
768         buffer_init(&m);
769         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_QUERY, &m);
770         debug3("%s: waiting for MONITOR_ANS_PAM_QUERY", __func__);
771         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_QUERY, &m);
772         ret = buffer_get_int(&m);
773         debug3("%s: pam_query returned %d", __func__, ret);
774         *name = buffer_get_string(&m, NULL);
775         *info = buffer_get_string(&m, NULL);
776         *num = buffer_get_int(&m);
777         *prompts = xmalloc((*num + 1) * sizeof(char *));
778         *echo_on = xmalloc((*num + 1) * sizeof(u_int));
779         for (i = 0; i < *num; ++i) {
780                 (*prompts)[i] = buffer_get_string(&m, NULL);
781                 (*echo_on)[i] = buffer_get_int(&m);
782         }
783         buffer_free(&m);
784         return (ret);
785 }
786
787 int
788 mm_sshpam_respond(void *ctx, u_int num, char **resp)
789 {
790         Buffer m;
791         int i, ret;
792
793         debug3("%s", __func__);
794         buffer_init(&m);
795         buffer_put_int(&m, num);
796         for (i = 0; i < num; ++i)
797                 buffer_put_cstring(&m, resp[i]);
798         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_RESPOND, &m);
799         debug3("%s: waiting for MONITOR_ANS_PAM_RESPOND", __func__);
800         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_RESPOND, &m);
801         ret = buffer_get_int(&m);
802         debug3("%s: pam_respond returned %d", __func__, ret);
803         buffer_free(&m);
804         return (ret);
805 }
806
807 void
808 mm_sshpam_free_ctx(void *ctxtp)
809 {
810         Buffer m;
811
812         debug3("%s", __func__);
813         buffer_init(&m);
814         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_FREE_CTX, &m);
815         debug3("%s: waiting for MONITOR_ANS_PAM_FREE_CTX", __func__);
816         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_FREE_CTX, &m);
817         buffer_free(&m);
818 }
819 #endif /* USE_PAM */
820
821 /* Request process termination */
822
823 void
824 mm_terminate(void)
825 {
826         Buffer m;
827
828         buffer_init(&m);
829         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_TERM, &m);
830         buffer_free(&m);
831 }
832
833 int
834 mm_ssh1_session_key(BIGNUM *num)
835 {
836         int rsafail;
837         Buffer m;
838
839         buffer_init(&m);
840         buffer_put_bignum2(&m, num);
841         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_SESSKEY, &m);
842
843         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_SESSKEY, &m);
844
845         rsafail = buffer_get_int(&m);
846         buffer_get_bignum2(&m, num);
847
848         buffer_free(&m);
849
850         return (rsafail);
851 }
852
853 static void
854 mm_chall_setup(char **name, char **infotxt, u_int *numprompts,
855     char ***prompts, u_int **echo_on)
856 {
857         *name = xstrdup("");
858         *infotxt = xstrdup("");
859         *numprompts = 1;
860         *prompts = xmalloc(*numprompts * sizeof(char *));
861         *echo_on = xmalloc(*numprompts * sizeof(u_int));
862         (*echo_on)[0] = 0;
863 }
864
865 int
866 mm_bsdauth_query(void *ctx, char **name, char **infotxt,
867    u_int *numprompts, char ***prompts, u_int **echo_on)
868 {
869         Buffer m;
870         u_int success;
871         char *challenge;
872
873         debug3("%s: entering", __func__);
874
875         buffer_init(&m);
876         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_BSDAUTHQUERY, &m);
877
878         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_BSDAUTHQUERY,
879             &m);
880         success = buffer_get_int(&m);
881         if (success == 0) {
882                 debug3("%s: no challenge", __func__);
883                 buffer_free(&m);
884                 return (-1);
885         }
886
887         /* Get the challenge, and format the response */
888         challenge  = buffer_get_string(&m, NULL);
889         buffer_free(&m);
890
891         mm_chall_setup(name, infotxt, numprompts, prompts, echo_on);
892         (*prompts)[0] = challenge;
893
894         debug3("%s: received challenge: %s", __func__, challenge);
895
896         return (0);
897 }
898
899 int
900 mm_bsdauth_respond(void *ctx, u_int numresponses, char **responses)
901 {
902         Buffer m;
903         int authok;
904
905         debug3("%s: entering", __func__);
906         if (numresponses != 1)
907                 return (-1);
908
909         buffer_init(&m);
910         buffer_put_cstring(&m, responses[0]);
911         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_BSDAUTHRESPOND, &m);
912
913         mm_request_receive_expect(pmonitor->m_recvfd,
914             MONITOR_ANS_BSDAUTHRESPOND, &m);
915
916         authok = buffer_get_int(&m);
917         buffer_free(&m);
918
919         return ((authok == 0) ? -1 : 0);
920 }
921
922 #ifdef SKEY
923 int
924 mm_skey_query(void *ctx, char **name, char **infotxt,
925    u_int *numprompts, char ***prompts, u_int **echo_on)
926 {
927         Buffer m;
928         int len;
929         u_int success;
930         char *p, *challenge;
931
932         debug3("%s: entering", __func__);
933
934         buffer_init(&m);
935         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_SKEYQUERY, &m);
936
937         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_SKEYQUERY,
938             &m);
939         success = buffer_get_int(&m);
940         if (success == 0) {
941                 debug3("%s: no challenge", __func__);
942                 buffer_free(&m);
943                 return (-1);
944         }
945
946         /* Get the challenge, and format the response */
947         challenge  = buffer_get_string(&m, NULL);
948         buffer_free(&m);
949
950         debug3("%s: received challenge: %s", __func__, challenge);
951
952         mm_chall_setup(name, infotxt, numprompts, prompts, echo_on);
953
954         len = strlen(challenge) + strlen(SKEY_PROMPT) + 1;
955         p = xmalloc(len);
956         strlcpy(p, challenge, len);
957         strlcat(p, SKEY_PROMPT, len);
958         (*prompts)[0] = p;
959         xfree(challenge);
960
961         return (0);
962 }
963
964 int
965 mm_skey_respond(void *ctx, u_int numresponses, char **responses)
966 {
967         Buffer m;
968         int authok;
969
970         debug3("%s: entering", __func__);
971         if (numresponses != 1)
972                 return (-1);
973
974         buffer_init(&m);
975         buffer_put_cstring(&m, responses[0]);
976         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_SKEYRESPOND, &m);
977
978         mm_request_receive_expect(pmonitor->m_recvfd,
979             MONITOR_ANS_SKEYRESPOND, &m);
980
981         authok = buffer_get_int(&m);
982         buffer_free(&m);
983
984         return ((authok == 0) ? -1 : 0);
985 }
986 #endif /* SKEY */
987
988 void
989 mm_ssh1_session_id(u_char session_id[16])
990 {
991         Buffer m;
992         int i;
993
994         debug3("%s entering", __func__);
995
996         buffer_init(&m);
997         for (i = 0; i < 16; i++)
998                 buffer_put_char(&m, session_id[i]);
999
1000         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_SESSID, &m);
1001         buffer_free(&m);
1002 }
1003
1004 int
1005 mm_auth_rsa_key_allowed(struct passwd *pw, BIGNUM *client_n, Key **rkey)
1006 {
1007         Buffer m;
1008         Key *key;
1009         u_char *blob;
1010         u_int blen;
1011         int allowed = 0, have_forced = 0;
1012
1013         debug3("%s entering", __func__);
1014
1015         buffer_init(&m);
1016         buffer_put_bignum2(&m, client_n);
1017
1018         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_RSAKEYALLOWED, &m);
1019         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_RSAKEYALLOWED, &m);
1020
1021         allowed = buffer_get_int(&m);
1022
1023         /* fake forced command */
1024         auth_clear_options();
1025         have_forced = buffer_get_int(&m);
1026         forced_command = have_forced ? xstrdup("true") : NULL;
1027
1028         if (allowed && rkey != NULL) {
1029                 blob = buffer_get_string(&m, &blen);
1030                 if ((key = key_from_blob(blob, blen)) == NULL)
1031                         fatal("%s: key_from_blob failed", __func__);
1032                 *rkey = key;
1033                 xfree(blob);
1034         }
1035         mm_send_debug(&m);
1036         buffer_free(&m);
1037
1038         return (allowed);
1039 }
1040
1041 BIGNUM *
1042 mm_auth_rsa_generate_challenge(Key *key)
1043 {
1044         Buffer m;
1045         BIGNUM *challenge;
1046         u_char *blob;
1047         u_int blen;
1048
1049         debug3("%s entering", __func__);
1050
1051         if ((challenge = BN_new()) == NULL)
1052                 fatal("%s: BN_new failed", __func__);
1053
1054         key->type = KEY_RSA;    /* XXX cheat for key_to_blob */
1055         if (key_to_blob(key, &blob, &blen) == 0)
1056                 fatal("%s: key_to_blob failed", __func__);
1057         key->type = KEY_RSA1;
1058
1059         buffer_init(&m);
1060         buffer_put_string(&m, blob, blen);
1061         xfree(blob);
1062
1063         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_RSACHALLENGE, &m);
1064         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_RSACHALLENGE, &m);
1065
1066         buffer_get_bignum2(&m, challenge);
1067         buffer_free(&m);
1068
1069         return (challenge);
1070 }
1071
1072 int
1073 mm_auth_rsa_verify_response(Key *key, BIGNUM *p, u_char response[16])
1074 {
1075         Buffer m;
1076         u_char *blob;
1077         u_int blen;
1078         int success = 0;
1079
1080         debug3("%s entering", __func__);
1081
1082         key->type = KEY_RSA;    /* XXX cheat for key_to_blob */
1083         if (key_to_blob(key, &blob, &blen) == 0)
1084                 fatal("%s: key_to_blob failed", __func__);
1085         key->type = KEY_RSA1;
1086
1087         buffer_init(&m);
1088         buffer_put_string(&m, blob, blen);
1089         buffer_put_string(&m, response, 16);
1090         xfree(blob);
1091
1092         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_RSARESPONSE, &m);
1093         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_RSARESPONSE, &m);
1094
1095         success = buffer_get_int(&m);
1096         buffer_free(&m);
1097
1098         return (success);
1099 }
1100
1101 #ifdef GSSAPI
1102 OM_uint32
1103 mm_ssh_gssapi_server_ctx(Gssctxt **ctx, gss_OID goid)
1104 {
1105         Buffer m;
1106         OM_uint32 major;
1107
1108         /* Client doesn't get to see the context */
1109         *ctx = NULL;
1110
1111         buffer_init(&m);
1112         buffer_put_string(&m, goid->elements, goid->length);
1113
1114         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSSETUP, &m);
1115         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSSETUP, &m);
1116
1117         major = buffer_get_int(&m);
1118
1119         buffer_free(&m);
1120         return (major);
1121 }
1122
1123 OM_uint32
1124 mm_ssh_gssapi_accept_ctx(Gssctxt *ctx, gss_buffer_desc *in,
1125     gss_buffer_desc *out, OM_uint32 *flags)
1126 {
1127         Buffer m;
1128         OM_uint32 major;
1129         u_int len;
1130
1131         buffer_init(&m);
1132         buffer_put_string(&m, in->value, in->length);
1133
1134         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSSTEP, &m);
1135         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSSTEP, &m);
1136
1137         major = buffer_get_int(&m);
1138         out->value = buffer_get_string(&m, &len);
1139         out->length = len;
1140         if (flags)
1141                 *flags = buffer_get_int(&m);
1142
1143         buffer_free(&m);
1144
1145         return (major);
1146 }
1147
1148 OM_uint32
1149 mm_ssh_gssapi_checkmic(Gssctxt *ctx, gss_buffer_t gssbuf, gss_buffer_t gssmic)
1150 {
1151         Buffer m;
1152         OM_uint32 major;
1153
1154         buffer_init(&m);
1155         buffer_put_string(&m, gssbuf->value, gssbuf->length);
1156         buffer_put_string(&m, gssmic->value, gssmic->length);
1157
1158         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSCHECKMIC, &m);
1159         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSCHECKMIC,
1160             &m);
1161
1162         major = buffer_get_int(&m);
1163         buffer_free(&m);
1164         return(major);
1165 }
1166
1167 int
1168 mm_ssh_gssapi_userok(char *user)
1169 {
1170         Buffer m;
1171         int authenticated = 0;
1172
1173         buffer_init(&m);
1174
1175         mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSUSEROK, &m);
1176         mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSUSEROK,
1177                                   &m);
1178
1179         authenticated = buffer_get_int(&m);
1180
1181         buffer_free(&m);
1182         debug3("%s: user %sauthenticated",__func__, authenticated ? "" : "not ");
1183         return (authenticated);
1184 }
1185 #endif /* GSSAPI */