[BACK]Return to packet.h CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Annotation of src/usr.bin/ssh/packet.h, Revision 1.2

1.1       deraadt     1: /*
                      2:
                      3: packet.h
                      4:
                      5: Author: Tatu Ylonen <ylo@cs.hut.fi>
                      6:
                      7: Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
                      8:                    All rights reserved
                      9:
                     10: Created: Sat Mar 18 02:02:14 1995 ylo
                     11:
                     12: Interface for the packet protocol functions.
                     13:
                     14: */
                     15:
                     16: /* RCSID("$Id: packet.h,v 1.9 1999/06/14 15:00:03 bg Exp $"); */
                     17:
                     18: #ifndef PACKET_H
                     19: #define PACKET_H
                     20:
1.2     ! provos     21: #include <ssl/bn.h>
1.1       deraadt    22:
                     23: /* Sets the socket used for communication.  Disables encryption until
                     24:    packet_set_encryption_key is called.  It is permissible that fd_in
                     25:    and fd_out are the same descriptor; in that case it is assumed to
                     26:    be a socket. */
1.2     ! provos     27: void packet_set_connection(int fd_in, int fd_out);
1.1       deraadt    28:
                     29: /* Puts the connection file descriptors into non-blocking mode. */
                     30: void packet_set_nonblocking(void);
                     31:
                     32: /* Returns the file descriptor used for input. */
                     33: int packet_get_connection_in(void);
                     34:
                     35: /* Returns the file descriptor used for output. */
                     36: int packet_get_connection_out(void);
                     37:
                     38: /* Closes the connection (both descriptors) and clears and frees
                     39:    internal data structures. */
                     40: void packet_close(void);
                     41:
                     42: /* Causes any further packets to be encrypted using the given key.  The same
                     43:    key is used for both sending and reception.  However, both directions
                     44:    are encrypted independently of each other.  Cipher types are
                     45:    defined in ssh.h. */
                     46: void packet_set_encryption_key(const unsigned char *key, unsigned int keylen,
                     47:                               int cipher_type, int is_client);
                     48:
                     49: /* Sets remote side protocol flags for the current connection.  This can
                     50:    be called at any time. */
                     51: void packet_set_protocol_flags(unsigned int flags);
                     52:
                     53: /* Returns the remote protocol flags set earlier by the above function. */
                     54: unsigned int packet_get_protocol_flags(void);
                     55:
                     56: /* Enables compression in both directions starting from the next packet. */
                     57: void packet_start_compression(int level);
                     58:
                     59: /* Informs that the current session is interactive.  Sets IP flags for optimal
                     60:    performance in interactive use. */
                     61: void packet_set_interactive(int interactive, int keepalives);
                     62:
                     63: /* Returns true if the current connection is interactive. */
                     64: int packet_is_interactive(void);
                     65:
                     66: /* Starts constructing a packet to send. */
                     67: void packet_start(int type);
                     68:
                     69: /* Appends a character to the packet data. */
                     70: void packet_put_char(int ch);
                     71:
                     72: /* Appends an integer to the packet data. */
                     73: void packet_put_int(unsigned int value);
                     74:
                     75: /* Appends an arbitrary precision integer to packet data. */
1.2     ! provos     76: void packet_put_bignum(BIGNUM *value);
1.1       deraadt    77:
                     78: /* Appends a string to packet data. */
                     79: void packet_put_string(const char *buf, unsigned int len);
                     80:
                     81: /* Finalizes and sends the packet.  If the encryption key has been set,
                     82:    encrypts the packet before sending. */
                     83: void packet_send(void);
                     84:
                     85: /* Waits until a packet has been received, and returns its type. */
                     86: int packet_read(int *payload_len_ptr);
                     87:
                     88: /* Waits until a packet has been received, verifies that its type matches
                     89:    that given, and gives a fatal error and exits if there is a mismatch. */
                     90: void packet_read_expect(int *payload_len_ptr, int type);
                     91:
                     92: /* Checks if a full packet is available in the data received so far via
                     93:    packet_process_incoming.  If so, reads the packet; otherwise returns
                     94:    SSH_MSG_NONE.  This does not wait for data from the connection.
                     95:
                     96:    SSH_MSG_DISCONNECT is handled specially here.  Also,
                     97:    SSH_MSG_IGNORE messages are skipped by this function and are never returned
                     98:    to higher levels. */
                     99: int packet_read_poll(int *packet_len_ptr);
                    100:
                    101: /* Buffers the given amount of input characters.  This is intended to be
                    102:    used together with packet_read_poll. */
                    103: void packet_process_incoming(const char *buf, unsigned int len);
                    104:
                    105: /* Returns a character (0-255) from the packet data. */
                    106: unsigned int packet_get_char(void);
                    107:
                    108: /* Returns an integer from the packet data. */
                    109: unsigned int packet_get_int(void);
                    110:
                    111: /* Returns an arbitrary precision integer from the packet data.  The integer
                    112:    must have been initialized before this call. */
1.2     ! provos    113: void packet_get_bignum(BIGNUM *value, int *length_ptr);
1.1       deraadt   114:
                    115: /* Returns a string from the packet data.  The string is allocated using
                    116:    xmalloc; it is the responsibility of the calling program to free it when
                    117:    no longer needed.  The length_ptr argument may be NULL, or point to an
                    118:    integer into which the length of the string is stored. */
                    119: char *packet_get_string(unsigned int *length_ptr);
                    120:
                    121: /* Logs the error in syslog using LOG_INFO, constructs and sends a disconnect
                    122:    packet, closes the connection, and exits.  This function never returns.
                    123:    The error message should not contain a newline.  The total length of the
                    124:    message must not exceed 1024 bytes. */
                    125: void packet_disconnect(const char *fmt, ...);
                    126:
                    127: /* Sends a diagnostic message to the other side.  This message
                    128:    can be sent at any time (but not while constructing another message).
                    129:    The message is printed immediately, but only if the client is being
                    130:    executed in verbose mode.  These messages are primarily intended to
                    131:    ease debugging authentication problems.  The total length of the message
                    132:    must not exceed 1024 bytes.  This will automatically call
                    133:    packet_write_wait.  If the remote side protocol flags do not indicate
                    134:    that it supports SSH_MSG_DEBUG, this will do nothing. */
                    135: void packet_send_debug(const char *fmt, ...);
                    136:
                    137: /* Checks if there is any buffered output, and tries to write some of the
                    138:    output. */
                    139: void packet_write_poll(void);
                    140:
                    141: /* Waits until all pending output data has been written. */
                    142: void packet_write_wait(void);
                    143:
                    144: /* Returns true if there is buffered data to write to the connection. */
                    145: int packet_have_data_to_write(void);
                    146:
                    147: /* Returns true if there is not too much data to write to the connection. */
                    148: int packet_not_very_much_data_to_write(void);
                    149:
                    150: /* Stores tty modes from the fd into current packet. */
                    151: void tty_make_modes(int fd);
                    152:
                    153: /* Parses tty modes for the fd from the current packet. */
                    154: void tty_parse_modes(int fd, int *n_bytes_ptr);
                    155:
                    156: #define packet_integrity_check(payload_len, expected_len, type) \
                    157: do { \
                    158:   int _p = (payload_len), _e = (expected_len); \
                    159:   if (_p != _e) { \
                    160:     log("Packet integrity error (%d != %d) at %s:%d", \
                    161:        _p, _e, __FILE__, __LINE__); \
                    162:     packet_disconnect("Packet integrity error. (%d)", (type)); \
                    163:   } \
                    164: } while (0)
                    165:
                    166: #endif /* PACKET_H */