diff --git a/libfreerdp-core/connection.c b/libfreerdp-core/connection.c index 02aad7dd3..a30cfdd12 100644 --- a/libfreerdp-core/connection.c +++ b/libfreerdp-core/connection.c @@ -17,9 +17,11 @@ * limitations under the License. */ -#include "connection.h" -#include "info.h" #include "per.h" +#include "info.h" +#include "input.h" + +#include "connection.h" /** * Connection Sequence @@ -388,6 +390,8 @@ boolean rdp_client_connect_demand_active(rdpRdp* rdp, STREAM* s) if (!rdp_send_confirm_active(rdp)) return false; + input_register_client_callbacks(rdp->input); + /** * The server may request a different desktop size during Deactivation-Reactivation sequence. * In this case, the UI should be informed and do actual window resizing at this point. @@ -419,6 +423,9 @@ boolean rdp_client_connect_finalize(rdpRdp* rdp) return false; if (!rdp_send_client_control_pdu(rdp, CTRLACTION_REQUEST_CONTROL)) return false; + + rdp->input->SynchronizeEvent(rdp->input, 0); + if (!rdp_send_client_persistent_key_list_pdu(rdp)) return false; if (!rdp_send_client_font_list_pdu(rdp, FONTLIST_FIRST | FONTLIST_LAST)) diff --git a/libfreerdp-core/freerdp.c b/libfreerdp-core/freerdp.c index 6366ce457..490d081c0 100644 --- a/libfreerdp-core/freerdp.c +++ b/libfreerdp-core/freerdp.c @@ -58,8 +58,6 @@ boolean freerdp_connect(freerdp* instance) extension_post_connect(rdp->extension); - input_register_client_callbacks(rdp->input); - IFCALLRET(instance->PostConnect, status, instance); if (status != true) diff --git a/libfreerdp-core/rdp.c b/libfreerdp-core/rdp.c index 5f32d5254..389294dcf 100644 --- a/libfreerdp-core/rdp.c +++ b/libfreerdp-core/rdp.c @@ -105,7 +105,7 @@ boolean rdp_read_share_control_header(STREAM* s, uint16* length, uint16* type, u void rdp_write_share_control_header(STREAM* s, uint16 length, uint16 type, uint16 channel_id) { - length -= RDP_PACKET_HEADER_LENGTH; + length -= (s->p - s->data); /* Share Control Header */ stream_write_uint16(s, length); /* totalLength */ @@ -280,9 +280,11 @@ static uint32 rdp_security_stream_out(rdpRdp* rdp, STREAM* s, int length) uint32 pad = 0; sec_flags = rdp->sec_flags; + if (sec_flags != 0) { rdp_write_security_header(s, sec_flags); + if (sec_flags & SEC_ENCRYPT) { if (rdp->settings->encryption_method == ENCRYPTION_METHOD_FIPS) @@ -292,12 +294,15 @@ static uint32 rdp_security_stream_out(rdpRdp* rdp, STREAM* s, int length) length = length - (data - s->data); stream_write_uint16(s, 0x10); /* length */ stream_write_uint8(s, 0x1); /* TSFIPS_VERSION 1*/ + /* handle padding */ pad = 8 - (length % 8); + if (pad == 8) pad = 0; if (pad) memset(data+length, 0, pad); + stream_write_uint8(s, pad); security_hmac_signature(data, length, s->p, rdp); @@ -316,8 +321,10 @@ static uint32 rdp_security_stream_out(rdpRdp* rdp, STREAM* s, int length) security_encrypt(s->p, length, rdp); } } + rdp->sec_flags = 0; } + return pad; } @@ -328,13 +335,19 @@ static uint32 rdp_get_sec_bytes(rdpRdp* rdp) if (rdp->sec_flags & SEC_ENCRYPT) { sec_bytes = 12; + if (rdp->settings->encryption_method == ENCRYPTION_METHOD_FIPS) sec_bytes += 4; } else if (rdp->sec_flags != 0) + { sec_bytes = 4; + } else + { sec_bytes = 0; + } + return sec_bytes; }