00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _LIBSSH_PRIV_H
00031 #define _LIBSSH_PRIV_H
00032 #include "config.h"
00033 #include "libssh/libssh.h"
00034
00035
00036
00037
00038
00039
00040
00041
00042 #define MAX_PACKET_LEN 262144
00043 #define ERROR_BUFFERLEN 1024
00044 #define CLIENTBANNER1 "SSH-1.5-libssh-" SSH_STRINGIFY(LIBSSH_VERSION)
00045 #define CLIENTBANNER2 "SSH-2.0-libssh-" SSH_STRINGIFY(LIBSSH_VERSION)
00046 #define KBDINT_MAX_PROMPT 256
00047
00048 #define TYPE_DSS 1
00049 #define TYPE_RSA 2
00050 #define TYPE_RSA1 3
00051
00052
00053 #ifdef HAVE_LIBCRYPTO
00054 #define OPENSSL_BIGNUMS
00055 #endif
00056
00057 #ifdef __cplusplus
00058 extern "C" {
00059 #endif
00060
00061
00062 #ifdef HAVE_LIBGCRYPT
00063 #include <gcrypt.h>
00064 typedef gcry_md_hd_t SHACTX;
00065 typedef gcry_md_hd_t MD5CTX;
00066 typedef gcry_md_hd_t HMACCTX;
00067 #ifdef MD5_DIGEST_LEN
00068 #undef MD5_DIGEST_LEN
00069 #endif
00070 #define SHA_DIGEST_LEN 20
00071 #define MD5_DIGEST_LEN 16
00072 #define EVP_MAX_MD_SIZE 36
00073
00074 typedef gcry_mpi_t bignum;
00075
00076 #define bignum_new() gcry_mpi_new(0)
00077 #define bignum_free(num) gcry_mpi_release(num)
00078 #define bignum_set_word(bn,n) gcry_mpi_set_ui(bn,n)
00079 #define bignum_bin2bn(bn,datalen,data) gcry_mpi_scan(data,GCRYMPI_FMT_USG,bn,datalen,NULL)
00080 #define bignum_bn2dec(num) my_gcry_bn2dec(num)
00081 #define bignum_dec2bn(num, data) my_gcry_dec2bn(data, num)
00082 #define bignum_bn2hex(num,data) gcry_mpi_aprint(GCRYMPI_FMT_HEX,data,NULL,num)
00083 #define bignum_hex2bn(num,datalen,data) gcry_mpi_scan(num,GCRYMPI_FMT_HEX,data,datalen,NULL)
00084 #define bignum_rand(num,bits) gcry_mpi_randomize(num,bits,GCRY_STRONG_RANDOM),gcry_mpi_set_bit(num,bits-1),gcry_mpi_set_bit(num,0)
00085 #define bignum_mod_exp(dest,generator,exp,modulo) gcry_mpi_powm(dest,generator,exp,modulo)
00086 #define bignum_num_bits(num) gcry_mpi_get_nbits(num)
00087 #define bignum_num_bytes(num) ((gcry_mpi_get_nbits(num)+7)/8)
00088 #define bignum_is_bit_set(num,bit) gcry_mpi_test_bit(num,bit)
00089 #define bignum_bn2bin(num,datalen,data) gcry_mpi_print(GCRYMPI_FMT_USG,data,datalen,NULL,num)
00090 #define bignum_cmp(num1,num2) gcry_mpi_cmp(num1,num2)
00091
00092 #elif defined HAVE_LIBCRYPTO
00093 #include <openssl/dsa.h>
00094 #include <openssl/rsa.h>
00095 #include <openssl/sha.h>
00096 #include <openssl/md5.h>
00097 #include <openssl/hmac.h>
00098 typedef SHA_CTX* SHACTX;
00099 typedef MD5_CTX* MD5CTX;
00100 typedef HMAC_CTX* HMACCTX;
00101 #ifdef MD5_DIGEST_LEN
00102 #undef MD5_DIGEST_LEN
00103 #endif
00104 #define SHA_DIGEST_LEN SHA_DIGEST_LENGTH
00105 #define MD5_DIGEST_LEN MD5_DIGEST_LENGTH
00106
00107 #endif
00108 #ifdef OPENSSL_BIGNUMS
00109 #include <openssl/bn.h>
00110 typedef BIGNUM* bignum;
00111 typedef BN_CTX* bignum_CTX;
00112
00113 #define bignum_new() BN_new()
00114 #define bignum_free(num) BN_clear_free(num)
00115 #define bignum_set_word(bn,n) BN_set_word(bn,n)
00116 #define bignum_bin2bn(bn,datalen,data) BN_bin2bn(bn,datalen,data)
00117 #define bignum_bn2dec(num) BN_bn2dec(num)
00118 #define bignum_dec2bn(bn,data) BN_dec2bn(data,bn)
00119 #define bignum_bn2hex(num) BN_bn2hex(num)
00120 #define bignum_rand(rnd, bits, top, bottom) BN_rand(rnd,bits,top,bottom)
00121 #define bignum_ctx_new() BN_CTX_new()
00122 #define bignum_ctx_free(num) BN_CTX_free(num)
00123 #define bignum_mod_exp(dest,generator,exp,modulo,ctx) BN_mod_exp(dest,generator,exp,modulo,ctx)
00124 #define bignum_num_bytes(num) BN_num_bytes(num)
00125 #define bignum_num_bits(num) BN_num_bits(num)
00126 #define bignum_is_bit_set(num,bit) BN_is_bit_set(num,bit)
00127 #define bignum_bn2bin(num,ptr) BN_bn2bin(num,ptr)
00128 #define bignum_cmp(num1,num2) BN_cmp(num1,num2)
00129
00130 #endif
00131
00132 #ifdef HAVE_SYS_TIME_H
00133 #include <sys/time.h>
00134 #endif
00135
00136
00137 #ifdef HAVE_POLL
00138 #include <poll.h>
00139 typedef struct pollfd pollfd_t;
00140 #else
00141 typedef struct pollfd_s {
00142 socket_t fd;
00143 short events;
00144 short revents;
00145 } pollfd_t;
00146
00147 #define POLLIN 0x001
00148 #define POLLPRI 0x002
00149 #define POLLOUT 0x004
00150
00151 #define POLLERR 0x008
00152 #define POLLHUP 0x010
00153 #define POLLNVAL 0x020
00154
00155 typedef unsigned long int nfds_t;
00156 #endif
00157
00158
00159 MD5CTX md5_init(void);
00160 void md5_update(MD5CTX c, const void *data, unsigned long len);
00161 void md5_final(unsigned char *md,MD5CTX c);
00162 SHACTX sha1_init(void);
00163 void sha1_update(SHACTX c, const void *data, unsigned long len);
00164 void sha1_final(unsigned char *md,SHACTX c);
00165 void sha1(unsigned char *digest,int len,unsigned char *hash);
00166 #define HMAC_SHA1 1
00167 #define HMAC_MD5 2
00168 HMACCTX hmac_init(const void *key,int len,int type);
00169 void hmac_update(HMACCTX c, const void *data, unsigned long len);
00170 void hmac_final(HMACCTX ctx,unsigned char *hashmacbuf,unsigned int *len);
00171
00172
00173
00174 struct string_struct {
00175 u32 size;
00176 unsigned char string[MAX_PACKET_LEN];
00177 }
00178 #if !defined(__SUNPRO_C)
00179 __attribute__ ((packed))
00180 #endif
00181 ;
00182
00185 struct buffer_struct {
00186 char *data;
00187 u32 used;
00188 u32 allocated;
00189 u32 pos;
00190 };
00191
00192
00193 typedef struct packet_struct {
00194 int valid;
00195 u32 len;
00196 u8 type;
00197 } PACKET;
00198
00199 typedef struct kex_struct {
00200 unsigned char cookie[16];
00201 char **methods;
00202 } KEX;
00203
00204 struct public_key_struct {
00205 int type;
00206 const char *type_c;
00207 #ifdef HAVE_LIBGCRYPT
00208 gcry_sexp_t dsa_pub;
00209 gcry_sexp_t rsa_pub;
00210 #elif HAVE_LIBCRYPTO
00211 DSA *dsa_pub;
00212 RSA *rsa_pub;
00213 #endif
00214 };
00215
00216 struct private_key_struct {
00217 int type;
00218 #ifdef HAVE_LIBGCRYPT
00219 gcry_sexp_t dsa_priv;
00220 gcry_sexp_t rsa_priv;
00221 #elif defined HAVE_LIBCRYPTO
00222 DSA *dsa_priv;
00223 RSA *rsa_priv;
00224 #endif
00225 };
00226
00227 typedef struct signature_struct {
00228 int type;
00229 #ifdef HAVE_LIBGCRYPT
00230 gcry_sexp_t dsa_sign;
00231 gcry_sexp_t rsa_sign;
00232 #elif defined HAVE_LIBCRYPTO
00233 DSA_SIG *dsa_sign;
00234 STRING *rsa_sign;
00235 #endif
00236 } SIGNATURE;
00237
00238
00239 struct error_struct {
00240
00241 int error_code;
00242 char error_buffer[ERROR_BUFFERLEN];
00243 };
00244
00245 struct ssh_options_struct {
00246 struct error_struct error;
00247 char *banner;
00248 char *username;
00249 char *host;
00250 char *bindaddr;
00251 int bindport;
00252 char *identity;
00253 char *ssh_dir;
00254 char *known_hosts_file;
00255 socket_t fd;
00256 int port;
00257 int dont_verify_hostkey;
00258 int use_nonexisting_algo;
00259 char *wanted_methods[10];
00260 void *wanted_cookie;
00261 ssh_auth_callback auth_function;
00262 void *auth_userdata;
00263 void (*connect_status_function)(void *arg, float status);
00264 void *connect_status_arg;
00265 long timeout;
00266 long timeout_usec;
00267 int ssh2allowed;
00268 int ssh1allowed;
00269 char *dsakey;
00270 char *rsakey;
00271 int log_verbosity;
00272 void (*log_function)(const char *message, SSH_SESSION *session, int verbosity);
00273 };
00274
00275 typedef struct ssh_crypto_struct {
00276 bignum e,f,x,k,y;
00277 unsigned char session_id[SHA_DIGEST_LEN];
00278
00279 unsigned char encryptIV[SHA_DIGEST_LEN*2];
00280 unsigned char decryptIV[SHA_DIGEST_LEN*2];
00281
00282 unsigned char decryptkey[SHA_DIGEST_LEN*2];
00283 unsigned char encryptkey[SHA_DIGEST_LEN*2];
00284
00285 unsigned char encryptMAC[SHA_DIGEST_LEN];
00286 unsigned char decryptMAC[SHA_DIGEST_LEN];
00287 unsigned char hmacbuf[EVP_MAX_MD_SIZE];
00288 struct crypto_struct *in_cipher, *out_cipher;
00289 STRING *server_pubkey;
00290 const char *server_pubkey_type;
00291 int do_compress_out;
00292 int do_compress_in;
00293 void *compress_out_ctx;
00294 void *compress_in_ctx;
00295 } CRYPTO;
00296
00297 struct channel_struct {
00298 struct channel_struct *prev;
00299 struct channel_struct *next;
00300 SSH_SESSION *session;
00301 u32 local_channel;
00302 u32 local_window;
00303 int local_eof;
00304 u32 local_maxpacket;
00305
00306 u32 remote_channel;
00307 u32 remote_window;
00308 int remote_eof;
00309 u32 remote_maxpacket;
00310 int open;
00311 int delayed_close;
00312 BUFFER *stdout_buffer;
00313 BUFFER *stderr_buffer;
00314 void *userarg;
00315 int version;
00316 int blocking;
00317 int exit_status;
00318 };
00319
00320 struct agent_struct {
00321 struct socket *sock;
00322 BUFFER *ident;
00323 unsigned int count;
00324 };
00325
00326 struct keys_struct {
00327 const char *privatekey;
00328 const char *publickey;
00329 };
00330
00331 struct ssh_session {
00332 struct error_struct error;
00333 struct socket *socket;
00334 SSH_OPTIONS *options;
00335 char *serverbanner;
00336 char *clientbanner;
00337 int protoversion;
00338 int server;
00339 int client;
00340 int openssh;
00341 u32 send_seq;
00342 u32 recv_seq;
00343
00344 int closed;
00345 int closed_by_except;
00346
00347 int connected;
00348
00349 int alive;
00350
00351 int auth_service_asked;
00352
00353
00354 int blocking;
00355
00356 STRING *banner;
00357
00358 char *remotebanner;
00359
00360 char *discon_msg;
00361
00362 BUFFER *in_buffer;
00363 PACKET in_packet;
00364 BUFFER *out_buffer;
00365
00366
00367
00368 int packet_state;
00369 int dh_handshake_state;
00370 STRING *dh_server_signature;
00371
00372 KEX server_kex;
00373 KEX client_kex;
00374 BUFFER *in_hashbuf;
00375 BUFFER *out_hashbuf;
00376 CRYPTO *current_crypto;
00377 CRYPTO *next_crypto;
00378
00379 CHANNEL *channels;
00380 int maxchannel;
00381 int exec_channel_opened;
00382
00383 AGENT *agent;
00384
00385
00386 struct ssh_kbdint *kbdint;
00387 int version;
00388
00389 PRIVATE_KEY *rsa_key;
00390 PRIVATE_KEY *dsa_key;
00391
00392 int auth_methods;
00393 int hostkeys;
00394 struct ssh_message *ssh_message;
00395 int log_verbosity;
00396 int log_indent;
00397 };
00398
00399 struct ssh_kbdint {
00400 u32 nprompts;
00401 char *name;
00402 char *instruction;
00403 char **prompts;
00404 unsigned char *echo;
00405 char **answers;
00406 };
00407
00408
00409
00410 struct ssh_bind_struct {
00411 struct error_struct error;
00412 socket_t bindfd;
00413 SSH_OPTIONS *options;
00414 int blocking;
00415 int toaccept;
00416 };
00417
00418 struct ssh_auth_request {
00419 char *username;
00420 int method;
00421 char *password;
00422 };
00423
00424 struct ssh_channel_request_open {
00425 int type;
00426 u32 sender;
00427 u32 window;
00428 u32 packet_size;
00429 char *originator;
00430 u16 orignator_port;
00431 char *destination;
00432 u16 destination_port;
00433 };
00434
00435 struct ssh_channel_request {
00436 int type;
00437 CHANNEL *channel;
00438 u8 want_reply;
00439
00440 char *TERM;
00441 u32 width;
00442 u32 height;
00443 u32 pxwidth;
00444 u32 pxheight;
00445 STRING *modes;
00446
00447
00448 char *var_name;
00449 char *var_value;
00450
00451 char *command;
00452
00453 char *subsystem;
00454 };
00455
00456 struct ssh_message {
00457 SSH_SESSION *session;
00458 int type;
00459 struct ssh_auth_request auth_request;
00460 struct ssh_channel_request_open channel_request_open;
00461 struct ssh_channel_request channel_request;
00462 };
00463
00464 #ifndef _WIN32
00465
00471 struct agent_struct *agent_new(struct ssh_session *session);
00472
00473 void agent_close(struct agent_struct *agent);
00474
00480 void agent_free(struct agent_struct *agent);
00481
00489 int agent_is_running(struct ssh_session *session);
00490
00491 int agent_get_ident_count(struct ssh_session *session);
00492
00493 struct public_key_struct *agent_get_next_ident(struct ssh_session *session,
00494 char **comment);
00495
00496 struct public_key_struct *agent_get_first_ident(struct ssh_session *session,
00497 char **comment);
00498
00499 STRING *agent_sign_data(struct ssh_session *session,
00500 struct buffer_struct *data,
00501 struct public_key_struct *pubkey);
00502 #endif
00503
00504
00505 int ssh_poll(pollfd_t *fds, nfds_t nfds, int timeout);
00506
00507
00508
00509 struct socket;
00510 int ssh_socket_init(void);
00511 struct socket *ssh_socket_new(SSH_SESSION *session);
00512 void ssh_socket_free(struct socket *s);
00513 void ssh_socket_set_fd(struct socket *s, socket_t fd);
00514 socket_t ssh_socket_get_fd(struct socket *s);
00515 #ifndef _WIN32
00516 int ssh_socket_unix(struct socket *s, const char *path);
00517 #endif
00518 void ssh_socket_close(struct socket *s);
00519 int ssh_socket_read(struct socket *s, void *buffer, int len);
00520 int ssh_socket_write(struct socket *s,const void *buffer, int len);
00521 int ssh_socket_is_open(struct socket *s);
00522 int ssh_socket_fd_isset(struct socket *s, fd_set *set);
00523 void ssh_socket_fd_set(struct socket *s, fd_set *set, int *fd_max);
00524 int ssh_socket_completeread(struct socket *s, void *buffer, u32 len);
00525 int ssh_socket_completewrite(struct socket *s, const void *buffer, u32 len);
00526 int ssh_socket_wait_for_data(struct socket *s, SSH_SESSION *session, u32 len);
00527 int ssh_socket_nonblocking_flush(struct socket *s);
00528 int ssh_socket_blocking_flush(struct socket *s);
00529 int ssh_socket_poll(struct socket *s, int *writeable, int *except);
00530 void ssh_socket_set_towrite(struct socket *s);
00531 void ssh_socket_set_toread(struct socket *s);
00532 void ssh_socket_set_except(struct socket *s);
00533 int ssh_socket_get_status(struct socket *s);
00534 int ssh_socket_data_available(struct socket *s);
00535 int ssh_socket_data_writable(struct socket *s);
00536
00537
00538 void ssh_cleanup(SSH_SESSION *session);
00539
00540
00541
00542 int ssh_send_banner(SSH_SESSION *session, int is_server);
00543 char *ssh_get_banner(SSH_SESSION *session);
00544
00545
00546 void ssh_set_error(void *error, int code, const char *descr, ...) PRINTF_ATTRIBUTE(3, 4);
00547
00548
00549
00550 void ssh_print_bignum(const char *which,bignum num);
00551 int dh_generate_e(SSH_SESSION *session);
00552 int dh_generate_f(SSH_SESSION *session);
00553 int dh_generate_x(SSH_SESSION *session);
00554 int dh_generate_y(SSH_SESSION *session);
00555
00556 int ssh_crypto_init(void);
00557 void ssh_crypto_finalize(void);
00558
00559 STRING *dh_get_e(SSH_SESSION *session);
00560 STRING *dh_get_f(SSH_SESSION *session);
00561 int dh_import_f(SSH_SESSION *session,STRING *f_string);
00562 int dh_import_e(SSH_SESSION *session, STRING *e_string);
00563 void dh_import_pubkey(SSH_SESSION *session,STRING *pubkey_string);
00564 int dh_build_k(SSH_SESSION *session);
00565 int make_sessionid(SSH_SESSION *session);
00566
00567 int hashbufin_add_cookie(SSH_SESSION *session, unsigned char *cookie);
00568 int hashbufout_add_cookie(SSH_SESSION *session);
00569 int generate_session_keys(SSH_SESSION *session);
00570
00571 int signature_verify(SSH_SESSION *session,STRING *signature);
00572 bignum make_string_bn(STRING *string);
00573 STRING *make_bignum_string(bignum num);
00574
00575
00576 u32 packet_decrypt_len(SSH_SESSION *session,char *crypted);
00577 int packet_decrypt(SSH_SESSION *session, void *packet,unsigned int len);
00578 unsigned char *packet_encrypt(SSH_SESSION *session,void *packet,unsigned int len);
00579
00580 int packet_hmac_verify(SSH_SESSION *session,BUFFER *buffer,unsigned char *mac);
00581
00582
00583
00584 void packet_parse(SSH_SESSION *session);
00585 int packet_send(SSH_SESSION *session);
00586
00587 int packet_read(SSH_SESSION *session);
00588 int packet_translate(SSH_SESSION *session);
00589 int packet_wait(SSH_SESSION *session,int type,int blocking);
00590 int packet_flush(SSH_SESSION *session, int enforce_blocking);
00591
00592 SSH_SESSION *ssh_session_new();
00593 socket_t ssh_connect_host(SSH_SESSION *session, const char *host,const char
00594 *bind_addr, int port, long timeout, long usec);
00595
00596
00597 extern const char *ssh_kex_nums[];
00598 int ssh_send_kex(SSH_SESSION *session, int server_kex);
00599 void ssh_list_kex(SSH_SESSION *session, KEX *kex);
00600 int set_kex(SSH_SESSION *session);
00601 int ssh_get_kex(SSH_SESSION *session, int server_kex);
00602 int verify_existing_algo(int algo, const char *name);
00603 char **space_tokenize(const char *chain);
00604 int ssh_get_kex1(SSH_SESSION *session);
00605 char *ssh_find_matching(const char *in_d, const char *what_d);
00606
00607
00608
00609 PRIVATE_KEY *_privatekey_from_file(void *session, const char *filename,
00610 int type);
00611 STRING *try_publickey_from_file(SSH_SESSION *session,
00612 struct keys_struct keytab,
00613 char **privkeyfile, int *type);
00614
00615
00616 const char *ssh_type_to_char(int type);
00617 int ssh_type_from_name(const char *name);
00618
00619 PRIVATE_KEY *privatekey_make_dss(SSH_SESSION *session, BUFFER *buffer);
00620 PRIVATE_KEY *privatekey_make_rsa(SSH_SESSION *session, BUFFER *buffer,
00621 const char *type);
00622 PRIVATE_KEY *privatekey_from_string(SSH_SESSION *session, STRING *privkey_s);
00623
00624 PUBLIC_KEY *publickey_make_dss(SSH_SESSION *session, BUFFER *buffer);
00625 PUBLIC_KEY *publickey_make_rsa(SSH_SESSION *session, BUFFER *buffer, int type);
00626 PUBLIC_KEY *publickey_from_string(SSH_SESSION *session, STRING *pubkey_s);
00627 SIGNATURE *signature_from_string(SSH_SESSION *session, STRING *signature,PUBLIC_KEY *pubkey,int needed_type);
00628 void signature_free(SIGNATURE *sign);
00629 STRING *ssh_do_sign_with_agent(struct ssh_session *session,
00630 struct buffer_struct *buf, struct public_key_struct *publickey);
00631 STRING *ssh_do_sign(SSH_SESSION *session,BUFFER *sigbuf,
00632 PRIVATE_KEY *privatekey);
00633 STRING *ssh_sign_session_id(SSH_SESSION *session, PRIVATE_KEY *privatekey);
00634 STRING *ssh_encrypt_rsa1(SSH_SESSION *session, STRING *data, PUBLIC_KEY *key);
00635
00636 void channel_handle(SSH_SESSION *session, int type);
00637 CHANNEL *channel_new(SSH_SESSION *session);
00638 int channel_default_bufferize(CHANNEL *channel, void *data, int len,
00639 int is_stderr);
00640 u32 ssh_channel_new_id(SSH_SESSION *session);
00641 CHANNEL *ssh_channel_from_local(SSH_SESSION *session, u32 id);
00642
00643
00644
00645
00646 int ssh_options_default_username(SSH_OPTIONS *opt);
00647 int ssh_options_default_ssh_dir(SSH_OPTIONS *opt);
00648 int ssh_options_default_known_hosts_file(SSH_OPTIONS *opt);
00649
00650
00651 int buffer_add_ssh_string(BUFFER *buffer, STRING *string);
00652 int buffer_add_u8(BUFFER *buffer, u8 data);
00653 int buffer_add_u32(BUFFER *buffer, u32 data);
00654 int buffer_add_u64(BUFFER *buffer, u64 data);
00655 int buffer_add_data(BUFFER *buffer, const void *data, u32 len);
00656 int buffer_prepend_data(BUFFER *buffer, const void *data, u32 len);
00657 int buffer_add_buffer(BUFFER *buffer, BUFFER *source);
00658 int buffer_reinit(BUFFER *buffer);
00659
00660
00661 void *buffer_get_rest(BUFFER *buffer);
00662
00663 u32 buffer_get_rest_len(BUFFER *buffer);
00664
00665
00666 int buffer_get_u8(BUFFER *buffer, u8 *data);
00667 int buffer_get_u32(BUFFER *buffer, u32 *data);
00668 int buffer_get_u64(BUFFER *buffer, u64 *data);
00669
00670 u32 buffer_get_data(BUFFER *buffer, void *data, u32 requestedlen);
00671
00672 STRING *buffer_get_ssh_string(BUFFER *buffer);
00673
00674 STRING *buffer_get_mpint(BUFFER *buffer);
00675
00676 u32 buffer_pass_bytes_end(BUFFER *buffer, u32 len);
00677 u32 buffer_pass_bytes(BUFFER *buffer, u32 len);
00678
00679
00680 BUFFER *base64_to_bin(const char *source);
00681 unsigned char *bin_to_base64(const unsigned char *source, int len);
00682
00683
00684 int compress_buffer(SSH_SESSION *session,BUFFER *buf);
00685 int decompress_buffer(SSH_SESSION *session,BUFFER *buf);
00686
00687
00688 int crypt_set_algorithms(SSH_SESSION *);
00689 int crypt_set_algorithms_server(SSH_SESSION *session);
00690 CRYPTO *crypto_new(void);
00691 void crypto_free(CRYPTO *crypto);
00692
00693
00694 u32 ssh_crc32(const char *buf, u32 len);
00695
00696
00697 int ssh_userauth1_none(SSH_SESSION *session, const char *username);
00698 int ssh_userauth1_offer_pubkey(SSH_SESSION *session, const char *username,
00699 int type, STRING *pubkey);
00700 int ssh_userauth1_password(SSH_SESSION *session, const char *username,
00701 const char *password);
00702
00703
00704 char *ssh_get_user_home_dir(void);
00705 int ssh_file_readaccess_ok(const char *file);
00706
00707
00708 u64 ntohll(u64);
00709 #define htonll(x) ntohll(x)
00710
00711
00712 int channel_open_session1(CHANNEL *channel);
00713 int channel_request_pty_size1(CHANNEL *channel, const char *terminal,
00714 int cols, int rows);
00715 int channel_change_pty_size1(CHANNEL *channel, int cols, int rows);
00716 int channel_request_shell1(CHANNEL *channel);
00717 int channel_request_exec1(CHANNEL *channel, const char *cmd);
00718 int channel_handle1(SSH_SESSION *session, int type);
00719 int channel_write1(CHANNEL *channel, const void *data, int len);
00720
00721
00722
00723 int ssh_handle_packets(SSH_SESSION *session);
00724
00725
00726 int match_hostname(const char *host, const char *pattern, unsigned int len);
00727
00728
00729
00730 #ifndef __FUNCTION__
00731 #if defined(__SUNPRO_C)
00732 #define __FUNCTION__ __func__
00733 #endif
00734 #endif
00735
00736 #define _enter_function(sess) \
00737 do {\
00738 if((sess)->log_verbosity >= SSH_LOG_FUNCTIONS){ \
00739 ssh_log((sess),SSH_LOG_FUNCTIONS,"entering function %s line %d in " __FILE__ , __FUNCTION__,__LINE__);\
00740 (sess)->log_indent++; \
00741 } \
00742 } while(0)
00743
00744 #define _leave_function(sess) \
00745 do { \
00746 if((sess)->log_verbosity >= SSH_LOG_FUNCTIONS){ \
00747 (sess)->log_indent--; \
00748 ssh_log((sess),SSH_LOG_FUNCTIONS,"leaving function %s line %d in " __FILE__ , __FUNCTION__,__LINE__);\
00749 }\
00750 } while(0)
00751
00752 #define enter_function() _enter_function(session)
00753 #define leave_function() _leave_function(session)
00754
00756 #define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x=NULL;} } while(0)
00757
00759 #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
00760
00762 #define ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } while(0)
00763
00765 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
00766
00768 #define BURN_STRING(x) do { if ((x) != NULL) memset((x), 'X', strlen((x))); } while(0)
00769
00770 #ifdef HAVE_LIBGCRYPT
00771
00772 int my_gcry_dec2bn(bignum *bn, const char *data);
00773 char *my_gcry_bn2dec(bignum bn);
00774 #endif
00775
00776 #ifdef __cplusplus
00777 }
00778 #endif
00779
00780 #endif
00781