1285031Sdes/* Written by Markus Friedl. Placed in the public domain. */ 2285031Sdes 3285031Sdes#include "includes.h" 4285031Sdes 5285031Sdes#include "ssherr.h" 6285031Sdes#include "packet.h" 7285031Sdes#include "log.h" 8285031Sdes 9285031Sdesstruct ssh *active_state, *backup_state; 10285031Sdes 11285031Sdes/* Map old to new API */ 12285031Sdes 13285031Sdesvoid 14285031Sdesssh_packet_start(struct ssh *ssh, u_char type) 15285031Sdes{ 16285031Sdes int r; 17285031Sdes 18285031Sdes if ((r = sshpkt_start(ssh, type)) != 0) 19285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 20285031Sdes} 21285031Sdes 22285031Sdesvoid 23285031Sdesssh_packet_put_char(struct ssh *ssh, int value) 24285031Sdes{ 25285031Sdes u_char ch = value; 26285031Sdes int r; 27285031Sdes 28285031Sdes if ((r = sshpkt_put_u8(ssh, ch)) != 0) 29285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 30285031Sdes} 31285031Sdes 32285031Sdesvoid 33285031Sdesssh_packet_put_int(struct ssh *ssh, u_int value) 34285031Sdes{ 35285031Sdes int r; 36285031Sdes 37285031Sdes if ((r = sshpkt_put_u32(ssh, value)) != 0) 38285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 39285031Sdes} 40285031Sdes 41285031Sdesvoid 42285031Sdesssh_packet_put_int64(struct ssh *ssh, u_int64_t value) 43285031Sdes{ 44285031Sdes int r; 45285031Sdes 46285031Sdes if ((r = sshpkt_put_u64(ssh, value)) != 0) 47285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 48285031Sdes} 49285031Sdes 50285031Sdesvoid 51285031Sdesssh_packet_put_string(struct ssh *ssh, const void *buf, u_int len) 52285031Sdes{ 53285031Sdes int r; 54285031Sdes 55285031Sdes if ((r = sshpkt_put_string(ssh, buf, len)) != 0) 56285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 57285031Sdes} 58285031Sdes 59285031Sdesvoid 60285031Sdesssh_packet_put_cstring(struct ssh *ssh, const char *str) 61285031Sdes{ 62285031Sdes int r; 63285031Sdes 64285031Sdes if ((r = sshpkt_put_cstring(ssh, str)) != 0) 65285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 66285031Sdes} 67285031Sdes 68285031Sdesvoid 69285031Sdesssh_packet_put_raw(struct ssh *ssh, const void *buf, u_int len) 70285031Sdes{ 71285031Sdes int r; 72285031Sdes 73285031Sdes if ((r = sshpkt_put(ssh, buf, len)) != 0) 74285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 75285031Sdes} 76285031Sdes 77285031Sdes#ifdef WITH_SSH1 78285031Sdesvoid 79285031Sdesssh_packet_put_bignum(struct ssh *ssh, BIGNUM * value) 80285031Sdes{ 81285031Sdes int r; 82285031Sdes 83285031Sdes if ((r = sshpkt_put_bignum1(ssh, value)) != 0) 84285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 85285031Sdes} 86285031Sdes#endif 87285031Sdes 88285031Sdes#ifdef WITH_OPENSSL 89285031Sdesvoid 90285031Sdesssh_packet_put_bignum2(struct ssh *ssh, BIGNUM * value) 91285031Sdes{ 92285031Sdes int r; 93285031Sdes 94285031Sdes if ((r = sshpkt_put_bignum2(ssh, value)) != 0) 95285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 96285031Sdes} 97285031Sdes 98285031Sdes# ifdef OPENSSL_HAS_ECC 99285031Sdesvoid 100285031Sdesssh_packet_put_ecpoint(struct ssh *ssh, const EC_GROUP *curve, 101285031Sdes const EC_POINT *point) 102285031Sdes{ 103285031Sdes int r; 104285031Sdes 105285031Sdes if ((r = sshpkt_put_ec(ssh, point, curve)) != 0) 106285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 107285031Sdes} 108285031Sdes# endif 109285031Sdes#endif /* WITH_OPENSSL */ 110285031Sdes 111285031Sdesvoid 112285031Sdesssh_packet_send(struct ssh *ssh) 113285031Sdes{ 114285031Sdes int r; 115285031Sdes 116285031Sdes if ((r = sshpkt_send(ssh)) != 0) 117285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 118285031Sdes} 119285031Sdes 120285031Sdesu_int 121285031Sdesssh_packet_get_char(struct ssh *ssh) 122285031Sdes{ 123285031Sdes u_char ch; 124285031Sdes int r; 125285031Sdes 126285031Sdes if ((r = sshpkt_get_u8(ssh, &ch)) != 0) 127285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 128285031Sdes return ch; 129285031Sdes} 130285031Sdes 131285031Sdesu_int 132285031Sdesssh_packet_get_int(struct ssh *ssh) 133285031Sdes{ 134285031Sdes u_int val; 135285031Sdes int r; 136285031Sdes 137285031Sdes if ((r = sshpkt_get_u32(ssh, &val)) != 0) 138285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 139285031Sdes return val; 140285031Sdes} 141285031Sdes 142285031Sdesu_int64_t 143285031Sdesssh_packet_get_int64(struct ssh *ssh) 144285031Sdes{ 145285031Sdes u_int64_t val; 146285031Sdes int r; 147285031Sdes 148285031Sdes if ((r = sshpkt_get_u64(ssh, &val)) != 0) 149285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 150285031Sdes return val; 151285031Sdes} 152285031Sdes 153285031Sdes#ifdef WITH_SSH1 154285031Sdesvoid 155285031Sdesssh_packet_get_bignum(struct ssh *ssh, BIGNUM * value) 156285031Sdes{ 157285031Sdes int r; 158285031Sdes 159285031Sdes if ((r = sshpkt_get_bignum1(ssh, value)) != 0) 160285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 161285031Sdes} 162285031Sdes#endif 163285031Sdes 164285031Sdes#ifdef WITH_OPENSSL 165285031Sdesvoid 166285031Sdesssh_packet_get_bignum2(struct ssh *ssh, BIGNUM * value) 167285031Sdes{ 168285031Sdes int r; 169285031Sdes 170285031Sdes if ((r = sshpkt_get_bignum2(ssh, value)) != 0) 171285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 172285031Sdes} 173285031Sdes 174285031Sdes# ifdef OPENSSL_HAS_ECC 175285031Sdesvoid 176285031Sdesssh_packet_get_ecpoint(struct ssh *ssh, const EC_GROUP *curve, EC_POINT *point) 177285031Sdes{ 178285031Sdes int r; 179285031Sdes 180285031Sdes if ((r = sshpkt_get_ec(ssh, point, curve)) != 0) 181285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 182285031Sdes} 183285031Sdes# endif 184285031Sdes#endif /* WITH_OPENSSL */ 185285031Sdes 186285031Sdesvoid * 187285031Sdesssh_packet_get_string(struct ssh *ssh, u_int *length_ptr) 188285031Sdes{ 189285031Sdes int r; 190285031Sdes size_t len; 191285031Sdes u_char *val; 192285031Sdes 193285031Sdes if ((r = sshpkt_get_string(ssh, &val, &len)) != 0) 194285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 195285031Sdes if (length_ptr != NULL) 196285031Sdes *length_ptr = (u_int)len; 197285031Sdes return val; 198285031Sdes} 199285031Sdes 200285031Sdesconst void * 201285031Sdesssh_packet_get_string_ptr(struct ssh *ssh, u_int *length_ptr) 202285031Sdes{ 203285031Sdes int r; 204285031Sdes size_t len; 205285031Sdes const u_char *val; 206285031Sdes 207285031Sdes if ((r = sshpkt_get_string_direct(ssh, &val, &len)) != 0) 208285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 209285031Sdes if (length_ptr != NULL) 210285031Sdes *length_ptr = (u_int)len; 211285031Sdes return val; 212285031Sdes} 213285031Sdes 214285031Sdeschar * 215285031Sdesssh_packet_get_cstring(struct ssh *ssh, u_int *length_ptr) 216285031Sdes{ 217285031Sdes int r; 218285031Sdes size_t len; 219285031Sdes char *val; 220285031Sdes 221285031Sdes if ((r = sshpkt_get_cstring(ssh, &val, &len)) != 0) 222285031Sdes fatal("%s: %s", __func__, ssh_err(r)); 223285031Sdes if (length_ptr != NULL) 224285031Sdes *length_ptr = (u_int)len; 225285031Sdes return val; 226285031Sdes} 227285031Sdes 228285031Sdes/* Old API, that had to be reimplemented */ 229285031Sdes 230285031Sdesvoid 231285031Sdespacket_set_connection(int fd_in, int fd_out) 232285031Sdes{ 233285031Sdes active_state = ssh_packet_set_connection(active_state, fd_in, fd_out); 234285031Sdes if (active_state == NULL) 235285031Sdes fatal("%s: ssh_packet_set_connection failed", __func__); 236285031Sdes} 237285031Sdes 238285031Sdesu_int 239285031Sdespacket_get_char(void) 240285031Sdes{ 241285031Sdes return (ssh_packet_get_char(active_state)); 242285031Sdes} 243285031Sdes 244285031Sdesu_int 245285031Sdespacket_get_int(void) 246285031Sdes{ 247285031Sdes return (ssh_packet_get_int(active_state)); 248285031Sdes} 249285031Sdes 250285031Sdesint 251285031Sdespacket_read_seqnr(u_int32_t *seqnr) 252285031Sdes{ 253285031Sdes u_char type; 254285031Sdes int r; 255285031Sdes 256285031Sdes if ((r = ssh_packet_read_seqnr(active_state, &type, seqnr)) != 0) 257285031Sdes sshpkt_fatal(active_state, __func__, r); 258285031Sdes return type; 259285031Sdes} 260285031Sdes 261285031Sdesint 262285031Sdespacket_read_poll_seqnr(u_int32_t *seqnr) 263285031Sdes{ 264285031Sdes u_char type; 265285031Sdes int r; 266285031Sdes 267285031Sdes if ((r = ssh_packet_read_poll_seqnr(active_state, &type, seqnr))) 268285031Sdes sshpkt_fatal(active_state, __func__, r); 269285031Sdes return type; 270285031Sdes} 271285031Sdes 272285031Sdesvoid 273285031Sdespacket_close(void) 274285031Sdes{ 275285031Sdes ssh_packet_close(active_state); 276285031Sdes active_state = NULL; 277285031Sdes} 278285031Sdes 279285031Sdesvoid 280285031Sdespacket_process_incoming(const char *buf, u_int len) 281285031Sdes{ 282285031Sdes int r; 283285031Sdes 284285031Sdes if ((r = ssh_packet_process_incoming(active_state, buf, len)) != 0) 285285031Sdes sshpkt_fatal(active_state, __func__, r); 286285031Sdes} 287285031Sdes 288285031Sdesvoid 289285031Sdespacket_write_wait(void) 290285031Sdes{ 291285031Sdes int r; 292285031Sdes 293285031Sdes if ((r = ssh_packet_write_wait(active_state)) != 0) 294285031Sdes sshpkt_fatal(active_state, __func__, r); 295285031Sdes} 296285031Sdes 297285031Sdesvoid 298285031Sdespacket_write_poll(void) 299285031Sdes{ 300285031Sdes int r; 301285031Sdes 302285031Sdes if ((r = ssh_packet_write_poll(active_state)) != 0) 303285031Sdes sshpkt_fatal(active_state, __func__, r); 304285031Sdes} 305285031Sdes 306285031Sdesvoid 307285031Sdespacket_read_expect(int expected_type) 308285031Sdes{ 309285031Sdes int r; 310285031Sdes 311285031Sdes if ((r = ssh_packet_read_expect(active_state, expected_type)) != 0) 312285031Sdes sshpkt_fatal(active_state, __func__, r); 313285031Sdes} 314285031Sdes 315285031Sdesvoid 316285031Sdespacket_disconnect(const char *fmt, ...) 317285031Sdes{ 318285031Sdes char buf[1024]; 319285031Sdes va_list args; 320285031Sdes 321285031Sdes va_start(args, fmt); 322285031Sdes vsnprintf(buf, sizeof(buf), fmt, args); 323285031Sdes va_end(args); 324285031Sdes ssh_packet_disconnect(active_state, "%s", buf); 325285031Sdes} 326285031Sdes 327285031Sdesvoid 328285031Sdespacket_send_debug(const char *fmt, ...) 329285031Sdes{ 330285031Sdes char buf[1024]; 331285031Sdes va_list args; 332285031Sdes 333285031Sdes va_start(args, fmt); 334285031Sdes vsnprintf(buf, sizeof(buf), fmt, args); 335285031Sdes va_end(args); 336285031Sdes ssh_packet_send_debug(active_state, "%s", buf); 337285031Sdes} 338