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

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:
        !            21: #include <gmp.h>
        !            22: #include "randoms.h"
        !            23:
        !            24: /* Sets the socket used for communication.  Disables encryption until
        !            25:    packet_set_encryption_key is called.  It is permissible that fd_in
        !            26:    and fd_out are the same descriptor; in that case it is assumed to
        !            27:    be a socket. */
        !            28: void packet_set_connection(int fd_in, int fd_out, RandomState *state);
        !            29:
        !            30: /* Puts the connection file descriptors into non-blocking mode. */
        !            31: void packet_set_nonblocking(void);
        !            32:
        !            33: /* Returns the file descriptor used for input. */
        !            34: int packet_get_connection_in(void);
        !            35:
        !            36: /* Returns the file descriptor used for output. */
        !            37: int packet_get_connection_out(void);
        !            38:
        !            39: /* Closes the connection (both descriptors) and clears and frees
        !            40:    internal data structures. */
        !            41: void packet_close(void);
        !            42:
        !            43: /* Causes any further packets to be encrypted using the given key.  The same
        !            44:    key is used for both sending and reception.  However, both directions
        !            45:    are encrypted independently of each other.  Cipher types are
        !            46:    defined in ssh.h. */
        !            47: void packet_set_encryption_key(const unsigned char *key, unsigned int keylen,
        !            48:                               int cipher_type, int is_client);
        !            49:
        !            50: /* Sets remote side protocol flags for the current connection.  This can
        !            51:    be called at any time. */
        !            52: void packet_set_protocol_flags(unsigned int flags);
        !            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. */
        !            58: void packet_start_compression(int level);
        !            59:
        !            60: /* Informs that the current session is interactive.  Sets IP flags for optimal
        !            61:    performance in interactive use. */
        !            62: void packet_set_interactive(int interactive, int keepalives);
        !            63:
        !            64: /* Returns true if the current connection is interactive. */
        !            65: int packet_is_interactive(void);
        !            66:
        !            67: /* Starts constructing a packet to send. */
        !            68: void packet_start(int type);
        !            69:
        !            70: /* Appends a character to the packet data. */
        !            71: void packet_put_char(int ch);
        !            72:
        !            73: /* Appends an integer to the packet data. */
        !            74: void packet_put_int(unsigned int value);
        !            75:
        !            76: /* Appends an arbitrary precision integer to packet data. */
        !            77: void packet_put_mp_int(MP_INT *value);
        !            78:
        !            79: /* Appends a string to packet data. */
        !            80: void packet_put_string(const char *buf, unsigned int len);
        !            81:
        !            82: /* Finalizes and sends the packet.  If the encryption key has been set,
        !            83:    encrypts the packet before sending. */
        !            84: void packet_send(void);
        !            85:
        !            86: /* Waits until a packet has been received, and returns its type. */
        !            87: int packet_read(int *payload_len_ptr);
        !            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. */
        !            91: void packet_read_expect(int *payload_len_ptr, int type);
        !            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
        !            95:    SSH_MSG_NONE.  This does not wait for data from the connection.
        !            96:
        !            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. */
        !           100: int packet_read_poll(int *packet_len_ptr);
        !           101:
        !           102: /* Buffers the given amount of input characters.  This is intended to be
        !           103:    used together with packet_read_poll. */
        !           104: void packet_process_incoming(const char *buf, unsigned int len);
        !           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. */
        !           114: void packet_get_mp_int(MP_INT *value, int *length_ptr);
        !           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. */
        !           120: char *packet_get_string(unsigned int *length_ptr);
        !           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. */
        !           126: void packet_disconnect(const char *fmt, ...);
        !           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. */
        !           136: void packet_send_debug(const char *fmt, ...);
        !           137:
        !           138: /* Checks if there is any buffered output, and tries to write some of the
        !           139:    output. */
        !           140: void packet_write_poll(void);
        !           141:
        !           142: /* Waits until all pending output data has been written. */
        !           143: void packet_write_wait(void);
        !           144:
        !           145: /* Returns true if there is buffered data to write to the connection. */
        !           146: int packet_have_data_to_write(void);
        !           147:
        !           148: /* Returns true if there is not too much data to write to the connection. */
        !           149: int packet_not_very_much_data_to_write(void);
        !           150:
        !           151: /* Stores tty modes from the fd into current packet. */
        !           152: void tty_make_modes(int fd);
        !           153:
        !           154: /* Parses tty modes for the fd from the current packet. */
        !           155: void tty_parse_modes(int fd, int *n_bytes_ptr);
        !           156:
        !           157: #define packet_integrity_check(payload_len, expected_len, type) \
        !           158: do { \
        !           159:   int _p = (payload_len), _e = (expected_len); \
        !           160:   if (_p != _e) { \
        !           161:     log("Packet integrity error (%d != %d) at %s:%d", \
        !           162:        _p, _e, __FILE__, __LINE__); \
        !           163:     packet_disconnect("Packet integrity error. (%d)", (type)); \
        !           164:   } \
        !           165: } while (0)
        !           166:
        !           167: #endif /* PACKET_H */