version 1.395, 2023/09/04 00:04:02 |
version 1.396, 2023/09/04 00:08:14 |
|
|
* output fd should be polled. |
* output fd should be polled. |
*/ |
*/ |
static int |
static int |
obfuscate_keystroke_timing(struct ssh *ssh, struct timespec *timeout) |
obfuscate_keystroke_timing(struct ssh *ssh, struct timespec *timeout, |
|
int channel_did_enqueue) |
{ |
{ |
static int active; |
static int active; |
static struct timespec next_interval, chaff_until; |
static struct timespec next_interval, chaff_until; |
|
|
ssh_packet_have_data_to_write(ssh)) { |
ssh_packet_have_data_to_write(ssh)) { |
/* Stop if the output buffer has more than a few keystrokes */ |
/* Stop if the output buffer has more than a few keystrokes */ |
stop_reason = "output buffer filling"; |
stop_reason = "output buffer filling"; |
} else if (active && ssh_packet_have_data_to_write(ssh)) { |
} else if (active && channel_did_enqueue && |
|
ssh_packet_have_data_to_write(ssh)) { |
/* Still in active mode and have a keystroke queued. */ |
/* Still in active mode and have a keystroke queued. */ |
had_keystroke = 1; |
had_keystroke = 1; |
} else if (active) { |
} else if (active) { |
|
|
* interactively. In this case, start quantising outbound packets to |
* interactively. In this case, start quantising outbound packets to |
* fixed time intervals to hide inter-keystroke timing. |
* fixed time intervals to hide inter-keystroke timing. |
*/ |
*/ |
if (!active && ssh_packet_interactive_data_to_write(ssh)) { |
if (!active && ssh_packet_interactive_data_to_write(ssh) && |
|
channel_did_enqueue && ssh_packet_have_data_to_write(ssh)) { |
debug3_f("starting: interval %d", |
debug3_f("starting: interval %d", |
options.obscure_keystroke_timing_interval); |
options.obscure_keystroke_timing_interval); |
just_started = had_keystroke = active = 1; |
just_started = had_keystroke = active = 1; |
|
|
*/ |
*/ |
static void |
static void |
client_wait_until_can_do_something(struct ssh *ssh, struct pollfd **pfdp, |
client_wait_until_can_do_something(struct ssh *ssh, struct pollfd **pfdp, |
u_int *npfd_allocp, u_int *npfd_activep, int rekeying, |
u_int *npfd_allocp, u_int *npfd_activep, int channel_did_enqueue, |
int *conn_in_readyp, int *conn_out_readyp) |
int *conn_in_readyp, int *conn_out_readyp) |
{ |
{ |
struct timespec timeout; |
struct timespec timeout; |
|
|
return; |
return; |
} |
} |
|
|
oready = obfuscate_keystroke_timing(ssh, &timeout); |
oready = obfuscate_keystroke_timing(ssh, &timeout, channel_did_enqueue); |
|
|
/* Monitor server connection on reserved pollfd entries */ |
/* Monitor server connection on reserved pollfd entries */ |
(*pfdp)[0].fd = connection_in; |
(*pfdp)[0].fd = connection_in; |
|
|
ptimeout_deadline_monotime(&timeout, control_persist_exit_time); |
ptimeout_deadline_monotime(&timeout, control_persist_exit_time); |
if (options.server_alive_interval > 0) |
if (options.server_alive_interval > 0) |
ptimeout_deadline_monotime(&timeout, server_alive_time); |
ptimeout_deadline_monotime(&timeout, server_alive_time); |
if (options.rekey_interval > 0 && !rekeying) { |
if (options.rekey_interval > 0 && !ssh_packet_is_rekeying(ssh)) { |
ptimeout_deadline_sec(&timeout, |
ptimeout_deadline_sec(&timeout, |
ssh_packet_get_rekey_timeout(ssh)); |
ssh_packet_get_rekey_timeout(ssh)); |
} |
} |
|
|
struct pollfd *pfd = NULL; |
struct pollfd *pfd = NULL; |
u_int npfd_alloc = 0, npfd_active = 0; |
u_int npfd_alloc = 0, npfd_active = 0; |
double start_time, total_time; |
double start_time, total_time; |
int r, len; |
int channel_did_enqueue = 0, r, len; |
u_int64_t ibytes, obytes; |
u_int64_t ibytes, obytes; |
int conn_in_ready, conn_out_ready; |
int conn_in_ready, conn_out_ready; |
|
|
|
|
|
|
/* Main loop of the client for the interactive session mode. */ |
/* Main loop of the client for the interactive session mode. */ |
while (!quit_pending) { |
while (!quit_pending) { |
|
channel_did_enqueue = 0; |
|
|
/* Process buffered packets sent by the server. */ |
/* Process buffered packets sent by the server. */ |
client_process_buffered_input_packets(ssh); |
client_process_buffered_input_packets(ssh); |
|
|
* enqueue them for sending to the server. |
* enqueue them for sending to the server. |
*/ |
*/ |
if (ssh_packet_not_very_much_data_to_write(ssh)) |
if (ssh_packet_not_very_much_data_to_write(ssh)) |
channel_output_poll(ssh); |
channel_did_enqueue = channel_output_poll(ssh); |
|
|
/* |
/* |
* Check if the window size has changed, and buffer a |
* Check if the window size has changed, and buffer a |
|
|
* available on one of the descriptors). |
* available on one of the descriptors). |
*/ |
*/ |
client_wait_until_can_do_something(ssh, &pfd, &npfd_alloc, |
client_wait_until_can_do_something(ssh, &pfd, &npfd_alloc, |
&npfd_active, ssh_packet_is_rekeying(ssh), |
&npfd_active, channel_did_enqueue, |
&conn_in_ready, &conn_out_ready); |
&conn_in_ready, &conn_out_ready); |
|
|
if (quit_pending) |
if (quit_pending) |