192f58c69SGordon Tetlow /* $OpenBSD: packet.h,v 1.96 2023/12/18 14:45:17 djm Exp $ */ 2af12a3e7SDag-Erling Smørgrav 3511b41d2SMark Murray /* 4511b41d2SMark Murray * Author: Tatu Ylonen <ylo@cs.hut.fi> 5511b41d2SMark Murray * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 6511b41d2SMark Murray * All rights reserved 7511b41d2SMark Murray * Interface for the packet protocol functions. 8511b41d2SMark Murray * 9c2d3a559SKris Kennaway * As far as I am concerned, the code I have written for this software 10c2d3a559SKris Kennaway * can be used freely for any purpose. Any derived versions of this 11c2d3a559SKris Kennaway * software must be clearly marked as such, and if the derived work is 12c2d3a559SKris Kennaway * incompatible with the protocol description in the RFC file, it must be 13c2d3a559SKris Kennaway * called by a name other than "ssh" or "Secure Shell". 14511b41d2SMark Murray */ 15511b41d2SMark Murray 16511b41d2SMark Murray #ifndef PACKET_H 17511b41d2SMark Murray #define PACKET_H 18511b41d2SMark Murray 19333ee039SDag-Erling Smørgrav #include <termios.h> 20333ee039SDag-Erling Smørgrav 21bc5531deSDag-Erling Smørgrav #ifdef WITH_OPENSSL 2218a71195SBrian Feldman # include <openssl/bn.h> 234a421b63SDag-Erling Smørgrav # ifdef OPENSSL_HAS_ECC 244a421b63SDag-Erling Smørgrav # include <openssl/ec.h> 25bc5531deSDag-Erling Smørgrav # else /* OPENSSL_HAS_ECC */ 26bc5531deSDag-Erling Smørgrav # define EC_KEY void 27bc5531deSDag-Erling Smørgrav # define EC_GROUP void 28bc5531deSDag-Erling Smørgrav # define EC_POINT void 29bc5531deSDag-Erling Smørgrav # endif /* OPENSSL_HAS_ECC */ 30bc5531deSDag-Erling Smørgrav #else /* WITH_OPENSSL */ 31bc5531deSDag-Erling Smørgrav # define BIGNUM void 32bc5531deSDag-Erling Smørgrav # define EC_KEY void 33bc5531deSDag-Erling Smørgrav # define EC_GROUP void 34bc5531deSDag-Erling Smørgrav # define EC_POINT void 35bc5531deSDag-Erling Smørgrav #endif /* WITH_OPENSSL */ 36511b41d2SMark Murray 37bc5531deSDag-Erling Smørgrav #include <signal.h> 38bc5531deSDag-Erling Smørgrav #include "openbsd-compat/sys-queue.h" 39511b41d2SMark Murray 40bc5531deSDag-Erling Smørgrav struct kex; 41bc5531deSDag-Erling Smørgrav struct sshkey; 42bc5531deSDag-Erling Smørgrav struct sshbuf; 43bc5531deSDag-Erling Smørgrav struct session_state; /* private session data */ 44511b41d2SMark Murray 45bc5531deSDag-Erling Smørgrav #include "dispatch.h" /* typedef, DISPATCH_MAX */ 46511b41d2SMark Murray 47bc5531deSDag-Erling Smørgrav struct key_entry { 48bc5531deSDag-Erling Smørgrav TAILQ_ENTRY(key_entry) next; 49bc5531deSDag-Erling Smørgrav struct sshkey *key; 50bc5531deSDag-Erling Smørgrav }; 51511b41d2SMark Murray 52bc5531deSDag-Erling Smørgrav struct ssh { 53bc5531deSDag-Erling Smørgrav /* Session state */ 54bc5531deSDag-Erling Smørgrav struct session_state *state; 5580628bacSDag-Erling Smørgrav 56bc5531deSDag-Erling Smørgrav /* Key exchange */ 57bc5531deSDag-Erling Smørgrav struct kex *kex; 58511b41d2SMark Murray 59076ad2f8SDag-Erling Smørgrav /* cached local and remote ip addresses and ports */ 60bc5531deSDag-Erling Smørgrav char *remote_ipaddr; 61bc5531deSDag-Erling Smørgrav int remote_port; 62076ad2f8SDag-Erling Smørgrav char *local_ipaddr; 63076ad2f8SDag-Erling Smørgrav int local_port; 6447dd1d1bSDag-Erling Smørgrav char *rdomain_in; 65bc5531deSDag-Erling Smørgrav 66d93a896eSDag-Erling Smørgrav /* Optional preamble for log messages (e.g. username) */ 67d93a896eSDag-Erling Smørgrav char *log_preamble; 68d93a896eSDag-Erling Smørgrav 69bc5531deSDag-Erling Smørgrav /* Dispatcher table */ 70bc5531deSDag-Erling Smørgrav dispatch_fn *dispatch[DISPATCH_MAX]; 71bc5531deSDag-Erling Smørgrav /* number of packets to ignore in the dispatcher */ 72bc5531deSDag-Erling Smørgrav int dispatch_skip_packets; 73bc5531deSDag-Erling Smørgrav 74bc5531deSDag-Erling Smørgrav /* datafellows */ 75bc5531deSDag-Erling Smørgrav int compat; 76bc5531deSDag-Erling Smørgrav 77bc5531deSDag-Erling Smørgrav /* Lists for private and public keys */ 78bc5531deSDag-Erling Smørgrav TAILQ_HEAD(, key_entry) private_keys; 79bc5531deSDag-Erling Smørgrav TAILQ_HEAD(, key_entry) public_keys; 80bc5531deSDag-Erling Smørgrav 814f52dfbbSDag-Erling Smørgrav /* Client/Server authentication context */ 824f52dfbbSDag-Erling Smørgrav void *authctxt; 834f52dfbbSDag-Erling Smørgrav 844f52dfbbSDag-Erling Smørgrav /* Channels context */ 854f52dfbbSDag-Erling Smørgrav struct ssh_channels *chanctxt; 864f52dfbbSDag-Erling Smørgrav 87bc5531deSDag-Erling Smørgrav /* APP data */ 88bc5531deSDag-Erling Smørgrav void *app_data; 89bc5531deSDag-Erling Smørgrav }; 90bc5531deSDag-Erling Smørgrav 91ca86bcf2SDag-Erling Smørgrav typedef int (ssh_packet_hook_fn)(struct ssh *, struct sshbuf *, 92ca86bcf2SDag-Erling Smørgrav u_char *, void *); 93ca86bcf2SDag-Erling Smørgrav 94bc5531deSDag-Erling Smørgrav struct ssh *ssh_alloc_session_state(void); 95bc5531deSDag-Erling Smørgrav struct ssh *ssh_packet_set_connection(struct ssh *, int, int); 96bc5531deSDag-Erling Smørgrav void ssh_packet_set_timeout(struct ssh *, int, int); 97bc5531deSDag-Erling Smørgrav int ssh_packet_stop_discard(struct ssh *); 98bc5531deSDag-Erling Smørgrav int ssh_packet_connection_af(struct ssh *); 99bc5531deSDag-Erling Smørgrav void ssh_packet_set_nonblocking(struct ssh *); 100bc5531deSDag-Erling Smørgrav int ssh_packet_get_connection_in(struct ssh *); 101bc5531deSDag-Erling Smørgrav int ssh_packet_get_connection_out(struct ssh *); 102bc5531deSDag-Erling Smørgrav void ssh_packet_close(struct ssh *); 103ca86bcf2SDag-Erling Smørgrav void ssh_packet_set_input_hook(struct ssh *, ssh_packet_hook_fn *, void *); 1044f52dfbbSDag-Erling Smørgrav void ssh_packet_clear_keys(struct ssh *); 1054f52dfbbSDag-Erling Smørgrav void ssh_clear_newkeys(struct ssh *, int); 106ca86bcf2SDag-Erling Smørgrav 107acc1a9efSDag-Erling Smørgrav int ssh_packet_is_rekeying(struct ssh *); 10819261079SEd Maste int ssh_packet_check_rekey(struct ssh *); 109bc5531deSDag-Erling Smørgrav void ssh_packet_set_protocol_flags(struct ssh *, u_int); 110bc5531deSDag-Erling Smørgrav u_int ssh_packet_get_protocol_flags(struct ssh *); 111bc5531deSDag-Erling Smørgrav void ssh_packet_set_tos(struct ssh *, int); 112bc5531deSDag-Erling Smørgrav void ssh_packet_set_interactive(struct ssh *, int, int, int); 113bc5531deSDag-Erling Smørgrav int ssh_packet_is_interactive(struct ssh *); 114bc5531deSDag-Erling Smørgrav void ssh_packet_set_server(struct ssh *); 115bc5531deSDag-Erling Smørgrav void ssh_packet_set_authenticated(struct ssh *); 116ca86bcf2SDag-Erling Smørgrav void ssh_packet_set_mux(struct ssh *); 117ca86bcf2SDag-Erling Smørgrav int ssh_packet_get_mux(struct ssh *); 118d93a896eSDag-Erling Smørgrav int ssh_packet_set_log_preamble(struct ssh *, const char *, ...) 119d93a896eSDag-Erling Smørgrav __attribute__((format(printf, 2, 3))); 120ca86bcf2SDag-Erling Smørgrav 121ca86bcf2SDag-Erling Smørgrav int ssh_packet_log_type(u_char); 122bc5531deSDag-Erling Smørgrav 123bc5531deSDag-Erling Smørgrav int ssh_packet_send2_wrapped(struct ssh *); 124bc5531deSDag-Erling Smørgrav int ssh_packet_send2(struct ssh *); 125bc5531deSDag-Erling Smørgrav 126bc5531deSDag-Erling Smørgrav int ssh_packet_read(struct ssh *); 127bc5531deSDag-Erling Smørgrav int ssh_packet_read_poll(struct ssh *); 128bc5531deSDag-Erling Smørgrav int ssh_packet_read_poll2(struct ssh *, u_char *, u_int32_t *seqnr_p); 129bc5531deSDag-Erling Smørgrav int ssh_packet_process_incoming(struct ssh *, const char *buf, u_int len); 1301323ec57SEd Maste int ssh_packet_process_read(struct ssh *, int); 131bc5531deSDag-Erling Smørgrav int ssh_packet_read_seqnr(struct ssh *, u_char *, u_int32_t *seqnr_p); 132bc5531deSDag-Erling Smørgrav int ssh_packet_read_poll_seqnr(struct ssh *, u_char *, u_int32_t *seqnr_p); 133bc5531deSDag-Erling Smørgrav 134bc5531deSDag-Erling Smørgrav const void *ssh_packet_get_string_ptr(struct ssh *, u_int *length_ptr); 135bc5531deSDag-Erling Smørgrav void ssh_packet_disconnect(struct ssh *, const char *fmt, ...) 136bc5531deSDag-Erling Smørgrav __attribute__((format(printf, 2, 3))) 137bc5531deSDag-Erling Smørgrav __attribute__((noreturn)); 138bc5531deSDag-Erling Smørgrav void ssh_packet_send_debug(struct ssh *, const char *fmt, ...) __attribute__((format(printf, 2, 3))); 139bc5531deSDag-Erling Smørgrav 140bc5531deSDag-Erling Smørgrav int ssh_set_newkeys(struct ssh *, int mode); 141bc5531deSDag-Erling Smørgrav void ssh_packet_get_bytes(struct ssh *, u_int64_t *, u_int64_t *); 142bc5531deSDag-Erling Smørgrav 143bc5531deSDag-Erling Smørgrav int ssh_packet_write_poll(struct ssh *); 144bc5531deSDag-Erling Smørgrav int ssh_packet_write_wait(struct ssh *); 145bc5531deSDag-Erling Smørgrav int ssh_packet_have_data_to_write(struct ssh *); 146bc5531deSDag-Erling Smørgrav int ssh_packet_not_very_much_data_to_write(struct ssh *); 147edf85781SEd Maste int ssh_packet_interactive_data_to_write(struct ssh *); 148bc5531deSDag-Erling Smørgrav 149bc5531deSDag-Erling Smørgrav int ssh_packet_connection_is_on_socket(struct ssh *); 150bc5531deSDag-Erling Smørgrav int ssh_packet_remaining(struct ssh *); 151af12a3e7SDag-Erling Smørgrav 152190cef3dSDag-Erling Smørgrav void ssh_tty_make_modes(struct ssh *, int, struct termios *); 153190cef3dSDag-Erling Smørgrav void ssh_tty_parse_modes(struct ssh *, int); 154af12a3e7SDag-Erling Smørgrav 155bc5531deSDag-Erling Smørgrav void ssh_packet_set_alive_timeouts(struct ssh *, int); 156bc5531deSDag-Erling Smørgrav int ssh_packet_inc_alive_timeouts(struct ssh *); 157bc5531deSDag-Erling Smørgrav int ssh_packet_set_maxsize(struct ssh *, u_int); 158bc5531deSDag-Erling Smørgrav u_int ssh_packet_get_maxsize(struct ssh *); 159511b41d2SMark Murray 160bc5531deSDag-Erling Smørgrav int ssh_packet_get_state(struct ssh *, struct sshbuf *); 161bc5531deSDag-Erling Smørgrav int ssh_packet_set_state(struct ssh *, struct sshbuf *); 162e8aafc91SKris Kennaway 163bc5531deSDag-Erling Smørgrav const char *ssh_remote_ipaddr(struct ssh *); 164acc1a9efSDag-Erling Smørgrav int ssh_remote_port(struct ssh *); 165076ad2f8SDag-Erling Smørgrav const char *ssh_local_ipaddr(struct ssh *); 166076ad2f8SDag-Erling Smørgrav int ssh_local_port(struct ssh *); 16747dd1d1bSDag-Erling Smørgrav const char *ssh_packet_rdomain_in(struct ssh *); 168cf2b5f3bSDag-Erling Smørgrav 169d93a896eSDag-Erling Smørgrav void ssh_packet_set_rekey_limits(struct ssh *, u_int64_t, u_int32_t); 170bc5531deSDag-Erling Smørgrav time_t ssh_packet_get_rekey_timeout(struct ssh *); 1717aee6ffeSDag-Erling Smørgrav 172bc5531deSDag-Erling Smørgrav void *ssh_packet_get_input(struct ssh *); 173bc5531deSDag-Erling Smørgrav void *ssh_packet_get_output(struct ssh *); 174bc5531deSDag-Erling Smørgrav 175bc5531deSDag-Erling Smørgrav /* new API */ 176bc5531deSDag-Erling Smørgrav int sshpkt_start(struct ssh *ssh, u_char type); 177bc5531deSDag-Erling Smørgrav int sshpkt_send(struct ssh *ssh); 178bc5531deSDag-Erling Smørgrav int sshpkt_disconnect(struct ssh *, const char *fmt, ...) 179bc5531deSDag-Erling Smørgrav __attribute__((format(printf, 2, 3))); 180bc5531deSDag-Erling Smørgrav int sshpkt_add_padding(struct ssh *, u_char); 18119261079SEd Maste void sshpkt_fatal(struct ssh *ssh, int r, const char *fmt, ...) 18219261079SEd Maste __attribute__((format(printf, 3, 4))) 18319261079SEd Maste __attribute__((noreturn)); 1844f52dfbbSDag-Erling Smørgrav int sshpkt_msg_ignore(struct ssh *, u_int); 185bc5531deSDag-Erling Smørgrav 186bc5531deSDag-Erling Smørgrav int sshpkt_put(struct ssh *ssh, const void *v, size_t len); 187bc5531deSDag-Erling Smørgrav int sshpkt_putb(struct ssh *ssh, const struct sshbuf *b); 188bc5531deSDag-Erling Smørgrav int sshpkt_put_u8(struct ssh *ssh, u_char val); 189bc5531deSDag-Erling Smørgrav int sshpkt_put_u32(struct ssh *ssh, u_int32_t val); 190bc5531deSDag-Erling Smørgrav int sshpkt_put_u64(struct ssh *ssh, u_int64_t val); 191bc5531deSDag-Erling Smørgrav int sshpkt_put_string(struct ssh *ssh, const void *v, size_t len); 192bc5531deSDag-Erling Smørgrav int sshpkt_put_cstring(struct ssh *ssh, const void *v); 193bc5531deSDag-Erling Smørgrav int sshpkt_put_stringb(struct ssh *ssh, const struct sshbuf *v); 194bc5531deSDag-Erling Smørgrav int sshpkt_put_ec(struct ssh *ssh, const EC_POINT *v, const EC_GROUP *g); 195bc5531deSDag-Erling Smørgrav int sshpkt_put_bignum2(struct ssh *ssh, const BIGNUM *v); 196bc5531deSDag-Erling Smørgrav 197bc5531deSDag-Erling Smørgrav int sshpkt_get(struct ssh *ssh, void *valp, size_t len); 198bc5531deSDag-Erling Smørgrav int sshpkt_get_u8(struct ssh *ssh, u_char *valp); 199bc5531deSDag-Erling Smørgrav int sshpkt_get_u32(struct ssh *ssh, u_int32_t *valp); 200bc5531deSDag-Erling Smørgrav int sshpkt_get_u64(struct ssh *ssh, u_int64_t *valp); 201bc5531deSDag-Erling Smørgrav int sshpkt_get_string(struct ssh *ssh, u_char **valp, size_t *lenp); 202bc5531deSDag-Erling Smørgrav int sshpkt_get_string_direct(struct ssh *ssh, const u_char **valp, size_t *lenp); 2034f52dfbbSDag-Erling Smørgrav int sshpkt_peek_string_direct(struct ssh *ssh, const u_char **valp, size_t *lenp); 204bc5531deSDag-Erling Smørgrav int sshpkt_get_cstring(struct ssh *ssh, char **valp, size_t *lenp); 20519261079SEd Maste int sshpkt_getb_froms(struct ssh *ssh, struct sshbuf **valp); 206bc5531deSDag-Erling Smørgrav int sshpkt_get_ec(struct ssh *ssh, EC_POINT *v, const EC_GROUP *g); 20719261079SEd Maste int sshpkt_get_bignum2(struct ssh *ssh, BIGNUM **valp); 208bc5531deSDag-Erling Smørgrav int sshpkt_get_end(struct ssh *ssh); 20947dd1d1bSDag-Erling Smørgrav void sshpkt_fmt_connection_id(struct ssh *ssh, char *s, size_t l); 210bc5531deSDag-Erling Smørgrav const u_char *sshpkt_ptr(struct ssh *, size_t *lenp); 211bc5531deSDag-Erling Smørgrav 212bc5531deSDag-Erling Smørgrav #if !defined(WITH_OPENSSL) 213bc5531deSDag-Erling Smørgrav # undef BIGNUM 214bc5531deSDag-Erling Smørgrav # undef EC_KEY 215bc5531deSDag-Erling Smørgrav # undef EC_GROUP 216bc5531deSDag-Erling Smørgrav # undef EC_POINT 217bc5531deSDag-Erling Smørgrav #elif !defined(OPENSSL_HAS_ECC) 218bc5531deSDag-Erling Smørgrav # undef EC_KEY 219bc5531deSDag-Erling Smørgrav # undef EC_GROUP 220bc5531deSDag-Erling Smørgrav # undef EC_POINT 221bc5531deSDag-Erling Smørgrav #endif 2227aee6ffeSDag-Erling Smørgrav 223511b41d2SMark Murray #endif /* PACKET_H */ 224