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