1/* $OpenBSD: packet.c,v 1.313 2023/12/18 14:45:17 djm Exp $ */
2/*
3 * Author: Tatu Ylonen <ylo@cs.hut.fi>
4 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
5 *                    All rights reserved
6 * This file contains code implementing the packet protocol and communication
7 * with the other side.  This same code is used both on client and server side.
8 *
9 * As far as I am concerned, the code I have written for this software
10 * can be used freely for any purpose.  Any derived versions of this
11 * software must be clearly marked as such, and if the derived work is
12 * incompatible with the protocol description in the RFC file, it must be
13 * called by a name other than "ssh" or "Secure Shell".
14 *
15 *
16 * SSH2 packet format added by Markus Friedl.
17 * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
18 *
19 * Redistribution and use in source and binary forms, with or without
20 * modification, are permitted provided that the following conditions
21 * are met:
22 * 1. Redistributions of source code must retain the above copyright
23 *    notice, this list of conditions and the following disclaimer.
24 * 2. Redistributions in binary form must reproduce the above copyright
25 *    notice, this list of conditions and the following disclaimer in the
26 *    documentation and/or other materials provided with the distribution.
27 *
28 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
29 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
30 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
31 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
32 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
33 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
37 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 */
39
40#include "includes.h"
41
42#include <sys/types.h>
43#include "openbsd-compat/sys-queue.h"
44#include <sys/socket.h>
45#ifdef HAVE_SYS_TIME_H
46# include <sys/time.h>
47#endif
48
49#include <netinet/in.h>
50#include <netinet/ip.h>
51#include <arpa/inet.h>
52
53#include <errno.h>
54#include <netdb.h>
55#include <stdarg.h>
56#include <stdio.h>
57#include <stdlib.h>
58#include <string.h>
59#include <unistd.h>
60#include <limits.h>
61#ifdef HAVE_POLL_H
62#include <poll.h>
63#endif
64#include <signal.h>
65#include <time.h>
66
67/*
68 * Explicitly include OpenSSL before zlib as some versions of OpenSSL have
69 * "free_func" in their headers, which zlib typedefs.
70 */
71#ifdef WITH_OPENSSL
72# include <openssl/bn.h>
73# include <openssl/evp.h>
74# ifdef OPENSSL_HAS_ECC
75#  include <openssl/ec.h>
76# endif
77#endif
78
79#ifdef WITH_ZLIB
80#include <zlib.h>
81#endif
82
83#include "xmalloc.h"
84#include "compat.h"
85#include "ssh2.h"
86#include "cipher.h"
87#include "sshkey.h"
88#include "kex.h"
89#include "digest.h"
90#include "mac.h"
91#include "log.h"
92#include "canohost.h"
93#include "misc.h"
94#include "channels.h"
95#include "ssh.h"
96#include "packet.h"
97#include "ssherr.h"
98#include "sshbuf.h"
99#include "blacklist_client.h"
100
101#ifdef PACKET_DEBUG
102#define DBG(x) x
103#else
104#define DBG(x)
105#endif
106
107#define PACKET_MAX_SIZE (256 * 1024)
108
109struct packet_state {
110	u_int32_t seqnr;
111	u_int32_t packets;
112	u_int64_t blocks;
113	u_int64_t bytes;
114};
115
116struct packet {
117	TAILQ_ENTRY(packet) next;
118	u_char type;
119	struct sshbuf *payload;
120};
121
122struct session_state {
123	/*
124	 * This variable contains the file descriptors used for
125	 * communicating with the other side.  connection_in is used for
126	 * reading; connection_out for writing.  These can be the same
127	 * descriptor, in which case it is assumed to be a socket.
128	 */
129	int connection_in;
130	int connection_out;
131
132	/* Protocol flags for the remote side. */
133	u_int remote_protocol_flags;
134
135	/* Encryption context for receiving data.  Only used for decryption. */
136	struct sshcipher_ctx *receive_context;
137
138	/* Encryption context for sending data.  Only used for encryption. */
139	struct sshcipher_ctx *send_context;
140
141	/* Buffer for raw input data from the socket. */
142	struct sshbuf *input;
143
144	/* Buffer for raw output data going to the socket. */
145	struct sshbuf *output;
146
147	/* Buffer for the partial outgoing packet being constructed. */
148	struct sshbuf *outgoing_packet;
149
150	/* Buffer for the incoming packet currently being processed. */
151	struct sshbuf *incoming_packet;
152
153	/* Scratch buffer for packet compression/decompression. */
154	struct sshbuf *compression_buffer;
155
156#ifdef WITH_ZLIB
157	/* Incoming/outgoing compression dictionaries */
158	z_stream compression_in_stream;
159	z_stream compression_out_stream;
160#endif
161	int compression_in_started;
162	int compression_out_started;
163	int compression_in_failures;
164	int compression_out_failures;
165
166	/* default maximum packet size */
167	u_int max_packet_size;
168
169	/* Flag indicating whether this module has been initialized. */
170	int initialized;
171
172	/* Set to true if the connection is interactive. */
173	int interactive_mode;
174
175	/* Set to true if we are the server side. */
176	int server_side;
177
178	/* Set to true if we are authenticated. */
179	int after_authentication;
180
181	int keep_alive_timeouts;
182
183	/* The maximum time that we will wait to send or receive a packet */
184	int packet_timeout_ms;
185
186	/* Session key information for Encryption and MAC */
187	struct newkeys *newkeys[MODE_MAX];
188	struct packet_state p_read, p_send;
189
190	/* Volume-based rekeying */
191	u_int64_t max_blocks_in, max_blocks_out, rekey_limit;
192
193	/* Time-based rekeying */
194	u_int32_t rekey_interval;	/* how often in seconds */
195	time_t rekey_time;	/* time of last rekeying */
196
197	/* roundup current message to extra_pad bytes */
198	u_char extra_pad;
199
200	/* XXX discard incoming data after MAC error */
201	u_int packet_discard;
202	size_t packet_discard_mac_already;
203	struct sshmac *packet_discard_mac;
204
205	/* Used in packet_read_poll2() */
206	u_int packlen;
207
208	/* Used in packet_send2 */
209	int rekeying;
210
211	/* Used in ssh_packet_send_mux() */
212	int mux;
213
214	/* Used in packet_set_interactive */
215	int set_interactive_called;
216
217	/* Used in packet_set_maxsize */
218	int set_maxsize_called;
219
220	/* One-off warning about weak ciphers */
221	int cipher_warning_done;
222
223	/* Hook for fuzzing inbound packets */
224	ssh_packet_hook_fn *hook_in;
225	void *hook_in_ctx;
226
227	TAILQ_HEAD(, packet) outgoing;
228};
229
230struct ssh *
231ssh_alloc_session_state(void)
232{
233	struct ssh *ssh = NULL;
234	struct session_state *state = NULL;
235
236	if ((ssh = calloc(1, sizeof(*ssh))) == NULL ||
237	    (state = calloc(1, sizeof(*state))) == NULL ||
238	    (ssh->kex = kex_new()) == NULL ||
239	    (state->input = sshbuf_new()) == NULL ||
240	    (state->output = sshbuf_new()) == NULL ||
241	    (state->outgoing_packet = sshbuf_new()) == NULL ||
242	    (state->incoming_packet = sshbuf_new()) == NULL)
243		goto fail;
244	TAILQ_INIT(&state->outgoing);
245	TAILQ_INIT(&ssh->private_keys);
246	TAILQ_INIT(&ssh->public_keys);
247	state->connection_in = -1;
248	state->connection_out = -1;
249	state->max_packet_size = 32768;
250	state->packet_timeout_ms = -1;
251	state->p_send.packets = state->p_read.packets = 0;
252	state->initialized = 1;
253	/*
254	 * ssh_packet_send2() needs to queue packets until
255	 * we've done the initial key exchange.
256	 */
257	state->rekeying = 1;
258	ssh->state = state;
259	return ssh;
260 fail:
261	if (ssh) {
262		kex_free(ssh->kex);
263		free(ssh);
264	}
265	if (state) {
266		sshbuf_free(state->input);
267		sshbuf_free(state->output);
268		sshbuf_free(state->incoming_packet);
269		sshbuf_free(state->outgoing_packet);
270		free(state);
271	}
272	return NULL;
273}
274
275void
276ssh_packet_set_input_hook(struct ssh *ssh, ssh_packet_hook_fn *hook, void *ctx)
277{
278	ssh->state->hook_in = hook;
279	ssh->state->hook_in_ctx = ctx;
280}
281
282/* Returns nonzero if rekeying is in progress */
283int
284ssh_packet_is_rekeying(struct ssh *ssh)
285{
286	return ssh->state->rekeying ||
287	    (ssh->kex != NULL && ssh->kex->done == 0);
288}
289
290/*
291 * Sets the descriptors used for communication.
292 */
293struct ssh *
294ssh_packet_set_connection(struct ssh *ssh, int fd_in, int fd_out)
295{
296	struct session_state *state;
297	const struct sshcipher *none = cipher_by_name("none");
298	int r;
299
300	if (none == NULL) {
301		error_f("cannot load cipher 'none'");
302		return NULL;
303	}
304	if (ssh == NULL)
305		ssh = ssh_alloc_session_state();
306	if (ssh == NULL) {
307		error_f("could not allocate state");
308		return NULL;
309	}
310	state = ssh->state;
311	state->connection_in = fd_in;
312	state->connection_out = fd_out;
313	if ((r = cipher_init(&state->send_context, none,
314	    (const u_char *)"", 0, NULL, 0, CIPHER_ENCRYPT)) != 0 ||
315	    (r = cipher_init(&state->receive_context, none,
316	    (const u_char *)"", 0, NULL, 0, CIPHER_DECRYPT)) != 0) {
317		error_fr(r, "cipher_init failed");
318		free(ssh); /* XXX need ssh_free_session_state? */
319		return NULL;
320	}
321	state->newkeys[MODE_IN] = state->newkeys[MODE_OUT] = NULL;
322	/*
323	 * Cache the IP address of the remote connection for use in error
324	 * messages that might be generated after the connection has closed.
325	 */
326	(void)ssh_remote_ipaddr(ssh);
327	return ssh;
328}
329
330void
331ssh_packet_set_timeout(struct ssh *ssh, int timeout, int count)
332{
333	struct session_state *state = ssh->state;
334
335	if (timeout <= 0 || count <= 0) {
336		state->packet_timeout_ms = -1;
337		return;
338	}
339	if ((INT_MAX / 1000) / count < timeout)
340		state->packet_timeout_ms = INT_MAX;
341	else
342		state->packet_timeout_ms = timeout * count * 1000;
343}
344
345void
346ssh_packet_set_mux(struct ssh *ssh)
347{
348	ssh->state->mux = 1;
349	ssh->state->rekeying = 0;
350	kex_free(ssh->kex);
351	ssh->kex = NULL;
352}
353
354int
355ssh_packet_get_mux(struct ssh *ssh)
356{
357	return ssh->state->mux;
358}
359
360int
361ssh_packet_set_log_preamble(struct ssh *ssh, const char *fmt, ...)
362{
363	va_list args;
364	int r;
365
366	free(ssh->log_preamble);
367	if (fmt == NULL)
368		ssh->log_preamble = NULL;
369	else {
370		va_start(args, fmt);
371		r = vasprintf(&ssh->log_preamble, fmt, args);
372		va_end(args);
373		if (r < 0 || ssh->log_preamble == NULL)
374			return SSH_ERR_ALLOC_FAIL;
375	}
376	return 0;
377}
378
379int
380ssh_packet_stop_discard(struct ssh *ssh)
381{
382	struct session_state *state = ssh->state;
383	int r;
384
385	if (state->packet_discard_mac) {
386		char buf[1024];
387		size_t dlen = PACKET_MAX_SIZE;
388
389		if (dlen > state->packet_discard_mac_already)
390			dlen -= state->packet_discard_mac_already;
391		memset(buf, 'a', sizeof(buf));
392		while (sshbuf_len(state->incoming_packet) < dlen)
393			if ((r = sshbuf_put(state->incoming_packet, buf,
394			    sizeof(buf))) != 0)
395				return r;
396		(void) mac_compute(state->packet_discard_mac,
397		    state->p_read.seqnr,
398		    sshbuf_ptr(state->incoming_packet), dlen,
399		    NULL, 0);
400	}
401	logit("Finished discarding for %.200s port %d",
402	    ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
403	return SSH_ERR_MAC_INVALID;
404}
405
406static int
407ssh_packet_start_discard(struct ssh *ssh, struct sshenc *enc,
408    struct sshmac *mac, size_t mac_already, u_int discard)
409{
410	struct session_state *state = ssh->state;
411	int r;
412
413	if (enc == NULL || !cipher_is_cbc(enc->cipher) || (mac && mac->etm)) {
414		if ((r = sshpkt_disconnect(ssh, "Packet corrupt")) != 0)
415			return r;
416		return SSH_ERR_MAC_INVALID;
417	}
418	/*
419	 * Record number of bytes over which the mac has already
420	 * been computed in order to minimize timing attacks.
421	 */
422	if (mac && mac->enabled) {
423		state->packet_discard_mac = mac;
424		state->packet_discard_mac_already = mac_already;
425	}
426	if (sshbuf_len(state->input) >= discard)
427		return ssh_packet_stop_discard(ssh);
428	state->packet_discard = discard - sshbuf_len(state->input);
429	return 0;
430}
431
432/* Returns 1 if remote host is connected via socket, 0 if not. */
433
434int
435ssh_packet_connection_is_on_socket(struct ssh *ssh)
436{
437	struct session_state *state;
438	struct sockaddr_storage from, to;
439	socklen_t fromlen, tolen;
440
441	if (ssh == NULL || ssh->state == NULL)
442		return 0;
443
444	state = ssh->state;
445	if (state->connection_in == -1 || state->connection_out == -1)
446		return 0;
447	/* filedescriptors in and out are the same, so it's a socket */
448	if (state->connection_in == state->connection_out)
449		return 1;
450	fromlen = sizeof(from);
451	memset(&from, 0, sizeof(from));
452	if (getpeername(state->connection_in, (struct sockaddr *)&from,
453	    &fromlen) == -1)
454		return 0;
455	tolen = sizeof(to);
456	memset(&to, 0, sizeof(to));
457	if (getpeername(state->connection_out, (struct sockaddr *)&to,
458	    &tolen) == -1)
459		return 0;
460	if (fromlen != tolen || memcmp(&from, &to, fromlen) != 0)
461		return 0;
462	if (from.ss_family != AF_INET && from.ss_family != AF_INET6)
463		return 0;
464	return 1;
465}
466
467void
468ssh_packet_get_bytes(struct ssh *ssh, u_int64_t *ibytes, u_int64_t *obytes)
469{
470	if (ibytes)
471		*ibytes = ssh->state->p_read.bytes;
472	if (obytes)
473		*obytes = ssh->state->p_send.bytes;
474}
475
476int
477ssh_packet_connection_af(struct ssh *ssh)
478{
479	return get_sock_af(ssh->state->connection_out);
480}
481
482/* Sets the connection into non-blocking mode. */
483
484void
485ssh_packet_set_nonblocking(struct ssh *ssh)
486{
487	/* Set the socket into non-blocking mode. */
488	set_nonblock(ssh->state->connection_in);
489
490	if (ssh->state->connection_out != ssh->state->connection_in)
491		set_nonblock(ssh->state->connection_out);
492}
493
494/* Returns the socket used for reading. */
495
496int
497ssh_packet_get_connection_in(struct ssh *ssh)
498{
499	return ssh->state->connection_in;
500}
501
502/* Returns the descriptor used for writing. */
503
504int
505ssh_packet_get_connection_out(struct ssh *ssh)
506{
507	return ssh->state->connection_out;
508}
509
510/*
511 * Returns the IP-address of the remote host as a string.  The returned
512 * string must not be freed.
513 */
514
515const char *
516ssh_remote_ipaddr(struct ssh *ssh)
517{
518	int sock;
519
520	/* Check whether we have cached the ipaddr. */
521	if (ssh->remote_ipaddr == NULL) {
522		if (ssh_packet_connection_is_on_socket(ssh)) {
523			sock = ssh->state->connection_in;
524			ssh->remote_ipaddr = get_peer_ipaddr(sock);
525			ssh->remote_port = get_peer_port(sock);
526			ssh->local_ipaddr = get_local_ipaddr(sock);
527			ssh->local_port = get_local_port(sock);
528		} else {
529			ssh->remote_ipaddr = xstrdup("UNKNOWN");
530			ssh->remote_port = 65535;
531			ssh->local_ipaddr = xstrdup("UNKNOWN");
532			ssh->local_port = 65535;
533		}
534	}
535	return ssh->remote_ipaddr;
536}
537
538/* Returns the port number of the remote host. */
539
540int
541ssh_remote_port(struct ssh *ssh)
542{
543	(void)ssh_remote_ipaddr(ssh); /* Will lookup and cache. */
544	return ssh->remote_port;
545}
546
547/*
548 * Returns the IP-address of the local host as a string.  The returned
549 * string must not be freed.
550 */
551
552const char *
553ssh_local_ipaddr(struct ssh *ssh)
554{
555	(void)ssh_remote_ipaddr(ssh); /* Will lookup and cache. */
556	return ssh->local_ipaddr;
557}
558
559/* Returns the port number of the local host. */
560
561int
562ssh_local_port(struct ssh *ssh)
563{
564	(void)ssh_remote_ipaddr(ssh); /* Will lookup and cache. */
565	return ssh->local_port;
566}
567
568/* Returns the routing domain of the input socket, or NULL if unavailable */
569const char *
570ssh_packet_rdomain_in(struct ssh *ssh)
571{
572	if (ssh->rdomain_in != NULL)
573		return ssh->rdomain_in;
574	if (!ssh_packet_connection_is_on_socket(ssh))
575		return NULL;
576	ssh->rdomain_in = get_rdomain(ssh->state->connection_in);
577	return ssh->rdomain_in;
578}
579
580/* Closes the connection and clears and frees internal data structures. */
581
582static void
583ssh_packet_close_internal(struct ssh *ssh, int do_close)
584{
585	struct session_state *state = ssh->state;
586	u_int mode;
587
588	if (!state->initialized)
589		return;
590	state->initialized = 0;
591	if (do_close) {
592		if (state->connection_in == state->connection_out) {
593			close(state->connection_out);
594		} else {
595			close(state->connection_in);
596			close(state->connection_out);
597		}
598	}
599	sshbuf_free(state->input);
600	sshbuf_free(state->output);
601	sshbuf_free(state->outgoing_packet);
602	sshbuf_free(state->incoming_packet);
603	for (mode = 0; mode < MODE_MAX; mode++) {
604		kex_free_newkeys(state->newkeys[mode]);	/* current keys */
605		state->newkeys[mode] = NULL;
606		ssh_clear_newkeys(ssh, mode);		/* next keys */
607	}
608#ifdef WITH_ZLIB
609	/* compression state is in shared mem, so we can only release it once */
610	if (do_close && state->compression_buffer) {
611		sshbuf_free(state->compression_buffer);
612		if (state->compression_out_started) {
613			z_streamp stream = &state->compression_out_stream;
614			debug("compress outgoing: "
615			    "raw data %llu, compressed %llu, factor %.2f",
616				(unsigned long long)stream->total_in,
617				(unsigned long long)stream->total_out,
618				stream->total_in == 0 ? 0.0 :
619				(double) stream->total_out / stream->total_in);
620			if (state->compression_out_failures == 0)
621				deflateEnd(stream);
622		}
623		if (state->compression_in_started) {
624			z_streamp stream = &state->compression_in_stream;
625			debug("compress incoming: "
626			    "raw data %llu, compressed %llu, factor %.2f",
627			    (unsigned long long)stream->total_out,
628			    (unsigned long long)stream->total_in,
629			    stream->total_out == 0 ? 0.0 :
630			    (double) stream->total_in / stream->total_out);
631			if (state->compression_in_failures == 0)
632				inflateEnd(stream);
633		}
634	}
635#endif	/* WITH_ZLIB */
636	cipher_free(state->send_context);
637	cipher_free(state->receive_context);
638	state->send_context = state->receive_context = NULL;
639	if (do_close) {
640		free(ssh->local_ipaddr);
641		ssh->local_ipaddr = NULL;
642		free(ssh->remote_ipaddr);
643		ssh->remote_ipaddr = NULL;
644		free(ssh->state);
645		ssh->state = NULL;
646		kex_free(ssh->kex);
647		ssh->kex = NULL;
648	}
649}
650
651void
652ssh_packet_close(struct ssh *ssh)
653{
654	ssh_packet_close_internal(ssh, 1);
655}
656
657void
658ssh_packet_clear_keys(struct ssh *ssh)
659{
660	ssh_packet_close_internal(ssh, 0);
661}
662
663/* Sets remote side protocol flags. */
664
665void
666ssh_packet_set_protocol_flags(struct ssh *ssh, u_int protocol_flags)
667{
668	ssh->state->remote_protocol_flags = protocol_flags;
669}
670
671/* Returns the remote protocol flags set earlier by the above function. */
672
673u_int
674ssh_packet_get_protocol_flags(struct ssh *ssh)
675{
676	return ssh->state->remote_protocol_flags;
677}
678
679/*
680 * Starts packet compression from the next packet on in both directions.
681 * Level is compression level 1 (fastest) - 9 (slow, best) as in gzip.
682 */
683
684static int
685ssh_packet_init_compression(struct ssh *ssh)
686{
687	if (!ssh->state->compression_buffer &&
688	    ((ssh->state->compression_buffer = sshbuf_new()) == NULL))
689		return SSH_ERR_ALLOC_FAIL;
690	return 0;
691}
692
693#ifdef WITH_ZLIB
694static int
695start_compression_out(struct ssh *ssh, int level)
696{
697	if (level < 1 || level > 9)
698		return SSH_ERR_INVALID_ARGUMENT;
699	debug("Enabling compression at level %d.", level);
700	if (ssh->state->compression_out_started == 1)
701		deflateEnd(&ssh->state->compression_out_stream);
702	switch (deflateInit(&ssh->state->compression_out_stream, level)) {
703	case Z_OK:
704		ssh->state->compression_out_started = 1;
705		break;
706	case Z_MEM_ERROR:
707		return SSH_ERR_ALLOC_FAIL;
708	default:
709		return SSH_ERR_INTERNAL_ERROR;
710	}
711	return 0;
712}
713
714static int
715start_compression_in(struct ssh *ssh)
716{
717	if (ssh->state->compression_in_started == 1)
718		inflateEnd(&ssh->state->compression_in_stream);
719	switch (inflateInit(&ssh->state->compression_in_stream)) {
720	case Z_OK:
721		ssh->state->compression_in_started = 1;
722		break;
723	case Z_MEM_ERROR:
724		return SSH_ERR_ALLOC_FAIL;
725	default:
726		return SSH_ERR_INTERNAL_ERROR;
727	}
728	return 0;
729}
730
731/* XXX remove need for separate compression buffer */
732static int
733compress_buffer(struct ssh *ssh, struct sshbuf *in, struct sshbuf *out)
734{
735	u_char buf[4096];
736	int r, status;
737
738	if (ssh->state->compression_out_started != 1)
739		return SSH_ERR_INTERNAL_ERROR;
740
741	/* This case is not handled below. */
742	if (sshbuf_len(in) == 0)
743		return 0;
744
745	/* Input is the contents of the input buffer. */
746	if ((ssh->state->compression_out_stream.next_in =
747	    sshbuf_mutable_ptr(in)) == NULL)
748		return SSH_ERR_INTERNAL_ERROR;
749	ssh->state->compression_out_stream.avail_in = sshbuf_len(in);
750
751	/* Loop compressing until deflate() returns with avail_out != 0. */
752	do {
753		/* Set up fixed-size output buffer. */
754		ssh->state->compression_out_stream.next_out = buf;
755		ssh->state->compression_out_stream.avail_out = sizeof(buf);
756
757		/* Compress as much data into the buffer as possible. */
758		status = deflate(&ssh->state->compression_out_stream,
759		    Z_PARTIAL_FLUSH);
760		switch (status) {
761		case Z_MEM_ERROR:
762			return SSH_ERR_ALLOC_FAIL;
763		case Z_OK:
764			/* Append compressed data to output_buffer. */
765			if ((r = sshbuf_put(out, buf, sizeof(buf) -
766			    ssh->state->compression_out_stream.avail_out)) != 0)
767				return r;
768			break;
769		case Z_STREAM_ERROR:
770		default:
771			ssh->state->compression_out_failures++;
772			return SSH_ERR_INVALID_FORMAT;
773		}
774	} while (ssh->state->compression_out_stream.avail_out == 0);
775	return 0;
776}
777
778static int
779uncompress_buffer(struct ssh *ssh, struct sshbuf *in, struct sshbuf *out)
780{
781	u_char buf[4096];
782	int r, status;
783
784	if (ssh->state->compression_in_started != 1)
785		return SSH_ERR_INTERNAL_ERROR;
786
787	if ((ssh->state->compression_in_stream.next_in =
788	    sshbuf_mutable_ptr(in)) == NULL)
789		return SSH_ERR_INTERNAL_ERROR;
790	ssh->state->compression_in_stream.avail_in = sshbuf_len(in);
791
792	for (;;) {
793		/* Set up fixed-size output buffer. */
794		ssh->state->compression_in_stream.next_out = buf;
795		ssh->state->compression_in_stream.avail_out = sizeof(buf);
796
797		status = inflate(&ssh->state->compression_in_stream,
798		    Z_SYNC_FLUSH);
799		switch (status) {
800		case Z_OK:
801			if ((r = sshbuf_put(out, buf, sizeof(buf) -
802			    ssh->state->compression_in_stream.avail_out)) != 0)
803				return r;
804			break;
805		case Z_BUF_ERROR:
806			/*
807			 * Comments in zlib.h say that we should keep calling
808			 * inflate() until we get an error.  This appears to
809			 * be the error that we get.
810			 */
811			return 0;
812		case Z_DATA_ERROR:
813			return SSH_ERR_INVALID_FORMAT;
814		case Z_MEM_ERROR:
815			return SSH_ERR_ALLOC_FAIL;
816		case Z_STREAM_ERROR:
817		default:
818			ssh->state->compression_in_failures++;
819			return SSH_ERR_INTERNAL_ERROR;
820		}
821	}
822	/* NOTREACHED */
823}
824
825#else	/* WITH_ZLIB */
826
827static int
828start_compression_out(struct ssh *ssh, int level)
829{
830	return SSH_ERR_INTERNAL_ERROR;
831}
832
833static int
834start_compression_in(struct ssh *ssh)
835{
836	return SSH_ERR_INTERNAL_ERROR;
837}
838
839static int
840compress_buffer(struct ssh *ssh, struct sshbuf *in, struct sshbuf *out)
841{
842	return SSH_ERR_INTERNAL_ERROR;
843}
844
845static int
846uncompress_buffer(struct ssh *ssh, struct sshbuf *in, struct sshbuf *out)
847{
848	return SSH_ERR_INTERNAL_ERROR;
849}
850#endif	/* WITH_ZLIB */
851
852void
853ssh_clear_newkeys(struct ssh *ssh, int mode)
854{
855	if (ssh->kex && ssh->kex->newkeys[mode]) {
856		kex_free_newkeys(ssh->kex->newkeys[mode]);
857		ssh->kex->newkeys[mode] = NULL;
858	}
859}
860
861int
862ssh_set_newkeys(struct ssh *ssh, int mode)
863{
864	struct session_state *state = ssh->state;
865	struct sshenc *enc;
866	struct sshmac *mac;
867	struct sshcomp *comp;
868	struct sshcipher_ctx **ccp;
869	struct packet_state *ps;
870	u_int64_t *max_blocks;
871	const char *wmsg;
872	int r, crypt_type;
873	const char *dir = mode == MODE_OUT ? "out" : "in";
874
875	debug2_f("mode %d", mode);
876
877	if (mode == MODE_OUT) {
878		ccp = &state->send_context;
879		crypt_type = CIPHER_ENCRYPT;
880		ps = &state->p_send;
881		max_blocks = &state->max_blocks_out;
882	} else {
883		ccp = &state->receive_context;
884		crypt_type = CIPHER_DECRYPT;
885		ps = &state->p_read;
886		max_blocks = &state->max_blocks_in;
887	}
888	if (state->newkeys[mode] != NULL) {
889		debug_f("rekeying %s, input %llu bytes %llu blocks, "
890		    "output %llu bytes %llu blocks", dir,
891		    (unsigned long long)state->p_read.bytes,
892		    (unsigned long long)state->p_read.blocks,
893		    (unsigned long long)state->p_send.bytes,
894		    (unsigned long long)state->p_send.blocks);
895		kex_free_newkeys(state->newkeys[mode]);
896		state->newkeys[mode] = NULL;
897	}
898	/* note that both bytes and the seqnr are not reset */
899	ps->packets = ps->blocks = 0;
900	/* move newkeys from kex to state */
901	if ((state->newkeys[mode] = ssh->kex->newkeys[mode]) == NULL)
902		return SSH_ERR_INTERNAL_ERROR;
903	ssh->kex->newkeys[mode] = NULL;
904	enc  = &state->newkeys[mode]->enc;
905	mac  = &state->newkeys[mode]->mac;
906	comp = &state->newkeys[mode]->comp;
907	if (cipher_authlen(enc->cipher) == 0) {
908		if ((r = mac_init(mac)) != 0)
909			return r;
910	}
911	mac->enabled = 1;
912	DBG(debug_f("cipher_init: %s", dir));
913	cipher_free(*ccp);
914	*ccp = NULL;
915	if ((r = cipher_init(ccp, enc->cipher, enc->key, enc->key_len,
916	    enc->iv, enc->iv_len, crypt_type)) != 0)
917		return r;
918	if (!state->cipher_warning_done &&
919	    (wmsg = cipher_warning_message(*ccp)) != NULL) {
920		error("Warning: %s", wmsg);
921		state->cipher_warning_done = 1;
922	}
923	/* Deleting the keys does not gain extra security */
924	/* explicit_bzero(enc->iv,  enc->block_size);
925	   explicit_bzero(enc->key, enc->key_len);
926	   explicit_bzero(mac->key, mac->key_len); */
927	if ((comp->type == COMP_ZLIB ||
928	    (comp->type == COMP_DELAYED &&
929	    state->after_authentication)) && comp->enabled == 0) {
930		if ((r = ssh_packet_init_compression(ssh)) < 0)
931			return r;
932		if (mode == MODE_OUT) {
933			if ((r = start_compression_out(ssh, 6)) != 0)
934				return r;
935		} else {
936			if ((r = start_compression_in(ssh)) != 0)
937				return r;
938		}
939		comp->enabled = 1;
940	}
941	/*
942	 * The 2^(blocksize*2) limit is too expensive for 3DES,
943	 * so enforce a 1GB limit for small blocksizes.
944	 * See RFC4344 section 3.2.
945	 */
946	if (enc->block_size >= 16)
947		*max_blocks = (u_int64_t)1 << (enc->block_size*2);
948	else
949		*max_blocks = ((u_int64_t)1 << 30) / enc->block_size;
950	if (state->rekey_limit)
951		*max_blocks = MINIMUM(*max_blocks,
952		    state->rekey_limit / enc->block_size);
953	debug("rekey %s after %llu blocks", dir,
954	    (unsigned long long)*max_blocks);
955	return 0;
956}
957
958#define MAX_PACKETS	(1U<<31)
959static int
960ssh_packet_need_rekeying(struct ssh *ssh, u_int outbound_packet_len)
961{
962	struct session_state *state = ssh->state;
963	u_int32_t out_blocks;
964
965	/* XXX client can't cope with rekeying pre-auth */
966	if (!state->after_authentication)
967		return 0;
968
969	/* Haven't keyed yet or KEX in progress. */
970	if (ssh_packet_is_rekeying(ssh))
971		return 0;
972
973	/* Peer can't rekey */
974	if (ssh->compat & SSH_BUG_NOREKEY)
975		return 0;
976
977	/*
978	 * Permit one packet in or out per rekey - this allows us to
979	 * make progress when rekey limits are very small.
980	 */
981	if (state->p_send.packets == 0 && state->p_read.packets == 0)
982		return 0;
983
984	/* Time-based rekeying */
985	if (state->rekey_interval != 0 &&
986	    (int64_t)state->rekey_time + state->rekey_interval <= monotime())
987		return 1;
988
989	/*
990	 * Always rekey when MAX_PACKETS sent in either direction
991	 * As per RFC4344 section 3.1 we do this after 2^31 packets.
992	 */
993	if (state->p_send.packets > MAX_PACKETS ||
994	    state->p_read.packets > MAX_PACKETS)
995		return 1;
996
997	/* Rekey after (cipher-specific) maximum blocks */
998	out_blocks = ROUNDUP(outbound_packet_len,
999	    state->newkeys[MODE_OUT]->enc.block_size);
1000	return (state->max_blocks_out &&
1001	    (state->p_send.blocks + out_blocks > state->max_blocks_out)) ||
1002	    (state->max_blocks_in &&
1003	    (state->p_read.blocks > state->max_blocks_in));
1004}
1005
1006int
1007ssh_packet_check_rekey(struct ssh *ssh)
1008{
1009	if (!ssh_packet_need_rekeying(ssh, 0))
1010		return 0;
1011	debug3_f("rekex triggered");
1012	return kex_start_rekex(ssh);
1013}
1014
1015/*
1016 * Delayed compression for SSH2 is enabled after authentication:
1017 * This happens on the server side after a SSH2_MSG_USERAUTH_SUCCESS is sent,
1018 * and on the client side after a SSH2_MSG_USERAUTH_SUCCESS is received.
1019 */
1020static int
1021ssh_packet_enable_delayed_compress(struct ssh *ssh)
1022{
1023	struct session_state *state = ssh->state;
1024	struct sshcomp *comp = NULL;
1025	int r, mode;
1026
1027	/*
1028	 * Remember that we are past the authentication step, so rekeying
1029	 * with COMP_DELAYED will turn on compression immediately.
1030	 */
1031	state->after_authentication = 1;
1032	for (mode = 0; mode < MODE_MAX; mode++) {
1033		/* protocol error: USERAUTH_SUCCESS received before NEWKEYS */
1034		if (state->newkeys[mode] == NULL)
1035			continue;
1036		comp = &state->newkeys[mode]->comp;
1037		if (comp && !comp->enabled && comp->type == COMP_DELAYED) {
1038			if ((r = ssh_packet_init_compression(ssh)) != 0)
1039				return r;
1040			if (mode == MODE_OUT) {
1041				if ((r = start_compression_out(ssh, 6)) != 0)
1042					return r;
1043			} else {
1044				if ((r = start_compression_in(ssh)) != 0)
1045					return r;
1046			}
1047			comp->enabled = 1;
1048		}
1049	}
1050	return 0;
1051}
1052
1053/* Used to mute debug logging for noisy packet types */
1054int
1055ssh_packet_log_type(u_char type)
1056{
1057	switch (type) {
1058	case SSH2_MSG_PING:
1059	case SSH2_MSG_PONG:
1060	case SSH2_MSG_CHANNEL_DATA:
1061	case SSH2_MSG_CHANNEL_EXTENDED_DATA:
1062	case SSH2_MSG_CHANNEL_WINDOW_ADJUST:
1063		return 0;
1064	default:
1065		return 1;
1066	}
1067}
1068
1069/*
1070 * Finalize packet in SSH2 format (compress, mac, encrypt, enqueue)
1071 */
1072int
1073ssh_packet_send2_wrapped(struct ssh *ssh)
1074{
1075	struct session_state *state = ssh->state;
1076	u_char type, *cp, macbuf[SSH_DIGEST_MAX_LENGTH];
1077	u_char tmp, padlen, pad = 0;
1078	u_int authlen = 0, aadlen = 0;
1079	u_int len;
1080	struct sshenc *enc   = NULL;
1081	struct sshmac *mac   = NULL;
1082	struct sshcomp *comp = NULL;
1083	int r, block_size;
1084
1085	if (state->newkeys[MODE_OUT] != NULL) {
1086		enc  = &state->newkeys[MODE_OUT]->enc;
1087		mac  = &state->newkeys[MODE_OUT]->mac;
1088		comp = &state->newkeys[MODE_OUT]->comp;
1089		/* disable mac for authenticated encryption */
1090		if ((authlen = cipher_authlen(enc->cipher)) != 0)
1091			mac = NULL;
1092	}
1093	block_size = enc ? enc->block_size : 8;
1094	aadlen = (mac && mac->enabled && mac->etm) || authlen ? 4 : 0;
1095
1096	type = (sshbuf_ptr(state->outgoing_packet))[5];
1097	if (ssh_packet_log_type(type))
1098		debug3("send packet: type %u", type);
1099#ifdef PACKET_DEBUG
1100	fprintf(stderr, "plain:     ");
1101	sshbuf_dump(state->outgoing_packet, stderr);
1102#endif
1103
1104	if (comp && comp->enabled) {
1105		len = sshbuf_len(state->outgoing_packet);
1106		/* skip header, compress only payload */
1107		if ((r = sshbuf_consume(state->outgoing_packet, 5)) != 0)
1108			goto out;
1109		sshbuf_reset(state->compression_buffer);
1110		if ((r = compress_buffer(ssh, state->outgoing_packet,
1111		    state->compression_buffer)) != 0)
1112			goto out;
1113		sshbuf_reset(state->outgoing_packet);
1114		if ((r = sshbuf_put(state->outgoing_packet,
1115		    "\0\0\0\0\0", 5)) != 0 ||
1116		    (r = sshbuf_putb(state->outgoing_packet,
1117		    state->compression_buffer)) != 0)
1118			goto out;
1119		DBG(debug("compression: raw %d compressed %zd", len,
1120		    sshbuf_len(state->outgoing_packet)));
1121	}
1122
1123	/* sizeof (packet_len + pad_len + payload) */
1124	len = sshbuf_len(state->outgoing_packet);
1125
1126	/*
1127	 * calc size of padding, alloc space, get random data,
1128	 * minimum padding is 4 bytes
1129	 */
1130	len -= aadlen; /* packet length is not encrypted for EtM modes */
1131	padlen = block_size - (len % block_size);
1132	if (padlen < 4)
1133		padlen += block_size;
1134	if (state->extra_pad) {
1135		tmp = state->extra_pad;
1136		state->extra_pad =
1137		    ROUNDUP(state->extra_pad, block_size);
1138		/* check if roundup overflowed */
1139		if (state->extra_pad < tmp)
1140			return SSH_ERR_INVALID_ARGUMENT;
1141		tmp = (len + padlen) % state->extra_pad;
1142		/* Check whether pad calculation below will underflow */
1143		if (tmp > state->extra_pad)
1144			return SSH_ERR_INVALID_ARGUMENT;
1145		pad = state->extra_pad - tmp;
1146		DBG(debug3_f("adding %d (len %d padlen %d extra_pad %d)",
1147		    pad, len, padlen, state->extra_pad));
1148		tmp = padlen;
1149		padlen += pad;
1150		/* Check whether padlen calculation overflowed */
1151		if (padlen < tmp)
1152			return SSH_ERR_INVALID_ARGUMENT; /* overflow */
1153		state->extra_pad = 0;
1154	}
1155	if ((r = sshbuf_reserve(state->outgoing_packet, padlen, &cp)) != 0)
1156		goto out;
1157	if (enc && !cipher_ctx_is_plaintext(state->send_context)) {
1158		/* random padding */
1159		arc4random_buf(cp, padlen);
1160	} else {
1161		/* clear padding */
1162		explicit_bzero(cp, padlen);
1163	}
1164	/* sizeof (packet_len + pad_len + payload + padding) */
1165	len = sshbuf_len(state->outgoing_packet);
1166	cp = sshbuf_mutable_ptr(state->outgoing_packet);
1167	if (cp == NULL) {
1168		r = SSH_ERR_INTERNAL_ERROR;
1169		goto out;
1170	}
1171	/* packet_length includes payload, padding and padding length field */
1172	POKE_U32(cp, len - 4);
1173	cp[4] = padlen;
1174	DBG(debug("send: len %d (includes padlen %d, aadlen %d)",
1175	    len, padlen, aadlen));
1176
1177	/* compute MAC over seqnr and packet(length fields, payload, padding) */
1178	if (mac && mac->enabled && !mac->etm) {
1179		if ((r = mac_compute(mac, state->p_send.seqnr,
1180		    sshbuf_ptr(state->outgoing_packet), len,
1181		    macbuf, sizeof(macbuf))) != 0)
1182			goto out;
1183		DBG(debug("done calc MAC out #%d", state->p_send.seqnr));
1184	}
1185	/* encrypt packet and append to output buffer. */
1186	if ((r = sshbuf_reserve(state->output,
1187	    sshbuf_len(state->outgoing_packet) + authlen, &cp)) != 0)
1188		goto out;
1189	if ((r = cipher_crypt(state->send_context, state->p_send.seqnr, cp,
1190	    sshbuf_ptr(state->outgoing_packet),
1191	    len - aadlen, aadlen, authlen)) != 0)
1192		goto out;
1193	/* append unencrypted MAC */
1194	if (mac && mac->enabled) {
1195		if (mac->etm) {
1196			/* EtM: compute mac over aadlen + cipher text */
1197			if ((r = mac_compute(mac, state->p_send.seqnr,
1198			    cp, len, macbuf, sizeof(macbuf))) != 0)
1199				goto out;
1200			DBG(debug("done calc MAC(EtM) out #%d",
1201			    state->p_send.seqnr));
1202		}
1203		if ((r = sshbuf_put(state->output, macbuf, mac->mac_len)) != 0)
1204			goto out;
1205	}
1206#ifdef PACKET_DEBUG
1207	fprintf(stderr, "encrypted: ");
1208	sshbuf_dump(state->output, stderr);
1209#endif
1210	/* increment sequence number for outgoing packets */
1211	if (++state->p_send.seqnr == 0) {
1212		if ((ssh->kex->flags & KEX_INITIAL) != 0) {
1213			ssh_packet_disconnect(ssh, "outgoing sequence number "
1214			    "wrapped during initial key exchange");
1215		}
1216		logit("outgoing seqnr wraps around");
1217	}
1218	if (++state->p_send.packets == 0)
1219		if (!(ssh->compat & SSH_BUG_NOREKEY))
1220			return SSH_ERR_NEED_REKEY;
1221	state->p_send.blocks += len / block_size;
1222	state->p_send.bytes += len;
1223	sshbuf_reset(state->outgoing_packet);
1224
1225	if (type == SSH2_MSG_NEWKEYS && ssh->kex->kex_strict) {
1226		debug_f("resetting send seqnr %u", state->p_send.seqnr);
1227		state->p_send.seqnr = 0;
1228	}
1229
1230	if (type == SSH2_MSG_NEWKEYS)
1231		r = ssh_set_newkeys(ssh, MODE_OUT);
1232	else if (type == SSH2_MSG_USERAUTH_SUCCESS && state->server_side)
1233		r = ssh_packet_enable_delayed_compress(ssh);
1234	else
1235		r = 0;
1236 out:
1237	return r;
1238}
1239
1240/* returns non-zero if the specified packet type is usec by KEX */
1241static int
1242ssh_packet_type_is_kex(u_char type)
1243{
1244	return
1245	    type >= SSH2_MSG_TRANSPORT_MIN &&
1246	    type <= SSH2_MSG_TRANSPORT_MAX &&
1247	    type != SSH2_MSG_SERVICE_REQUEST &&
1248	    type != SSH2_MSG_SERVICE_ACCEPT &&
1249	    type != SSH2_MSG_EXT_INFO;
1250}
1251
1252int
1253ssh_packet_send2(struct ssh *ssh)
1254{
1255	struct session_state *state = ssh->state;
1256	struct packet *p;
1257	u_char type;
1258	int r, need_rekey;
1259
1260	if (sshbuf_len(state->outgoing_packet) < 6)
1261		return SSH_ERR_INTERNAL_ERROR;
1262	type = sshbuf_ptr(state->outgoing_packet)[5];
1263	need_rekey = !ssh_packet_type_is_kex(type) &&
1264	    ssh_packet_need_rekeying(ssh, sshbuf_len(state->outgoing_packet));
1265
1266	/*
1267	 * During rekeying we can only send key exchange messages.
1268	 * Queue everything else.
1269	 */
1270	if ((need_rekey || state->rekeying) && !ssh_packet_type_is_kex(type)) {
1271		if (need_rekey)
1272			debug3_f("rekex triggered");
1273		debug("enqueue packet: %u", type);
1274		p = calloc(1, sizeof(*p));
1275		if (p == NULL)
1276			return SSH_ERR_ALLOC_FAIL;
1277		p->type = type;
1278		p->payload = state->outgoing_packet;
1279		TAILQ_INSERT_TAIL(&state->outgoing, p, next);
1280		state->outgoing_packet = sshbuf_new();
1281		if (state->outgoing_packet == NULL)
1282			return SSH_ERR_ALLOC_FAIL;
1283		if (need_rekey) {
1284			/*
1285			 * This packet triggered a rekey, so send the
1286			 * KEXINIT now.
1287			 * NB. reenters this function via kex_start_rekex().
1288			 */
1289			return kex_start_rekex(ssh);
1290		}
1291		return 0;
1292	}
1293
1294	/* rekeying starts with sending KEXINIT */
1295	if (type == SSH2_MSG_KEXINIT)
1296		state->rekeying = 1;
1297
1298	if ((r = ssh_packet_send2_wrapped(ssh)) != 0)
1299		return r;
1300
1301	/* after a NEWKEYS message we can send the complete queue */
1302	if (type == SSH2_MSG_NEWKEYS) {
1303		state->rekeying = 0;
1304		state->rekey_time = monotime();
1305		while ((p = TAILQ_FIRST(&state->outgoing))) {
1306			type = p->type;
1307			/*
1308			 * If this packet triggers a rekex, then skip the
1309			 * remaining packets in the queue for now.
1310			 * NB. re-enters this function via kex_start_rekex.
1311			 */
1312			if (ssh_packet_need_rekeying(ssh,
1313			    sshbuf_len(p->payload))) {
1314				debug3_f("queued packet triggered rekex");
1315				return kex_start_rekex(ssh);
1316			}
1317			debug("dequeue packet: %u", type);
1318			sshbuf_free(state->outgoing_packet);
1319			state->outgoing_packet = p->payload;
1320			TAILQ_REMOVE(&state->outgoing, p, next);
1321			memset(p, 0, sizeof(*p));
1322			free(p);
1323			if ((r = ssh_packet_send2_wrapped(ssh)) != 0)
1324				return r;
1325		}
1326	}
1327	return 0;
1328}
1329
1330/*
1331 * Waits until a packet has been received, and returns its type.  Note that
1332 * no other data is processed until this returns, so this function should not
1333 * be used during the interactive session.
1334 */
1335
1336int
1337ssh_packet_read_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
1338{
1339	struct session_state *state = ssh->state;
1340	int len, r, ms_remain = 0;
1341	struct pollfd pfd;
1342	char buf[8192];
1343	struct timeval start;
1344	struct timespec timespec, *timespecp = NULL;
1345
1346	DBG(debug("packet_read()"));
1347
1348	/*
1349	 * Since we are blocking, ensure that all written packets have
1350	 * been sent.
1351	 */
1352	if ((r = ssh_packet_write_wait(ssh)) != 0)
1353		goto out;
1354
1355	/* Stay in the loop until we have received a complete packet. */
1356	for (;;) {
1357		/* Try to read a packet from the buffer. */
1358		if ((r = ssh_packet_read_poll_seqnr(ssh, typep, seqnr_p)) != 0)
1359			break;
1360		/* If we got a packet, return it. */
1361		if (*typep != SSH_MSG_NONE)
1362			break;
1363		/*
1364		 * Otherwise, wait for some data to arrive, add it to the
1365		 * buffer, and try again.
1366		 */
1367		pfd.fd = state->connection_in;
1368		pfd.events = POLLIN;
1369
1370		if (state->packet_timeout_ms > 0) {
1371			ms_remain = state->packet_timeout_ms;
1372			timespecp = &timespec;
1373		}
1374		/* Wait for some data to arrive. */
1375		for (;;) {
1376			if (state->packet_timeout_ms > 0) {
1377				ms_to_timespec(&timespec, ms_remain);
1378				monotime_tv(&start);
1379			}
1380			if ((r = ppoll(&pfd, 1, timespecp, NULL)) >= 0)
1381				break;
1382			if (errno != EAGAIN && errno != EINTR &&
1383			    errno != EWOULDBLOCK) {
1384				r = SSH_ERR_SYSTEM_ERROR;
1385				goto out;
1386			}
1387			if (state->packet_timeout_ms <= 0)
1388				continue;
1389			ms_subtract_diff(&start, &ms_remain);
1390			if (ms_remain <= 0) {
1391				r = 0;
1392				break;
1393			}
1394		}
1395		if (r == 0) {
1396			r = SSH_ERR_CONN_TIMEOUT;
1397			goto out;
1398		}
1399		/* Read data from the socket. */
1400		len = read(state->connection_in, buf, sizeof(buf));
1401		if (len == 0) {
1402			r = SSH_ERR_CONN_CLOSED;
1403			goto out;
1404		}
1405		if (len == -1) {
1406			r = SSH_ERR_SYSTEM_ERROR;
1407			goto out;
1408		}
1409
1410		/* Append it to the buffer. */
1411		if ((r = ssh_packet_process_incoming(ssh, buf, len)) != 0)
1412			goto out;
1413	}
1414 out:
1415	return r;
1416}
1417
1418int
1419ssh_packet_read(struct ssh *ssh)
1420{
1421	u_char type;
1422	int r;
1423
1424	if ((r = ssh_packet_read_seqnr(ssh, &type, NULL)) != 0)
1425		fatal_fr(r, "read");
1426	return type;
1427}
1428
1429static int
1430ssh_packet_read_poll2_mux(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
1431{
1432	struct session_state *state = ssh->state;
1433	const u_char *cp;
1434	size_t need;
1435	int r;
1436
1437	if (ssh->kex)
1438		return SSH_ERR_INTERNAL_ERROR;
1439	*typep = SSH_MSG_NONE;
1440	cp = sshbuf_ptr(state->input);
1441	if (state->packlen == 0) {
1442		if (sshbuf_len(state->input) < 4 + 1)
1443			return 0; /* packet is incomplete */
1444		state->packlen = PEEK_U32(cp);
1445		if (state->packlen < 4 + 1 ||
1446		    state->packlen > PACKET_MAX_SIZE)
1447			return SSH_ERR_MESSAGE_INCOMPLETE;
1448	}
1449	need = state->packlen + 4;
1450	if (sshbuf_len(state->input) < need)
1451		return 0; /* packet is incomplete */
1452	sshbuf_reset(state->incoming_packet);
1453	if ((r = sshbuf_put(state->incoming_packet, cp + 4,
1454	    state->packlen)) != 0 ||
1455	    (r = sshbuf_consume(state->input, need)) != 0 ||
1456	    (r = sshbuf_get_u8(state->incoming_packet, NULL)) != 0 ||
1457	    (r = sshbuf_get_u8(state->incoming_packet, typep)) != 0)
1458		return r;
1459	if (ssh_packet_log_type(*typep))
1460		debug3_f("type %u", *typep);
1461	/* sshbuf_dump(state->incoming_packet, stderr); */
1462	/* reset for next packet */
1463	state->packlen = 0;
1464	return r;
1465}
1466
1467int
1468ssh_packet_read_poll2(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
1469{
1470	struct session_state *state = ssh->state;
1471	u_int padlen, need;
1472	u_char *cp;
1473	u_int maclen, aadlen = 0, authlen = 0, block_size;
1474	struct sshenc *enc   = NULL;
1475	struct sshmac *mac   = NULL;
1476	struct sshcomp *comp = NULL;
1477	int r;
1478
1479	if (state->mux)
1480		return ssh_packet_read_poll2_mux(ssh, typep, seqnr_p);
1481
1482	*typep = SSH_MSG_NONE;
1483
1484	if (state->packet_discard)
1485		return 0;
1486
1487	if (state->newkeys[MODE_IN] != NULL) {
1488		enc  = &state->newkeys[MODE_IN]->enc;
1489		mac  = &state->newkeys[MODE_IN]->mac;
1490		comp = &state->newkeys[MODE_IN]->comp;
1491		/* disable mac for authenticated encryption */
1492		if ((authlen = cipher_authlen(enc->cipher)) != 0)
1493			mac = NULL;
1494	}
1495	maclen = mac && mac->enabled ? mac->mac_len : 0;
1496	block_size = enc ? enc->block_size : 8;
1497	aadlen = (mac && mac->enabled && mac->etm) || authlen ? 4 : 0;
1498
1499	if (aadlen && state->packlen == 0) {
1500		if (cipher_get_length(state->receive_context,
1501		    &state->packlen, state->p_read.seqnr,
1502		    sshbuf_ptr(state->input), sshbuf_len(state->input)) != 0)
1503			return 0;
1504		if (state->packlen < 1 + 4 ||
1505		    state->packlen > PACKET_MAX_SIZE) {
1506#ifdef PACKET_DEBUG
1507			sshbuf_dump(state->input, stderr);
1508#endif
1509			logit("Bad packet length %u.", state->packlen);
1510			if ((r = sshpkt_disconnect(ssh, "Packet corrupt")) != 0)
1511				return r;
1512			return SSH_ERR_CONN_CORRUPT;
1513		}
1514		sshbuf_reset(state->incoming_packet);
1515	} else if (state->packlen == 0) {
1516		/*
1517		 * check if input size is less than the cipher block size,
1518		 * decrypt first block and extract length of incoming packet
1519		 */
1520		if (sshbuf_len(state->input) < block_size)
1521			return 0;
1522		sshbuf_reset(state->incoming_packet);
1523		if ((r = sshbuf_reserve(state->incoming_packet, block_size,
1524		    &cp)) != 0)
1525			goto out;
1526		if ((r = cipher_crypt(state->receive_context,
1527		    state->p_send.seqnr, cp, sshbuf_ptr(state->input),
1528		    block_size, 0, 0)) != 0)
1529			goto out;
1530		state->packlen = PEEK_U32(sshbuf_ptr(state->incoming_packet));
1531		if (state->packlen < 1 + 4 ||
1532		    state->packlen > PACKET_MAX_SIZE) {
1533#ifdef PACKET_DEBUG
1534			fprintf(stderr, "input: \n");
1535			sshbuf_dump(state->input, stderr);
1536			fprintf(stderr, "incoming_packet: \n");
1537			sshbuf_dump(state->incoming_packet, stderr);
1538#endif
1539			logit("Bad packet length %u.", state->packlen);
1540			return ssh_packet_start_discard(ssh, enc, mac, 0,
1541			    PACKET_MAX_SIZE);
1542		}
1543		if ((r = sshbuf_consume(state->input, block_size)) != 0)
1544			goto out;
1545	}
1546	DBG(debug("input: packet len %u", state->packlen+4));
1547
1548	if (aadlen) {
1549		/* only the payload is encrypted */
1550		need = state->packlen;
1551	} else {
1552		/*
1553		 * the payload size and the payload are encrypted, but we
1554		 * have a partial packet of block_size bytes
1555		 */
1556		need = 4 + state->packlen - block_size;
1557	}
1558	DBG(debug("partial packet: block %d, need %d, maclen %d, authlen %d,"
1559	    " aadlen %d", block_size, need, maclen, authlen, aadlen));
1560	if (need % block_size != 0) {
1561		logit("padding error: need %d block %d mod %d",
1562		    need, block_size, need % block_size);
1563		return ssh_packet_start_discard(ssh, enc, mac, 0,
1564		    PACKET_MAX_SIZE - block_size);
1565	}
1566	/*
1567	 * check if the entire packet has been received and
1568	 * decrypt into incoming_packet:
1569	 * 'aadlen' bytes are unencrypted, but authenticated.
1570	 * 'need' bytes are encrypted, followed by either
1571	 * 'authlen' bytes of authentication tag or
1572	 * 'maclen' bytes of message authentication code.
1573	 */
1574	if (sshbuf_len(state->input) < aadlen + need + authlen + maclen)
1575		return 0; /* packet is incomplete */
1576#ifdef PACKET_DEBUG
1577	fprintf(stderr, "read_poll enc/full: ");
1578	sshbuf_dump(state->input, stderr);
1579#endif
1580	/* EtM: check mac over encrypted input */
1581	if (mac && mac->enabled && mac->etm) {
1582		if ((r = mac_check(mac, state->p_read.seqnr,
1583		    sshbuf_ptr(state->input), aadlen + need,
1584		    sshbuf_ptr(state->input) + aadlen + need + authlen,
1585		    maclen)) != 0) {
1586			if (r == SSH_ERR_MAC_INVALID)
1587				logit("Corrupted MAC on input.");
1588			goto out;
1589		}
1590	}
1591	if ((r = sshbuf_reserve(state->incoming_packet, aadlen + need,
1592	    &cp)) != 0)
1593		goto out;
1594	if ((r = cipher_crypt(state->receive_context, state->p_read.seqnr, cp,
1595	    sshbuf_ptr(state->input), need, aadlen, authlen)) != 0)
1596		goto out;
1597	if ((r = sshbuf_consume(state->input, aadlen + need + authlen)) != 0)
1598		goto out;
1599	if (mac && mac->enabled) {
1600		/* Not EtM: check MAC over cleartext */
1601		if (!mac->etm && (r = mac_check(mac, state->p_read.seqnr,
1602		    sshbuf_ptr(state->incoming_packet),
1603		    sshbuf_len(state->incoming_packet),
1604		    sshbuf_ptr(state->input), maclen)) != 0) {
1605			if (r != SSH_ERR_MAC_INVALID)
1606				goto out;
1607			logit("Corrupted MAC on input.");
1608			if (need + block_size > PACKET_MAX_SIZE)
1609				return SSH_ERR_INTERNAL_ERROR;
1610			return ssh_packet_start_discard(ssh, enc, mac,
1611			    sshbuf_len(state->incoming_packet),
1612			    PACKET_MAX_SIZE - need - block_size);
1613		}
1614		/* Remove MAC from input buffer */
1615		DBG(debug("MAC #%d ok", state->p_read.seqnr));
1616		if ((r = sshbuf_consume(state->input, mac->mac_len)) != 0)
1617			goto out;
1618	}
1619
1620	if (seqnr_p != NULL)
1621		*seqnr_p = state->p_read.seqnr;
1622	if (++state->p_read.seqnr == 0) {
1623		if ((ssh->kex->flags & KEX_INITIAL) != 0) {
1624			ssh_packet_disconnect(ssh, "incoming sequence number "
1625			    "wrapped during initial key exchange");
1626		}
1627		logit("incoming seqnr wraps around");
1628	}
1629	if (++state->p_read.packets == 0)
1630		if (!(ssh->compat & SSH_BUG_NOREKEY))
1631			return SSH_ERR_NEED_REKEY;
1632	state->p_read.blocks += (state->packlen + 4) / block_size;
1633	state->p_read.bytes += state->packlen + 4;
1634
1635	/* get padlen */
1636	padlen = sshbuf_ptr(state->incoming_packet)[4];
1637	DBG(debug("input: padlen %d", padlen));
1638	if (padlen < 4)	{
1639		if ((r = sshpkt_disconnect(ssh,
1640		    "Corrupted padlen %d on input.", padlen)) != 0 ||
1641		    (r = ssh_packet_write_wait(ssh)) != 0)
1642			return r;
1643		return SSH_ERR_CONN_CORRUPT;
1644	}
1645
1646	/* skip packet size + padlen, discard padding */
1647	if ((r = sshbuf_consume(state->incoming_packet, 4 + 1)) != 0 ||
1648	    ((r = sshbuf_consume_end(state->incoming_packet, padlen)) != 0))
1649		goto out;
1650
1651	DBG(debug("input: len before de-compress %zd",
1652	    sshbuf_len(state->incoming_packet)));
1653	if (comp && comp->enabled) {
1654		sshbuf_reset(state->compression_buffer);
1655		if ((r = uncompress_buffer(ssh, state->incoming_packet,
1656		    state->compression_buffer)) != 0)
1657			goto out;
1658		sshbuf_reset(state->incoming_packet);
1659		if ((r = sshbuf_putb(state->incoming_packet,
1660		    state->compression_buffer)) != 0)
1661			goto out;
1662		DBG(debug("input: len after de-compress %zd",
1663		    sshbuf_len(state->incoming_packet)));
1664	}
1665	/*
1666	 * get packet type, implies consume.
1667	 * return length of payload (without type field)
1668	 */
1669	if ((r = sshbuf_get_u8(state->incoming_packet, typep)) != 0)
1670		goto out;
1671	if (ssh_packet_log_type(*typep))
1672		debug3("receive packet: type %u", *typep);
1673	if (*typep < SSH2_MSG_MIN) {
1674		if ((r = sshpkt_disconnect(ssh,
1675		    "Invalid ssh2 packet type: %d", *typep)) != 0 ||
1676		    (r = ssh_packet_write_wait(ssh)) != 0)
1677			return r;
1678		return SSH_ERR_PROTOCOL_ERROR;
1679	}
1680	if (state->hook_in != NULL &&
1681	    (r = state->hook_in(ssh, state->incoming_packet, typep,
1682	    state->hook_in_ctx)) != 0)
1683		return r;
1684	if (*typep == SSH2_MSG_USERAUTH_SUCCESS && !state->server_side)
1685		r = ssh_packet_enable_delayed_compress(ssh);
1686	else
1687		r = 0;
1688#ifdef PACKET_DEBUG
1689	fprintf(stderr, "read/plain[%d]:\r\n", *typep);
1690	sshbuf_dump(state->incoming_packet, stderr);
1691#endif
1692	/* reset for next packet */
1693	state->packlen = 0;
1694	if (*typep == SSH2_MSG_NEWKEYS && ssh->kex->kex_strict) {
1695		debug_f("resetting read seqnr %u", state->p_read.seqnr);
1696		state->p_read.seqnr = 0;
1697	}
1698
1699	if ((r = ssh_packet_check_rekey(ssh)) != 0)
1700		return r;
1701 out:
1702	return r;
1703}
1704
1705int
1706ssh_packet_read_poll_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
1707{
1708	struct session_state *state = ssh->state;
1709	u_int reason, seqnr;
1710	int r;
1711	u_char *msg;
1712	const u_char *d;
1713	size_t len;
1714
1715	for (;;) {
1716		msg = NULL;
1717		r = ssh_packet_read_poll2(ssh, typep, seqnr_p);
1718		if (r != 0)
1719			return r;
1720		if (*typep == 0) {
1721			/* no message ready */
1722			return 0;
1723		}
1724		state->keep_alive_timeouts = 0;
1725		DBG(debug("received packet type %d", *typep));
1726
1727		/* Always process disconnect messages */
1728		if (*typep == SSH2_MSG_DISCONNECT) {
1729			if ((r = sshpkt_get_u32(ssh, &reason)) != 0 ||
1730			    (r = sshpkt_get_string(ssh, &msg, NULL)) != 0)
1731				return r;
1732			/* Ignore normal client exit notifications */
1733			do_log2(ssh->state->server_side &&
1734			    reason == SSH2_DISCONNECT_BY_APPLICATION ?
1735			    SYSLOG_LEVEL_INFO : SYSLOG_LEVEL_ERROR,
1736			    "Received disconnect from %s port %d:"
1737			    "%u: %.400s", ssh_remote_ipaddr(ssh),
1738			    ssh_remote_port(ssh), reason, msg);
1739			free(msg);
1740			return SSH_ERR_DISCONNECTED;
1741		}
1742
1743		/*
1744		 * Do not implicitly handle any messages here during initial
1745		 * KEX when in strict mode. They will be need to be allowed
1746		 * explicitly by the KEX dispatch table or they will generate
1747		 * protocol errors.
1748		 */
1749		if (ssh->kex != NULL &&
1750		    (ssh->kex->flags & KEX_INITIAL) && ssh->kex->kex_strict)
1751			return 0;
1752		/* Implicitly handle transport-level messages */
1753		switch (*typep) {
1754		case SSH2_MSG_IGNORE:
1755			debug3("Received SSH2_MSG_IGNORE");
1756			break;
1757		case SSH2_MSG_DEBUG:
1758			if ((r = sshpkt_get_u8(ssh, NULL)) != 0 ||
1759			    (r = sshpkt_get_string(ssh, &msg, NULL)) != 0 ||
1760			    (r = sshpkt_get_string(ssh, NULL, NULL)) != 0) {
1761				free(msg);
1762				return r;
1763			}
1764			debug("Remote: %.900s", msg);
1765			free(msg);
1766			break;
1767		case SSH2_MSG_UNIMPLEMENTED:
1768			if ((r = sshpkt_get_u32(ssh, &seqnr)) != 0)
1769				return r;
1770			debug("Received SSH2_MSG_UNIMPLEMENTED for %u",
1771			    seqnr);
1772			break;
1773		case SSH2_MSG_PING:
1774			if ((r = sshpkt_get_string_direct(ssh, &d, &len)) != 0)
1775				return r;
1776			DBG(debug("Received SSH2_MSG_PING len %zu", len));
1777			if ((r = sshpkt_start(ssh, SSH2_MSG_PONG)) != 0 ||
1778			    (r = sshpkt_put_string(ssh, d, len)) != 0 ||
1779			    (r = sshpkt_send(ssh)) != 0)
1780				return r;
1781			break;
1782		case SSH2_MSG_PONG:
1783			if ((r = sshpkt_get_string_direct(ssh,
1784			    NULL, &len)) != 0)
1785				return r;
1786			DBG(debug("Received SSH2_MSG_PONG len %zu", len));
1787			break;
1788		default:
1789			return 0;
1790		}
1791	}
1792}
1793
1794/*
1795 * Buffers the supplied input data. This is intended to be used together
1796 * with packet_read_poll().
1797 */
1798int
1799ssh_packet_process_incoming(struct ssh *ssh, const char *buf, u_int len)
1800{
1801	struct session_state *state = ssh->state;
1802	int r;
1803
1804	if (state->packet_discard) {
1805		state->keep_alive_timeouts = 0; /* ?? */
1806		if (len >= state->packet_discard) {
1807			if ((r = ssh_packet_stop_discard(ssh)) != 0)
1808				return r;
1809		}
1810		state->packet_discard -= len;
1811		return 0;
1812	}
1813	if ((r = sshbuf_put(state->input, buf, len)) != 0)
1814		return r;
1815
1816	return 0;
1817}
1818
1819/* Reads and buffers data from the specified fd */
1820int
1821ssh_packet_process_read(struct ssh *ssh, int fd)
1822{
1823	struct session_state *state = ssh->state;
1824	int r;
1825	size_t rlen;
1826
1827	if ((r = sshbuf_read(fd, state->input, PACKET_MAX_SIZE, &rlen)) != 0)
1828		return r;
1829
1830	if (state->packet_discard) {
1831		if ((r = sshbuf_consume_end(state->input, rlen)) != 0)
1832			return r;
1833		state->keep_alive_timeouts = 0; /* ?? */
1834		if (rlen >= state->packet_discard) {
1835			if ((r = ssh_packet_stop_discard(ssh)) != 0)
1836				return r;
1837		}
1838		state->packet_discard -= rlen;
1839		return 0;
1840	}
1841	return 0;
1842}
1843
1844int
1845ssh_packet_remaining(struct ssh *ssh)
1846{
1847	return sshbuf_len(ssh->state->incoming_packet);
1848}
1849
1850/*
1851 * Sends a diagnostic message from the server to the client.  This message
1852 * can be sent at any time (but not while constructing another message). The
1853 * message is printed immediately, but only if the client is being executed
1854 * in verbose mode.  These messages are primarily intended to ease debugging
1855 * authentication problems.   The length of the formatted message must not
1856 * exceed 1024 bytes.  This will automatically call ssh_packet_write_wait.
1857 */
1858void
1859ssh_packet_send_debug(struct ssh *ssh, const char *fmt,...)
1860{
1861	char buf[1024];
1862	va_list args;
1863	int r;
1864
1865	if ((ssh->compat & SSH_BUG_DEBUG))
1866		return;
1867
1868	va_start(args, fmt);
1869	vsnprintf(buf, sizeof(buf), fmt, args);
1870	va_end(args);
1871
1872	debug3("sending debug message: %s", buf);
1873
1874	if ((r = sshpkt_start(ssh, SSH2_MSG_DEBUG)) != 0 ||
1875	    (r = sshpkt_put_u8(ssh, 0)) != 0 || /* always display */
1876	    (r = sshpkt_put_cstring(ssh, buf)) != 0 ||
1877	    (r = sshpkt_put_cstring(ssh, "")) != 0 ||
1878	    (r = sshpkt_send(ssh)) != 0 ||
1879	    (r = ssh_packet_write_wait(ssh)) != 0)
1880		fatal_fr(r, "send DEBUG");
1881}
1882
1883void
1884sshpkt_fmt_connection_id(struct ssh *ssh, char *s, size_t l)
1885{
1886	snprintf(s, l, "%.200s%s%s port %d",
1887	    ssh->log_preamble ? ssh->log_preamble : "",
1888	    ssh->log_preamble ? " " : "",
1889	    ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
1890}
1891
1892/*
1893 * Pretty-print connection-terminating errors and exit.
1894 */
1895static void
1896sshpkt_vfatal(struct ssh *ssh, int r, const char *fmt, va_list ap)
1897{
1898	char *tag = NULL, remote_id[512];
1899	int oerrno = errno;
1900
1901	sshpkt_fmt_connection_id(ssh, remote_id, sizeof(remote_id));
1902
1903	switch (r) {
1904	case SSH_ERR_CONN_CLOSED:
1905		ssh_packet_clear_keys(ssh);
1906		logdie("Connection closed by %s", remote_id);
1907	case SSH_ERR_CONN_TIMEOUT:
1908		ssh_packet_clear_keys(ssh);
1909		logdie("Connection %s %s timed out",
1910		    ssh->state->server_side ? "from" : "to", remote_id);
1911	case SSH_ERR_DISCONNECTED:
1912		ssh_packet_clear_keys(ssh);
1913		logdie("Disconnected from %s", remote_id);
1914	case SSH_ERR_SYSTEM_ERROR:
1915		if (errno == ECONNRESET) {
1916			ssh_packet_clear_keys(ssh);
1917			logdie("Connection reset by %s", remote_id);
1918		}
1919		/* FALLTHROUGH */
1920	case SSH_ERR_NO_CIPHER_ALG_MATCH:
1921	case SSH_ERR_NO_MAC_ALG_MATCH:
1922	case SSH_ERR_NO_COMPRESS_ALG_MATCH:
1923	case SSH_ERR_NO_KEX_ALG_MATCH:
1924	case SSH_ERR_NO_HOSTKEY_ALG_MATCH:
1925		if (ssh->kex && ssh->kex->failed_choice) {
1926			BLACKLIST_NOTIFY(ssh, BLACKLIST_AUTH_FAIL, "ssh");
1927			ssh_packet_clear_keys(ssh);
1928			errno = oerrno;
1929			logdie("Unable to negotiate with %s: %s. "
1930			    "Their offer: %s", remote_id, ssh_err(r),
1931			    ssh->kex->failed_choice);
1932		}
1933		/* FALLTHROUGH */
1934	default:
1935		if (vasprintf(&tag, fmt, ap) == -1) {
1936			ssh_packet_clear_keys(ssh);
1937			logdie_f("could not allocate failure message");
1938		}
1939		ssh_packet_clear_keys(ssh);
1940		errno = oerrno;
1941		logdie_r(r, "%s%sConnection %s %s",
1942		    tag != NULL ? tag : "", tag != NULL ? ": " : "",
1943		    ssh->state->server_side ? "from" : "to", remote_id);
1944	}
1945}
1946
1947void
1948sshpkt_fatal(struct ssh *ssh, int r, const char *fmt, ...)
1949{
1950	va_list ap;
1951
1952	va_start(ap, fmt);
1953	sshpkt_vfatal(ssh, r, fmt, ap);
1954	/* NOTREACHED */
1955	va_end(ap);
1956	logdie_f("should have exited");
1957}
1958
1959/*
1960 * Logs the error plus constructs and sends a disconnect packet, closes the
1961 * connection, and exits.  This function never returns. The error message
1962 * should not contain a newline.  The length of the formatted message must
1963 * not exceed 1024 bytes.
1964 */
1965void
1966ssh_packet_disconnect(struct ssh *ssh, const char *fmt,...)
1967{
1968	char buf[1024], remote_id[512];
1969	va_list args;
1970	static int disconnecting = 0;
1971	int r;
1972
1973	if (disconnecting)	/* Guard against recursive invocations. */
1974		fatal("packet_disconnect called recursively.");
1975	disconnecting = 1;
1976
1977	/*
1978	 * Format the message.  Note that the caller must make sure the
1979	 * message is of limited size.
1980	 */
1981	sshpkt_fmt_connection_id(ssh, remote_id, sizeof(remote_id));
1982	va_start(args, fmt);
1983	vsnprintf(buf, sizeof(buf), fmt, args);
1984	va_end(args);
1985
1986	/* Display the error locally */
1987	logit("Disconnecting %s: %.100s", remote_id, buf);
1988
1989	/*
1990	 * Send the disconnect message to the other side, and wait
1991	 * for it to get sent.
1992	 */
1993	if ((r = sshpkt_disconnect(ssh, "%s", buf)) != 0)
1994		sshpkt_fatal(ssh, r, "%s", __func__);
1995
1996	if ((r = ssh_packet_write_wait(ssh)) != 0)
1997		sshpkt_fatal(ssh, r, "%s", __func__);
1998
1999	/* Close the connection. */
2000	ssh_packet_close(ssh);
2001	cleanup_exit(255);
2002}
2003
2004/*
2005 * Checks if there is any buffered output, and tries to write some of
2006 * the output.
2007 */
2008int
2009ssh_packet_write_poll(struct ssh *ssh)
2010{
2011	struct session_state *state = ssh->state;
2012	int len = sshbuf_len(state->output);
2013	int r;
2014
2015	if (len > 0) {
2016		len = write(state->connection_out,
2017		    sshbuf_ptr(state->output), len);
2018		if (len == -1) {
2019			if (errno == EINTR || errno == EAGAIN ||
2020			    errno == EWOULDBLOCK)
2021				return 0;
2022			return SSH_ERR_SYSTEM_ERROR;
2023		}
2024		if (len == 0)
2025			return SSH_ERR_CONN_CLOSED;
2026		if ((r = sshbuf_consume(state->output, len)) != 0)
2027			return r;
2028	}
2029	return 0;
2030}
2031
2032/*
2033 * Calls packet_write_poll repeatedly until all pending output data has been
2034 * written.
2035 */
2036int
2037ssh_packet_write_wait(struct ssh *ssh)
2038{
2039	int ret, r, ms_remain = 0;
2040	struct timeval start;
2041	struct timespec timespec, *timespecp = NULL;
2042	struct session_state *state = ssh->state;
2043	struct pollfd pfd;
2044
2045	if ((r = ssh_packet_write_poll(ssh)) != 0)
2046		return r;
2047	while (ssh_packet_have_data_to_write(ssh)) {
2048		pfd.fd = state->connection_out;
2049		pfd.events = POLLOUT;
2050
2051		if (state->packet_timeout_ms > 0) {
2052			ms_remain = state->packet_timeout_ms;
2053			timespecp = &timespec;
2054		}
2055		for (;;) {
2056			if (state->packet_timeout_ms > 0) {
2057				ms_to_timespec(&timespec, ms_remain);
2058				monotime_tv(&start);
2059			}
2060			if ((ret = ppoll(&pfd, 1, timespecp, NULL)) >= 0)
2061				break;
2062			if (errno != EAGAIN && errno != EINTR &&
2063			    errno != EWOULDBLOCK)
2064				break;
2065			if (state->packet_timeout_ms <= 0)
2066				continue;
2067			ms_subtract_diff(&start, &ms_remain);
2068			if (ms_remain <= 0) {
2069				ret = 0;
2070				break;
2071			}
2072		}
2073		if (ret == 0)
2074			return SSH_ERR_CONN_TIMEOUT;
2075		if ((r = ssh_packet_write_poll(ssh)) != 0)
2076			return r;
2077	}
2078	return 0;
2079}
2080
2081/* Returns true if there is buffered data to write to the connection. */
2082
2083int
2084ssh_packet_have_data_to_write(struct ssh *ssh)
2085{
2086	return sshbuf_len(ssh->state->output) != 0;
2087}
2088
2089/* Returns true if there is not too much data to write to the connection. */
2090
2091int
2092ssh_packet_not_very_much_data_to_write(struct ssh *ssh)
2093{
2094	if (ssh->state->interactive_mode)
2095		return sshbuf_len(ssh->state->output) < 16384;
2096	else
2097		return sshbuf_len(ssh->state->output) < 128 * 1024;
2098}
2099
2100/*
2101 * returns true when there are at most a few keystrokes of data to write
2102 * and the connection is in interactive mode.
2103 */
2104
2105int
2106ssh_packet_interactive_data_to_write(struct ssh *ssh)
2107{
2108	return ssh->state->interactive_mode &&
2109	    sshbuf_len(ssh->state->output) < 256;
2110}
2111
2112void
2113ssh_packet_set_tos(struct ssh *ssh, int tos)
2114{
2115	if (!ssh_packet_connection_is_on_socket(ssh) || tos == INT_MAX)
2116		return;
2117	set_sock_tos(ssh->state->connection_in, tos);
2118}
2119
2120/* Informs that the current session is interactive.  Sets IP flags for that. */
2121
2122void
2123ssh_packet_set_interactive(struct ssh *ssh, int interactive, int qos_interactive, int qos_bulk)
2124{
2125	struct session_state *state = ssh->state;
2126
2127	if (state->set_interactive_called)
2128		return;
2129	state->set_interactive_called = 1;
2130
2131	/* Record that we are in interactive mode. */
2132	state->interactive_mode = interactive;
2133
2134	/* Only set socket options if using a socket.  */
2135	if (!ssh_packet_connection_is_on_socket(ssh))
2136		return;
2137	set_nodelay(state->connection_in);
2138	ssh_packet_set_tos(ssh, interactive ? qos_interactive : qos_bulk);
2139}
2140
2141/* Returns true if the current connection is interactive. */
2142
2143int
2144ssh_packet_is_interactive(struct ssh *ssh)
2145{
2146	return ssh->state->interactive_mode;
2147}
2148
2149int
2150ssh_packet_set_maxsize(struct ssh *ssh, u_int s)
2151{
2152	struct session_state *state = ssh->state;
2153
2154	if (state->set_maxsize_called) {
2155		logit_f("called twice: old %d new %d",
2156		    state->max_packet_size, s);
2157		return -1;
2158	}
2159	if (s < 4 * 1024 || s > 1024 * 1024) {
2160		logit_f("bad size %d", s);
2161		return -1;
2162	}
2163	state->set_maxsize_called = 1;
2164	debug_f("setting to %d", s);
2165	state->max_packet_size = s;
2166	return s;
2167}
2168
2169int
2170ssh_packet_inc_alive_timeouts(struct ssh *ssh)
2171{
2172	return ++ssh->state->keep_alive_timeouts;
2173}
2174
2175void
2176ssh_packet_set_alive_timeouts(struct ssh *ssh, int ka)
2177{
2178	ssh->state->keep_alive_timeouts = ka;
2179}
2180
2181u_int
2182ssh_packet_get_maxsize(struct ssh *ssh)
2183{
2184	return ssh->state->max_packet_size;
2185}
2186
2187void
2188ssh_packet_set_rekey_limits(struct ssh *ssh, u_int64_t bytes, u_int32_t seconds)
2189{
2190	debug3("rekey after %llu bytes, %u seconds", (unsigned long long)bytes,
2191	    (unsigned int)seconds);
2192	ssh->state->rekey_limit = bytes;
2193	ssh->state->rekey_interval = seconds;
2194}
2195
2196time_t
2197ssh_packet_get_rekey_timeout(struct ssh *ssh)
2198{
2199	time_t seconds;
2200
2201	seconds = ssh->state->rekey_time + ssh->state->rekey_interval -
2202	    monotime();
2203	return (seconds <= 0 ? 1 : seconds);
2204}
2205
2206void
2207ssh_packet_set_server(struct ssh *ssh)
2208{
2209	ssh->state->server_side = 1;
2210	ssh->kex->server = 1; /* XXX unify? */
2211}
2212
2213void
2214ssh_packet_set_authenticated(struct ssh *ssh)
2215{
2216	ssh->state->after_authentication = 1;
2217}
2218
2219void *
2220ssh_packet_get_input(struct ssh *ssh)
2221{
2222	return (void *)ssh->state->input;
2223}
2224
2225void *
2226ssh_packet_get_output(struct ssh *ssh)
2227{
2228	return (void *)ssh->state->output;
2229}
2230
2231/* Reset after_authentication and reset compression in post-auth privsep */
2232static int
2233ssh_packet_set_postauth(struct ssh *ssh)
2234{
2235	int r;
2236
2237	debug_f("called");
2238	/* This was set in net child, but is not visible in user child */
2239	ssh->state->after_authentication = 1;
2240	ssh->state->rekeying = 0;
2241	if ((r = ssh_packet_enable_delayed_compress(ssh)) != 0)
2242		return r;
2243	return 0;
2244}
2245
2246/* Packet state (de-)serialization for privsep */
2247
2248/* turn kex into a blob for packet state serialization */
2249static int
2250kex_to_blob(struct sshbuf *m, struct kex *kex)
2251{
2252	int r;
2253
2254	if ((r = sshbuf_put_u32(m, kex->we_need)) != 0 ||
2255	    (r = sshbuf_put_cstring(m, kex->hostkey_alg)) != 0 ||
2256	    (r = sshbuf_put_u32(m, kex->hostkey_type)) != 0 ||
2257	    (r = sshbuf_put_u32(m, kex->hostkey_nid)) != 0 ||
2258	    (r = sshbuf_put_u32(m, kex->kex_type)) != 0 ||
2259	    (r = sshbuf_put_u32(m, kex->kex_strict)) != 0 ||
2260	    (r = sshbuf_put_stringb(m, kex->my)) != 0 ||
2261	    (r = sshbuf_put_stringb(m, kex->peer)) != 0 ||
2262	    (r = sshbuf_put_stringb(m, kex->client_version)) != 0 ||
2263	    (r = sshbuf_put_stringb(m, kex->server_version)) != 0 ||
2264	    (r = sshbuf_put_stringb(m, kex->session_id)) != 0 ||
2265	    (r = sshbuf_put_u32(m, kex->flags)) != 0)
2266		return r;
2267	return 0;
2268}
2269
2270/* turn key exchange results into a blob for packet state serialization */
2271static int
2272newkeys_to_blob(struct sshbuf *m, struct ssh *ssh, int mode)
2273{
2274	struct sshbuf *b;
2275	struct sshcipher_ctx *cc;
2276	struct sshcomp *comp;
2277	struct sshenc *enc;
2278	struct sshmac *mac;
2279	struct newkeys *newkey;
2280	int r;
2281
2282	if ((newkey = ssh->state->newkeys[mode]) == NULL)
2283		return SSH_ERR_INTERNAL_ERROR;
2284	enc = &newkey->enc;
2285	mac = &newkey->mac;
2286	comp = &newkey->comp;
2287	cc = (mode == MODE_OUT) ? ssh->state->send_context :
2288	    ssh->state->receive_context;
2289	if ((r = cipher_get_keyiv(cc, enc->iv, enc->iv_len)) != 0)
2290		return r;
2291	if ((b = sshbuf_new()) == NULL)
2292		return SSH_ERR_ALLOC_FAIL;
2293	if ((r = sshbuf_put_cstring(b, enc->name)) != 0 ||
2294	    (r = sshbuf_put_u32(b, enc->enabled)) != 0 ||
2295	    (r = sshbuf_put_u32(b, enc->block_size)) != 0 ||
2296	    (r = sshbuf_put_string(b, enc->key, enc->key_len)) != 0 ||
2297	    (r = sshbuf_put_string(b, enc->iv, enc->iv_len)) != 0)
2298		goto out;
2299	if (cipher_authlen(enc->cipher) == 0) {
2300		if ((r = sshbuf_put_cstring(b, mac->name)) != 0 ||
2301		    (r = sshbuf_put_u32(b, mac->enabled)) != 0 ||
2302		    (r = sshbuf_put_string(b, mac->key, mac->key_len)) != 0)
2303			goto out;
2304	}
2305	if ((r = sshbuf_put_u32(b, comp->type)) != 0 ||
2306	    (r = sshbuf_put_cstring(b, comp->name)) != 0)
2307		goto out;
2308	r = sshbuf_put_stringb(m, b);
2309 out:
2310	sshbuf_free(b);
2311	return r;
2312}
2313
2314/* serialize packet state into a blob */
2315int
2316ssh_packet_get_state(struct ssh *ssh, struct sshbuf *m)
2317{
2318	struct session_state *state = ssh->state;
2319	int r;
2320
2321	if ((r = kex_to_blob(m, ssh->kex)) != 0 ||
2322	    (r = newkeys_to_blob(m, ssh, MODE_OUT)) != 0 ||
2323	    (r = newkeys_to_blob(m, ssh, MODE_IN)) != 0 ||
2324	    (r = sshbuf_put_u64(m, state->rekey_limit)) != 0 ||
2325	    (r = sshbuf_put_u32(m, state->rekey_interval)) != 0 ||
2326	    (r = sshbuf_put_u32(m, state->p_send.seqnr)) != 0 ||
2327	    (r = sshbuf_put_u64(m, state->p_send.blocks)) != 0 ||
2328	    (r = sshbuf_put_u32(m, state->p_send.packets)) != 0 ||
2329	    (r = sshbuf_put_u64(m, state->p_send.bytes)) != 0 ||
2330	    (r = sshbuf_put_u32(m, state->p_read.seqnr)) != 0 ||
2331	    (r = sshbuf_put_u64(m, state->p_read.blocks)) != 0 ||
2332	    (r = sshbuf_put_u32(m, state->p_read.packets)) != 0 ||
2333	    (r = sshbuf_put_u64(m, state->p_read.bytes)) != 0 ||
2334	    (r = sshbuf_put_stringb(m, state->input)) != 0 ||
2335	    (r = sshbuf_put_stringb(m, state->output)) != 0)
2336		return r;
2337
2338	return 0;
2339}
2340
2341/* restore key exchange results from blob for packet state de-serialization */
2342static int
2343newkeys_from_blob(struct sshbuf *m, struct ssh *ssh, int mode)
2344{
2345	struct sshbuf *b = NULL;
2346	struct sshcomp *comp;
2347	struct sshenc *enc;
2348	struct sshmac *mac;
2349	struct newkeys *newkey = NULL;
2350	size_t keylen, ivlen, maclen;
2351	int r;
2352
2353	if ((newkey = calloc(1, sizeof(*newkey))) == NULL) {
2354		r = SSH_ERR_ALLOC_FAIL;
2355		goto out;
2356	}
2357	if ((r = sshbuf_froms(m, &b)) != 0)
2358		goto out;
2359#ifdef DEBUG_PK
2360	sshbuf_dump(b, stderr);
2361#endif
2362	enc = &newkey->enc;
2363	mac = &newkey->mac;
2364	comp = &newkey->comp;
2365
2366	if ((r = sshbuf_get_cstring(b, &enc->name, NULL)) != 0 ||
2367	    (r = sshbuf_get_u32(b, (u_int *)&enc->enabled)) != 0 ||
2368	    (r = sshbuf_get_u32(b, &enc->block_size)) != 0 ||
2369	    (r = sshbuf_get_string(b, &enc->key, &keylen)) != 0 ||
2370	    (r = sshbuf_get_string(b, &enc->iv, &ivlen)) != 0)
2371		goto out;
2372	if ((enc->cipher = cipher_by_name(enc->name)) == NULL) {
2373		r = SSH_ERR_INVALID_FORMAT;
2374		goto out;
2375	}
2376	if (cipher_authlen(enc->cipher) == 0) {
2377		if ((r = sshbuf_get_cstring(b, &mac->name, NULL)) != 0)
2378			goto out;
2379		if ((r = mac_setup(mac, mac->name)) != 0)
2380			goto out;
2381		if ((r = sshbuf_get_u32(b, (u_int *)&mac->enabled)) != 0 ||
2382		    (r = sshbuf_get_string(b, &mac->key, &maclen)) != 0)
2383			goto out;
2384		if (maclen > mac->key_len) {
2385			r = SSH_ERR_INVALID_FORMAT;
2386			goto out;
2387		}
2388		mac->key_len = maclen;
2389	}
2390	if ((r = sshbuf_get_u32(b, &comp->type)) != 0 ||
2391	    (r = sshbuf_get_cstring(b, &comp->name, NULL)) != 0)
2392		goto out;
2393	if (sshbuf_len(b) != 0) {
2394		r = SSH_ERR_INVALID_FORMAT;
2395		goto out;
2396	}
2397	enc->key_len = keylen;
2398	enc->iv_len = ivlen;
2399	ssh->kex->newkeys[mode] = newkey;
2400	newkey = NULL;
2401	r = 0;
2402 out:
2403	free(newkey);
2404	sshbuf_free(b);
2405	return r;
2406}
2407
2408/* restore kex from blob for packet state de-serialization */
2409static int
2410kex_from_blob(struct sshbuf *m, struct kex **kexp)
2411{
2412	struct kex *kex;
2413	int r;
2414
2415	if ((kex = kex_new()) == NULL)
2416		return SSH_ERR_ALLOC_FAIL;
2417	if ((r = sshbuf_get_u32(m, &kex->we_need)) != 0 ||
2418	    (r = sshbuf_get_cstring(m, &kex->hostkey_alg, NULL)) != 0 ||
2419	    (r = sshbuf_get_u32(m, (u_int *)&kex->hostkey_type)) != 0 ||
2420	    (r = sshbuf_get_u32(m, (u_int *)&kex->hostkey_nid)) != 0 ||
2421	    (r = sshbuf_get_u32(m, &kex->kex_type)) != 0 ||
2422	    (r = sshbuf_get_u32(m, &kex->kex_strict)) != 0 ||
2423	    (r = sshbuf_get_stringb(m, kex->my)) != 0 ||
2424	    (r = sshbuf_get_stringb(m, kex->peer)) != 0 ||
2425	    (r = sshbuf_get_stringb(m, kex->client_version)) != 0 ||
2426	    (r = sshbuf_get_stringb(m, kex->server_version)) != 0 ||
2427	    (r = sshbuf_get_stringb(m, kex->session_id)) != 0 ||
2428	    (r = sshbuf_get_u32(m, &kex->flags)) != 0)
2429		goto out;
2430	kex->server = 1;
2431	kex->done = 1;
2432	r = 0;
2433 out:
2434	if (r != 0 || kexp == NULL) {
2435		kex_free(kex);
2436		if (kexp != NULL)
2437			*kexp = NULL;
2438	} else {
2439		kex_free(*kexp);
2440		*kexp = kex;
2441	}
2442	return r;
2443}
2444
2445/*
2446 * Restore packet state from content of blob 'm' (de-serialization).
2447 * Note that 'm' will be partially consumed on parsing or any other errors.
2448 */
2449int
2450ssh_packet_set_state(struct ssh *ssh, struct sshbuf *m)
2451{
2452	struct session_state *state = ssh->state;
2453	const u_char *input, *output;
2454	size_t ilen, olen;
2455	int r;
2456
2457	if ((r = kex_from_blob(m, &ssh->kex)) != 0 ||
2458	    (r = newkeys_from_blob(m, ssh, MODE_OUT)) != 0 ||
2459	    (r = newkeys_from_blob(m, ssh, MODE_IN)) != 0 ||
2460	    (r = sshbuf_get_u64(m, &state->rekey_limit)) != 0 ||
2461	    (r = sshbuf_get_u32(m, &state->rekey_interval)) != 0 ||
2462	    (r = sshbuf_get_u32(m, &state->p_send.seqnr)) != 0 ||
2463	    (r = sshbuf_get_u64(m, &state->p_send.blocks)) != 0 ||
2464	    (r = sshbuf_get_u32(m, &state->p_send.packets)) != 0 ||
2465	    (r = sshbuf_get_u64(m, &state->p_send.bytes)) != 0 ||
2466	    (r = sshbuf_get_u32(m, &state->p_read.seqnr)) != 0 ||
2467	    (r = sshbuf_get_u64(m, &state->p_read.blocks)) != 0 ||
2468	    (r = sshbuf_get_u32(m, &state->p_read.packets)) != 0 ||
2469	    (r = sshbuf_get_u64(m, &state->p_read.bytes)) != 0)
2470		return r;
2471	/*
2472	 * We set the time here so that in post-auth privsep child we
2473	 * count from the completion of the authentication.
2474	 */
2475	state->rekey_time = monotime();
2476	/* XXX ssh_set_newkeys overrides p_read.packets? XXX */
2477	if ((r = ssh_set_newkeys(ssh, MODE_IN)) != 0 ||
2478	    (r = ssh_set_newkeys(ssh, MODE_OUT)) != 0)
2479		return r;
2480
2481	if ((r = ssh_packet_set_postauth(ssh)) != 0)
2482		return r;
2483
2484	sshbuf_reset(state->input);
2485	sshbuf_reset(state->output);
2486	if ((r = sshbuf_get_string_direct(m, &input, &ilen)) != 0 ||
2487	    (r = sshbuf_get_string_direct(m, &output, &olen)) != 0 ||
2488	    (r = sshbuf_put(state->input, input, ilen)) != 0 ||
2489	    (r = sshbuf_put(state->output, output, olen)) != 0)
2490		return r;
2491
2492	if (sshbuf_len(m))
2493		return SSH_ERR_INVALID_FORMAT;
2494	debug3_f("done");
2495	return 0;
2496}
2497
2498/* NEW API */
2499
2500/* put data to the outgoing packet */
2501
2502int
2503sshpkt_put(struct ssh *ssh, const void *v, size_t len)
2504{
2505	return sshbuf_put(ssh->state->outgoing_packet, v, len);
2506}
2507
2508int
2509sshpkt_putb(struct ssh *ssh, const struct sshbuf *b)
2510{
2511	return sshbuf_putb(ssh->state->outgoing_packet, b);
2512}
2513
2514int
2515sshpkt_put_u8(struct ssh *ssh, u_char val)
2516{
2517	return sshbuf_put_u8(ssh->state->outgoing_packet, val);
2518}
2519
2520int
2521sshpkt_put_u32(struct ssh *ssh, u_int32_t val)
2522{
2523	return sshbuf_put_u32(ssh->state->outgoing_packet, val);
2524}
2525
2526int
2527sshpkt_put_u64(struct ssh *ssh, u_int64_t val)
2528{
2529	return sshbuf_put_u64(ssh->state->outgoing_packet, val);
2530}
2531
2532int
2533sshpkt_put_string(struct ssh *ssh, const void *v, size_t len)
2534{
2535	return sshbuf_put_string(ssh->state->outgoing_packet, v, len);
2536}
2537
2538int
2539sshpkt_put_cstring(struct ssh *ssh, const void *v)
2540{
2541	return sshbuf_put_cstring(ssh->state->outgoing_packet, v);
2542}
2543
2544int
2545sshpkt_put_stringb(struct ssh *ssh, const struct sshbuf *v)
2546{
2547	return sshbuf_put_stringb(ssh->state->outgoing_packet, v);
2548}
2549
2550int
2551sshpkt_getb_froms(struct ssh *ssh, struct sshbuf **valp)
2552{
2553	return sshbuf_froms(ssh->state->incoming_packet, valp);
2554}
2555
2556#ifdef WITH_OPENSSL
2557#ifdef OPENSSL_HAS_ECC
2558int
2559sshpkt_put_ec(struct ssh *ssh, const EC_POINT *v, const EC_GROUP *g)
2560{
2561	return sshbuf_put_ec(ssh->state->outgoing_packet, v, g);
2562}
2563#endif /* OPENSSL_HAS_ECC */
2564
2565
2566int
2567sshpkt_put_bignum2(struct ssh *ssh, const BIGNUM *v)
2568{
2569	return sshbuf_put_bignum2(ssh->state->outgoing_packet, v);
2570}
2571#endif /* WITH_OPENSSL */
2572
2573/* fetch data from the incoming packet */
2574
2575int
2576sshpkt_get(struct ssh *ssh, void *valp, size_t len)
2577{
2578	return sshbuf_get(ssh->state->incoming_packet, valp, len);
2579}
2580
2581int
2582sshpkt_get_u8(struct ssh *ssh, u_char *valp)
2583{
2584	return sshbuf_get_u8(ssh->state->incoming_packet, valp);
2585}
2586
2587int
2588sshpkt_get_u32(struct ssh *ssh, u_int32_t *valp)
2589{
2590	return sshbuf_get_u32(ssh->state->incoming_packet, valp);
2591}
2592
2593int
2594sshpkt_get_u64(struct ssh *ssh, u_int64_t *valp)
2595{
2596	return sshbuf_get_u64(ssh->state->incoming_packet, valp);
2597}
2598
2599int
2600sshpkt_get_string(struct ssh *ssh, u_char **valp, size_t *lenp)
2601{
2602	return sshbuf_get_string(ssh->state->incoming_packet, valp, lenp);
2603}
2604
2605int
2606sshpkt_get_string_direct(struct ssh *ssh, const u_char **valp, size_t *lenp)
2607{
2608	return sshbuf_get_string_direct(ssh->state->incoming_packet, valp, lenp);
2609}
2610
2611int
2612sshpkt_peek_string_direct(struct ssh *ssh, const u_char **valp, size_t *lenp)
2613{
2614	return sshbuf_peek_string_direct(ssh->state->incoming_packet, valp, lenp);
2615}
2616
2617int
2618sshpkt_get_cstring(struct ssh *ssh, char **valp, size_t *lenp)
2619{
2620	return sshbuf_get_cstring(ssh->state->incoming_packet, valp, lenp);
2621}
2622
2623#ifdef WITH_OPENSSL
2624#ifdef OPENSSL_HAS_ECC
2625int
2626sshpkt_get_ec(struct ssh *ssh, EC_POINT *v, const EC_GROUP *g)
2627{
2628	return sshbuf_get_ec(ssh->state->incoming_packet, v, g);
2629}
2630#endif /* OPENSSL_HAS_ECC */
2631
2632int
2633sshpkt_get_bignum2(struct ssh *ssh, BIGNUM **valp)
2634{
2635	return sshbuf_get_bignum2(ssh->state->incoming_packet, valp);
2636}
2637#endif /* WITH_OPENSSL */
2638
2639int
2640sshpkt_get_end(struct ssh *ssh)
2641{
2642	if (sshbuf_len(ssh->state->incoming_packet) > 0)
2643		return SSH_ERR_UNEXPECTED_TRAILING_DATA;
2644	return 0;
2645}
2646
2647const u_char *
2648sshpkt_ptr(struct ssh *ssh, size_t *lenp)
2649{
2650	if (lenp != NULL)
2651		*lenp = sshbuf_len(ssh->state->incoming_packet);
2652	return sshbuf_ptr(ssh->state->incoming_packet);
2653}
2654
2655/* start a new packet */
2656
2657int
2658sshpkt_start(struct ssh *ssh, u_char type)
2659{
2660	u_char buf[6]; /* u32 packet length, u8 pad len, u8 type */
2661
2662	DBG(debug("packet_start[%d]", type));
2663	memset(buf, 0, sizeof(buf));
2664	buf[sizeof(buf) - 1] = type;
2665	sshbuf_reset(ssh->state->outgoing_packet);
2666	return sshbuf_put(ssh->state->outgoing_packet, buf, sizeof(buf));
2667}
2668
2669static int
2670ssh_packet_send_mux(struct ssh *ssh)
2671{
2672	struct session_state *state = ssh->state;
2673	u_char type, *cp;
2674	size_t len;
2675	int r;
2676
2677	if (ssh->kex)
2678		return SSH_ERR_INTERNAL_ERROR;
2679	len = sshbuf_len(state->outgoing_packet);
2680	if (len < 6)
2681		return SSH_ERR_INTERNAL_ERROR;
2682	cp = sshbuf_mutable_ptr(state->outgoing_packet);
2683	type = cp[5];
2684	if (ssh_packet_log_type(type))
2685		debug3_f("type %u", type);
2686	/* drop everything, but the connection protocol */
2687	if (type >= SSH2_MSG_CONNECTION_MIN &&
2688	    type <= SSH2_MSG_CONNECTION_MAX) {
2689		POKE_U32(cp, len - 4);
2690		if ((r = sshbuf_putb(state->output,
2691		    state->outgoing_packet)) != 0)
2692			return r;
2693		/* sshbuf_dump(state->output, stderr); */
2694	}
2695	sshbuf_reset(state->outgoing_packet);
2696	return 0;
2697}
2698
2699/*
2700 * 9.2.  Ignored Data Message
2701 *
2702 *   byte      SSH_MSG_IGNORE
2703 *   string    data
2704 *
2705 * All implementations MUST understand (and ignore) this message at any
2706 * time (after receiving the protocol version). No implementation is
2707 * required to send them. This message can be used as an additional
2708 * protection measure against advanced traffic analysis techniques.
2709 */
2710int
2711sshpkt_msg_ignore(struct ssh *ssh, u_int nbytes)
2712{
2713	u_int32_t rnd = 0;
2714	int r;
2715	u_int i;
2716
2717	if ((r = sshpkt_start(ssh, SSH2_MSG_IGNORE)) != 0 ||
2718	    (r = sshpkt_put_u32(ssh, nbytes)) != 0)
2719		return r;
2720	for (i = 0; i < nbytes; i++) {
2721		if (i % 4 == 0)
2722			rnd = arc4random();
2723		if ((r = sshpkt_put_u8(ssh, (u_char)rnd & 0xff)) != 0)
2724			return r;
2725		rnd >>= 8;
2726	}
2727	return 0;
2728}
2729
2730/* send it */
2731
2732int
2733sshpkt_send(struct ssh *ssh)
2734{
2735	if (ssh->state && ssh->state->mux)
2736		return ssh_packet_send_mux(ssh);
2737	return ssh_packet_send2(ssh);
2738}
2739
2740int
2741sshpkt_disconnect(struct ssh *ssh, const char *fmt,...)
2742{
2743	char buf[1024];
2744	va_list args;
2745	int r;
2746
2747	va_start(args, fmt);
2748	vsnprintf(buf, sizeof(buf), fmt, args);
2749	va_end(args);
2750
2751	debug2_f("sending SSH2_MSG_DISCONNECT: %s", buf);
2752	if ((r = sshpkt_start(ssh, SSH2_MSG_DISCONNECT)) != 0 ||
2753	    (r = sshpkt_put_u32(ssh, SSH2_DISCONNECT_PROTOCOL_ERROR)) != 0 ||
2754	    (r = sshpkt_put_cstring(ssh, buf)) != 0 ||
2755	    (r = sshpkt_put_cstring(ssh, "")) != 0 ||
2756	    (r = sshpkt_send(ssh)) != 0)
2757		return r;
2758	return 0;
2759}
2760
2761/* roundup current message to pad bytes */
2762int
2763sshpkt_add_padding(struct ssh *ssh, u_char pad)
2764{
2765	ssh->state->extra_pad = pad;
2766	return 0;
2767}
2768