[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.5

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