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 #ifndef _LIBSSH_PRIV_H
00027 #define _LIBSSH_PRIV_H
00028 #include "config.h"
00029 #include "libssh/libssh.h"
00030
00031
00032
00033
00034
00035
00036
00037
00038 #define MAX_PACKET_LEN 262144
00039 #define ERROR_BUFFERLEN 1024
00040 #define CLIENTBANNER1 "SSH-1.5-" LIBSSH_VERSION
00041 #define CLIENTBANNER2 "SSH-2.0-" LIBSSH_VERSION
00042 #define KBDINT_MAX_PROMPT 256
00043
00044 #define TYPE_DSS 1
00045 #define TYPE_RSA 2
00046 #define TYPE_RSA1 3
00047
00048
00049 #ifdef HAVE_LIBCRYPTO
00050 #define OPENSSL_BIGNUMS
00051 #endif
00052
00053 #ifdef __cplusplus
00054 extern "C" {
00055 #endif
00056
00057
00058 #ifdef HAVE_LIBGCRYPT
00059 #include <gcrypt.h>
00060 typedef gcry_md_hd_t SHACTX;
00061 typedef gcry_md_hd_t MD5CTX;
00062 typedef gcry_md_hd_t HMACCTX;
00063 #ifdef MD5_DIGEST_LEN
00064 #undef MD5_DIGEST_LEN
00065 #endif
00066 #define SHA_DIGEST_LEN 20
00067 #define MD5_DIGEST_LEN 16
00068 #define EVP_MAX_MD_SIZE 36
00069
00070 typedef gcry_mpi_t bignum;
00071
00072 #define bignum_new() gcry_mpi_new(0)
00073 #define bignum_free(num) gcry_mpi_release(num)
00074 #define bignum_set_word(bn,n) gcry_mpi_set_ui(bn,n)
00075 #define bignum_bin2bn(bn,datalen,data) gcry_mpi_scan(data,GCRYMPI_FMT_USG,bn,datalen,NULL)
00076 #define bignum_bn2dec(num) my_gcry_bn2dec(num)
00077 #define bignum_dec2bn(num, data) my_gcry_dec2bn(data, num)
00078 #define bignum_bn2hex(num,data) gcry_mpi_aprint(GCRYMPI_FMT_HEX,data,NULL,num)
00079 #define bignum_hex2bn(num,datalen,data) gcry_mpi_scan(num,GCRYMPI_FMT_HEX,data,datalen,NULL)
00080 #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)
00081 #define bignum_mod_exp(dest,generator,exp,modulo) gcry_mpi_powm(dest,generator,exp,modulo)
00082 #define bignum_num_bits(num) gcry_mpi_get_nbits(num)
00083 #define bignum_num_bytes(num) ((gcry_mpi_get_nbits(num)+7)/8)
00084 #define bignum_is_bit_set(num,bit) gcry_mpi_test_bit(num,bit)
00085 #define bignum_bn2bin(num,datalen,data) gcry_mpi_print(GCRYMPI_FMT_USG,data,datalen,NULL,num)
00086 #define bignum_cmp(num1,num2) gcry_mpi_cmp(num1,num2)
00087
00088 #elif defined HAVE_LIBCRYPTO
00089 #include <openssl/dsa.h>
00090 #include <openssl/rsa.h>
00091 #include <openssl/sha.h>
00092 #include <openssl/md5.h>
00093 #include <openssl/hmac.h>
00094 typedef SHA_CTX* SHACTX;
00095 typedef MD5_CTX* MD5CTX;
00096 typedef HMAC_CTX* HMACCTX;
00097 #ifdef MD5_DIGEST_LEN
00098 #undef MD5_DIGEST_LEN
00099 #endif
00100 #define SHA_DIGEST_LEN SHA_DIGEST_LENGTH
00101 #define MD5_DIGEST_LEN MD5_DIGEST_LENGTH
00102
00103 #endif
00104 #ifdef OPENSSL_BIGNUMS
00105 #include <openssl/bn.h>
00106 typedef BIGNUM* bignum;
00107 typedef BN_CTX* bignum_CTX;
00108
00109 #define bignum_new() BN_new()
00110 #define bignum_free(num) BN_clear_free(num)
00111 #define bignum_set_word(bn,n) BN_set_word(bn,n)
00112 #define bignum_bin2bn(bn,datalen,data) BN_bin2bn(bn,datalen,data)
00113 #define bignum_bn2dec(num) BN_bn2dec(num)
00114 #define bignum_dec2bn(bn,data) BN_dec2bn(data,bn)
00115 #define bignum_bn2hex(num) BN_bn2hex(num)
00116 #define bignum_rand(rnd, bits, top, bottom) BN_rand(rnd,bits,top,bottom)
00117 #define bignum_ctx_new() BN_CTX_new()
00118 #define bignum_ctx_free(num) BN_CTX_free(num)
00119 #define bignum_mod_exp(dest,generator,exp,modulo,ctx) BN_mod_exp(dest,generator,exp,modulo,ctx)
00120 #define bignum_num_bytes(num) BN_num_bytes(num)
00121 #define bignum_num_bits(num) BN_num_bits(num)
00122 #define bignum_is_bit_set(num,bit) BN_is_bit_set(num,bit)
00123 #define bignum_bn2bin(num,ptr) BN_bn2bin(num,ptr)
00124 #define bignum_cmp(num1,num2) BN_cmp(num1,num2)
00125
00126 #endif
00127
00128 #ifdef HAVE_SYS_TIME_H
00129 #include <sys/time.h>
00130 #endif
00131
00132
00133 MD5CTX md5_init(void);
00134 void md5_update(MD5CTX c, const void *data, unsigned long len);
00135 void md5_final(unsigned char *md,MD5CTX c);
00136 SHACTX sha1_init(void);
00137 void sha1_update(SHACTX c, const void *data, unsigned long len);
00138 void sha1_final(unsigned char *md,SHACTX c);
00139 void sha1(unsigned char *digest,int len,unsigned char *hash);
00140 #define HMAC_SHA1 1
00141 #define HMAC_MD5 2
00142 HMACCTX hmac_init(const void *key,int len,int type);
00143 void hmac_update(HMACCTX c, const void *data, unsigned long len);
00144 void hmac_final(HMACCTX ctx,unsigned char *hashmacbuf,unsigned int *len);
00145
00146
00147
00148 struct string_struct {
00149 u32 size;
00150 unsigned char string[MAX_PACKET_LEN];
00151 } __attribute__ ((packed));
00152
00155 struct buffer_struct {
00156 char *data;
00157 int used;
00158 int allocated;
00159 int pos;
00160 };
00161
00162
00163 typedef struct packet_struct {
00164 int valid;
00165 u32 len;
00166 u8 type;
00167 } PACKET;
00168
00169 typedef struct kex_struct {
00170 unsigned char cookie[16];
00171 char **methods;
00172 } KEX;
00173
00174 struct public_key_struct {
00175 int type;
00176 char *type_c;
00177 #ifdef HAVE_LIBGCRYPT
00178 gcry_sexp_t dsa_pub;
00179 gcry_sexp_t rsa_pub;
00180 #elif HAVE_LIBCRYPTO
00181 DSA *dsa_pub;
00182 RSA *rsa_pub;
00183 #endif
00184 };
00185
00186 struct private_key_struct {
00187 int type;
00188 #ifdef HAVE_LIBGCRYPT
00189 gcry_sexp_t dsa_priv;
00190 gcry_sexp_t rsa_priv;
00191 #elif defined HAVE_LIBCRYPTO
00192 DSA *dsa_priv;
00193 RSA *rsa_priv;
00194 #endif
00195 };
00196
00197 typedef struct signature_struct {
00198 int type;
00199 #ifdef HAVE_LIBGCRYPT
00200 gcry_sexp_t dsa_sign;
00201 gcry_sexp_t rsa_sign;
00202 #elif defined HAVE_LIBCRYPTO
00203 DSA_SIG *dsa_sign;
00204 STRING *rsa_sign;
00205 #endif
00206 } SIGNATURE;
00207
00208 struct ssh_options_struct {
00209 char *banner;
00210 char *username;
00211 char *host;
00212 char *bindaddr;
00213 int bindport;
00214 char *identity;
00215 char *ssh_dir;
00216 char *known_hosts_file;
00217 int fd;
00218 int port;
00219 int dont_verify_hostkey;
00220 int use_nonexisting_algo;
00221 char *wanted_methods[10];
00222 void *wanted_cookie;
00223 void *passphrase_function;
00224 void (*connect_status_function)(void *arg, float status);
00225 void *connect_status_arg;
00226 long timeout;
00227 long timeout_usec;
00228 int ssh2allowed;
00229 int ssh1allowed;
00230 char *dsakey;
00231 char *rsakey;
00232 };
00233
00234 typedef struct ssh_crypto_struct {
00235 bignum e,f,x,k,y;
00236 unsigned char session_id[SHA_DIGEST_LEN];
00237
00238 unsigned char encryptIV[SHA_DIGEST_LEN*2];
00239 unsigned char decryptIV[SHA_DIGEST_LEN*2];
00240
00241 unsigned char decryptkey[SHA_DIGEST_LEN*2];
00242 unsigned char encryptkey[SHA_DIGEST_LEN*2];
00243
00244 unsigned char encryptMAC[SHA_DIGEST_LEN];
00245 unsigned char decryptMAC[SHA_DIGEST_LEN];
00246 unsigned char hmacbuf[EVP_MAX_MD_SIZE];
00247 struct crypto_struct *in_cipher, *out_cipher;
00248 STRING *server_pubkey;
00249 char *server_pubkey_type;
00250 int do_compress_out;
00251 int do_compress_in;
00252 void *compress_out_ctx;
00253 void *compress_in_ctx;
00254 } CRYPTO;
00255
00256 struct channel_struct {
00257 struct channel_struct *prev;
00258 struct channel_struct *next;
00259 SSH_SESSION *session;
00260 u32 local_channel;
00261 u32 local_window;
00262 int local_eof;
00263 u32 local_maxpacket;
00264
00265 u32 remote_channel;
00266 u32 remote_window;
00267 int remote_eof;
00268 u32 remote_maxpacket;
00269 int open;
00270 int delayed_close;
00271 BUFFER *stdout_buffer;
00272 BUFFER *stderr_buffer;
00273 void *userarg;
00274 int version;
00275 int blocking;
00276 };
00277
00278
00279 struct error_struct {
00280
00281 int error_code;
00282 char error_buffer[ERROR_BUFFERLEN];
00283 };
00284
00285
00286 struct ssh_session {
00287 struct error_struct error;
00288 int fd;
00289 SSH_OPTIONS *options;
00290 char *serverbanner;
00291 char *clientbanner;
00292 int protoversion;
00293 int server;
00294 int client;
00295 u32 send_seq;
00296 u32 recv_seq;
00297
00298 int closed;
00299 int closed_by_except;
00300
00301 int connected;
00302
00303 int alive;
00304
00305 int auth_service_asked;
00306
00307
00308 int data_to_read;
00309
00310 int data_to_write;
00311 int data_except;
00312 int blocking;
00313
00314 STRING *banner;
00315
00316 char *remotebanner;
00317
00318 char *discon_msg;
00319
00320 BUFFER *in_buffer;
00321 PACKET in_packet;
00322 BUFFER *out_buffer;
00323
00324 BUFFER *out_socket_buffer;
00325 BUFFER *in_socket_buffer;
00326
00327
00328
00329 int packet_state;
00330 int dh_handshake_state;
00331 STRING *dh_server_signature;
00332
00333 KEX server_kex;
00334 KEX client_kex;
00335 BUFFER *in_hashbuf;
00336 BUFFER *out_hashbuf;
00337 CRYPTO *current_crypto;
00338 CRYPTO *next_crypto;
00339
00340 int channel_bytes_toread;
00341
00342
00343 CHANNEL *channels;
00344 int maxchannel;
00345 int exec_channel_opened;
00346
00347
00348
00349 struct ssh_kbdint *kbdint;
00350 int version;
00351
00352 PRIVATE_KEY *rsa_key;
00353 PRIVATE_KEY *dsa_key;
00354
00355 int auth_methods;
00356 int hostkeys;
00357 struct ssh_message *ssh_message;
00358 };
00359
00360 struct ssh_kbdint {
00361 u32 nprompts;
00362 char *name;
00363 char *instruction;
00364 char **prompts;
00365 unsigned char *echo;
00366 char **answers;
00367 };
00368
00369
00370 void ssh_cleanup(SSH_SESSION *session);
00371
00372
00373
00374 int ssh_send_banner(SSH_SESSION *session, int is_server);
00375 char *ssh_get_banner(SSH_SESSION *session);
00376
00377
00378 void ssh_set_error(void *error,int code,char *descr,...);
00379
00380
00381
00382 void dh_generate_e(SSH_SESSION *session);
00383 void ssh_print_bignum(char *which,bignum num);
00384 void dh_generate_x(SSH_SESSION *session);
00385 void dh_generate_y(SSH_SESSION *session);
00386 void dh_generate_f(SSH_SESSION *session);
00387
00388 STRING *dh_get_e(SSH_SESSION *session);
00389 STRING *dh_get_f(SSH_SESSION *session);
00390 void dh_import_f(SSH_SESSION *session,STRING *f_string);
00391 void dh_import_e(SSH_SESSION *session, STRING *e_string);
00392 void dh_import_pubkey(SSH_SESSION *session,STRING *pubkey_string);
00393 void dh_build_k(SSH_SESSION *session);
00394 void make_sessionid(SSH_SESSION *session);
00395
00396 void hashbufin_add_cookie(SSH_SESSION *session,unsigned char *cookie);
00397 void hashbufout_add_cookie(SSH_SESSION *session);
00398 void generate_session_keys(SSH_SESSION *session);
00399
00400 int signature_verify(SSH_SESSION *session,STRING *signature);
00401 bignum make_string_bn(STRING *string);
00402 STRING *make_bignum_string(bignum num);
00403
00404
00405 u32 packet_decrypt_len(SSH_SESSION *session,char *crypted);
00406 int packet_decrypt(SSH_SESSION *session, void *packet,unsigned int len);
00407 unsigned char *packet_encrypt(SSH_SESSION *session,void *packet,unsigned int len);
00408
00409 int packet_hmac_verify(SSH_SESSION *session,BUFFER *buffer,unsigned char *mac);
00410
00411
00412 void packet_clear_out(SSH_SESSION *session);
00413 void packet_parse(SSH_SESSION *session);
00414 int packet_send(SSH_SESSION *session);
00415
00416 int packet_read(SSH_SESSION *session);
00417 int packet_translate(SSH_SESSION *session);
00418 int packet_wait(SSH_SESSION *session,int type,int blocking);
00419 int packet_flush(SSH_SESSION *session, int enforce_blocking);
00420
00421 SSH_SESSION *ssh_session_new();
00422 int ssh_connect_host(SSH_SESSION *session, const char *host,const char
00423 *bind_addr, int port, long timeout, long usec);
00424
00425
00426 extern char *ssh_kex_nums[];
00427 void ssh_send_kex(SSH_SESSION *session,int server_kex);
00428 void ssh_list_kex(KEX *kex);
00429 int set_kex(SSH_SESSION *session);
00430 int ssh_get_kex(SSH_SESSION *session, int server_kex);
00431 int verify_existing_algo(int algo,char *name);
00432 char **space_tokenize(char *chain);
00433 int ssh_get_kex1(SSH_SESSION *session);
00434 char *ssh_find_matching(char *in_d, char *what_d);
00435
00436
00437
00438 PRIVATE_KEY *_privatekey_from_file(void *session,char *filename,int type);
00439
00440
00441 char *ssh_type_to_char(int type);
00442 PUBLIC_KEY *publickey_make_dss(BUFFER *buffer);
00443 PUBLIC_KEY *publickey_make_rsa(BUFFER *buffer,char *type);
00444 PUBLIC_KEY *publickey_from_string(STRING *pubkey_s);
00445 SIGNATURE *signature_from_string(STRING *signature,PUBLIC_KEY *pubkey,int needed_type);
00446 void signature_free(SIGNATURE *sign);
00447 STRING *ssh_do_sign(SSH_SESSION *session,BUFFER *sigbuf,
00448 PRIVATE_KEY *privatekey);
00449 STRING *ssh_sign_session_id(SSH_SESSION *session, PRIVATE_KEY *privatekey);
00450 STRING *ssh_encrypt_rsa1(SSH_SESSION *session, STRING *data, PUBLIC_KEY *key);
00451
00452 void channel_handle(SSH_SESSION *session, int type);
00453 CHANNEL *channel_new(SSH_SESSION *session);
00454 void channel_default_bufferize(CHANNEL *channel, void *data, int len,
00455 int is_stderr);
00456 u32 ssh_channel_new_id(SSH_SESSION *session);
00457 CHANNEL *ssh_channel_from_local(SSH_SESSION *session,u32 num);
00458
00459
00460
00461 void ssh_options_free(SSH_OPTIONS *opt);
00462
00463 int ssh_options_default_username(SSH_OPTIONS *opt);
00464 int ssh_options_default_ssh_dir(SSH_OPTIONS *opt);
00465 int ssh_options_default_known_hosts_file(SSH_OPTIONS *opt);
00466
00467
00468 void buffer_add_ssh_string(BUFFER *buffer,STRING *string);
00469 void buffer_add_u8(BUFFER *buffer, u8 data);
00470 void buffer_add_u32(BUFFER *buffer, u32 data);
00471 void buffer_add_u64(BUFFER *buffer,u64 data);
00472 void buffer_add_data(BUFFER *buffer, void *data, int len);
00473 void buffer_add_data_begin(BUFFER *buffer,void *data,int len);
00474 void buffer_add_buffer(BUFFER *buffer, BUFFER *source);
00475 void buffer_reinit(BUFFER *buffer);
00476
00477
00478 void *buffer_get_rest(BUFFER *buffer);
00479
00480 int buffer_get_rest_len(BUFFER *buffer);
00481
00482
00483 int buffer_get_u8(BUFFER *buffer,u8 *data);
00484 int buffer_get_u32(BUFFER *buffer,u32 *data);
00485 int buffer_get_u64(BUFFER *buffer, u64 *data);
00486
00487 int buffer_get_data(BUFFER *buffer,void *data,int requestedlen);
00488
00489 STRING *buffer_get_ssh_string(BUFFER *buffer);
00490
00491 STRING *buffer_get_mpint(BUFFER *buffer);
00492
00493 int buffer_pass_bytes_end(BUFFER *buffer,int len);
00494 int buffer_pass_bytes(BUFFER *buffer, int len);
00495
00496
00497 BUFFER *base64_to_bin(char *source);
00498 unsigned char *bin_to_base64(unsigned char *source, int len);
00499
00500
00501 int compress_buffer(SSH_SESSION *session,BUFFER *buf);
00502 int decompress_buffer(SSH_SESSION *session,BUFFER *buf);
00503
00504
00505 int crypt_set_algorithms(SSH_SESSION *);
00506 int crypt_set_algorithms_server(SSH_SESSION *session);
00507 CRYPTO *crypto_new();
00508 void crypto_free(CRYPTO *crypto);
00509
00510
00511 u32 ssh_crc32(char *buffer, int len);
00512
00513
00514 int ssh_userauth1_none(SSH_SESSION *session, char *username);
00515 int ssh_userauth1_offer_pubkey(SSH_SESSION *session, char *username,
00516 int type, STRING *pubkey);
00517 int ssh_userauth1_password(SSH_SESSION *session, char *username,
00518 char *password);
00519
00520
00521 char *ssh_get_user_home_dir();
00522 int ssh_file_readaccess_ok(char *file);
00523
00524
00525 u64 ntohll(u64);
00526 #define htonll(x) ntohll(x)
00527
00528
00529 int channel_open_session1(CHANNEL *channel);
00530 int channel_request_pty_size1(CHANNEL *channel, char *terminal,int cols,
00531 int rows);
00532 int channel_change_pty_size1(CHANNEL *channel, int cols, int rows);
00533 int channel_request_shell1(CHANNEL *channel);
00534 int channel_request_exec1(CHANNEL *channel, char *cmd);
00535 void channel_handle1(SSH_SESSION *session,int type);
00536 int channel_write1(CHANNEL *channel, void *data, int len);
00537
00538
00539
00540 int ssh_handle_packets(SSH_SESSION *session);
00541
00542 #ifdef HAVE_LIBGCRYPT
00543
00544 int my_gcry_dec2bn(bignum *bn, const char *data);
00545 char *my_gcry_bn2dec(bignum bn);
00546 #endif
00547
00548 #ifdef __cplusplus
00549 } ;
00550 #endif
00551
00552 #endif