]> andersk Git - openssh.git/blob - packet.h
97afbdf60adb0067c72e2456d950fc5063b2494b
[openssh.git] / packet.h
1 /*
2  * Author: Tatu Ylonen <ylo@cs.hut.fi>
3  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4  *                    All rights reserved
5  * Interface for the packet protocol functions.
6  *
7  * As far as I am concerned, the code I have written for this software
8  * can be used freely for any purpose.  Any derived versions of this
9  * software must be clearly marked as such, and if the derived work is
10  * incompatible with the protocol description in the RFC file, it must be
11  * called by a name other than "ssh" or "Secure Shell".
12  */
13
14 /* RCSID("$OpenBSD: packet.h,v 1.24 2001/06/26 06:32:57 itojun Exp $"); */
15
16 #ifndef PACKET_H
17 #define PACKET_H
18
19 #include <openssl/bn.h>
20
21 /*
22  * Sets the socket used for communication.  Disables encryption until
23  * packet_set_encryption_key is called.  It is permissible that fd_in and
24  * fd_out are the same descriptor; in that case it is assumed to be a socket.
25  */
26 void    packet_set_connection(int, int);
27
28 /* Puts the connection file descriptors into non-blocking mode. */
29 void    packet_set_nonblocking(void);
30
31 /* Returns the file descriptor used for input. */
32 int     packet_get_connection_in(void);
33
34 /* Returns the file descriptor used for output. */
35 int     packet_get_connection_out(void);
36
37 /*
38  * Closes the connection (both descriptors) and clears and frees internal
39  * data structures.
40  */
41 void    packet_close(void);
42
43 /*
44  * Causes any further packets to be encrypted using the given key.  The same
45  * key is used for both sending and reception.  However, both directions are
46  * encrypted independently of each other.  Cipher types are defined in ssh.h.
47  */
48 void
49 packet_set_encryption_key(const u_char *, u_int, int);
50
51 /*
52  * Sets remote side protocol flags for the current connection.  This can be
53  * called at any time.
54  */
55 void    packet_set_protocol_flags(u_int);
56
57 /* Returns the remote protocol flags set earlier by the above function. */
58 u_int packet_get_protocol_flags(void);
59
60 /* Enables compression in both directions starting from the next packet. */
61 void    packet_start_compression(int);
62
63 /*
64  * Informs that the current session is interactive.  Sets IP flags for
65  * optimal performance in interactive use.
66  */
67 void    packet_set_interactive(int);
68
69 /* Returns true if the current connection is interactive. */
70 int     packet_is_interactive(void);
71
72 /* Starts constructing a packet to send. */
73 void    packet_start(u_char);
74
75 /* Appends a character to the packet data. */
76 void    packet_put_char(int ch);
77
78 /* Appends an integer to the packet data. */
79 void    packet_put_int(u_int value);
80
81 /* Appends an arbitrary precision integer to packet data. */
82 void    packet_put_bignum(BIGNUM * value);
83 void    packet_put_bignum2(BIGNUM * value);
84
85 /* Appends a string to packet data. */
86 void    packet_put_string(const char *buf, u_int len);
87 void    packet_put_cstring(const char *str);
88 void    packet_put_raw(const char *buf, u_int len);
89
90 /*
91  * Finalizes and sends the packet.  If the encryption key has been set,
92  * encrypts the packet before sending.
93  */
94 void    packet_send(void);
95
96 /* Waits until a packet has been received, and returns its type. */
97 int     packet_read(int *payload_len_ptr);
98
99 /*
100  * Waits until a packet has been received, verifies that its type matches
101  * that given, and gives a fatal error and exits if there is a mismatch.
102  */
103 void    packet_read_expect(int *payload_len_ptr, int type);
104
105 /*
106  * Checks if a full packet is available in the data received so far via
107  * packet_process_incoming.  If so, reads the packet; otherwise returns
108  * SSH_MSG_NONE.  This does not wait for data from the connection.
109  * SSH_MSG_DISCONNECT is handled specially here.  Also, SSH_MSG_IGNORE
110  * messages are skipped by this function and are never returned to higher
111  * levels.
112  */
113 int     packet_read_poll(int *packet_len_ptr);
114
115 /*
116  * Buffers the given amount of input characters.  This is intended to be used
117  * together with packet_read_poll.
118  */
119 void    packet_process_incoming(const char *buf, u_int len);
120
121 /* Returns a character (0-255) from the packet data. */
122 u_int packet_get_char(void);
123
124 /* Returns an integer from the packet data. */
125 u_int packet_get_int(void);
126
127 /*
128  * Returns an arbitrary precision integer from the packet data.  The integer
129  * must have been initialized before this call.
130  */
131 void    packet_get_bignum(BIGNUM * value, int *length_ptr);
132 void    packet_get_bignum2(BIGNUM * value, int *length_ptr);
133 char    *packet_get_raw(int *length_ptr);
134
135 /*
136  * Returns a string from the packet data.  The string is allocated using
137  * xmalloc; it is the responsibility of the calling program to free it when
138  * no longer needed.  The length_ptr argument may be NULL, or point to an
139  * integer into which the length of the string is stored.
140  */
141 char   *packet_get_string(u_int *length_ptr);
142
143 /*
144  * Logs the error in syslog using LOG_INFO, constructs and sends a disconnect
145  * packet, closes the connection, and exits.  This function never returns.
146  * The error message should not contain a newline.  The total length of the
147  * message must not exceed 1024 bytes.
148  */
149 void    packet_disconnect(const char *fmt,...) __attribute__((format(printf, 1, 2)));
150
151 /*
152  * Sends a diagnostic message to the other side.  This message can be sent at
153  * any time (but not while constructing another message). The message is
154  * printed immediately, but only if the client is being executed in verbose
155  * mode.  These messages are primarily intended to ease debugging
156  * authentication problems.  The total length of the message must not exceed
157  * 1024 bytes.  This will automatically call packet_write_wait.  If the
158  * remote side protocol flags do not indicate that it supports SSH_MSG_DEBUG,
159  * this will do nothing.
160  */
161 void    packet_send_debug(const char *fmt,...) __attribute__((format(printf, 1, 2)));
162
163 /* Checks if there is any buffered output, and tries to write some of the output. */
164 void    packet_write_poll(void);
165
166 /* Waits until all pending output data has been written. */
167 void    packet_write_wait(void);
168
169 /* Returns true if there is buffered data to write to the connection. */
170 int     packet_have_data_to_write(void);
171
172 /* Returns true if there is not too much data to write to the connection. */
173 int     packet_not_very_much_data_to_write(void);
174
175 /* maximum packet size, requested by client with SSH_CMSG_MAX_PACKET_SIZE */
176 extern int max_packet_size;
177 int     packet_set_maxsize(int);
178 #define packet_get_maxsize() max_packet_size
179
180 /* Stores tty modes from the fd or tiop into current packet. */
181 void    tty_make_modes(int, struct termios *);
182
183 /* Parses tty modes for the fd from the current packet. */
184 void    tty_parse_modes(int, int *);
185
186 #define packet_integrity_check(payload_len, expected_len, type) \
187 do { \
188   int _p = (payload_len), _e = (expected_len); \
189   if (_p != _e) { \
190     log("Packet integrity error (%d != %d) at %s:%d", \
191         _p, _e, __FILE__, __LINE__); \
192     packet_disconnect("Packet integrity error. (%d)", (type)); \
193   } \
194 } while (0)
195
196 #define packet_done() \
197 do { \
198         int _len = packet_remaining(); \
199         if (_len > 0) { \
200                 log("Packet integrity error (%d bytes remaining) at %s:%d", \
201                     _len ,__FILE__, __LINE__); \
202                 packet_disconnect("Packet integrity error."); \
203         } \
204 } while (0)
205
206 /* remote host is connected via a socket/ipv4 */
207 int     packet_connection_is_on_socket(void);
208 int     packet_connection_is_ipv4(void);
209
210 /* returns remaining payload bytes */
211 int     packet_remaining(void);
212
213 /* append an ignore message */
214 void    packet_send_ignore(int);
215
216 /* add an ignore message and make sure size (current+ignore) = n*sumlen */
217 void    packet_inject_ignore(int);
218
219 #endif                          /* PACKET_H */
This page took 0.038997 seconds and 3 git commands to generate.