diff --git a/Makefile.am b/Makefile.am index 6d644836..3003129d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -50,7 +50,6 @@ endif SUBDIRS = \ common \ vnc \ - rdp \ xup \ mc \ $(NEUTRINORDPDIR) \ diff --git a/configure.ac b/configure.ac index 80eda003..d99e7b2c 100644 --- a/configure.ac +++ b/configure.ac @@ -307,7 +307,6 @@ AC_CONFIG_FILES([ pkgconfig/Makefile pkgconfig/xrdp.pc pkgconfig/xrdp-uninstalled.pc - rdp/Makefile sesman/chansrv/Makefile sesman/libscp/Makefile sesman/Makefile diff --git a/file-loc.txt b/file-loc.txt index 98894465..2a1e58a8 100644 --- a/file-loc.txt +++ b/file-loc.txt @@ -4,7 +4,6 @@ default build will install the following /usr/local/lib/xrdp libcommon.so libmc.so - librdp.so libscp.so libvnc.so libxrdp.so diff --git a/rdp/Makefile.am b/rdp/Makefile.am deleted file mode 100644 index 6065cc11..00000000 --- a/rdp/Makefile.am +++ /dev/null @@ -1,30 +0,0 @@ -AM_CPPFLAGS = \ - -DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \ - -DXRDP_SBIN_PATH=\"${sbindir}\" \ - -DXRDP_SHARE_PATH=\"${datadir}/xrdp\" \ - -DXRDP_PID_PATH=\"${localstatedir}/run\" \ - -I$(top_srcdir)/common - -if XRDP_DEBUG -AM_CPPFLAGS += -DXRDP_DEBUG -endif - -module_LTLIBRARIES = \ - librdp.la - -librdp_la_SOURCES = \ - rdp.c \ - rdp.h \ - rdp_bitmap.c \ - rdp_iso.c \ - rdp_lic.c \ - rdp_mcs.c \ - rdp_orders.c \ - rdp_rdp.c \ - rdp_sec.c \ - rdp_tcp.c - -librdp_la_LIBADD = \ - $(top_builddir)/common/libcommon.la - -librdp_la_LDFLAGS = -avoid-version -module diff --git a/rdp/rdp.c b/rdp/rdp.c deleted file mode 100644 index 6792398f..00000000 --- a/rdp/rdp.c +++ /dev/null @@ -1,354 +0,0 @@ -/** - * xrdp: A Remote Desktop Protocol server. - * - * Copyright (C) Jay Sorg 2004-2013 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * librdp main file - */ - -#include "rdp.h" - -/******************************************************************************/ -/* return error */ -int DEFAULT_CC -lib_mod_start(struct mod *mod, int w, int h, int bpp) -{ - DEBUG(("in lib_mod_start")); - mod->width = w; - mod->height = h; - mod->rdp_bpp = bpp; - mod->xrdp_bpp = bpp; - mod->keylayout = 0x409; - g_strncpy(mod->port, "3389", 255); /* default */ - DEBUG(("out lib_mod_start")); - return 0; -} - -/******************************************************************************/ -/* return error */ -int DEFAULT_CC -lib_mod_connect(struct mod *mod) -{ - DEBUG(("in lib_mod_connect")); - /* clear screen */ - mod->server_begin_update(mod); - mod->server_set_fgcolor(mod, 0); - mod->server_fill_rect(mod, 0, 0, mod->width, mod->height); - mod->server_end_update(mod); - - /* connect */ - if (rdp_rdp_connect(mod->rdp_layer, mod->ip, mod->port) == 0) - { - mod->sck = mod->rdp_layer->sec_layer->mcs_layer->iso_layer->tcp_layer->sck; - g_tcp_set_non_blocking(mod->sck); - g_tcp_set_no_delay(mod->sck); - mod->sck_obj = g_create_wait_obj_from_socket(mod->sck, 0); - DEBUG(("out lib_mod_connect")); - return 0; - } - - DEBUG(("out lib_mod_connect error")); - return 1; -} - -/******************************************************************************/ -/* return error */ -int DEFAULT_CC -lib_mod_event(struct mod *mod, int msg, long param1, long param2, - long param3, long param4) -{ - struct stream *s; - - if (!mod->up_and_running) - { - return 0; - } - - DEBUG(("in lib_mod_event")); - make_stream(s); - init_stream(s, 8192 * 2); - - switch (msg) - { - case 15: - rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_SCANCODE, - param4, param3, 0); - break; - case 16: - rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_SCANCODE, - param4, param3, 0); - break; - case 17: - rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_SYNCHRONIZE, - param4, param3, 0); - break; - case 100: - rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE, - MOUSE_FLAG_MOVE, param1, param2); - break; - case 101: - rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE, - MOUSE_FLAG_BUTTON1, param1, param2); - break; - case 102: - rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE, - MOUSE_FLAG_BUTTON1 | MOUSE_FLAG_DOWN, - param1, param2); - break; - case 103: - rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE, - MOUSE_FLAG_BUTTON2, param1, param2); - break; - case 104: - rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE, - MOUSE_FLAG_BUTTON2 | MOUSE_FLAG_DOWN, - param1, param2); - break; - case 105: - rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE, - MOUSE_FLAG_BUTTON3, param1, param2); - break; - case 106: - rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE, - MOUSE_FLAG_BUTTON3 | MOUSE_FLAG_DOWN, - param1, param2); - break; - case 107: - rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE, - MOUSE_FLAG_BUTTON4, param1, param2); - break; - case 108: - rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE, - MOUSE_FLAG_BUTTON4 | MOUSE_FLAG_DOWN, - param1, param2); - break; - case 109: - rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE, - MOUSE_FLAG_BUTTON5, param1, param2); - break; - case 110: - rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE, - MOUSE_FLAG_BUTTON5 | MOUSE_FLAG_DOWN, - param1, param2); - break; - case 200: - rdp_rdp_send_invalidate(mod->rdp_layer, s, - (param1 >> 16) & 0xffff, param1 & 0xffff, - (param2 >> 16) & 0xffff, param2 & 0xffff); - break; - } - - free_stream(s); - DEBUG(("out lib_mod_event")); - return 0; -} - -/******************************************************************************/ -/* return error */ -int DEFAULT_CC -lib_mod_signal(struct mod *mod) -{ - int type; - int cont; - struct stream *s; - - DEBUG(("in lib_mod_signal")); - - if (mod->in_s == 0) - { - make_stream(mod->in_s); - } - - s = mod->in_s; - init_stream(s, 8192 * 2); - cont = 1; - - while (cont) - { - type = 0; - - if (rdp_rdp_recv(mod->rdp_layer, s, &type) != 0) - { - DEBUG(("out lib_mod_signal error rdp_rdp_recv failed")); - return 1; - } - - DEBUG(("lib_mod_signal type %d", type)); - - switch (type) - { - case RDP_PDU_DATA: - rdp_rdp_process_data_pdu(mod->rdp_layer, s); - break; - case RDP_PDU_DEMAND_ACTIVE: - rdp_rdp_process_demand_active(mod->rdp_layer, s); - mod->up_and_running = 1; - break; - case RDP_PDU_DEACTIVATE: - mod->up_and_running = 0; - break; - case RDP_PDU_REDIRECT: - break; - case 0: - break; - default: - break; - } - - cont = s->next_packet < s->end; - } - - DEBUG(("out lib_mod_signal")); - return 0; -} - -/******************************************************************************/ -/* return error */ -int DEFAULT_CC -lib_mod_end(struct mod *mod) -{ - rdp_rdp_delete(mod->rdp_layer); - mod->rdp_layer = 0; - free_stream(mod->in_s); - mod->in_s = 0; - - if (mod->sck_obj != 0) - { - g_delete_wait_obj_from_socket(mod->sck_obj); - mod->sck_obj = 0; - } - - if (mod->sck != 0) - { - g_tcp_close(mod->sck); - mod->sck = 0; - } - - return 0; -} - -/******************************************************************************/ -/* return error */ -int DEFAULT_CC -lib_mod_set_param(struct mod *mod, const char *name, const char *value) -{ - if (g_strncasecmp(name, "ip", 255) == 0) - { - g_strncpy(mod->ip, value, 255); - } - else if (g_strncasecmp(name, "port", 255) == 0) - { - g_strncpy(mod->port, value, 255); - } - else if (g_strncasecmp(name, "username", 255) == 0) - { - g_strncpy(mod->username, value, 255); - } - else if (g_strncasecmp(name, "password", 255) == 0) - { - g_strncpy(mod->password, value, 255); - } - else if (g_strncasecmp(name, "hostname", 255) == 0) - { - g_strncpy(mod->hostname, value, 255); - } - else if (g_strncasecmp(name, "keylayout", 255) == 0) - { - mod->keylayout = g_atoi(value); - } - - return 0; -} - -/******************************************************************************/ -/* return error */ -int DEFAULT_CC -lib_mod_get_wait_objs(struct mod *mod, tbus *read_objs, int *rcount, - tbus *write_objs, int *wcount, int *timeout) -{ - int i; - - i = *rcount; - - if (mod != 0) - { - if (mod->sck_obj != 0) - { - read_objs[i++] = mod->sck_obj; - } - } - - *rcount = i; - return 0; -} - -/******************************************************************************/ -/* return error */ -int DEFAULT_CC -lib_mod_check_wait_objs(struct mod *mod) -{ - int rv; - - rv = 0; - - if (mod != 0) - { - if (mod->sck_obj != 0) - { - if (g_is_wait_obj_set(mod->sck_obj)) - { - rv = lib_mod_signal(mod); - } - } - } - - return rv; -} - -/******************************************************************************/ -tintptr EXPORT_CC -mod_init(void) -{ - struct mod *mod; - - DEBUG(("in mod_init")); - mod = (struct mod *)g_malloc(sizeof(struct mod), 1); - mod->size = sizeof(struct mod); - mod->version = CURRENT_MOD_VER; - mod->handle = (tintptr) mod; - mod->mod_connect = lib_mod_connect; - mod->mod_start = lib_mod_start; - mod->mod_event = lib_mod_event; - mod->mod_signal = lib_mod_signal; - mod->mod_end = lib_mod_end; - mod->mod_set_param = lib_mod_set_param; - mod->mod_get_wait_objs = lib_mod_get_wait_objs; - mod->mod_check_wait_objs = lib_mod_check_wait_objs; - mod->rdp_layer = rdp_rdp_create(mod); - DEBUG(("out mod_init")); - return (tintptr) mod; -} - -/******************************************************************************/ -int EXPORT_CC -mod_exit(tintptr handle) -{ - struct mod *mod = (struct mod *) handle; - - DEBUG(("in mod_exit")); - g_free(mod); - DEBUG(("out mod_exit")); - return 0; -} diff --git a/rdp/rdp.h b/rdp/rdp.h deleted file mode 100644 index 6d919774..00000000 --- a/rdp/rdp.h +++ /dev/null @@ -1,465 +0,0 @@ -/** - * xrdp: A Remote Desktop Protocol server. - * - * Copyright (C) Jay Sorg 2004-2013 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * librdp main header file - */ - -/* include other h files */ -#include "arch.h" -#include "parse.h" -#include "os_calls.h" -#include "ssl_calls.h" -#include "xrdp_constants.h" -#include "defines.h" - -struct rdp_brush -{ - int xorigin; - int yorigin; - int style; - char pattern[8]; -}; - -struct rdp_pen -{ - int style; - int width; - int color; -}; - -struct rdp_colormap -{ - int ncolors; - int colors[256]; -}; - -struct rdp_bitmap -{ - int width; - int height; - int bpp; - char* data; -}; - -struct rdp_cursor -{ - int x; - int y; - int width; - int height; - char mask[(32 * 32) / 8]; - char data[(32 * 32) * 3]; -}; - -/* tcp */ -struct rdp_tcp -{ - int sck; - int sck_closed; - struct rdp_iso* iso_layer; /* owner */ -}; - -/* iso */ -struct rdp_iso -{ - struct rdp_mcs* mcs_layer; /* owner */ - struct rdp_tcp* tcp_layer; -}; - -/* mcs */ -struct rdp_mcs -{ - struct rdp_sec* sec_layer; /* owner */ - struct rdp_iso* iso_layer; - int userid; - struct stream* client_mcs_data; - struct stream* server_mcs_data; -}; - -/* sec */ -struct rdp_sec -{ - struct rdp_rdp* rdp_layer; /* owner */ - struct rdp_mcs* mcs_layer; - struct rdp_lic* lic_layer; - char server_random[32]; - char client_random[64]; - char client_crypt_random[72]; - struct stream* client_mcs_data; - struct stream* server_mcs_data; - int decrypt_use_count; - int encrypt_use_count; - char decrypt_key[16]; - char encrypt_key[16]; - char decrypt_update_key[16]; - char encrypt_update_key[16]; - int rc4_key_size; /* 1 = 40-bit, 2 = 128-bit */ - int rc4_key_len; /* 8 or 16 */ - int crypt_level; /* 1 = low, 2 = medium, 3 = high */ - char sign_key[16]; - void* decrypt_rc4_info; - void* encrypt_rc4_info; -}; - -/* licence */ -struct rdp_lic -{ - struct rdp_sec* sec_layer; /* owner */ - char licence_key[16]; - char licence_sign_key[16]; - int licence_issued; -}; - -/* rdp */ -struct rdp_rdp -{ - struct mod* mod; - struct rdp_sec* sec_layer; - struct rdp_orders* orders; - int share_id; - int use_rdp5; - int bitmap_compression; - int bitmap_cache; - int desktop_save; - int polygon_ellipse_orders; - int rec_mode; - int rec_fd; - /* cache */ - struct rdp_colormap colormap; - struct rdp_cursor cursors[32]; -}; - -struct rdp_orders_state -{ - /* order stuff */ - int order_type; - /* clip state */ - int clip_left; - int clip_top; - int clip_right; - int clip_bottom; - /* text order state */ - int text_font; - int text_flags; - int text_opcode; - int text_mixmode; - int text_fgcolor; - int text_bgcolor; - int text_clipleft; - int text_cliptop; - int text_clipright; - int text_clipbottom; - int text_boxleft; - int text_boxtop; - int text_boxright; - int text_boxbottom; - struct rdp_brush text_brush; - int text_x; - int text_y; - int text_length; - char text_text[256]; - /* destblt order state */ - int dest_x; - int dest_y; - int dest_cx; - int dest_cy; - int dest_opcode; - /* patblt order state */ - int pat_x; - int pat_y; - int pat_cx; - int pat_cy; - int pat_opcode; - int pat_bgcolor; - int pat_fgcolor; - struct rdp_brush pat_brush; - /* screenblt order state */ - int screenblt_x; - int screenblt_y; - int screenblt_cx; - int screenblt_cy; - int screenblt_opcode; - int screenblt_srcx; - int screenblt_srcy; - /* line order state */ - int line_mixmode; - int line_startx; - int line_starty; - int line_endx; - int line_endy; - int line_bgcolor; - int line_opcode; - struct rdp_pen line_pen; - /* rect order state */ - int rect_x; - int rect_y; - int rect_cx; - int rect_cy; - int rect_color; - /* desksave order state */ - int desksave_offset; - int desksave_left; - int desksave_top; - int desksave_right; - int desksave_bottom; - int desksave_action; - /* memblt order state */ - int memblt_cache_id; - int memblt_color_table; - int memblt_x; - int memblt_y; - int memblt_cx; - int memblt_cy; - int memblt_opcode; - int memblt_srcx; - int memblt_srcy; - int memblt_cache_idx; - /* polyline order state */ - int polyline_x; - int polyline_y; - int polyline_opcode; - int polyline_fgcolor; - int polyline_lines; - int polyline_datasize; - char polyline_data[256]; -}; - -/* orders */ -struct rdp_orders -{ - struct rdp_rdp* rdp_layer; - /* order state */ - struct rdp_orders_state state; - /* cache */ - struct rdp_colormap* cache_colormap[6]; - struct rdp_bitmap* cache_bitmap[3][600]; -}; - -#define CURRENT_MOD_VER 2 - -struct mod -{ - int size; /* size of this struct */ - int version; /* internal version */ - /* client functions */ - int (*mod_start)(struct mod* v, int w, int h, int bpp); - int (*mod_connect)(struct mod* v); - int (*mod_event)(struct mod* v, int msg, long param1, long param2, - long param3, long param4); - int (*mod_signal)(struct mod* v); - int (*mod_end)(struct mod* v); - int (*mod_set_param)(struct mod *v, const char *name, const char *value); - int (*mod_session_change)(struct mod* v, int, int); - int (*mod_get_wait_objs)(struct mod* v, tbus* read_objs, int* rcount, - tbus* write_objs, int* wcount, int* timeout); - int (*mod_check_wait_objs)(struct mod* v); - long mod_dumby[100 - 9]; /* align, 100 minus the number of mod - functions above */ - /* server functions */ - int (*server_begin_update)(struct mod* v); - int (*server_end_update)(struct mod* v); - int (*server_fill_rect)(struct mod* v, int x, int y, int cx, int cy); - int (*server_screen_blt)(struct mod* v, int x, int y, int cx, int cy, - int srcx, int srcy); - int (*server_paint_rect)(struct mod* v, int x, int y, int cx, int cy, - char* data, int width, int height, int srcx, int srcy); - int (*server_set_cursor)(struct mod* v, int x, int y, char* data, char* mask); - int (*server_palette)(struct mod* v, int* palette); - int (*server_msg)(struct mod* v, char* msg, int code); - int (*server_is_term)(struct mod* v); - int (*server_set_clip)(struct mod* v, int x, int y, int cx, int cy); - int (*server_reset_clip)(struct mod* v); - int (*server_set_fgcolor)(struct mod* v, int fgcolor); - int (*server_set_bgcolor)(struct mod* v, int bgcolor); - int (*server_set_opcode)(struct mod* v, int opcode); - int (*server_set_mixmode)(struct mod* v, int mixmode); - int (*server_set_brush)(struct mod* v, int x_origin, int y_origin, - int style, char* pattern); - int (*server_set_pen)(struct mod* v, int style, - int width); - int (*server_draw_line)(struct mod* v, int x1, int y1, int x2, int y2); - int (*server_add_char)(struct mod* v, int font, int character, - int offset, int baseline, - int width, int height, char* data); - int (*server_draw_text)(struct mod* v, int font, - int flags, int mixmode, int clip_left, int clip_top, - int clip_right, int clip_bottom, - int box_left, int box_top, - int box_right, int box_bottom, - int x, int y, char* data, int data_len); - int (*server_reset)(struct mod* v, int width, int height, int bpp); - int (*server_query_channel)(struct mod* v, int index, - char* channel_name, - int* channel_flags); - int (*server_get_channel_id)(struct mod* v, const char *name); - int (*server_send_to_channel)(struct mod* v, int channel_id, - char* data, int data_len, - int total_data_len, int flags); - int (*server_bell_trigger)(struct mod* v); - long server_dumby[100 - 25]; /* align, 100 minus the number of server - functions above */ - /* common */ - long handle; /* pointer to self as long */ - long wm; - long painter; - int sck; - /* mod data */ - struct rdp_rdp* rdp_layer; - int width; - int height; - int rdp_bpp; - int xrdp_bpp; - char ip[256]; - char port[256]; - char username[256]; - char password[256]; - char hostname[256]; - char domain[256]; - char program[256]; - char directory[256]; - int keylayout; - int up_and_running; - struct stream* in_s; - tbus sck_obj; -}; - -/* rdp_tcp.c */ -struct rdp_tcp* APP_CC -rdp_tcp_create(struct rdp_iso* owner); -void APP_CC -rdp_tcp_delete(struct rdp_tcp* self); -int APP_CC -rdp_tcp_init(struct rdp_tcp* self, struct stream* s); -int APP_CC -rdp_tcp_recv(struct rdp_tcp* self, struct stream* s, int len); -int APP_CC -rdp_tcp_send(struct rdp_tcp* self, struct stream* s); -int APP_CC -rdp_tcp_connect(struct rdp_tcp* self, char* ip, char* port); -int APP_CC -rdp_tcp_disconnect(struct rdp_tcp* self); - -/* rdp_ico.c */ -struct rdp_iso* APP_CC -rdp_iso_create(struct rdp_mcs* owner); -void APP_CC -rdp_iso_delete(struct rdp_iso* self); -int APP_CC -rdp_iso_recv(struct rdp_iso* self, struct stream* s); -int APP_CC -rdp_iso_init(struct rdp_iso* self, struct stream* s); -int APP_CC -rdp_iso_send(struct rdp_iso* self, struct stream* s); -int APP_CC -rdp_iso_connect(struct rdp_iso* self, char* ip, char* port); -int APP_CC -rdp_iso_disconnect(struct rdp_iso* self); - -/* rdp_mcs.c */ -struct rdp_mcs* APP_CC -rdp_mcs_create(struct rdp_sec* owner, - struct stream* client_mcs_data, - struct stream* server_mcs_data); -void APP_CC -rdp_mcs_delete(struct rdp_mcs* self); -int APP_CC -rdp_mcs_init(struct rdp_mcs* self, struct stream* s); -int APP_CC -rdp_mcs_send(struct rdp_mcs* self, struct stream* s); -int APP_CC -rdp_mcs_connect(struct rdp_mcs* self, char* ip, char* port); -int APP_CC -rdp_mcs_recv(struct rdp_mcs* self, struct stream* s, int* chan); - -/* rdp_sec.c */ -struct rdp_sec* APP_CC -rdp_sec_create(struct rdp_rdp* owner); -void APP_CC -rdp_sec_delete(struct rdp_sec* self); -int APP_CC -rdp_sec_init(struct rdp_sec* self, struct stream* s, int flags); -int APP_CC -rdp_sec_send(struct rdp_sec* self, struct stream* s, int flags); -int APP_CC -rdp_sec_recv(struct rdp_sec* self, struct stream* s, int* chan); -int APP_CC -rdp_sec_connect(struct rdp_sec* self, char* ip, char* port); -void APP_CC -rdp_sec_buf_out_uint32(char* buffer, int value); -void APP_CC -rdp_sec_hash_16(char* out, char* in, char* salt1, char* salt2); -void APP_CC -rdp_sec_hash_48(char* out, char* in, char* salt1, char* salt2, int salt); -void APP_CC -rdp_sec_sign(char* signature, int siglen, char* session_key, int keylen, - char* data, int datalen); - -/* rdp_rdp.c */ -struct rdp_rdp* APP_CC -rdp_rdp_create(struct mod* owner); -void APP_CC -rdp_rdp_delete(struct rdp_rdp* self); -int APP_CC -rdp_rdp_connect(struct rdp_rdp* self, char* ip, char* port); -int APP_CC -rdp_rdp_send_input(struct rdp_rdp* self, struct stream* s, - int time, int message_type, - int device_flags, int param1, int param2); -int APP_CC -rdp_rdp_send_invalidate(struct rdp_rdp* self, struct stream* s, - int left, int top, int width, int height); -int APP_CC -rdp_rdp_recv(struct rdp_rdp* self, struct stream* s, int* type); -int APP_CC -rdp_rdp_process_data_pdu(struct rdp_rdp* self, struct stream* s); -int APP_CC -rdp_rdp_process_demand_active(struct rdp_rdp* self, struct stream* s); -void APP_CC -rdp_rdp_out_unistr(struct stream* s, char* text); -int APP_CC -rdp_rec_check_file(struct rdp_rdp* self); -int APP_CC -rdp_rec_write_item(struct rdp_rdp* self, struct stream* s); - -/* rdp_bitmap.c */ -int APP_CC -rdp_bitmap_decompress(char* output, int width, int height, char* input, - int size, int Bpp); - -/* rdp_orders.c */ -struct rdp_orders* APP_CC -rdp_orders_create(struct rdp_rdp* owner); -void APP_CC -rdp_orders_delete(struct rdp_orders* self); -void APP_CC -rdp_orders_reset_state(struct rdp_orders* self); -int APP_CC -rdp_orders_process_orders(struct rdp_orders* self, struct stream* s, - int num_orders); -char* APP_CC -rdp_orders_convert_bitmap(int in_bpp, int out_bpp, char* bmpdata, - int width, int height, int* palette); -int APP_CC -rdp_orders_convert_color(int in_bpp, int out_bpp, int in_color, int* palette); - -/* rdp_lic.c */ -struct rdp_lic* APP_CC -rdp_lic_create(struct rdp_sec* owner); -void APP_CC -rdp_lic_delete(struct rdp_lic* self); -void APP_CC -rdp_lic_process(struct rdp_lic* self, struct stream* s); diff --git a/rdp/rdp_bitmap.c b/rdp/rdp_bitmap.c deleted file mode 100644 index 4ba821d3..00000000 --- a/rdp/rdp_bitmap.c +++ /dev/null @@ -1,999 +0,0 @@ -/** - * xrdp: A Remote Desktop Protocol server. - * - * Copyright (C) Jay Sorg 2004-2013 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * librdp bitmap routines - */ - -#include "rdp.h" - -/******************************************************************************/ -#define CVAL(p) ((unsigned char)(*(p++))) - -#if defined(B_ENDIAN) -#define EIK0 1 -#define EIK1 0 -#else -#define EIK0 0 -#define EIK1 1 -#endif - -/******************************************************************************/ -#define REPEAT(statement) \ - { \ - while ((count > 0) && (x < width)) \ - { \ - statement; \ - count--; \ - x++; \ - } \ - } - -/******************************************************************************/ -#define MASK_UPDATE \ - { \ - mixmask <<= 1; \ - if ((mixmask & 0xff) == 0) \ - { \ - mask = fom_mask ? fom_mask : CVAL(input); \ - mixmask = 1; \ - } \ - } - -/******************************************************************************/ -/* 1 byte bitmap decompress */ -/* returns boolean */ -static int APP_CC -bitmap_decompress1(char *output, int width, int height, char *input, int size) -{ - char *prevline; - char *line; - char *end; - char color1; - char color2; - char mix; - int code; - int mixmask; - int mask; - int opcode; - int count; - int offset; - int isfillormix; - int x; - int lastopcode; - int insertmix; - int bicolor; - int fom_mask; - - end = input + size; - prevline = 0; - line = 0; - x = width; - lastopcode = -1; - insertmix = 0; - bicolor = 0; - color1 = 0; - color2 = 0; - mix = 0xff; - mask = 0; - fom_mask = 0; - - while (input < end) - { - fom_mask = 0; - code = CVAL(input); - opcode = code >> 4; - - /* Handle different opcode forms */ - switch (opcode) - { - case 0xc: - case 0xd: - case 0xe: - opcode -= 6; - count = code & 0xf; - offset = 16; - break; - case 0xf: - opcode = code & 0xf; - - if (opcode < 9) - { - count = CVAL(input); - count |= CVAL(input) << 8; - } - else - { - count = (opcode < 0xb) ? 8 : 1; - } - - offset = 0; - break; - default: - opcode >>= 1; - count = code & 0x1f; - offset = 32; - break; - } - - /* Handle strange cases for counts */ - if (offset != 0) - { - isfillormix = ((opcode == 2) || (opcode == 7)); - - if (count == 0) - { - if (isfillormix) - { - count = CVAL(input) + 1; - } - else - { - count = CVAL(input) + offset; - } - } - else if (isfillormix) - { - count <<= 3; - } - } - - /* Read preliminary data */ - switch (opcode) - { - case 0: /* Fill */ - - if ((lastopcode == opcode) && !((x == width) && (prevline == 0))) - { - insertmix = 1; - } - - break; - case 8: /* Bicolor */ - color1 = CVAL(input); - /* fall through is intentional */ - case 3: /* Color */ - color2 = CVAL(input); - break; - case 6: /* SetMix/Mix */ - case 7: /* SetMix/FillOrMix */ - mix = CVAL(input); - opcode -= 5; - break; - case 9: /* FillOrMix_1 */ - mask = 0x03; - opcode = 0x02; - fom_mask = 3; - break; - case 0x0a: /* FillOrMix_2 */ - mask = 0x05; - opcode = 0x02; - fom_mask = 5; - break; - } - - lastopcode = opcode; - mixmask = 0; - - /* Output body */ - while (count > 0) - { - if (x >= width) - { - if (height <= 0) - { - return 0; - } - - x = 0; - height--; - prevline = line; - line = output + height * width; - } - - switch (opcode) - { - case 0: /* Fill */ - - if (insertmix) - { - if (prevline == 0) - { - line[x] = mix; - } - else - { - line[x] = prevline[x] ^ mix; - } - - insertmix = 0; - count--; - x++; - } - - if (prevline == 0) - { - REPEAT(line[x] = 0) - } - else - { - REPEAT(line[x] = prevline[x]) - } - - break; - case 1: /* Mix */ - - if (prevline == 0) - { - REPEAT(line[x] = mix) - } - else - { - REPEAT(line[x] = prevline[x] ^ mix) - } - - break; - case 2: /* Fill or Mix */ - - if (prevline == 0) - { - REPEAT - ( - MASK_UPDATE; - - if (mask & mixmask) - { - line[x] = mix; - } - else - { - line[x] = 0; - } - ) - } - else - { - REPEAT - ( - MASK_UPDATE; - - if (mask & mixmask) - { - line[x] = prevline[x] ^ mix; - } - else - { - line[x] = prevline[x]; - } - ) - } - - break; - case 3: /* Color */ - REPEAT(line[x] = color2) - break; - case 4: /* Copy */ - REPEAT(line[x] = CVAL(input)) - break; - case 8: /* Bicolor */ - REPEAT - ( - - if (bicolor) - { - line[x] = color2; - bicolor = 0; - } - else - { - line[x] = color1; - bicolor = 1; - count++; - } - ) - break; - case 0xd: /* White */ - REPEAT(line[x] = 0xff) - break; - case 0xe: /* Black */ - REPEAT(line[x] = 0) - break; - default: - return 0; - break; - } - } - } - - return 1; -} - -/******************************************************************************/ -/* 2 byte bitmap decompress */ -/* returns boolean */ -static int APP_CC -bitmap_decompress2(char *output, int width, int height, char *input, int size) -{ - char *prevline; - char *line; - char *end; - char color1[2]; - char color2[2]; - char mix[2]; - int code; - int mixmask; - int mask; - int opcode; - int count; - int offset; - int isfillormix; - int x; - int lastopcode; - int insertmix; - int bicolor; - int fom_mask; - - end = input + size; - prevline = 0; - line = 0; - x = width; - lastopcode = -1; - insertmix = 0; - bicolor = 0; - color1[0] = 0; - color1[1] = 0; - color2[0] = 0; - color2[1] = 0; - mix[0] = 0xff; - mix[1] = 0xff; - mask = 0; - fom_mask = 0; - - while (input < end) - { - fom_mask = 0; - code = CVAL(input); - opcode = code >> 4; - - /* Handle different opcode forms */ - switch (opcode) - { - case 0xc: - case 0xd: - case 0xe: - opcode -= 6; - count = code & 0xf; - offset = 16; - break; - case 0xf: - opcode = code & 0xf; - - if (opcode < 9) - { - count = CVAL(input); - count |= CVAL(input) << 8; - } - else - { - count = (opcode < 0xb) ? 8 : 1; - } - - offset = 0; - break; - default: - opcode >>= 1; - count = code & 0x1f; - offset = 32; - break; - } - - /* Handle strange cases for counts */ - if (offset != 0) - { - isfillormix = ((opcode == 2) || (opcode == 7)); - - if (count == 0) - { - if (isfillormix) - { - count = CVAL(input) + 1; - } - else - { - count = CVAL(input) + offset; - } - } - else if (isfillormix) - { - count <<= 3; - } - } - - /* Read preliminary data */ - switch (opcode) - { - case 0: /* Fill */ - - if ((lastopcode == opcode) && !((x == width) && (prevline == 0))) - { - insertmix = 1; - } - - break; - case 8: /* Bicolor */ - color1[EIK0] = CVAL(input); - color1[EIK1] = CVAL(input); - /* fall through is intentional */ - case 3: /* Color */ - color2[EIK0] = CVAL(input); - color2[EIK1] = CVAL(input); - break; - case 6: /* SetMix/Mix */ - case 7: /* SetMix/FillOrMix */ - mix[EIK0] = CVAL(input); - mix[EIK1] = CVAL(input); - opcode -= 5; - break; - case 9: /* FillOrMix_1 */ - mask = 0x03; - opcode = 0x02; - fom_mask = 3; - break; - case 0x0a: /* FillOrMix_2 */ - mask = 0x05; - opcode = 0x02; - fom_mask = 5; - break; - } - - lastopcode = opcode; - mixmask = 0; - - /* Output body */ - while (count > 0) - { - if (x >= width) - { - if (height <= 0) - { - return 0; - } - - x = 0; - height--; - prevline = line; - line = output + height * (width * 2); - } - - switch (opcode) - { - case 0: /* Fill */ - - if (insertmix) - { - if (prevline == 0) - { - line[x * 2 + 0] = mix[0]; - line[x * 2 + 1] = mix[1]; - } - else - { - line[x * 2 + 0] = prevline[x * 2 + 0] ^ mix[0]; - line[x * 2 + 1] = prevline[x * 2 + 1] ^ mix[1]; - } - - insertmix = 0; - count--; - x++; - } - - if (prevline == 0) - { - REPEAT - ( - line[x * 2 + 0] = 0; - line[x * 2 + 1] = 0; - ) - } - else - { - REPEAT - ( - line[x * 2 + 0] = prevline[x * 2 + 0]; - line[x * 2 + 1] = prevline[x * 2 + 1]; - ) - } - - break; - case 1: /* Mix */ - - if (prevline == 0) - { - REPEAT - ( - line[x * 2 + 0] = mix[0]; - line[x * 2 + 1] = mix[1]; - ) - } - else - { - REPEAT - ( - line[x * 2 + 0] = prevline[x * 2 + 0] ^ mix[0]; - line[x * 2 + 1] = prevline[x * 2 + 1] ^ mix[1]; - ) - } - - break; - case 2: /* Fill or Mix */ - - if (prevline == 0) - { - REPEAT - ( - MASK_UPDATE; - - if (mask & mixmask) - { - line[x * 2 + 0] = mix[0]; - line[x * 2 + 1] = mix[1]; - } - else - { - line[x * 2 + 0] = 0; - line[x * 2 + 1] = 0; - } - ) - } - else - { - REPEAT - ( - MASK_UPDATE; - - if (mask & mixmask) - { - line[x * 2 + 0] = prevline[x * 2 + 0] ^ mix[0]; - line[x * 2 + 1] = prevline[x * 2 + 1] ^ mix[1]; - } - else - { - line[x * 2 + 0] = prevline[x * 2 + 0]; - line[x * 2 + 1] = prevline[x * 2 + 1]; - } - ) - } - - break; - case 3: /* Color */ - REPEAT - ( - line[x * 2 + 0] = color2[0]; - line[x * 2 + 1] = color2[1]; - ) - break; - case 4: /* Copy */ - REPEAT - ( - line[x * 2 + EIK0] = CVAL(input); - line[x * 2 + EIK1] = CVAL(input); - ) - break; - case 8: /* Bicolor */ - REPEAT - ( - - if (bicolor) - { - line[x * 2 + 0] = color2[0]; - line[x * 2 + 1] = color2[1]; - bicolor = 0; - } - else - { - line[x * 2 + 0] = color1[0]; - line[x * 2 + 1] = color1[1]; - bicolor = 1; - count++; - } - ) - break; - case 0xd: /* White */ - REPEAT - ( - line[x * 2 + 0] = 0xff; - line[x * 2 + 1] = 0xff; - ) - break; - case 0xe: /* Black */ - REPEAT - ( - line[x * 2 + 0] = 0; - line[x * 2 + 1] = 0; - ) - break; - default: - return 0; - break; - } - } - } - - return 1; -} - -/******************************************************************************/ -/* 3 byte bitmap decompress */ -/* returns boolean */ -static int APP_CC -bitmap_decompress3(char *output, int width, int height, char *input, int size) -{ - char *prevline; - char *line; - char *end; - char color1[3]; - char color2[3]; - char mix[3]; - int code; - int mixmask; - int mask; - int opcode; - int count; - int offset; - int isfillormix; - int x; - int lastopcode; - int insertmix; - int bicolor; - int fom_mask; - - end = input + size; - prevline = 0; - line = 0; - x = width; - lastopcode = -1; - insertmix = 0; - bicolor = 0; - color1[0] = 0; - color1[1] = 0; - color1[2] = 0; - color2[0] = 0; - color2[1] = 0; - color2[2] = 0; - mix[0] = 0xff; - mix[1] = 0xff; - mix[2] = 0xff; - mask = 0; - fom_mask = 0; - - while (input < end) - { - fom_mask = 0; - code = CVAL(input); - opcode = code >> 4; - - /* Handle different opcode forms */ - switch (opcode) - { - case 0xc: - case 0xd: - case 0xe: - opcode -= 6; - count = code & 0xf; - offset = 16; - break; - case 0xf: - opcode = code & 0xf; - - if (opcode < 9) - { - count = CVAL(input); - count |= CVAL(input) << 8; - } - else - { - count = (opcode < 0xb) ? 8 : 1; - } - - offset = 0; - break; - default: - opcode >>= 1; - count = code & 0x1f; - offset = 32; - break; - } - - /* Handle strange cases for counts */ - if (offset != 0) - { - isfillormix = ((opcode == 2) || (opcode == 7)); - - if (count == 0) - { - if (isfillormix) - { - count = CVAL(input) + 1; - } - else - { - count = CVAL(input) + offset; - } - } - else if (isfillormix) - { - count <<= 3; - } - } - - /* Read preliminary data */ - switch (opcode) - { - case 0: /* Fill */ - - if ((lastopcode == opcode) && !((x == width) && (prevline == 0))) - { - insertmix = 1; - } - - break; - case 8: /* Bicolor */ - color1[0] = CVAL(input); - color1[1] = CVAL(input); - color1[2] = CVAL(input); - /* fall through is intentional */ - case 3: /* Color */ - color2[0] = CVAL(input); - color2[1] = CVAL(input); - color2[2] = CVAL(input); - break; - case 6: /* SetMix/Mix */ - case 7: /* SetMix/FillOrMix */ - mix[0] = CVAL(input); - mix[1] = CVAL(input); - mix[2] = CVAL(input); - opcode -= 5; - break; - case 9: /* FillOrMix_1 */ - mask = 0x03; - opcode = 0x02; - fom_mask = 3; - break; - case 0x0a: /* FillOrMix_2 */ - mask = 0x05; - opcode = 0x02; - fom_mask = 5; - break; - } - - lastopcode = opcode; - mixmask = 0; - - /* Output body */ - while (count > 0) - { - if (x >= width) - { - if (height <= 0) - { - return 0; - } - - x = 0; - height--; - prevline = line; - line = output + height * (width * 3); - } - - switch (opcode) - { - case 0: /* Fill */ - - if (insertmix) - { - if (prevline == 0) - { - line[x * 3 + 0] = mix[0]; - line[x * 3 + 1] = mix[1]; - line[x * 3 + 2] = mix[2]; - } - else - { - line[x * 3 + 0] = prevline[x * 3 + 0] ^ mix[0]; - line[x * 3 + 1] = prevline[x * 3 + 1] ^ mix[1]; - line[x * 3 + 2] = prevline[x * 3 + 2] ^ mix[2]; - } - - insertmix = 0; - count--; - x++; - } - - if (prevline == 0) - { - REPEAT - ( - line[x * 3 + 0] = 0; - line[x * 3 + 1] = 0; - line[x * 3 + 2] = 0; - ) - } - else - { - REPEAT - ( - line[x * 3 + 0] = prevline[x * 3 + 0]; - line[x * 3 + 1] = prevline[x * 3 + 1]; - line[x * 3 + 2] = prevline[x * 3 + 2]; - ) - } - - break; - case 1: /* Mix */ - - if (prevline == 0) - { - REPEAT - ( - line[x * 3 + 0] = mix[0]; - line[x * 3 + 1] = mix[1]; - line[x * 3 + 2] = mix[2]; - ) - } - else - { - REPEAT - ( - line[x * 3 + 0] = prevline[x * 3 + 0] ^ mix[0]; - line[x * 3 + 1] = prevline[x * 3 + 1] ^ mix[1]; - line[x * 3 + 2] = prevline[x * 3 + 2] ^ mix[2]; - ) - } - - break; - case 2: /* Fill or Mix */ - - if (prevline == 0) - { - REPEAT - ( - MASK_UPDATE; - - if (mask & mixmask) - { - line[x * 3 + 0] = mix[0]; - line[x * 3 + 1] = mix[1]; - line[x * 3 + 2] = mix[2]; - } - else - { - line[x * 3 + 0] = 0; - line[x * 3 + 1] = 0; - line[x * 3 + 2] = 0; - } - ) - } - else - { - REPEAT - ( - MASK_UPDATE; - - if (mask & mixmask) - { - line[x * 3 + 0] = prevline[x * 3 + 0] ^ mix[0]; - line[x * 3 + 1] = prevline[x * 3 + 1] ^ mix[1]; - line[x * 3 + 2] = prevline[x * 3 + 2] ^ mix[2]; - } - else - { - line[x * 3 + 0] = prevline[x * 3 + 0]; - line[x * 3 + 1] = prevline[x * 3 + 1]; - line[x * 3 + 2] = prevline[x * 3 + 2]; - } - ) - } - - break; - case 3: /* Color */ - REPEAT - ( - line[x * 3 + 0] = color2[0]; - line[x * 3 + 1] = color2[1]; - line[x * 3 + 2] = color2[2]; - ) - break; - case 4: /* Copy */ - REPEAT - ( - line[x * 3 + 0] = CVAL(input); - line[x * 3 + 1] = CVAL(input); - line[x * 3 + 2] = CVAL(input); - ) - break; - case 8: /* Bicolor */ - REPEAT - ( - - if (bicolor) - { - line[x * 3 + 0] = color2[0]; - line[x * 3 + 1] = color2[1]; - line[x * 3 + 2] = color2[2]; - bicolor = 0; - } - else - { - line[x * 3 + 0] = color1[0]; - line[x * 3 + 1] = color1[1]; - line[x * 3 + 2] = color1[2]; - bicolor = 1; - count++; - } - ) - break; - case 0xd: /* White */ - REPEAT - ( - line[x * 3 + 0] = 0xff; - line[x * 3 + 1] = 0xff; - line[x * 3 + 2] = 0xff; - ) - break; - case 0xe: /* Black */ - REPEAT - ( - line[x * 3 + 0] = 0; - line[x * 3 + 1] = 0; - line[x * 3 + 2] = 0; - ) - break; - default: - return 0; - break; - } - } - } - - return 1; -} - -/*****************************************************************************/ -/* returns boolean */ -int APP_CC -rdp_bitmap_decompress(char *output, int width, int height, char *input, - int size, int Bpp) -{ - int rv; - - switch (Bpp) - { - case 1: - rv = bitmap_decompress1(output, width, height, input, size); - break; - case 2: - rv = bitmap_decompress2(output, width, height, input, size); - break; - case 3: - rv = bitmap_decompress3(output, width, height, input, size); - break; - default: - rv = 0; - break; - } - - return rv; -} diff --git a/rdp/rdp_iso.c b/rdp/rdp_iso.c deleted file mode 100644 index 65721658..00000000 --- a/rdp/rdp_iso.c +++ /dev/null @@ -1,239 +0,0 @@ -/** - * xrdp: A Remote Desktop Protocol server. - * - * Copyright (C) Jay Sorg 2004-2013 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * librdp iso layer - */ - -#include "rdp.h" - -/*****************************************************************************/ -struct rdp_iso *APP_CC -rdp_iso_create(struct rdp_mcs *owner) -{ - struct rdp_iso *self; - - self = (struct rdp_iso *)g_malloc(sizeof(struct rdp_iso), 1); - self->mcs_layer = owner; - self->tcp_layer = rdp_tcp_create(self); - return self; -} - -/*****************************************************************************/ -void APP_CC -rdp_iso_delete(struct rdp_iso *self) -{ - if (self == 0) - { - return; - } - - rdp_tcp_delete(self->tcp_layer); - g_free(self); -} - -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_iso_recv_msg(struct rdp_iso *self, struct stream *s, int *code) -{ - int ver; - int len; - - *code = 0; - - if (rdp_tcp_recv(self->tcp_layer, s, 4) != 0) - { - DEBUG((" out rdp_iso_recv_msg error rdp_tcp_recv 1 failed")); - return 1; - } - - in_uint8(s, ver); - - if (ver != 3) - { - DEBUG((" out rdp_iso_recv_msg error ver != 3")); - return 1; - } - - in_uint8s(s, 1); - in_uint16_be(s, len); - - if (rdp_tcp_recv(self->tcp_layer, s, len - 4) != 0) - { - DEBUG((" out rdp_iso_recv_msg error rdp_tcp_recv 2 failed")); - return 1; - } - - in_uint8s(s, 1); - in_uint8(s, *code); - - if (*code == ISO_PDU_DT) - { - in_uint8s(s, 1); - } - else - { - in_uint8s(s, 5); - } - - return 0; -} - -/*****************************************************************************/ -static int APP_CC -rdp_iso_send_msg(struct rdp_iso *self, struct stream *s, int code) -{ - if (rdp_tcp_init(self->tcp_layer, s) != 0) - { - return 1; - } - - out_uint8(s, 3); - out_uint8(s, 0); - out_uint16_be(s, 11); /* length */ - out_uint8(s, 6); - out_uint8(s, code); - out_uint16_le(s, 0); - out_uint16_le(s, 0); - out_uint8(s, 0); - s_mark_end(s); - - if (rdp_tcp_send(self->tcp_layer, s) != 0) - { - return 1; - } - - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_iso_recv(struct rdp_iso *self, struct stream *s) -{ - int code; - - if (rdp_iso_recv_msg(self, s, &code) != 0) - { - return 1; - } - - if (code != ISO_PDU_DT) - { - return 1; - } - - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_iso_init(struct rdp_iso *self, struct stream *s) -{ - rdp_tcp_init(self->tcp_layer, s); - s_push_layer(s, iso_hdr, 7); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_iso_send(struct rdp_iso *self, struct stream *s) -{ - int len; - - s_pop_layer(s, iso_hdr); - len = s->end - s->p; - out_uint8(s, 3); - out_uint8(s, 0); - out_uint16_be(s, len); - out_uint8(s, 2); - out_uint8(s, ISO_PDU_DT); - out_uint8(s, 0x80); - - if (rdp_tcp_send(self->tcp_layer, s) != 0) - { - return 1; - } - - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_iso_connect(struct rdp_iso *self, char *ip, char *port) -{ - int code; - struct stream *s; - - DEBUG((" in rdp_iso_connect")); - make_stream(s); - init_stream(s, 8192); - - if (rdp_tcp_connect(self->tcp_layer, ip, port) != 0) - { - free_stream(s); - DEBUG((" out rdp_iso_connect error rdp_tcp_connect failed")); - return 1; - } - - if (rdp_iso_send_msg(self, s, ISO_PDU_CR) != 0) - { - free_stream(s); - rdp_tcp_disconnect(self->tcp_layer); - DEBUG((" out rdp_iso_connect error rdp_iso_send_msg failed")); - return 1; - } - - init_stream(s, 8192); - - if (rdp_iso_recv_msg(self, s, &code) != 0) - { - free_stream(s); - rdp_tcp_disconnect(self->tcp_layer); - DEBUG((" out rdp_iso_connect error rdp_iso_recv_msg failed")); - return 1; - } - - if (code != ISO_PDU_CC) - { - free_stream(s); - rdp_tcp_disconnect(self->tcp_layer); - DEBUG((" out rdp_iso_connect error code != ISO_PDU_CC")); - return 1; - } - - free_stream(s); - DEBUG((" out rdp_iso_connect")); - return 0; -} - -/*****************************************************************************/ -int APP_CC -rdp_iso_disconnect(struct rdp_iso *self) -{ - struct stream *s; - - make_stream(s); - init_stream(s, 8192); - rdp_iso_send_msg(self, s, ISO_PDU_DR); - rdp_tcp_disconnect(self->tcp_layer); - free_stream(s); - return 0; -} diff --git a/rdp/rdp_lic.c b/rdp/rdp_lic.c deleted file mode 100644 index 799c14b7..00000000 --- a/rdp/rdp_lic.c +++ /dev/null @@ -1,375 +0,0 @@ -/** - * xrdp: A Remote Desktop Protocol server. - * - * Copyright (C) Jay Sorg 2004-2013 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * licence - */ - -#include "rdp.h" - -/*****************************************************************************/ -struct rdp_lic *APP_CC -rdp_lic_create(struct rdp_sec *owner) -{ - struct rdp_lic *self; - - self = (struct rdp_lic *)g_malloc(sizeof(struct rdp_lic), 1); - self->sec_layer = owner; - return self; -} - -/*****************************************************************************/ -void APP_CC -rdp_lic_delete(struct rdp_lic *self) -{ - if (self == 0) - { - return; - } - - g_free(self); -} - -/*****************************************************************************/ -/* Generate a session key and RC4 keys, given client and server randoms */ -static void APP_CC -rdp_lic_generate_keys(struct rdp_lic *self, char *client_random, - char *server_random, char *pre_master_secret) -{ - char master_secret[48]; - char key_block[48]; - - /* Generate master secret and then key material */ - rdp_sec_hash_48(master_secret, pre_master_secret, client_random, - server_random, 65); - rdp_sec_hash_48(key_block, master_secret, server_random, - client_random, 65); - /* Store first 16 bytes of session key as MAC secret */ - g_memcpy(self->licence_sign_key, key_block, 16); - /* Generate RC4 key from next 16 bytes */ - rdp_sec_hash_16(self->licence_key, key_block + 16, client_random, - server_random); -} - -/*****************************************************************************/ -static void APP_CC -rdp_lic_generate_hwid(struct rdp_lic *self, char *hwid) -{ - rdp_sec_buf_out_uint32(hwid, 2); - g_strncpy(hwid + 4, self->sec_layer->rdp_layer->mod->hostname, - LICENCE_HWID_SIZE - 4); -} - -#if 0 -/*****************************************************************************/ -/* Present an existing licence to the server */ -static void APP_CC -rdp_lic_present(struct rdp_lic *self, char *client_random, char *rsa_data, - char *licence_data, int licence_size, char *hwid, - char *signature) -{ - int sec_flags; - int length; - struct stream *s; - - sec_flags = SEC_LICENCE_NEG; - length = 16 + SEC_RANDOM_SIZE + SEC_MODULUS_SIZE + SEC_PADDING_SIZE + - licence_size + LICENCE_HWID_SIZE + LICENCE_SIGNATURE_SIZE; - make_stream(s); - init_stream(s, 8192); - rdp_sec_init(self->sec_layer, s, sec_flags); - out_uint8(s, LICENCE_TAG_PRESENT); - out_uint8(s, 2); /* version */ - out_uint16_le(s, length); - out_uint32_le(s, 1); - out_uint16_le(s, 0); - out_uint16_le(s, 0x0201); - out_uint8p(s, client_random, SEC_RANDOM_SIZE); - out_uint16_le(s, 0); - out_uint16_le(s, (SEC_MODULUS_SIZE + SEC_PADDING_SIZE)); - out_uint8p(s, rsa_data, SEC_MODULUS_SIZE); - out_uint8s(s, SEC_PADDING_SIZE); - out_uint16_le(s, 1); - out_uint16_le(s, licence_size); - out_uint8p(s, licence_data, licence_size); - out_uint16_le(s, 1); - out_uint16_le(s, LICENCE_HWID_SIZE); - out_uint8p(s, hwid, LICENCE_HWID_SIZE); - out_uint8p(s, signature, LICENCE_SIGNATURE_SIZE); - s_mark_end(s); - rdp_sec_send(self->sec_layer, s, sec_flags); - free_stream(s); -} -#endif - -/*****************************************************************************/ -/* Send a licence request packet */ -static void APP_CC -rdp_lic_send_request(struct rdp_lic *self, char *client_random, - char *rsa_data, char *user, char *host) -{ - int sec_flags; - int userlen; - int hostlen; - int length; - struct stream *s; - - sec_flags = SEC_LICENCE_NEG; - userlen = g_strlen(user) + 1; - hostlen = g_strlen(host) + 1; - length = 128 + userlen + hostlen; - make_stream(s); - init_stream(s, 8192); - rdp_sec_init(self->sec_layer, s, sec_flags); - out_uint8(s, LICENCE_TAG_REQUEST); - out_uint8(s, 2); /* version */ - out_uint16_le(s, length); - out_uint32_le(s, 1); - out_uint16_le(s, 0); - out_uint16_le(s, 0xff01); - out_uint8p(s, client_random, SEC_RANDOM_SIZE); - out_uint16_le(s, 0); - out_uint16_le(s, (SEC_MODULUS_SIZE + SEC_PADDING_SIZE)); - out_uint8p(s, rsa_data, SEC_MODULUS_SIZE); - out_uint8s(s, SEC_PADDING_SIZE); - out_uint16_le(s, LICENCE_TAG_USER); - out_uint16_le(s, userlen); - out_uint8p(s, user, userlen); - out_uint16_le(s, LICENCE_TAG_HOST); - out_uint16_le(s, hostlen); - out_uint8p(s, host, hostlen); - s_mark_end(s); - rdp_sec_send(self->sec_layer, s, sec_flags); - free_stream(s); -} - -/*****************************************************************************/ -/* Process a licence demand packet */ -static void APP_CC -rdp_lic_process_demand(struct rdp_lic *self, struct stream *s) -{ - char null_data[SEC_MODULUS_SIZE]; - char *server_random; - - /* Retrieve the server random from the incoming packet */ - in_uint8p(s, server_random, SEC_RANDOM_SIZE); - /* We currently use null client keys. This is a bit naughty but, hey, - the security of licence negotiation isn't exactly paramount. */ - g_memset(null_data, 0, sizeof(null_data)); - rdp_lic_generate_keys(self, null_data, server_random, null_data); - -#if 0 - int licence_size; - char *licence_data; - - licence_size = 0; /* todo load_licence(&licence_data); */ - - if (licence_size > 0) - { - void *crypt_key; - char hwid[LICENCE_HWID_SIZE]; - char signature[LICENCE_SIGNATURE_SIZE]; - - /* Generate a signature for the HWID buffer */ - rdp_lic_generate_hwid(self, hwid); - rdp_sec_sign(signature, 16, self->licence_sign_key, 16, - hwid, sizeof(hwid)); - /* Now encrypt the HWID */ - crypt_key = ssl_rc4_info_create(); - ssl_rc4_set_key(crypt_key, self->licence_key, 16); - ssl_rc4_crypt(crypt_key, hwid, sizeof(hwid)); - ssl_rc4_info_delete(crypt_key); - rdp_lic_present(self, null_data, null_data, licence_data, - licence_size, hwid, signature); - g_free(licence_data); - return; - } -#endif - - rdp_lic_send_request(self, null_data, null_data, - self->sec_layer->rdp_layer->mod->username, - self->sec_layer->rdp_layer->mod->hostname); -} - -/*****************************************************************************/ -/* Send an authentication response packet */ -static void APP_CC -rdp_lic_send_authresp(struct rdp_lic *self, char *token, char *crypt_hwid, - char *signature) -{ - int sec_flags; - int length; - struct stream *s; - - sec_flags = SEC_LICENCE_NEG; - length = 58; - make_stream(s); - init_stream(s, 8192); - rdp_sec_init(self->sec_layer, s, sec_flags); - out_uint8(s, LICENCE_TAG_AUTHRESP); - out_uint8(s, 2); /* version */ - out_uint16_le(s, length); - out_uint16_le(s, 1); - out_uint16_le(s, LICENCE_TOKEN_SIZE); - out_uint8p(s, token, LICENCE_TOKEN_SIZE); - out_uint16_le(s, 1); - out_uint16_le(s, LICENCE_HWID_SIZE); - out_uint8p(s, crypt_hwid, LICENCE_HWID_SIZE); - out_uint8p(s, signature, LICENCE_SIGNATURE_SIZE); - s_mark_end(s); - rdp_sec_send(self->sec_layer, s, sec_flags); - free_stream(s); -} - -/*****************************************************************************/ -/* Parse an authentication request packet */ -/* returns boolean */ -static int APP_CC -rdp_lic_parse_authreq(struct rdp_lic *self, struct stream *s, - char **token, char **signature) -{ - int tokenlen; - - in_uint8s(s, 6); /* unknown: f8 3d 15 00 04 f6 */ - in_uint16_le(s, tokenlen); - - if (tokenlen != LICENCE_TOKEN_SIZE) - { - /* error("token len %d\n", tokenlen); */ - return 0; - } - - in_uint8p(s, *token, tokenlen); - in_uint8p(s, *signature, LICENCE_SIGNATURE_SIZE); - return s_check_end(s); -} - -/*****************************************************************************/ -/* Process an authentication request packet */ -static void APP_CC -rdp_lic_process_authreq(struct rdp_lic *self, struct stream *s) -{ - char *in_token; - char *in_sig; - char out_token[LICENCE_TOKEN_SIZE]; - char decrypt_token[LICENCE_TOKEN_SIZE]; - char hwid[LICENCE_HWID_SIZE]; - char crypt_hwid[LICENCE_HWID_SIZE]; - char sealed_buffer[LICENCE_TOKEN_SIZE + LICENCE_HWID_SIZE]; - char out_sig[LICENCE_SIGNATURE_SIZE]; - void *crypt_key; - - in_token = 0; - in_sig = 0; - /* Parse incoming packet and save the encrypted token */ - rdp_lic_parse_authreq(self, s, &in_token, &in_sig); - g_memcpy(out_token, in_token, LICENCE_TOKEN_SIZE); - /* Decrypt the token. It should read TEST in Unicode. */ - crypt_key = ssl_rc4_info_create(); - ssl_rc4_set_key(crypt_key, self->licence_key, 16); - g_memcpy(decrypt_token, in_token, LICENCE_TOKEN_SIZE); - ssl_rc4_crypt(crypt_key, decrypt_token, LICENCE_TOKEN_SIZE); - /* Generate a signature for a buffer of token and HWID */ - rdp_lic_generate_hwid(self, hwid); - g_memcpy(sealed_buffer, decrypt_token, LICENCE_TOKEN_SIZE); - g_memcpy(sealed_buffer + LICENCE_TOKEN_SIZE, hwid, LICENCE_HWID_SIZE); - rdp_sec_sign(out_sig, 16, self->licence_sign_key, 16, sealed_buffer, - sizeof(sealed_buffer)); - /* Now encrypt the HWID */ - ssl_rc4_set_key(crypt_key, self->licence_key, 16); - g_memcpy(crypt_hwid, hwid, LICENCE_HWID_SIZE); - ssl_rc4_crypt(crypt_key, crypt_hwid, LICENCE_HWID_SIZE); - rdp_lic_send_authresp(self, out_token, crypt_hwid, out_sig); - ssl_rc4_info_delete(crypt_key); -} - -/*****************************************************************************/ -/* Process an licence issue packet */ -static void APP_CC -rdp_lic_process_issue(struct rdp_lic *self, struct stream *s) -{ - void *crypt_key; - int length; - int check; - int i; - - in_uint8s(s, 2); /* 3d 45 - unknown */ - in_uint16_le(s, length); - - if (!s_check_rem(s, length)) - { - return; - } - - crypt_key = ssl_rc4_info_create(); - ssl_rc4_set_key(crypt_key, self->licence_key, 16); - ssl_rc4_crypt(crypt_key, s->p, length); - ssl_rc4_info_delete(crypt_key); - in_uint16_le(s, check); - - if (check != 0) - { - return; - } - - self->licence_issued = 1; - in_uint8s(s, 2); /* pad */ - /* advance to fourth string */ - length = 0; - - for (i = 0; i < 4; i++) - { - in_uint8s(s, length); - in_uint32_le(s, length); - - if (!s_check_rem(s, length)) - { - return; - } - } - - /* todo save_licence(s->p, length); */ -} - -/******************************************************************************/ -/* Process a licence packet */ -void APP_CC -rdp_lic_process(struct rdp_lic *self, struct stream *s) -{ - int tag; - - in_uint8(s, tag); - in_uint8s(s, 3); /* version, length */ - - switch (tag) - { - case LICENCE_TAG_DEMAND: - rdp_lic_process_demand(self, s); - break; - case LICENCE_TAG_AUTHREQ: - rdp_lic_process_authreq(self, s); - break; - case LICENCE_TAG_ISSUE: - rdp_lic_process_issue(self, s); - break; - case LICENCE_TAG_REISSUE: - case LICENCE_TAG_RESULT: - break; - default: - break; - /* todo unimpl("licence tag 0x%x\n", tag); */ - } -} diff --git a/rdp/rdp_mcs.c b/rdp/rdp_mcs.c deleted file mode 100644 index 536ba7d1..00000000 --- a/rdp/rdp_mcs.c +++ /dev/null @@ -1,630 +0,0 @@ -/** - * xrdp: A Remote Desktop Protocol server. - * - * Copyright (C) Jay Sorg 2004-2013 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * librdp mcs layer - */ - -#include "rdp.h" -#include "log.h" - -/*****************************************************************************/ -struct rdp_mcs *APP_CC -rdp_mcs_create(struct rdp_sec *owner, - struct stream *client_mcs_data, - struct stream *server_mcs_data) -{ - struct rdp_mcs *self; - - self = (struct rdp_mcs *)g_malloc(sizeof(struct rdp_mcs), 1); - self->sec_layer = owner; - self->userid = 1; - self->client_mcs_data = client_mcs_data; - self->server_mcs_data = server_mcs_data; - self->iso_layer = rdp_iso_create(self); - return self; -} - -/*****************************************************************************/ -void APP_CC -rdp_mcs_delete(struct rdp_mcs *self) -{ - if (self == 0) - { - return; - } - - rdp_iso_delete(self->iso_layer); - g_free(self); -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_mcs_recv(struct rdp_mcs *self, struct stream *s, int *chan) -{ - int appid; - int opcode; - int len; - - DEBUG((" in rdp_mcs_recv")); - - if (rdp_iso_recv(self->iso_layer, s) != 0) - { - return 1; - } - - in_uint8(s, opcode); - appid = opcode >> 2; - - if (appid != MCS_SDIN) - { - DEBUG((" out rdp_mcs_recv error")); - return 1; - } - - in_uint8s(s, 2); - in_uint16_be(s, *chan); - in_uint8s(s, 1); - in_uint8(s, len); - - if (len & 0x80) - { - in_uint8s(s, 1); - } - - DEBUG((" out rdp_mcs_recv")); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_mcs_ber_out_header(struct rdp_mcs *self, struct stream *s, - int tag_val, int len) -{ - if (tag_val > 0xff) - { - out_uint16_be(s, tag_val); - } - else - { - out_uint8(s, tag_val); - } - - if (len >= 0x80) - { - out_uint8(s, 0x82); - out_uint16_be(s, len); - } - else - { - out_uint8(s, len); - } - - return 0; -} - -#if 0 -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_mcs_ber_out_int8(struct rdp_mcs *self, struct stream *s, int value) -{ - rdp_mcs_ber_out_header(self, s, BER_TAG_INTEGER, 1); - out_uint8(s, value); - return 0; -} -#endif - -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_mcs_ber_out_int16(struct rdp_mcs *self, struct stream *s, int value) -{ - rdp_mcs_ber_out_header(self, s, BER_TAG_INTEGER, 2); - out_uint8(s, (value >> 8)); - out_uint8(s, value); - return 0; -} - -#if 0 -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_mcs_ber_out_int24(struct rdp_mcs *self, struct stream *s, int value) -{ - rdp_mcs_ber_out_header(self, s, BER_TAG_INTEGER, 3); - out_uint8(s, (value >> 16)); - out_uint8(s, (value >> 8)); - out_uint8(s, value); - return 0; -} -#endif - -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_mcs_out_domain_params(struct rdp_mcs *self, struct stream *s, - int max_channels, - int max_users, int max_tokens, - int max_pdu_size) -{ - rdp_mcs_ber_out_header(self, s, MCS_TAG_DOMAIN_PARAMS, 32); - rdp_mcs_ber_out_int16(self, s, max_channels); - rdp_mcs_ber_out_int16(self, s, max_users); - rdp_mcs_ber_out_int16(self, s, max_tokens); - rdp_mcs_ber_out_int16(self, s, 1); - rdp_mcs_ber_out_int16(self, s, 0); - rdp_mcs_ber_out_int16(self, s, 1); - rdp_mcs_ber_out_int16(self, s, max_pdu_size); - rdp_mcs_ber_out_int16(self, s, 2); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_mcs_send_connection_initial(struct rdp_mcs *self) -{ - int data_len; - int len; - struct stream *s; - - make_stream(s); - init_stream(s, 8192); - data_len = self->client_mcs_data->end - self->client_mcs_data->data; - len = 7 + 3 * 34 + 4 + data_len; - - if (rdp_iso_init(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - - rdp_mcs_ber_out_header(self, s, MCS_CONNECT_INITIAL, len); - rdp_mcs_ber_out_header(self, s, BER_TAG_OCTET_STRING, 0); /* calling domain */ - rdp_mcs_ber_out_header(self, s, BER_TAG_OCTET_STRING, 0); /* called domain */ - rdp_mcs_ber_out_header(self, s, BER_TAG_BOOLEAN, 1); - out_uint8(s, 0xff); /* upward flag */ - rdp_mcs_out_domain_params(self, s, 2, 2, 0, 0xffff); /* target params */ - rdp_mcs_out_domain_params(self, s, 1, 1, 1, 0x420); /* min params */ - rdp_mcs_out_domain_params(self, s, 0xffff, 0xfc17, 0xffff, 0xffff); /* max params */ - rdp_mcs_ber_out_header(self, s, BER_TAG_OCTET_STRING, data_len); - out_uint8p(s, self->client_mcs_data->data, data_len); - s_mark_end(s); - - if (rdp_iso_send(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_mcs_ber_parse_header(struct rdp_mcs *self, struct stream *s, - int tag_val, int *len) -{ - int tag; - int l; - int i; - - if (tag_val > 0xff) - { - in_uint16_be(s, tag); - } - else - { - in_uint8(s, tag); - } - - if (tag != tag_val) - { - return 1; - } - - in_uint8(s, l); - - if (l & 0x80) - { - l = l & ~0x80; - *len = 0; - - while (l > 0) - { - in_uint8(s, i); - *len = (*len << 8) | i; - l--; - } - } - else - { - *len = l; - } - - if (s_check(s)) - { - return 0; - } - else - { - return 1; - } -} - -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_mcs_parse_domain_params(struct rdp_mcs *self, struct stream *s) -{ - int len; - - if (rdp_mcs_ber_parse_header(self, s, MCS_TAG_DOMAIN_PARAMS, &len) != 0) - { - return 1; - } - - in_uint8s(s, len); - - if (s_check(s)) - { - return 0; - } - else - { - return 1; - } -} - -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_mcs_recv_connection_response(struct rdp_mcs *self) -{ - int len; - int res; - struct stream *s; - - make_stream(s); - init_stream(s, 8192); - - if (rdp_iso_recv(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - - rdp_mcs_ber_parse_header(self, s, MCS_CONNECT_RESPONSE, &len); - rdp_mcs_ber_parse_header(self, s, BER_TAG_RESULT, &len); - in_uint8(s, res); - - if (res != 0) - { - free_stream(s); - return 1; - } - - rdp_mcs_ber_parse_header(self, s, BER_TAG_INTEGER, &len); - in_uint8s(s, len); /* connect id */ - rdp_mcs_parse_domain_params(self, s); - rdp_mcs_ber_parse_header(self, s, BER_TAG_OCTET_STRING, &len); - - if (len > self->server_mcs_data->size) - { - len = self->server_mcs_data->size; - } - - in_uint8a(s, self->server_mcs_data->data, len); - self->server_mcs_data->p = self->server_mcs_data->data; - self->server_mcs_data->end = self->server_mcs_data->data + len; - - if (s_check_end(s)) - { - free_stream(s); - return 0; - } - else - { - free_stream(s); - return 1; - } -} - -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_mcs_send_edrq(struct rdp_mcs *self) -{ - struct stream *s; - - make_stream(s); - init_stream(s, 8192); - - if (rdp_iso_init(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - - out_uint8(s, (MCS_EDRQ << 2)); - out_uint16_be(s, 0x100); /* height */ - out_uint16_be(s, 0x100); /* interval */ - s_mark_end(s); - - if (rdp_iso_send(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_mcs_send_aurq(struct rdp_mcs *self) -{ - struct stream *s; - - make_stream(s); - init_stream(s, 8192); - - if (rdp_iso_init(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - - out_uint8(s, (MCS_AURQ << 2)); - s_mark_end(s); - - if (rdp_iso_send(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_mcs_recv_aucf(struct rdp_mcs *self) -{ - int opcode; - int res; - struct stream *s; - - make_stream(s); - init_stream(s, 8192); - - if (rdp_iso_recv(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - - in_uint8(s, opcode); - - if ((opcode >> 2) != MCS_AUCF) - { - free_stream(s); - return 1; - } - - in_uint8(s, res); - - if (res != 0) - { - free_stream(s); - return 1; - } - - if (opcode & 2) - { - in_uint16_be(s, self->userid); - } - - if (!(s_check_end(s))) - { - free_stream(s); - return 1; - } - - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_mcs_send_cjrq(struct rdp_mcs *self, int chanid) -{ - struct stream *s; - - make_stream(s); - init_stream(s, 8192); - - if (rdp_iso_init(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - - out_uint8(s, (MCS_CJRQ << 2)); - out_uint16_be(s, self->userid); - out_uint16_be(s, chanid); - s_mark_end(s); - - if (rdp_iso_send(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -static int APP_CC -rdp_mcs_recv_cjcf(struct rdp_mcs *self) -{ - int opcode; - int res; - struct stream *s; - - make_stream(s); - init_stream(s, 8192); - - if (rdp_iso_recv(self->iso_layer, s) != 0) - { - free_stream(s); - return 1; - } - - in_uint8(s, opcode); - - if ((opcode >> 2) != MCS_CJCF) - { - free_stream(s); - return 1; - } - - in_uint8(s, res); - - if (res != 0) - { - free_stream(s); - return 1; - } - - in_uint8s(s, 4); /* mcs_userid, req_chanid */ - - if (opcode & 2) - { - in_uint8s(s, 2); /* join_chanid */ - } - - if (!(s_check_end(s))) - { - free_stream(s); - return 1; - } - - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_mcs_connect(struct rdp_mcs *self, char *ip, char *port) -{ - DEBUG((" in rdp_mcs_connect")); - - if (rdp_iso_connect(self->iso_layer, ip, port) != 0) - { - DEBUG((" out rdp_mcs_connect error rdp_iso_connect failed")); - return 1; - } - - rdp_mcs_send_connection_initial(self); - - if (rdp_mcs_recv_connection_response(self) != 0) - { - rdp_iso_disconnect(self->iso_layer); - DEBUG((" out rdp_mcs_connect error rdp_mcs_recv_connection_response \ -failed")); - return 1; - } - - rdp_mcs_send_edrq(self); - rdp_mcs_send_aurq(self); - - if (rdp_mcs_recv_aucf(self) != 0) - { - rdp_iso_disconnect(self->iso_layer); - DEBUG((" out rdp_mcs_connect error rdp_mcs_recv_aucf failed")); - return 1; - } - - rdp_mcs_send_cjrq(self, self->userid + 1001); - - if (rdp_mcs_recv_cjcf(self) != 0) - { - rdp_iso_disconnect(self->iso_layer); - DEBUG((" out rdp_mcs_connect error rdp_mcs_recv_cjcf 1 failed")); - return 1; - } - - rdp_mcs_send_cjrq(self, MCS_GLOBAL_CHANNEL); - - if (rdp_mcs_recv_cjcf(self) != 0) - { - rdp_iso_disconnect(self->iso_layer); - DEBUG((" out rdp_mcs_connect error rdp_mcs_recv_cjcf 2 failed")); - return 1; - } - - DEBUG((" out rdp_mcs_connect")); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_mcs_init(struct rdp_mcs *self, struct stream *s) -{ - if (rdp_iso_init(self->iso_layer, s)) - log_message(LOG_LEVEL_ERROR, "rdp_mcs.c: rdp_iso_init() failed"); - s_push_layer(s, mcs_hdr, 8); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_mcs_send(struct rdp_mcs *self, struct stream *s) -{ - int len; - - s_pop_layer(s, mcs_hdr); - len = (s->end - s->p) - 8; - len = len | 0x8000; - out_uint8(s, MCS_SDRQ << 2); - out_uint16_be(s, self->userid); - out_uint16_be(s, MCS_GLOBAL_CHANNEL); - out_uint8(s, 0x70); - out_uint16_be(s, len); - - if (rdp_iso_send(self->iso_layer, s) != 0) - { - return 1; - } - - return 0; -} diff --git a/rdp/rdp_orders.c b/rdp/rdp_orders.c deleted file mode 100644 index 1cad819d..00000000 --- a/rdp/rdp_orders.c +++ /dev/null @@ -1,1687 +0,0 @@ -/** - * xrdp: A Remote Desktop Protocol server. - * - * Copyright (C) Jay Sorg 2004-2013 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * ibrdp orders - */ - -#include "rdp.h" - -#ifndef NULL -#define NULL 0 -#endif - -/*****************************************************************************/ -struct rdp_orders *APP_CC -rdp_orders_create(struct rdp_rdp *owner) -{ - struct rdp_orders *self = (struct rdp_orders *)NULL; - - self = (struct rdp_orders *)g_malloc(sizeof(struct rdp_orders), 1); - self->rdp_layer = owner; - return self; -} - -/*****************************************************************************/ -void APP_CC -rdp_orders_delete(struct rdp_orders *self) -{ - int i = 0; - int j = 0; - - if (self == 0) - { - return; - } - - /* free the colormap cache */ - for (i = 0; i < 6; i++) - { - g_free(self->cache_colormap[i]); - } - - /* free the bitmap cache */ - for (i = 0; i < 3; i++) - { - for (j = 0; j < 600; j++) - { - if (self->cache_bitmap[i][j] != 0) - { - g_free(self->cache_bitmap[i][j]->data); - } - - g_free(self->cache_bitmap[i][j]); - } - } - - g_free(self); -} - -/*****************************************************************************/ -void APP_CC -rdp_orders_reset_state(struct rdp_orders *self) -{ - g_memset(&self->state, 0, sizeof(self->state)); -} - -/*****************************************************************************/ -/* Read field indicating which parameters are present */ -static void APP_CC -rdp_orders_in_present(struct stream *s, int *present, - int flags, int size) -{ - int bits = 0; - int i = 0; - - if (flags & RDP_ORDER_SMALL) - { - size--; - } - - if (flags & RDP_ORDER_TINY) - { - if (size < 2) - { - size = 0; - } - else - { - size -= 2; - } - } - - *present = 0; - - for (i = 0; i < size; i++) - { - in_uint8(s, bits); - *present |= bits << (i * 8); - } -} - -/*****************************************************************************/ -/* Read a co-ordinate (16-bit, or 8-bit delta) */ -static void APP_CC -rdp_orders_in_coord(struct stream *s, int *coord, int delta) -{ - int change = 0; - - if (delta) - { - in_sint8(s, change); - *coord += change; - } - else - { - in_sint16_le(s, *coord); - } -} - -/*****************************************************************************/ -/* Parse bounds information */ -static void APP_CC -rdp_orders_parse_bounds(struct rdp_orders *self, struct stream *s) -{ - int present = 0; - - in_uint8(s, present); - - if (present & 1) - { - rdp_orders_in_coord(s, &self->state.clip_left, 0); - } - else if (present & 16) - { - rdp_orders_in_coord(s, &self->state.clip_left, 1); - } - - if (present & 2) - { - rdp_orders_in_coord(s, &self->state.clip_top, 0); - } - else if (present & 32) - { - rdp_orders_in_coord(s, &self->state.clip_top, 1); - } - - if (present & 4) - { - rdp_orders_in_coord(s, &self->state.clip_right, 0); - } - else if (present & 64) - { - rdp_orders_in_coord(s, &self->state.clip_right, 1); - } - - if (present & 8) - { - rdp_orders_in_coord(s, &self->state.clip_bottom, 0); - } - else if (present & 128) - { - rdp_orders_in_coord(s, &self->state.clip_bottom, 1); - } -} - -/*****************************************************************************/ -/* Process a colormap cache order */ -static void APP_CC -rdp_orders_process_colcache(struct rdp_orders *self, struct stream *s, - int flags) -{ - struct rdp_colormap *colormap = (struct rdp_colormap *)NULL; - struct stream *rec_s = (struct stream *)NULL; - int cache_id = 0; - int i = 0; - - colormap = (struct rdp_colormap *)g_malloc(sizeof(struct rdp_colormap), 1); - in_uint8(s, cache_id); - in_uint16_le(s, colormap->ncolors); - - for (i = 0; i < colormap->ncolors; i++) - { - in_uint32_le(s, colormap->colors[i]); - } - - g_free(self->cache_colormap[cache_id]); - self->cache_colormap[cache_id] = colormap; - - if (self->rdp_layer->rec_mode) - { - rdp_rec_check_file(self->rdp_layer); - make_stream(rec_s); - init_stream(rec_s, 4096); - s_push_layer(rec_s, iso_hdr, 4); - out_uint8(rec_s, 10); - out_uint8(rec_s, cache_id); - - for (i = 0; i < 256; i++) - { - out_uint32_le(rec_s, colormap->colors[i]); - } - - rdp_rec_write_item(self->rdp_layer, rec_s); - free_stream(rec_s); - } -} - -/*****************************************************************************/ -/* Process a raw bitmap cache order */ -static void APP_CC -rdp_orders_process_raw_bmpcache(struct rdp_orders *self, struct stream *s, - int flags) -{ - int cache_idx = 0; - int cache_id = 0; - int width = 0; - int height = 0; - int bpp = 0; - int Bpp = 0; - int x = 0; - int y = 0; - char *inverted = (char *)NULL; - char *dst = (char *)NULL; - struct rdp_bitmap *bitmap = (struct rdp_bitmap *)NULL; - struct stream *rec_s = (struct stream *)NULL; - - in_uint8(s, cache_id); - in_uint8s(s, 1); - in_uint8(s, width); - in_uint8(s, height); - in_uint8(s, bpp); - Bpp = (bpp + 7) / 8; - in_uint8s(s, 2); /* bufsize */ - in_uint16_le(s, cache_idx); - inverted = (char *)g_malloc(width * height * Bpp, 0); - - for (y = 0; y < height; y++) - { - dst = inverted + (((height - y) - 1) * (width * Bpp)); - - if (Bpp == 1) - { - for (x = 0; x < width; x++) - { - in_uint8(s, dst[x]); - } - } - else if (Bpp == 2) - { - for (x = 0; x < width; x++) - { - in_uint16_le(s, ((tui16 *)dst)[x]); - } - } - else if (Bpp == 3) - { - for (x = 0; x < width; x++) - { - in_uint8(s, dst[x * 3 + 0]); - in_uint8(s, dst[x * 3 + 1]); - in_uint8(s, dst[x * 3 + 2]); - } - } - } - - bitmap = (struct rdp_bitmap *)g_malloc(sizeof(struct rdp_bitmap), 0); - bitmap->width = width; - bitmap->height = height; - bitmap->bpp = bpp; - bitmap->data = inverted; - - if (self->cache_bitmap[cache_id][cache_idx] != 0) - { - g_free(self->cache_bitmap[cache_id][cache_idx]->data); - } - - g_free(self->cache_bitmap[cache_id][cache_idx]); - self->cache_bitmap[cache_id][cache_idx] = bitmap; - - if (self->rdp_layer->rec_mode) - { - y = width * height * Bpp; - rdp_rec_check_file(self->rdp_layer); - make_stream(rec_s); - init_stream(rec_s, y + 256); - s_push_layer(rec_s, iso_hdr, 4); - out_uint8(rec_s, 8); - out_uint8(rec_s, cache_id); - out_uint16_le(rec_s, cache_idx); - out_uint16_le(rec_s, width); - out_uint16_le(rec_s, height); - out_uint16_le(rec_s, y); - out_uint8a(rec_s, inverted, y); - rdp_rec_write_item(self->rdp_layer, rec_s); - free_stream(rec_s); - } -} - -/*****************************************************************************/ -/* Process a bitmap cache order */ -static void APP_CC -rdp_orders_process_bmpcache(struct rdp_orders *self, struct stream *s, - int flags) -{ - char *data = (char *)NULL; - char *bmpdata = (char *)NULL; - int cache_idx = 0; - int size = 0; - int cache_id = 0; - int width = 0; - int height = 0; - int bpp = 0; - int Bpp = 0; - int bufsize = 0; - struct rdp_bitmap *bitmap = (struct rdp_bitmap *)NULL; - struct stream *rec_s = (struct stream *)NULL; - - in_uint8(s, cache_id); - in_uint8s(s, 1); /* pad */ - in_uint8(s, width); - in_uint8(s, height); - in_uint8(s, bpp); - Bpp = (bpp + 7) / 8; - in_uint16_le(s, bufsize); - in_uint16_le(s, cache_idx); - - if (flags & 1024) - { - size = bufsize; - } - else - { - in_uint8s(s, 2); /* pad */ - in_uint16_le(s, size); - in_uint8s(s, 2); /* row_size */ - in_uint8s(s, 2); /* final_size */ - } - - in_uint8p(s, data, size); - bmpdata = (char *)g_malloc(width * height * Bpp, 0); - - if (rdp_bitmap_decompress(bmpdata, width, height, data, size, Bpp)) - { - } - else - { - /* error */ - } - - bitmap = (struct rdp_bitmap *)g_malloc(sizeof(struct rdp_bitmap), 0); - bitmap->width = width; - bitmap->height = height; - bitmap->bpp = bpp; - bitmap->data = bmpdata; - - if (self->cache_bitmap[cache_id][cache_idx] != 0) - { - g_free(self->cache_bitmap[cache_id][cache_idx]->data); - } - - g_free(self->cache_bitmap[cache_id][cache_idx]); - self->cache_bitmap[cache_id][cache_idx] = bitmap; - - if (self->rdp_layer->rec_mode) - { - size = width * height * Bpp; - rdp_rec_check_file(self->rdp_layer); - make_stream(rec_s); - init_stream(rec_s, size + 256); - s_push_layer(rec_s, iso_hdr, 4); - out_uint8(rec_s, 8); - out_uint8(rec_s, cache_id); - out_uint16_le(rec_s, cache_idx); - out_uint16_le(rec_s, width); - out_uint16_le(rec_s, height); - out_uint16_le(rec_s, size); - out_uint8a(rec_s, bmpdata, size); - rdp_rec_write_item(self->rdp_layer, rec_s); - free_stream(rec_s); - } -} - -/*****************************************************************************/ -/* Process a font cache order */ -static void APP_CC -rdp_orders_process_fontcache(struct rdp_orders *self, struct stream *s, - int flags) -{ - struct stream *rec_s = (struct stream *)NULL; - int font = 0; - int nglyphs = 0; - int character = 0; - int offset = 0; - int baseline = 0; - int width = 0; - int height = 0; - int i = 0; - int datasize = 0; - char *data = (char *)NULL; - - in_uint8(s, font); - in_uint8(s, nglyphs); - - for (i = 0; i < nglyphs; i++) - { - in_uint16_le(s, character); - in_uint16_le(s, offset); - in_uint16_le(s, baseline); - in_uint16_le(s, width); - in_uint16_le(s, height); - datasize = (height * ((width + 7) / 8) + 3) & ~3; - in_uint8p(s, data, datasize); - self->rdp_layer->mod->server_add_char(self->rdp_layer->mod, font, - character, offset, baseline, - width, height, data); - - if (self->rdp_layer->rec_mode) - { - rdp_rec_check_file(self->rdp_layer); - make_stream(rec_s); - init_stream(rec_s, datasize + 256); - s_push_layer(rec_s, iso_hdr, 4); - out_uint8(rec_s, 9); - out_uint8(rec_s, font); - out_uint16_le(rec_s, character); - out_uint16_le(rec_s, offset); - out_uint16_le(rec_s, baseline); - out_uint16_le(rec_s, width); - out_uint16_le(rec_s, height); - out_uint16_le(rec_s, datasize); - out_uint8a(rec_s, data, datasize); - rdp_rec_write_item(self->rdp_layer, rec_s); - free_stream(rec_s); - } - } -} - -/*****************************************************************************/ -/* Process a secondary order */ -static int APP_CC -rdp_orders_process_secondary_order(struct rdp_orders *self, struct stream *s) -{ - short length = 0; - int flags = 0; - int type = 0; - char *next_order = (char *)NULL; - - in_uint16_le(s, length); - in_uint16_le(s, flags); - in_uint8(s, type); - next_order = s->p + length + 7; - - switch (type) - { - case RDP_ORDER_COLCACHE: - rdp_orders_process_colcache(self, s, flags); - break; - case RDP_ORDER_RAW_BMPCACHE: - rdp_orders_process_raw_bmpcache(self, s, flags); - break; - case RDP_ORDER_BMPCACHE: - rdp_orders_process_bmpcache(self, s, flags); - break; - case RDP_ORDER_FONTCACHE: - rdp_orders_process_fontcache(self, s, flags); - break; - default: - /* error, unknown order */ - break; - } - - s->p = next_order; - return 0; -} - -/*****************************************************************************/ -/* Read a color entry */ -static void APP_CC -rdp_orders_in_color(struct stream *s, int *color) -{ - int i = 0; - - in_uint8(s, i); - *color = i; - in_uint8(s, i); - *color |= i << 8; - in_uint8(s, i); - *color |= i << 16; -} - -/*****************************************************************************/ -/* Parse a brush */ -static void APP_CC -rdp_orders_parse_brush(struct stream *s, struct rdp_brush *brush, int present) -{ - if (present & 1) - { - in_uint8(s, brush->xorigin); - } - - if (present & 2) - { - in_uint8(s, brush->yorigin); - } - - if (present & 4) - { - in_uint8(s, brush->style); - } - - if (present & 8) - { - in_uint8(s, brush->pattern[0]); - } - - if (present & 16) - { - in_uint8a(s, brush->pattern + 1, 7); - } -} - -/*****************************************************************************/ -/* Parse a pen */ -static void APP_CC -rdp_orders_parse_pen(struct stream *s, struct rdp_pen *pen, int present) -{ - if (present & 1) - { - in_uint8(s, pen->style); - } - - if (present & 2) - { - in_uint8(s, pen->width); - } - - if (present & 4) - { - rdp_orders_in_color(s, &pen->color); - } -} - -/*****************************************************************************/ -/* Process a text order */ -static void APP_CC -rdp_orders_process_text2(struct rdp_orders *self, struct stream *s, - int present, int delta) -{ - int fgcolor = 0; - int bgcolor = 0; - struct stream *rec_s = (struct stream *)NULL; - - if (present & 0x000001) - { - in_uint8(s, self->state.text_font); - } - - if (present & 0x000002) - { - in_uint8(s, self->state.text_flags); - } - - if (present & 0x000004) - { - in_uint8(s, self->state.text_opcode); - } - - if (present & 0x000008) - { - in_uint8(s, self->state.text_mixmode); - } - - if (present & 0x000010) - { - rdp_orders_in_color(s, &self->state.text_fgcolor); - } - - if (present & 0x000020) - { - rdp_orders_in_color(s, &self->state.text_bgcolor); - } - - if (present & 0x000040) - { - in_sint16_le(s, self->state.text_clipleft); - } - - if (present & 0x000080) - { - in_sint16_le(s, self->state.text_cliptop); - } - - if (present & 0x000100) - { - in_sint16_le(s, self->state.text_clipright); - } - - if (present & 0x000200) - { - in_sint16_le(s, self->state.text_clipbottom); - } - - if (present & 0x000400) - { - in_sint16_le(s, self->state.text_boxleft); - } - - if (present & 0x000800) - { - in_sint16_le(s, self->state.text_boxtop); - } - - if (present & 0x001000) - { - in_sint16_le(s, self->state.text_boxright); - } - - if (present & 0x002000) - { - in_sint16_le(s, self->state.text_boxbottom); - } - - rdp_orders_parse_brush(s, &self->state.text_brush, present >> 14); - - if (present & 0x080000) - { - in_sint16_le(s, self->state.text_x); - } - - if (present & 0x100000) - { - in_sint16_le(s, self->state.text_y); - } - - if (present & 0x200000) - { - in_uint8(s, self->state.text_length); - in_uint8a(s, self->state.text_text, self->state.text_length); - } - - self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod, - self->state.text_opcode); - fgcolor = rdp_orders_convert_color(self->rdp_layer->mod->rdp_bpp, - self->rdp_layer->mod->xrdp_bpp, - self->state.text_fgcolor, - self->rdp_layer->colormap.colors); - self->rdp_layer->mod->server_set_fgcolor(self->rdp_layer->mod, fgcolor); - bgcolor = rdp_orders_convert_color(self->rdp_layer->mod->rdp_bpp, - self->rdp_layer->mod->xrdp_bpp, - self->state.text_bgcolor, - self->rdp_layer->colormap.colors); - self->rdp_layer->mod->server_set_bgcolor(self->rdp_layer->mod, bgcolor); - self->rdp_layer->mod->server_draw_text(self->rdp_layer->mod, - self->state.text_font, - self->state.text_flags, - self->state.text_mixmode, - self->state.text_clipleft, - self->state.text_cliptop, - self->state.text_clipright, - self->state.text_clipbottom, - self->state.text_boxleft, - self->state.text_boxtop, - self->state.text_boxright, - self->state.text_boxbottom, - self->state.text_x, - self->state.text_y, - self->state.text_text, - self->state.text_length); - self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod, 0xcc); - - if (self->rdp_layer->rec_mode) - { - rdp_rec_check_file(self->rdp_layer); - make_stream(rec_s); - init_stream(rec_s, 512); - s_push_layer(rec_s, iso_hdr, 4); - out_uint8(rec_s, 7); - out_uint8(rec_s, self->state.text_font); - out_uint8(rec_s, self->state.text_flags); - out_uint8(rec_s, self->state.text_opcode); - out_uint8(rec_s, self->state.text_mixmode); - out_uint32_le(rec_s, self->state.text_fgcolor); - out_uint32_le(rec_s, self->state.text_bgcolor); - out_uint16_le(rec_s, self->state.text_clipleft); - out_uint16_le(rec_s, self->state.text_cliptop); - out_uint16_le(rec_s, self->state.text_clipright); - out_uint16_le(rec_s, self->state.text_clipbottom); - out_uint16_le(rec_s, self->state.text_boxleft); - out_uint16_le(rec_s, self->state.text_boxtop); - out_uint16_le(rec_s, self->state.text_boxright); - out_uint16_le(rec_s, self->state.text_boxbottom); - out_uint16_le(rec_s, self->state.text_x); - out_uint16_le(rec_s, self->state.text_y); - out_uint16_le(rec_s, self->state.text_length); - out_uint8a(rec_s, self->state.text_text, self->state.text_length); - rdp_rec_write_item(self->rdp_layer, rec_s); - free_stream(rec_s); - } -} - -/*****************************************************************************/ -/* Process a destination blt order */ -static void APP_CC -rdp_orders_process_destblt(struct rdp_orders *self, struct stream *s, - int present, int delta) -{ - struct stream *rec_s = (struct stream *)NULL; - - if (present & 0x01) - { - rdp_orders_in_coord(s, &self->state.dest_x, delta); - } - - if (present & 0x02) - { - rdp_orders_in_coord(s, &self->state.dest_y, delta); - } - - if (present & 0x04) - { - rdp_orders_in_coord(s, &self->state.dest_cx, delta); - } - - if (present & 0x08) - { - rdp_orders_in_coord(s, &self->state.dest_cy, delta); - } - - if (present & 0x10) - { - in_uint8(s, self->state.dest_opcode); - } - - self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod, - self->state.dest_opcode); - self->rdp_layer->mod->server_fill_rect(self->rdp_layer->mod, - self->state.dest_x, - self->state.dest_y, - self->state.dest_cx, - self->state.dest_cy); - self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod, 0xcc); - - if (self->rdp_layer->rec_mode) - { - rdp_rec_check_file(self->rdp_layer); - make_stream(rec_s); - init_stream(rec_s, 512); - s_push_layer(rec_s, iso_hdr, 4); - out_uint8(rec_s, 6); - out_uint16_le(rec_s, self->state.dest_x); - out_uint16_le(rec_s, self->state.dest_y); - out_uint16_le(rec_s, self->state.dest_cx); - out_uint16_le(rec_s, self->state.dest_cy); - out_uint8(rec_s, self->state.dest_opcode); - rdp_rec_write_item(self->rdp_layer, rec_s); - free_stream(rec_s); - } -} - -/*****************************************************************************/ -/* Process a pattern blt order */ -static void APP_CC -rdp_orders_process_patblt(struct rdp_orders *self, struct stream *s, - int present, int delta) -{ - int fgcolor = 0; - int bgcolor = 0; - struct stream *rec_s = (struct stream *)NULL; - - if (present & 0x0001) - { - rdp_orders_in_coord(s, &self->state.pat_x, delta); - } - - if (present & 0x0002) - { - rdp_orders_in_coord(s, &self->state.pat_y, delta); - } - - if (present & 0x0004) - { - rdp_orders_in_coord(s, &self->state.pat_cx, delta); - } - - if (present & 0x0008) - { - rdp_orders_in_coord(s, &self->state.pat_cy, delta); - } - - if (present & 0x0010) - { - in_uint8(s, self->state.pat_opcode); - } - - if (present & 0x0020) - { - rdp_orders_in_color(s, &self->state.pat_bgcolor); - } - - if (present & 0x0040) - { - rdp_orders_in_color(s, &self->state.pat_fgcolor); - } - - rdp_orders_parse_brush(s, &self->state.pat_brush, present >> 7); - self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod, - self->state.pat_opcode); - self->rdp_layer->mod->server_set_mixmode(self->rdp_layer->mod, 1); - fgcolor = rdp_orders_convert_color(self->rdp_layer->mod->rdp_bpp, - self->rdp_layer->mod->xrdp_bpp, - self->state.pat_fgcolor, - self->rdp_layer->colormap.colors); - self->rdp_layer->mod->server_set_fgcolor(self->rdp_layer->mod, fgcolor); - bgcolor = rdp_orders_convert_color(self->rdp_layer->mod->rdp_bpp, - self->rdp_layer->mod->xrdp_bpp, - self->state.pat_bgcolor, - self->rdp_layer->colormap.colors); - self->rdp_layer->mod->server_set_bgcolor(self->rdp_layer->mod, bgcolor); - self->rdp_layer->mod->server_set_brush(self->rdp_layer->mod, - self->state.pat_brush.xorigin, - self->state.pat_brush.yorigin, - self->state.pat_brush.style, - self->state.pat_brush.pattern); - self->rdp_layer->mod->server_fill_rect(self->rdp_layer->mod, - self->state.pat_x, - self->state.pat_y, - self->state.pat_cx, - self->state.pat_cy); - self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod, 0xcc); - self->rdp_layer->mod->server_set_mixmode(self->rdp_layer->mod, 0); - - if (self->rdp_layer->rec_mode) - { - rdp_rec_check_file(self->rdp_layer); - make_stream(rec_s); - init_stream(rec_s, 512); - s_push_layer(rec_s, iso_hdr, 4); - out_uint8(rec_s, 5); - out_uint16_le(rec_s, self->state.pat_x); - out_uint16_le(rec_s, self->state.pat_y); - out_uint16_le(rec_s, self->state.pat_cx); - out_uint16_le(rec_s, self->state.pat_cy); - out_uint8(rec_s, self->state.pat_opcode); - out_uint32_le(rec_s, self->state.pat_fgcolor); - out_uint32_le(rec_s, self->state.pat_bgcolor); - out_uint8(rec_s, self->state.pat_brush.xorigin); - out_uint8(rec_s, self->state.pat_brush.yorigin); - out_uint8(rec_s, self->state.pat_brush.style); - out_uint8a(rec_s, self->state.pat_brush.pattern, 8); - rdp_rec_write_item(self->rdp_layer, rec_s); - free_stream(rec_s); - } -} - -/*****************************************************************************/ -/* Process a screen blt order */ -static void APP_CC -rdp_orders_process_screenblt(struct rdp_orders *self, struct stream *s, - int present, int delta) -{ - struct stream *rec_s; - - if (present & 0x0001) - { - rdp_orders_in_coord(s, &self->state.screenblt_x, delta); - } - - if (present & 0x0002) - { - rdp_orders_in_coord(s, &self->state.screenblt_y, delta); - } - - if (present & 0x0004) - { - rdp_orders_in_coord(s, &self->state.screenblt_cx, delta); - } - - if (present & 0x0008) - { - rdp_orders_in_coord(s, &self->state.screenblt_cy, delta); - } - - if (present & 0x0010) - { - in_uint8(s, self->state.screenblt_opcode); - } - - if (present & 0x0020) - { - rdp_orders_in_coord(s, &self->state.screenblt_srcx, delta); - } - - if (present & 0x0040) - { - rdp_orders_in_coord(s, &self->state.screenblt_srcy, delta); - } - - self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod, - self->state.screenblt_opcode); - self->rdp_layer->mod->server_screen_blt(self->rdp_layer->mod, - self->state.screenblt_x, - self->state.screenblt_y, - self->state.screenblt_cx, - self->state.screenblt_cy, - self->state.screenblt_srcx, - self->state.screenblt_srcy); - self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod, 0xcc); - - if (self->rdp_layer->rec_mode) - { - rdp_rec_check_file(self->rdp_layer); - make_stream(rec_s); - init_stream(rec_s, 512); - s_push_layer(rec_s, iso_hdr, 4); - out_uint8(rec_s, 4); - out_uint16_le(rec_s, self->state.screenblt_x); - out_uint16_le(rec_s, self->state.screenblt_y); - out_uint16_le(rec_s, self->state.screenblt_cx); - out_uint16_le(rec_s, self->state.screenblt_cy); - out_uint16_le(rec_s, self->state.screenblt_srcx); - out_uint16_le(rec_s, self->state.screenblt_srcy); - out_uint8(rec_s, self->state.screenblt_opcode); - rdp_rec_write_item(self->rdp_layer, rec_s); - free_stream(rec_s); - } -} - -/*****************************************************************************/ -/* Process a line order */ -static void APP_CC -rdp_orders_process_line(struct rdp_orders *self, struct stream *s, - int present, int delta) -{ - int bgcolor = 0; - int fgcolor = 0; - struct stream *rec_s = (struct stream *)NULL; - - if (present & 0x0001) - { - in_uint16_le(s, self->state.line_mixmode); - } - - if (present & 0x0002) - { - rdp_orders_in_coord(s, &self->state.line_startx, delta); - } - - if (present & 0x0004) - { - rdp_orders_in_coord(s, &self->state.line_starty, delta); - } - - if (present & 0x0008) - { - rdp_orders_in_coord(s, &self->state.line_endx, delta); - } - - if (present & 0x0010) - { - rdp_orders_in_coord(s, &self->state.line_endy, delta); - } - - if (present & 0x0020) - { - rdp_orders_in_color(s, &self->state.line_bgcolor); - } - - if (present & 0x0040) - { - in_uint8(s, self->state.line_opcode); - } - - rdp_orders_parse_pen(s, &self->state.line_pen, present >> 7); - self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod, - self->state.line_opcode); - bgcolor = rdp_orders_convert_color(self->rdp_layer->mod->rdp_bpp, - self->rdp_layer->mod->xrdp_bpp, - self->state.line_bgcolor, - self->rdp_layer->colormap.colors); - fgcolor = rdp_orders_convert_color(self->rdp_layer->mod->rdp_bpp, - self->rdp_layer->mod->xrdp_bpp, - self->state.line_pen.color, - self->rdp_layer->colormap.colors); - self->rdp_layer->mod->server_set_fgcolor(self->rdp_layer->mod, fgcolor); - self->rdp_layer->mod->server_set_bgcolor(self->rdp_layer->mod, bgcolor); - self->rdp_layer->mod->server_set_pen(self->rdp_layer->mod, - self->state.line_pen.style, - self->state.line_pen.width); - self->rdp_layer->mod->server_draw_line(self->rdp_layer->mod, - self->state.line_startx, - self->state.line_starty, - self->state.line_endx, - self->state.line_endy); - self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod, 0xcc); - - if (self->rdp_layer->rec_mode) - { - rdp_rec_check_file(self->rdp_layer); - make_stream(rec_s); - init_stream(rec_s, 512); - s_push_layer(rec_s, iso_hdr, 4); - out_uint8(rec_s, 3); - out_uint16_le(rec_s, self->state.line_mixmode); - out_uint16_le(rec_s, self->state.line_startx); - out_uint16_le(rec_s, self->state.line_starty); - out_uint16_le(rec_s, self->state.line_endx); - out_uint16_le(rec_s, self->state.line_endy); - out_uint32_le(rec_s, self->state.line_bgcolor); - out_uint8(rec_s, self->state.line_opcode); - out_uint8(rec_s, self->state.line_pen.style); - out_uint8(rec_s, self->state.line_pen.width); - out_uint32_le(rec_s, self->state.line_pen.color); - rdp_rec_write_item(self->rdp_layer, rec_s); - free_stream(rec_s); - } -} - -/*****************************************************************************/ -/* Process an opaque rectangle order */ -static void APP_CC -rdp_orders_process_rect(struct rdp_orders *self, struct stream *s, - int present, int delta) -{ - int i = 0; - int fgcolor = 0; - struct stream *rec_s = (struct stream *)NULL; - - if (present & 0x01) - { - rdp_orders_in_coord(s, &self->state.rect_x, delta); - } - - if (present & 0x02) - { - rdp_orders_in_coord(s, &self->state.rect_y, delta); - } - - if (present & 0x04) - { - rdp_orders_in_coord(s, &self->state.rect_cx, delta); - } - - if (present & 0x08) - { - rdp_orders_in_coord(s, &self->state.rect_cy, delta); - } - - if (present & 0x10) - { - in_uint8(s, i); - self->state.rect_color = (self->state.rect_color & 0xffffff00) | i; - } - - if (present & 0x20) - { - in_uint8(s, i); - self->state.rect_color = (self->state.rect_color & 0xffff00ff) | (i << 8); - } - - if (present & 0x40) - { - in_uint8(s, i); - self->state.rect_color = (self->state.rect_color & 0xff00ffff) | (i << 16); - } - - fgcolor = rdp_orders_convert_color(self->rdp_layer->mod->rdp_bpp, - self->rdp_layer->mod->xrdp_bpp, - self->state.rect_color, - self->rdp_layer->colormap.colors); - self->rdp_layer->mod->server_set_fgcolor(self->rdp_layer->mod, fgcolor); - self->rdp_layer->mod->server_fill_rect(self->rdp_layer->mod, - self->state.rect_x, - self->state.rect_y, - self->state.rect_cx, - self->state.rect_cy); - - if (self->rdp_layer->rec_mode) - { - rdp_rec_check_file(self->rdp_layer); - make_stream(rec_s); - init_stream(rec_s, 512); - s_push_layer(rec_s, iso_hdr, 4); - out_uint8(rec_s, 1); - out_uint16_le(rec_s, self->state.rect_x); - out_uint16_le(rec_s, self->state.rect_y); - out_uint16_le(rec_s, self->state.rect_cx); - out_uint16_le(rec_s, self->state.rect_cy); - out_uint32_le(rec_s, self->state.rect_color); - rdp_rec_write_item(self->rdp_layer, rec_s); - free_stream(rec_s); - } -} - -/*****************************************************************************/ -/* Process a desktop save order */ -static void APP_CC -rdp_orders_process_desksave(struct rdp_orders *self, struct stream *s, - int present, int delta) -{ - //int width = 0; - //int height = 0; - - if (present & 0x01) - { - in_uint32_le(s, self->state.desksave_offset); - } - - if (present & 0x02) - { - rdp_orders_in_coord(s, &self->state.desksave_left, delta); - } - - if (present & 0x04) - { - rdp_orders_in_coord(s, &self->state.desksave_top, delta); - } - - if (present & 0x08) - { - rdp_orders_in_coord(s, &self->state.desksave_right, delta); - } - - if (present & 0x10) - { - rdp_orders_in_coord(s, &self->state.desksave_bottom, delta); - } - - if (present & 0x20) - { - in_uint8(s, self->state.desksave_action); - } - - // width = (self->state.desksave_right - self->state.desksave_left) + 1; - // height = (self->state.desksave_bottom - self->state.desksave_top) + 1; - if (self->state.desksave_action == 0) - { - // ui_desktop_save(os->offset, os->left, os->top, width, height); - } - else - { - // ui_desktop_restore(os->offset, os->left, os->top, width, height); - } -} - -/*****************************************************************************/ -/* Process a memory blt order */ -static void APP_CC -rdp_orders_process_memblt(struct rdp_orders *self, struct stream *s, - int present, int delta) -{ - struct rdp_bitmap *bitmap = (struct rdp_bitmap *)NULL; - struct stream *rec_s = (struct stream *)NULL; - char *bmpdata = (char *)NULL; - - if (present & 0x0001) - { - in_uint8(s, self->state.memblt_cache_id); - in_uint8(s, self->state.memblt_color_table); - } - - if (present & 0x0002) - { - rdp_orders_in_coord(s, &self->state.memblt_x, delta); - } - - if (present & 0x0004) - { - rdp_orders_in_coord(s, &self->state.memblt_y, delta); - } - - if (present & 0x0008) - { - rdp_orders_in_coord(s, &self->state.memblt_cx, delta); - } - - if (present & 0x0010) - { - rdp_orders_in_coord(s, &self->state.memblt_cy, delta); - } - - if (present & 0x0020) - { - in_uint8(s, self->state.memblt_opcode); - } - - if (present & 0x0040) - { - rdp_orders_in_coord(s, &self->state.memblt_srcx, delta); - } - - if (present & 0x0080) - { - rdp_orders_in_coord(s, &self->state.memblt_srcy, delta); - } - - if (present & 0x0100) - { - in_uint16_le(s, self->state.memblt_cache_idx); - } - - bitmap = self->cache_bitmap[self->state.memblt_cache_id] - [self->state.memblt_cache_idx]; - - if (bitmap != 0) - { - self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod, - self->state.memblt_opcode); - bmpdata = rdp_orders_convert_bitmap(self->rdp_layer->mod->rdp_bpp, - self->rdp_layer->mod->xrdp_bpp, - bitmap->data, bitmap->width, - bitmap->height, - self->cache_colormap - [self->state.memblt_color_table]->colors); - self->rdp_layer->mod->server_paint_rect(self->rdp_layer->mod, - self->state.memblt_x, - self->state.memblt_y, - self->state.memblt_cx, - self->state.memblt_cy, - bmpdata, - bitmap->width, - bitmap->height, - self->state.memblt_srcx, - self->state.memblt_srcy); - self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod, 0xcc); - - if (self->rdp_layer->rec_mode) - { - rdp_rec_check_file(self->rdp_layer); - make_stream(rec_s); - init_stream(rec_s, 512); - s_push_layer(rec_s, iso_hdr, 4); - out_uint8(rec_s, 2); - out_uint8(rec_s, self->state.memblt_opcode); - out_uint16_le(rec_s, self->state.memblt_x); - out_uint16_le(rec_s, self->state.memblt_y); - out_uint16_le(rec_s, self->state.memblt_cx); - out_uint16_le(rec_s, self->state.memblt_cy); - out_uint16_le(rec_s, self->state.memblt_cache_id); - out_uint16_le(rec_s, self->state.memblt_cache_idx); - out_uint16_le(rec_s, self->state.memblt_srcx); - out_uint16_le(rec_s, self->state.memblt_srcy); - rdp_rec_write_item(self->rdp_layer, rec_s); - free_stream(rec_s); - } - - if (bmpdata != bitmap->data) - { - g_free(bmpdata); - } - } -} - -/*****************************************************************************/ -/* Process a 3-way blt order */ -static void APP_CC -rdp_orders_process_triblt(struct rdp_orders *self, struct stream *s, - int present, int delta) -{ - /* not used */ -} - -/*****************************************************************************/ -/* Process a polyline order */ -static void APP_CC -rdp_orders_process_polyline(struct rdp_orders *self, struct stream *s, - int present, int delta) -{ - if (present & 0x01) - { - rdp_orders_in_coord(s, &self->state.polyline_x, delta); - } - - if (present & 0x02) - { - rdp_orders_in_coord(s, &self->state.polyline_y, delta); - } - - if (present & 0x04) - { - in_uint8(s, self->state.polyline_opcode); - } - - if (present & 0x10) - { - rdp_orders_in_color(s, &self->state.polyline_fgcolor); - } - - if (present & 0x20) - { - in_uint8(s, self->state.polyline_lines); - } - - if (present & 0x40) - { - in_uint8(s, self->state.polyline_datasize); - in_uint8a(s, self->state.polyline_data, self->state.polyline_datasize); - } - - /* todo */ -} - -/*****************************************************************************/ -int APP_CC -rdp_orders_process_orders(struct rdp_orders *self, struct stream *s, - int num_orders) -{ - int processed = 0; - int order_flags = 0; - int size = 0; - int present = 0; - int delta = 0; - - processed = 0; - - while (processed < num_orders) - { - in_uint8(s, order_flags); - - if (!(order_flags & RDP_ORDER_STANDARD)) - { - /* error, this should always be set */ - break; - } - - if (order_flags & RDP_ORDER_SECONDARY) - { - rdp_orders_process_secondary_order(self, s); - } - else - { - if (order_flags & RDP_ORDER_CHANGE) - { - in_uint8(s, self->state.order_type); - } - - switch (self->state.order_type) - { - case RDP_ORDER_TRIBLT: - case RDP_ORDER_TEXT2: - size = 3; - break; - case RDP_ORDER_PATBLT: - case RDP_ORDER_MEMBLT: - case RDP_ORDER_LINE: - size = 2; - break; - default: - size = 1; - break; - } - - rdp_orders_in_present(s, &present, order_flags, size); - - if (order_flags & RDP_ORDER_BOUNDS) - { - if (!(order_flags & RDP_ORDER_LASTBOUNDS)) - { - rdp_orders_parse_bounds(self, s); - } - - self->rdp_layer->mod->server_set_clip(self->rdp_layer->mod, - self->state.clip_left, - self->state.clip_top, - (self->state.clip_right - self->state.clip_left) + 1, - (self->state.clip_bottom - self->state.clip_top) + 1); - } - - delta = order_flags & RDP_ORDER_DELTA; - - switch (self->state.order_type) - { - case RDP_ORDER_TEXT2: - rdp_orders_process_text2(self, s, present, delta); - break; - case RDP_ORDER_DESTBLT: - rdp_orders_process_destblt(self, s, present, delta); - break; - case RDP_ORDER_PATBLT: - rdp_orders_process_patblt(self, s, present, delta); - break; - case RDP_ORDER_SCREENBLT: - rdp_orders_process_screenblt(self, s, present, delta); - break; - case RDP_ORDER_LINE: - rdp_orders_process_line(self, s, present, delta); - break; - case RDP_ORDER_RECT: - rdp_orders_process_rect(self, s, present, delta); - break; - case RDP_ORDER_DESKSAVE: - rdp_orders_process_desksave(self, s, present, delta); - break; - case RDP_ORDER_MEMBLT: - rdp_orders_process_memblt(self, s, present, delta); - break; - case RDP_ORDER_TRIBLT: - rdp_orders_process_triblt(self, s, present, delta); - break; - case RDP_ORDER_POLYLINE: - rdp_orders_process_polyline(self, s, present, delta); - break; - default: - /* error unknown order */ - break; - } - - if (order_flags & RDP_ORDER_BOUNDS) - { - self->rdp_layer->mod->server_reset_clip(self->rdp_layer->mod); - } - } - - processed++; - } - - return 0; -} - -/*****************************************************************************/ -/* returns pointer, it might return bmpdata if the data doesn't need to - be converted, else it mallocs it. The calling function must free - it if needed */ -char *APP_CC -rdp_orders_convert_bitmap(int in_bpp, int out_bpp, char *bmpdata, - int width, int height, int *palette) -{ - char *out = (char *)NULL; - char *src = (char *)NULL; - char *dst = (char *)NULL; - int i = 0; - int j = 0; - int red = 0; - int green = 0; - int blue = 0; - int pixel = 0; - - if ((in_bpp == 8) && (out_bpp == 8)) - { - out = (char *)g_malloc(width * height, 0); - src = bmpdata; - dst = out; - - for (i = 0; i < height; i++) - { - for (j = 0; j < width; j++) - { - pixel = *((tui8 *)src); - pixel = palette[pixel]; - SPLITCOLOR32(red, green, blue, pixel); - pixel = COLOR8(red, green, blue); - *dst = pixel; - src++; - dst++; - } - } - - return out; - } - - if ((in_bpp == 8) && (out_bpp == 16)) - { - out = (char *)g_malloc(width * height * 2, 0); - src = bmpdata; - dst = out; - - for (i = 0; i < height; i++) - { - for (j = 0; j < width; j++) - { - pixel = *((tui8 *)src); - pixel = palette[pixel]; - SPLITCOLOR32(red, green, blue, pixel); - pixel = COLOR16(red, green, blue); - *((tui16 *)dst) = pixel; - src++; - dst += 2; - } - } - - return out; - } - - if ((in_bpp == 8) && (out_bpp == 24)) - { - out = (char *)g_malloc(width * height * 4, 0); - src = bmpdata; - dst = out; - - for (i = 0; i < height; i++) - { - for (j = 0; j < width; j++) - { - pixel = *((tui8 *)src); - pixel = palette[pixel]; - SPLITCOLOR32(red, green, blue, pixel); - pixel = COLOR24RGB(red, green, blue); - *((tui32 *)dst) = pixel; - src++; - dst += 4; - } - } - - return out; - } - - if ((in_bpp == 15) && (out_bpp == 16)) - { - out = (char *)g_malloc(width * height * 2, 0); - src = bmpdata; - dst = out; - - for (i = 0; i < height; i++) - { - for (j = 0; j < width; j++) - { - pixel = *((tui16 *)src); - SPLITCOLOR15(red, green, blue, pixel); - pixel = COLOR16(red, green, blue); - *((tui16 *)dst) = pixel; - src += 2; - dst += 2; - } - } - - return out; - } - - if ((in_bpp == 15) && (out_bpp == 24)) - { - out = (char *)g_malloc(width * height * 4, 0); - src = bmpdata; - dst = out; - - for (i = 0; i < height; i++) - { - for (j = 0; j < width; j++) - { - pixel = *((tui16 *)src); - SPLITCOLOR15(red, green, blue, pixel); - pixel = COLOR24RGB(red, green, blue); - *((tui32 *)dst) = pixel; - src += 2; - dst += 4; - } - } - - return out; - } - - if ((in_bpp == 16) && (out_bpp == 16)) - { - return bmpdata; - } - - if ((in_bpp == 16) && (out_bpp == 24)) - { - out = (char *)g_malloc(width * height * 4, 0); - src = bmpdata; - dst = out; - - for (i = 0; i < height; i++) - { - for (j = 0; j < width; j++) - { - pixel = *((tui16 *)src); - SPLITCOLOR16(red, green, blue, pixel); - pixel = COLOR24RGB(red, green, blue); - *((tui32 *)dst) = pixel; - src += 2; - dst += 4; - } - } - - return out; - } - - if ((in_bpp == 24) && (out_bpp == 24)) - { - out = (char *)g_malloc(width * height * 4, 0); - src = bmpdata; - dst = out; - - for (i = 0; i < height; i++) - { - for (j = 0; j < width; j++) - { - blue = *((tui8 *)src); - src++; - green = *((tui8 *)src); - src++; - red = *((tui8 *)src); - src++; - pixel = COLOR24RGB(red, green, blue); - *((tui32 *)dst) = pixel; - dst += 4; - } - } - - return out; - } - - return 0; -} - -/*****************************************************************************/ -/* returns color or 0 */ -int APP_CC -rdp_orders_convert_color(int in_bpp, int out_bpp, int in_color, int *palette) -{ - int pixel = 0; - int red = 0; - int green = 0; - int blue = 0; - - if ((in_bpp == 8) && (out_bpp == 8)) - { - pixel = palette[in_color]; - SPLITCOLOR32(red, green, blue, pixel); - pixel = COLOR8(red, green, blue); - return pixel; - } - - if ((in_bpp == 8) && (out_bpp == 16)) - { - pixel = palette[in_color]; - SPLITCOLOR32(red, green, blue, pixel); - pixel = COLOR16(red, green, blue); - return pixel; - } - - if ((in_bpp == 8) && (out_bpp == 24)) - { - pixel = palette[in_color]; - SPLITCOLOR32(red, green, blue, pixel); - pixel = COLOR24BGR(red, green, blue); - return pixel; - } - - if ((in_bpp == 15) && (out_bpp == 16)) - { - pixel = in_color; - SPLITCOLOR15(red, green, blue, pixel); - pixel = COLOR16(red, green, blue); - return pixel; - } - - if ((in_bpp == 15) && (out_bpp == 24)) - { - pixel = in_color; - SPLITCOLOR15(red, green, blue, pixel); - pixel = COLOR24BGR(red, green, blue); - return pixel; - } - - if ((in_bpp == 16) && (out_bpp == 16)) - { - return in_color; - } - - if ((in_bpp == 16) && (out_bpp == 24)) - { - pixel = in_color; - SPLITCOLOR16(red, green, blue, pixel); - pixel = COLOR24BGR(red, green, blue); - return pixel; - } - - if ((in_bpp == 24) && (out_bpp == 24)) - { - return in_color; - } - - return 0; -} diff --git a/rdp/rdp_rdp.c b/rdp/rdp_rdp.c deleted file mode 100644 index 1e7952c5..00000000 --- a/rdp/rdp_rdp.c +++ /dev/null @@ -1,1203 +0,0 @@ -/** - * xrdp: A Remote Desktop Protocol server. - * - * Copyright (C) Jay Sorg 2004-2013 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * librdp rdp layer - */ - -#include "rdp.h" - -#ifndef NULL -#define NULL 0 -#endif - -/*****************************************************************************/ -struct rdp_rdp *APP_CC -rdp_rdp_create(struct mod *owner) -{ - struct rdp_rdp *self; - - self = (struct rdp_rdp *)g_malloc(sizeof(struct rdp_rdp), 1); - self->mod = owner; - self->sec_layer = rdp_sec_create(self); - self->bitmap_compression = 1; - self->bitmap_cache = 1; - self->desktop_save = 0; - self->orders = rdp_orders_create(self); - self->rec_mode = 0; - return self; -} - -/*****************************************************************************/ -void APP_CC -rdp_rdp_delete(struct rdp_rdp *self) -{ - if (self == 0) - { - return; - } - - rdp_orders_delete(self->orders); - rdp_sec_delete(self->sec_layer); - - if (self->rec_fd != 0) - { - g_file_close(self->rec_fd); - self->rec_fd = 0; - } - - g_free(self); -} - -/******************************************************************************/ -/* Initialise an RDP packet */ -int APP_CC -rdp_rdp_init(struct rdp_rdp *self, struct stream *s) -{ - if (rdp_sec_init(self->sec_layer, s, SEC_ENCRYPT) != 0) - { - return 1; - } - - s_push_layer(s, rdp_hdr, 6); - return 0; -} - -/******************************************************************************/ -/* Send an RDP packet */ -int APP_CC -rdp_rdp_send(struct rdp_rdp *self, struct stream *s, int pdu_type) -{ - int len; - int sec_flags; - - s_pop_layer(s, rdp_hdr); - len = s->end - s->p; - out_uint16_le(s, len); - out_uint16_le(s, pdu_type | 0x10); - out_uint16_le(s, self->sec_layer->mcs_layer->userid); - sec_flags = SEC_ENCRYPT; - - if (rdp_sec_send(self->sec_layer, s, sec_flags) != 0) - { - return 1; - } - - return 0; -} - -/******************************************************************************/ -/* Initialise an RDP data packet */ -int APP_CC -rdp_rdp_init_data(struct rdp_rdp *self, struct stream *s) -{ - if (rdp_sec_init(self->sec_layer, s, SEC_ENCRYPT) != 0) - { - return 1; - } - - s_push_layer(s, rdp_hdr, 18); - return 0; -} - -/******************************************************************************/ -/* Send an RDP data packet */ -int APP_CC -rdp_rdp_send_data(struct rdp_rdp *self, struct stream *s, int pdu_data_type) -{ - int len; - int sec_flags; - - s_pop_layer(s, rdp_hdr); - len = s->end - s->p; - out_uint16_le(s, len); - out_uint16_le(s, RDP_PDU_DATA | 0x10); - out_uint16_le(s, self->sec_layer->mcs_layer->userid); - out_uint32_le(s, self->share_id); - out_uint8(s, 0); - out_uint8(s, 1); - out_uint16_le(s, len - 14); - out_uint8(s, pdu_data_type); - out_uint8(s, 0); /* compress type */ - out_uint16_le(s, 0); /* compress len */ - sec_flags = SEC_ENCRYPT; - - if (rdp_sec_send(self->sec_layer, s, sec_flags) != 0) - { - return 1; - } - - return 0; -} - -/******************************************************************************/ -/* Output general capability set */ -static int APP_CC -rdp_rdp_out_general_caps(struct rdp_rdp *self, struct stream *s) -{ - out_uint16_le(s, RDP_CAPSET_GENERAL); - out_uint16_le(s, RDP_CAPLEN_GENERAL); - out_uint16_le(s, 1); /* OS major type */ - out_uint16_le(s, 3); /* OS minor type */ - out_uint16_le(s, 0x200); /* Protocol version */ - out_uint16_le(s, 0); /* Pad */ - out_uint16_le(s, 0); /* Compression types */ - out_uint16_le(s, self->use_rdp5 ? 0x40d : 0); - out_uint16_le(s, 0); /* Update capability */ - out_uint16_le(s, 0); /* Remote unshare capability */ - out_uint16_le(s, 0); /* Compression level */ - out_uint16_le(s, 0); /* Pad */ - return 0; -} - -/******************************************************************************/ -/* Output bitmap capability set */ -static int APP_CC -rdp_rdp_out_bitmap_caps(struct rdp_rdp *self, struct stream *s) -{ - out_uint16_le(s, RDP_CAPSET_BITMAP); - out_uint16_le(s, RDP_CAPLEN_BITMAP); - out_uint16_le(s, self->mod->rdp_bpp); /* Preferred BPP */ - out_uint16_le(s, 1); /* Receive 1 BPP */ - out_uint16_le(s, 1); /* Receive 4 BPP */ - out_uint16_le(s, 1); /* Receive 8 BPP */ - out_uint16_le(s, 800); /* Desktop width */ - out_uint16_le(s, 600); /* Desktop height */ - out_uint16_le(s, 0); /* Pad */ - out_uint16_le(s, 1); /* Allow resize */ - out_uint16_le(s, self->bitmap_compression); /* Support compression */ - out_uint16_le(s, 0); /* Unknown */ - out_uint16_le(s, 1); /* Unknown */ - out_uint16_le(s, 0); /* Pad */ - return 0; -} - -/******************************************************************************/ -/* Output order capability set */ -static int APP_CC -rdp_rdp_out_order_caps(struct rdp_rdp *self, struct stream *s) -{ - char order_caps[32]; - - g_memset(order_caps, 0, 32); - order_caps[0] = 1; /* dest blt */ - order_caps[1] = 1; /* pat blt */ - order_caps[2] = 1; /* screen blt */ - order_caps[3] = self->bitmap_cache; /* memblt */ - order_caps[4] = 0; /* triblt */ - order_caps[8] = 1; /* line */ - order_caps[9] = 1; /* line */ - order_caps[10] = 1; /* rect */ - order_caps[11] = self->desktop_save; /* desksave */ - order_caps[13] = 1; /* memblt another above */ - order_caps[14] = 1; /* triblt another above */ - order_caps[20] = self->polygon_ellipse_orders; /* polygon */ - order_caps[21] = self->polygon_ellipse_orders; /* polygon2 */ - order_caps[22] = 0; /* todo polyline */ - order_caps[25] = self->polygon_ellipse_orders; /* ellipse */ - order_caps[26] = self->polygon_ellipse_orders; /* ellipse2 */ - order_caps[27] = 1; /* text2 */ - out_uint16_le(s, RDP_CAPSET_ORDER); - out_uint16_le(s, RDP_CAPLEN_ORDER); - out_uint8s(s, 20); /* Terminal desc, pad */ - out_uint16_le(s, 1); /* Cache X granularity */ - out_uint16_le(s, 20); /* Cache Y granularity */ - out_uint16_le(s, 0); /* Pad */ - out_uint16_le(s, 1); /* Max order level */ - out_uint16_le(s, 0x147); /* Number of fonts */ - out_uint16_le(s, 0x2a); /* Capability flags */ - out_uint8p(s, order_caps, 32); /* Orders supported */ - out_uint16_le(s, 0x6a1); /* Text capability flags */ - out_uint8s(s, 6); /* Pad */ - out_uint32_le(s, self->desktop_save * 0x38400); /* Desktop cache size */ - out_uint32_le(s, 0); /* Unknown */ - out_uint32_le(s, 0x4e4); /* Unknown */ - return 0; -} - -/******************************************************************************/ -/* Output bitmap cache capability set */ -static int APP_CC -rdp_rdp_out_bmpcache_caps(struct rdp_rdp *self, struct stream *s) -{ - int Bpp = 0; - - out_uint16_le(s, RDP_CAPSET_BMPCACHE); - out_uint16_le(s, RDP_CAPLEN_BMPCACHE); - Bpp = (self->mod->rdp_bpp + 7) / 8; - out_uint8s(s, 24); /* unused */ - out_uint16_le(s, 0x258); /* entries */ - out_uint16_le(s, 0x100 * Bpp); /* max cell size */ - out_uint16_le(s, 0x12c); /* entries */ - out_uint16_le(s, 0x400 * Bpp); /* max cell size */ - out_uint16_le(s, 0x106); /* entries */ - out_uint16_le(s, 0x1000 * Bpp); /* max cell size */ - return 0; -} - -/******************************************************************************/ -/* Output control capability set */ -static int APP_CC -rdp_rdp_out_control_caps(struct rdp_rdp *self, struct stream *s) -{ - out_uint16_le(s, RDP_CAPSET_CONTROL); - out_uint16_le(s, RDP_CAPLEN_CONTROL); - out_uint16_le(s, 0); /* Control capabilities */ - out_uint16_le(s, 0); /* Remote detach */ - out_uint16_le(s, 2); /* Control interest */ - out_uint16_le(s, 2); /* Detach interest */ - return 0; -} - -/******************************************************************************/ -/* Output activation capability set */ -static int APP_CC -rdp_rdp_out_activate_caps(struct rdp_rdp *self, struct stream *s) -{ - out_uint16_le(s, RDP_CAPSET_ACTIVATE); - out_uint16_le(s, RDP_CAPLEN_ACTIVATE); - out_uint16_le(s, 0); /* Help key */ - out_uint16_le(s, 0); /* Help index key */ - out_uint16_le(s, 0); /* Extended help key */ - out_uint16_le(s, 0); /* Window activate */ - return 0; -} - -/******************************************************************************/ -/* Output pointer capability set */ -static int APP_CC -rdp_rdp_out_pointer_caps(struct rdp_rdp *self, struct stream *s) -{ - out_uint16_le(s, RDP_CAPSET_POINTER); - out_uint16_le(s, RDP_CAPLEN_POINTER_MONO); - out_uint16_le(s, 0); /* Color pointer */ - out_uint16_le(s, 20); /* Cache size */ - return 0; -} - -/******************************************************************************/ -/* Output share capability set */ -static int APP_CC -rdp_rdp_out_share_caps(struct rdp_rdp *self, struct stream *s) -{ - out_uint16_le(s, RDP_CAPSET_SHARE); - out_uint16_le(s, RDP_CAPLEN_SHARE); - out_uint16_le(s, 0); /* userid */ - out_uint16_le(s, 0); /* pad */ - return 0; -} - -/******************************************************************************/ -/* Output color cache capability set */ -static int APP_CC -rdp_rdp_out_colcache_caps(struct rdp_rdp *self, struct stream *s) -{ - out_uint16_le(s, RDP_CAPSET_COLCACHE); - out_uint16_le(s, RDP_CAPLEN_COLCACHE); - out_uint16_le(s, 6); /* cache size */ - out_uint16_le(s, 0); /* pad */ - return 0; -} - -static const unsigned char caps_0x0d[] = -{ - 0x01, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char caps_0x0c[] = { 0x01, 0x00, 0x00, 0x00 }; - -static const unsigned char caps_0x0e[] = { 0x01, 0x00, 0x00, 0x00 }; - -static const unsigned char caps_0x10[] = -{ - 0xFE, 0x00, 0x04, 0x00, 0xFE, 0x00, 0x04, 0x00, - 0xFE, 0x00, 0x08, 0x00, 0xFE, 0x00, 0x08, 0x00, - 0xFE, 0x00, 0x10, 0x00, 0xFE, 0x00, 0x20, 0x00, - 0xFE, 0x00, 0x40, 0x00, 0xFE, 0x00, 0x80, 0x00, - 0xFE, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x08, - 0x00, 0x01, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00 -}; - -/******************************************************************************/ -/* Output unknown capability sets */ -static int APP_CC -rdp_rdp_out_unknown_caps(struct rdp_rdp *self, struct stream *s, int id, - int length, const unsigned char *caps) -{ - out_uint16_le(s, id); - out_uint16_le(s, length); - out_uint8p(s, caps, length - 4); - return 0; -} - -#define RDP5_FLAG 0x0030 - -/******************************************************************************/ -/* Send a confirm active PDU */ -static int APP_CC -rdp_rdp_send_confirm_active(struct rdp_rdp *self, struct stream *s) -{ - int sec_flags; - int caplen; - - sec_flags = SEC_ENCRYPT; - //sec_flags = RDP5_FLAG | SEC_ENCRYPT; - caplen = RDP_CAPLEN_GENERAL + RDP_CAPLEN_BITMAP + RDP_CAPLEN_ORDER + - RDP_CAPLEN_BMPCACHE + RDP_CAPLEN_COLCACHE + - RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL + - RDP_CAPLEN_POINTER_MONO + RDP_CAPLEN_SHARE + - 0x58 + 0x08 + 0x08 + 0x34 /* unknown caps */ + - 4 /* w2k fix, why? */ ; - - if (rdp_sec_init(self->sec_layer, s, sec_flags) != 0) - { - return 1; - } - - out_uint16_le(s, 2 + 14 + caplen + sizeof(RDP_SOURCE)); - out_uint16_le(s, (RDP_PDU_CONFIRM_ACTIVE | 0x10)); /* Version 1 */ - out_uint16_le(s, (self->sec_layer->mcs_layer->userid + 1001)); - out_uint32_le(s, self->share_id); - out_uint16_le(s, 0x3ea); /* userid */ - out_uint16_le(s, sizeof(RDP_SOURCE)); - out_uint16_le(s, caplen); - out_uint8p(s, RDP_SOURCE, sizeof(RDP_SOURCE)); - out_uint16_le(s, 0xd); /* num_caps */ - out_uint8s(s, 2); /* pad */ - rdp_rdp_out_general_caps(self, s); - rdp_rdp_out_bitmap_caps(self, s); - rdp_rdp_out_order_caps(self, s); - rdp_rdp_out_bmpcache_caps(self, s); - rdp_rdp_out_colcache_caps(self, s); - rdp_rdp_out_activate_caps(self, s); - rdp_rdp_out_control_caps(self, s); - rdp_rdp_out_pointer_caps(self, s); - rdp_rdp_out_share_caps(self, s); - rdp_rdp_out_unknown_caps(self, s, 0x0d, 0x58, caps_0x0d); /* international? */ - rdp_rdp_out_unknown_caps(self, s, 0x0c, 0x08, caps_0x0c); - rdp_rdp_out_unknown_caps(self, s, 0x0e, 0x08, caps_0x0e); - rdp_rdp_out_unknown_caps(self, s, 0x10, 0x34, caps_0x10); /* glyph cache? */ - s_mark_end(s); - - if (rdp_sec_send(self->sec_layer, s, sec_flags) != 0) - { - return 1; - } - - return 0; -} - -/******************************************************************************/ -/* Process a color pointer PDU */ -static int APP_CC -rdp_rdp_process_color_pointer_pdu(struct rdp_rdp *self, struct stream *s) -{ - unsigned int cache_idx; - unsigned int dlen; - unsigned int mlen; - struct rdp_cursor *cursor; - - in_uint16_le(s, cache_idx); - - if (cache_idx >= sizeof(self->cursors) / sizeof(cursor)) - { - return 1; - } - - /* there are only 32 cursors */ - if (cache_idx > 31) - { - return 1; - } - - cursor = self->cursors + cache_idx; - in_uint16_le(s, cursor->x); - in_uint16_le(s, cursor->y); - in_uint16_le(s, cursor->width); - in_uint16_le(s, cursor->height); - in_uint16_le(s, mlen); /* mask length */ - in_uint16_le(s, dlen); /* data length */ - - if ((mlen > sizeof(cursor->mask)) || (dlen > sizeof(cursor->data))) - { - return 1; - } - - in_uint8a(s, cursor->data, dlen); - in_uint8a(s, cursor->mask, mlen); - self->mod->server_set_cursor(self->mod, cursor->x, cursor->y, - cursor->data, cursor->mask); - return 0; -} - -/******************************************************************************/ -/* Process a cached pointer PDU */ -static int APP_CC -rdp_rdp_process_cached_pointer_pdu(struct rdp_rdp *self, struct stream *s) -{ - int cache_idx; - struct rdp_cursor *cursor; - - in_uint16_le(s, cache_idx); - - if (cache_idx > 31) - { - return 1; - } - - cursor = self->cursors + cache_idx; - self->mod->server_set_cursor(self->mod, cursor->x, cursor->y, - cursor->data, cursor->mask); - return 0; -} - -/******************************************************************************/ -/* Process a system pointer PDU */ -static int APP_CC -rdp_rdp_process_system_pointer_pdu(struct rdp_rdp *self, struct stream *s) -{ - int system_pointer_type; - struct rdp_cursor *cursor; - - in_uint16_le(s, system_pointer_type); - - switch (system_pointer_type) - { - case RDP_NULL_POINTER: - cursor = (struct rdp_cursor *)g_malloc(sizeof(struct rdp_cursor), 1); - g_memset(cursor->mask, 0xff, sizeof(cursor->mask)); - self->mod->server_set_cursor(self->mod, cursor->x, cursor->y, - cursor->data, cursor->mask); - g_free(cursor); - break; - default: - break; - } - - return 0; -} - -/******************************************************************************/ -/* Process a pointer PDU */ -static int APP_CC -rdp_rdp_process_pointer_pdu(struct rdp_rdp *self, struct stream *s) -{ - int message_type; - int rv; - - rv = 0; - in_uint16_le(s, message_type); - in_uint8s(s, 2); /* pad */ - - switch (message_type) - { - case RDP_POINTER_MOVE: - in_uint8s(s, 2); /* x */ - in_uint8s(s, 2); /* y */ - break; - case RDP_POINTER_COLOR: - rv = rdp_rdp_process_color_pointer_pdu(self, s); - break; - case RDP_POINTER_CACHED: - rv = rdp_rdp_process_cached_pointer_pdu(self, s); - break; - case RDP_POINTER_SYSTEM: - rv = rdp_rdp_process_system_pointer_pdu(self, s); - break; - default: - break; - } - - return rv; -} - -/******************************************************************************/ -/* Process bitmap updates */ -static void APP_CC -rdp_rdp_process_bitmap_updates(struct rdp_rdp *self, struct stream *s) -{ - int num_updates = 0; - int left = 0; - int top = 0; - int right = 0; - int bottom = 0; - int width = 0; - int height = 0; - int cx = 0; - int cy = 0; - int bpp = 0; - int Bpp = 0; - int compress = 0; - int bufsize = 0; - int size = 0; - int i = 0; - int x = 0; - int y = 0; - char *data = NULL; - char *bmpdata0 = NULL; - char *bmpdata1 = NULL; - - in_uint16_le(s, num_updates); - - for (i = 0; i < num_updates; i++) - { - in_uint16_le(s, left); - in_uint16_le(s, top); - in_uint16_le(s, right); - in_uint16_le(s, bottom); - in_uint16_le(s, width); - in_uint16_le(s, height); - in_uint16_le(s, bpp); - Bpp = (bpp + 7) / 8; - in_uint16_le(s, compress); - in_uint16_le(s, bufsize); - cx = (right - left) + 1; - cy = (bottom - top) + 1; - bmpdata0 = (char *)g_malloc(width * height * Bpp, 0); - - if (compress) - { - if (compress & 0x400) - { - size = bufsize; - } - else - { - in_uint8s(s, 2); /* pad */ - in_uint16_le(s, size); - in_uint8s(s, 4); /* line_size, final_size */ - } - - in_uint8p(s, data, size); - rdp_bitmap_decompress(bmpdata0, width, height, data, size, Bpp); - bmpdata1 = rdp_orders_convert_bitmap(bpp, self->mod->xrdp_bpp, - bmpdata0, width, height, - self->colormap.colors); - self->mod->server_paint_rect(self->mod, left, top, cx, cy, bmpdata1, - width, height, 0, 0); - } - else /* not compressed */ - { - for (y = 0; y < height; y++) - { - data = bmpdata0 + ((height - y) - 1) * (width * Bpp); - - if (Bpp == 1) - { - for (x = 0; x < width; x++) - { - in_uint8(s, data[x]); - } - } - else if (Bpp == 2) - { - for (x = 0; x < width; x++) - { - in_uint16_le(s, ((tui16 *)data)[x]); - } - } - else if (Bpp == 3) - { - for (x = 0; x < width; x++) - { - in_uint8(s, data[x * 3 + 0]); - in_uint8(s, data[x * 3 + 1]); - in_uint8(s, data[x * 3 + 2]); - } - } - } - - bmpdata1 = rdp_orders_convert_bitmap(bpp, self->mod->xrdp_bpp, - bmpdata0, width, height, - self->colormap.colors); - self->mod->server_paint_rect(self->mod, left, top, cx, cy, bmpdata1, - width, height, 0, 0); - } - - if (bmpdata0 != bmpdata1) - { - g_free(bmpdata1); - } - - g_free(bmpdata0); - } -} - -/******************************************************************************/ -/* Process a palette update */ -static void APP_CC -rdp_rdp_process_palette(struct rdp_rdp *self, struct stream *s) -{ - int i; - int r; - int g; - int b; - - in_uint8s(s, 2); /* pad */ - in_uint16_le(s, self->colormap.ncolors); - in_uint8s(s, 2); /* pad */ - - for (i = 0; i < self->colormap.ncolors; i++) - { - in_uint8(s, r); - in_uint8(s, g); - in_uint8(s, b); - self->colormap.colors[i] = (r << 16) | (g << 8) | b; - } - - //ui_set_colormap(hmap); -} - -/******************************************************************************/ -/* Process an update PDU */ -static int APP_CC -rdp_rdp_process_update_pdu(struct rdp_rdp *self, struct stream *s) -{ - int update_type; - int count; - - in_uint16_le(s, update_type); - self->mod->server_begin_update(self->mod); - - switch (update_type) - { - case RDP_UPDATE_ORDERS: - in_uint8s(s, 2); /* pad */ - in_uint16_le(s, count); - in_uint8s(s, 2); /* pad */ - rdp_orders_process_orders(self->orders, s, count); - break; - case RDP_UPDATE_BITMAP: - rdp_rdp_process_bitmap_updates(self, s); - break; - case RDP_UPDATE_PALETTE: - rdp_rdp_process_palette(self, s); - break; - case RDP_UPDATE_SYNCHRONIZE: - break; - default: - break; - } - - self->mod->server_end_update(self->mod); - return 0; -} - - -/******************************************************************************/ -void APP_CC -rdp_rdp_out_unistr(struct stream *s, char *text) -{ - int i; - - i = 0; - - while (text[i] != 0) - { - out_uint8(s, text[i]); - out_uint8(s, 0); - i++; - } - - out_uint8(s, 0); - out_uint8(s, 0); -} - -/******************************************************************************/ -int APP_CC -rdp_rdp_send_login_info(struct rdp_rdp *self, int flags) -{ - int len_domain; - int len_username; - int len_password; - int len_program; - int len_directory; - int sec_flags; - struct stream *s; - - DEBUG(("in rdp_rdp_send_login_info")); - make_stream(s); - init_stream(s, 8192); - len_domain = 2 * g_strlen(self->mod->domain); - len_username = 2 * g_strlen(self->mod->username); - len_password = 2 * g_strlen(self->mod->password); - len_program = 2 * g_strlen(self->mod->program); - len_directory = 2 * g_strlen(self->mod->directory); - sec_flags = SEC_LOGON_INFO | SEC_ENCRYPT; - - if (rdp_sec_init(self->sec_layer, s, sec_flags) != 0) - { - free_stream(s); - DEBUG(("out rdp_rdp_send_login_info error 1")); - return 1; - } - - out_uint32_le(s, 0); - out_uint32_le(s, flags); - out_uint16_le(s, len_domain); - out_uint16_le(s, len_username); - out_uint16_le(s, len_password); - out_uint16_le(s, len_program); - out_uint16_le(s, len_directory); - rdp_rdp_out_unistr(s, self->mod->domain); - rdp_rdp_out_unistr(s, self->mod->username); - rdp_rdp_out_unistr(s, self->mod->password); - rdp_rdp_out_unistr(s, self->mod->program); - rdp_rdp_out_unistr(s, self->mod->directory); - s_mark_end(s); - - if (rdp_sec_send(self->sec_layer, s, sec_flags) != 0) - { - free_stream(s); - DEBUG(("out rdp_rdp_send_login_info error 2")); - return 1; - } - - free_stream(s); - DEBUG(("out rdp_rdp_send_login_info")); - return 0; -} - -/******************************************************************************/ -int APP_CC -rdp_rdp_connect(struct rdp_rdp *self, char *ip, char *port) -{ - int flags; - - DEBUG(("in rdp_rdp_connect")); - flags = RDP_LOGON_NORMAL; - - if (g_strlen(self->mod->password) > 0) - { - flags |= RDP_LOGON_AUTO; - } - - if (rdp_sec_connect(self->sec_layer, ip, port) != 0) - { - DEBUG(("out rdp_rdp_connect error rdp_sec_connect failed")); - return 1; - } - - if (rdp_rdp_send_login_info(self, flags) != 0) - { - DEBUG(("out rdp_rdp_connect error rdp_rdp_send_login_info failed")); - return 1; - } - - DEBUG(("out rdp_rdp_connect")); - return 0; -} - -/******************************************************************************/ -int APP_CC -rdp_rdp_send_input(struct rdp_rdp *self, struct stream *s, - int time, int message_type, - int device_flags, int param1, int param2) -{ - if (rdp_rdp_init_data(self, s) != 0) - { - return 1; - } - - out_uint16_le(s, 1); /* number of events */ - out_uint16_le(s, 0); - out_uint32_le(s, time); - out_uint16_le(s, message_type); - out_uint16_le(s, device_flags); - out_uint16_le(s, param1); - out_uint16_le(s, param2); - s_mark_end(s); - - if (rdp_rdp_send_data(self, s, RDP_DATA_PDU_INPUT) != 0) - { - return 1; - } - - return 0; -} - -/******************************************************************************/ -int APP_CC -rdp_rdp_send_invalidate(struct rdp_rdp *self, struct stream *s, - int left, int top, int width, int height) -{ - if (rdp_rdp_init_data(self, s) != 0) - { - return 1; - } - - out_uint32_le(s, 1); - out_uint16_le(s, left); - out_uint16_le(s, top); - out_uint16_le(s, (left + width) - 1); - out_uint16_le(s, (top + height) - 1); - s_mark_end(s); - - if (rdp_rdp_send_data(self, s, 33) != 0) - { - return 1; - } - - return 0; -} - -/******************************************************************************/ -int APP_CC -rdp_rdp_recv(struct rdp_rdp *self, struct stream *s, int *type) -{ - int len; - int pdu_type; - int chan; - - chan = 0; - DEBUG(("in rdp_rdp_recv")); - - if (s->next_packet >= s->end || s->next_packet == 0) - { - if (rdp_sec_recv(self->sec_layer, s, &chan) != 0) - { - DEBUG(("error in rdp_rdp_recv, rdp_sec_recv failed")); - return 1; - } - - s->next_packet = s->p; - } - else - { - chan = MCS_GLOBAL_CHANNEL; - s->p = s->next_packet; - } - - if (chan == MCS_GLOBAL_CHANNEL) - { - in_uint16_le(s, len); - DEBUG(("rdp_rdp_recv got %d len", len)); - - if (len == 0x8000) - { - s->next_packet += 8; - DEBUG(("out rdp_rdp_recv")); - return 0; - } - - in_uint16_le(s, pdu_type); - in_uint8s(s, 2); - *type = pdu_type & 0xf; - s->next_packet += len; - } - else - { - /* todo, process channel data */ - DEBUG(("got channel data channel %d", chan)); - s->next_packet = s->end; - } - - DEBUG(("out rdp_rdp_recv")); - return 0; -} - - -/******************************************************************************/ -static int APP_CC -rdp_rdp_process_disconnect_pdu(struct rdp_rdp *self, struct stream *s) -{ - return 0; -} - -/******************************************************************************/ -int APP_CC -rdp_rdp_process_data_pdu(struct rdp_rdp *self, struct stream *s) -{ - int data_pdu_type; - int rv; - - rv = 0; - in_uint8s(s, 6); /* shareid, pad, streamid */ - in_uint8s(s, 2); /* len */ - in_uint8(s, data_pdu_type); - in_uint8s(s, 1); /* ctype */ - in_uint8s(s, 2); /* clen */ - - switch (data_pdu_type) - { - case RDP_DATA_PDU_UPDATE: - rv = rdp_rdp_process_update_pdu(self, s); - break; - case RDP_DATA_PDU_CONTROL: - break; - case RDP_DATA_PDU_SYNCHRONISE: - break; - case RDP_DATA_PDU_POINTER: - rv = rdp_rdp_process_pointer_pdu(self, s); - break; - case RDP_DATA_PDU_PLAY_SOUND: - break; - case RDP_DATA_PDU_LOGON: - break; - case RDP_DATA_PDU_DISCONNECT: - rv = rdp_rdp_process_disconnect_pdu(self, s); - break; - default: - break; - } - - return rv; -} - -/******************************************************************************/ -/* Process a bitmap capability set */ -static void APP_CC -rdp_rdp_process_general_caps(struct rdp_rdp *self, struct stream *s) -{ -} - -/******************************************************************************/ -/* Process a bitmap capability set */ -static void APP_CC -rdp_rdp_process_bitmap_caps(struct rdp_rdp *self, struct stream *s) -{ - int bpp = 0; - - in_uint16_le(s, bpp); - in_uint8s(s, 6); - in_uint8s(s, 2); /* width */ - in_uint8s(s, 2); /* height */ - self->mod->rdp_bpp = bpp; - /* todo, call reset if needed and use width and height */ -} - -/******************************************************************************/ -/* Process server capabilities */ -/* returns error */ -static int APP_CC -rdp_rdp_process_server_caps(struct rdp_rdp *self, struct stream *s, int len) -{ - int n = 0; - int ncapsets = 0; - int capset_type = 0; - int capset_length = 0; - char *next = NULL; - char *start = NULL; - - start = s->p; - in_uint16_le(s, ncapsets); - in_uint8s(s, 2); /* pad */ - - for (n = 0; n < ncapsets; n++) - { - if (s->p > start + len) - { - return 0; - } - - in_uint16_le(s, capset_type); - in_uint16_le(s, capset_length); - next = (s->p + capset_length) - 4; - - switch (capset_type) - { - case RDP_CAPSET_GENERAL: - rdp_rdp_process_general_caps(self, s); - break; - case RDP_CAPSET_BITMAP: - rdp_rdp_process_bitmap_caps(self, s); - break; - default: - break; - } - - s->p = next; - } - - return 0; -} - -/******************************************************************************/ -/* Send a control PDU */ -/* returns error */ -static int APP_CC -rdp_rdp_send_control(struct rdp_rdp *self, struct stream *s, int action) -{ - if (rdp_rdp_init_data(self, s) != 0) - { - return 1; - } - - out_uint16_le(s, action); - out_uint16_le(s, 0); /* userid */ - out_uint32_le(s, 0); /* control id */ - s_mark_end(s); - - if (rdp_rdp_send_data(self, s, RDP_DATA_PDU_CONTROL) != 0) - { - return 1; - } - - return 0; -} - -/******************************************************************************/ -/* Send a synchronisation PDU */ -/* returns error */ -static int APP_CC -rdp_rdp_send_synchronise(struct rdp_rdp *self, struct stream *s) -{ - if (rdp_rdp_init_data(self, s) != 0) - { - return 1; - } - - out_uint16_le(s, 1); /* type */ - out_uint16_le(s, 1002); - s_mark_end(s); - - if (rdp_rdp_send_data(self, s, RDP_DATA_PDU_SYNCHRONISE) != 0) - { - return 1; - } - - return 0; -} - -/******************************************************************************/ -/* Send an (empty) font information PDU */ -static int APP_CC -rdp_rdp_send_fonts(struct rdp_rdp *self, struct stream *s, int seq) -{ - if (rdp_rdp_init_data(self, s) != 0) - { - return 1; - } - - out_uint16_le(s, 0); /* number of fonts */ - out_uint16_le(s, 0); /* pad? */ - out_uint16_le(s, seq); /* unknown */ - out_uint16_le(s, 0x32); /* entry size */ - s_mark_end(s); - - if (rdp_rdp_send_data(self, s, RDP_DATA_PDU_FONT2) != 0) - { - return 1; - } - - return 0; -} - -/******************************************************************************/ -/* Respond to a demand active PDU */ -int APP_CC -rdp_rdp_process_demand_active(struct rdp_rdp *self, struct stream *s) -{ - int type = 0; - int len_src_descriptor = 0; - int len_combined_caps = 0; - - in_uint32_le(s, self->share_id); - in_uint16_le(s, len_src_descriptor); - in_uint16_le(s, len_combined_caps); - in_uint8s(s, len_src_descriptor); - rdp_rdp_process_server_caps(self, s, len_combined_caps); - rdp_rdp_send_confirm_active(self, s); - rdp_rdp_send_synchronise(self, s); - rdp_rdp_send_control(self, s, RDP_CTL_COOPERATE); - rdp_rdp_send_control(self, s, RDP_CTL_REQUEST_CONTROL); - rdp_rdp_recv(self, s, &type); /* RDP_PDU_SYNCHRONIZE */ - rdp_rdp_recv(self, s, &type); /* RDP_CTL_COOPERATE */ - rdp_rdp_recv(self, s, &type); /* RDP_CTL_GRANT_CONTROL */ - rdp_rdp_send_input(self, s, 0, RDP_INPUT_SYNCHRONIZE, 0, 0, 0); - rdp_rdp_send_fonts(self, s, 1); - rdp_rdp_send_fonts(self, s, 2); - rdp_rdp_recv(self, s, &type); /* RDP_PDU_UNKNOWN 0x28 (Fonts?) */ - rdp_orders_reset_state(self->orders); - return 0; -} - -/******************************************************************************/ -int APP_CC -rdp_rec_check_file(struct rdp_rdp *self) -{ - char file_name[256]; - int index = 0; - int len = 0; - struct stream *s = (struct stream *)NULL; - - g_memset(file_name, 0, sizeof(char) * 256); - - if (self->rec_fd == 0) - { - index = 1; - g_sprintf(file_name, "rec%8.8d.rec", index); - - while (g_file_exist(file_name)) - { - index++; - - if (index >= 9999) - { - return 1; - } - - g_sprintf(file_name, "rec%8.8d.rec", index); - } - - self->rec_fd = g_file_open(file_name); - if (self->rec_fd < 0) - return 1; - - make_stream(s); - init_stream(s, 8192); - out_uint8a(s, "XRDPREC1", 8); - out_uint8s(s, 8); - s_mark_end(s); - len = s->end - s->data; - g_file_write(self->rec_fd, s->data, len); - free_stream(s); - } - - return 0; -} - -/******************************************************************************/ -int APP_CC -rdp_rec_write_item(struct rdp_rdp *self, struct stream *s) -{ - int len = 0; - int time = 0; - - if (self->rec_fd == 0) - { - return 1; - } - - time = g_time1(); - out_uint32_le(s, time); - s_mark_end(s); - len = s->end - s->data; - s_pop_layer(s, iso_hdr); - out_uint32_le(s, len); - g_file_write(self->rec_fd, s->data, len); - return 0; -} diff --git a/rdp/rdp_sec.c b/rdp/rdp_sec.c deleted file mode 100644 index 2622ad76..00000000 --- a/rdp/rdp_sec.c +++ /dev/null @@ -1,713 +0,0 @@ -/** - * xrdp: A Remote Desktop Protocol server. - * - * Copyright (C) Jay Sorg 2004-2013 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * librdp secure layer - */ - -#include "rdp.h" - -static char g_pad_54[40] = -{ - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54 -}; - -static char g_pad_92[48] = -{ - 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92 -}; - -/*****************************************************************************/ -struct rdp_sec *APP_CC -rdp_sec_create(struct rdp_rdp *owner) -{ - struct rdp_sec *self; - - self = (struct rdp_sec *)g_malloc(sizeof(struct rdp_sec), 1); - self->rdp_layer = owner; - make_stream(self->client_mcs_data); - init_stream(self->client_mcs_data, 8192); - make_stream(self->server_mcs_data); - init_stream(self->server_mcs_data, 8192); - self->mcs_layer = rdp_mcs_create(self, self->client_mcs_data, - self->server_mcs_data); - - if (self->decrypt_rc4_info != NULL) - { - g_writeln("rdp_sec_create - decrypt_rc4_info already created !!!"); - } - - self->decrypt_rc4_info = ssl_rc4_info_create(); - - if (self->encrypt_rc4_info != NULL) - { - g_writeln("rdp_sec_create - encrypt_rc4_info already created !!!"); - } - - self->encrypt_rc4_info = ssl_rc4_info_create(); - self->lic_layer = rdp_lic_create(self); - return self; -} - -/*****************************************************************************/ -void APP_CC -rdp_sec_delete(struct rdp_sec *self) -{ - if (self == 0) - { - return; - } - - rdp_lic_delete(self->lic_layer); - rdp_mcs_delete(self->mcs_layer); - free_stream(self->client_mcs_data); - free_stream(self->server_mcs_data); - ssl_rc4_info_delete(self->decrypt_rc4_info); - ssl_rc4_info_delete(self->encrypt_rc4_info); - g_free(self); -} - -/*****************************************************************************/ -/* Reduce key entropy from 64 to 40 bits */ -static void APP_CC -rdp_sec_make_40bit(char *key) -{ - key[0] = 0xd1; - key[1] = 0x26; - key[2] = 0x9e; -} - -/*****************************************************************************/ -/* returns error */ -/* update an encryption key */ -static int APP_CC -rdp_sec_update(char *key, char *update_key, int key_len) -{ - char shasig[20]; - void *sha1_info; - void *md5_info; - void *rc4_info; - - sha1_info = ssl_sha1_info_create(); - md5_info = ssl_md5_info_create(); - rc4_info = ssl_rc4_info_create(); - ssl_sha1_clear(sha1_info); - ssl_sha1_transform(sha1_info, update_key, key_len); - ssl_sha1_transform(sha1_info, g_pad_54, 40); - ssl_sha1_transform(sha1_info, key, key_len); - ssl_sha1_complete(sha1_info, shasig); - ssl_md5_clear(md5_info); - ssl_md5_transform(md5_info, update_key, key_len); - ssl_md5_transform(md5_info, g_pad_92, 48); - ssl_md5_transform(md5_info, shasig, 20); - ssl_md5_complete(md5_info, key); - ssl_rc4_set_key(rc4_info, key, key_len); - ssl_rc4_crypt(rc4_info, key, key_len); - - if (key_len == 8) - { - rdp_sec_make_40bit(key); - } - - ssl_sha1_info_delete(sha1_info); - ssl_md5_info_delete(md5_info); - ssl_rc4_info_delete(rc4_info); - return 0; -} - -/*****************************************************************************/ -static void APP_CC -rdp_sec_decrypt(struct rdp_sec *self, char *data, int len) -{ - if (self->decrypt_use_count == 4096) - { - rdp_sec_update(self->decrypt_key, self->decrypt_update_key, - self->rc4_key_len); - ssl_rc4_set_key(self->decrypt_rc4_info, self->decrypt_key, - self->rc4_key_len); - self->decrypt_use_count = 0; - } - - ssl_rc4_crypt(self->decrypt_rc4_info, data, len); - self->decrypt_use_count++; -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_sec_recv(struct rdp_sec *self, struct stream *s, int *chan) -{ - int flags; - - DEBUG((" in rdp_sec_recv")); - - if (rdp_mcs_recv(self->mcs_layer, s, chan) != 0) - { - DEBUG((" error in rdp_sec_recv, rdp_mcs_recv failed")); - return 1; - } - - in_uint32_le(s, flags); - DEBUG((" rdp_sec_recv flags %8.8x", flags)); - - if (flags & SEC_ENCRYPT) /* 0x08 */ - { - in_uint8s(s, 8); /* signature */ - rdp_sec_decrypt(self, s->p, s->end - s->p); - } - - if (flags & SEC_LICENCE_NEG) /* 0x80 */ - { - DEBUG((" in rdp_sec_recv, got SEC_LICENCE_NEG")); - rdp_lic_process(self->lic_layer, s); - *chan = 0; - } - - DEBUG((" out rdp_sec_recv")); - return 0; -} - -/*****************************************************************************/ -/* prepare client mcs data to send in mcs layer */ -static void APP_CC -rdp_sec_out_mcs_data(struct rdp_sec *self) -{ - struct stream *s; - int hostlen; - int length; - - s = self->client_mcs_data; - init_stream(s, 512); - self->rdp_layer->mod->hostname[15] = 0; /* limit length to 15 */ - hostlen = 2 * g_strlen(self->rdp_layer->mod->hostname); - length = 158 + 76 + 12 + 4; - /* Generic Conference Control (T.124) ConferenceCreateRequest */ - out_uint16_be(s, 5); - out_uint16_be(s, 0x14); - out_uint8(s, 0x7c); - out_uint16_be(s, 1); - out_uint16_be(s, (length | 0x8000)); /* remaining length */ - out_uint16_be(s, 8); /* length? */ - out_uint16_be(s, 16); - out_uint8(s, 0); - out_uint16_le(s, 0xc001); - out_uint8(s, 0); - out_uint32_le(s, 0x61637544); /* OEM ID: "Duca", as in Ducati. */ - out_uint16_be(s, ((length - 14) | 0x8000)); /* remaining length */ - /* Client information */ - out_uint16_le(s, SEC_TAG_CLI_INFO); - out_uint16_le(s, 212); /* length */ - out_uint16_le(s, 1); /* RDP version. 1 == RDP4, 4 == RDP5. */ - out_uint16_le(s, 8); - out_uint16_le(s, self->rdp_layer->mod->width); - out_uint16_le(s, self->rdp_layer->mod->height); - out_uint16_le(s, 0xca01); - out_uint16_le(s, 0xaa03); - out_uint32_le(s, self->rdp_layer->mod->keylayout); - out_uint32_le(s, 2600); /* Client build */ - /* Unicode name of client, padded to 32 bytes */ - rdp_rdp_out_unistr(s, self->rdp_layer->mod->hostname); - out_uint8s(s, 30 - hostlen); - out_uint32_le(s, 4); - out_uint32_le(s, 0); - out_uint32_le(s, 12); - out_uint8s(s, 64); /* reserved? 4 + 12 doublewords */ - out_uint16_le(s, 0xca01); /* color depth? */ - out_uint16_le(s, 1); - out_uint32_le(s, 0); - out_uint8(s, self->rdp_layer->mod->rdp_bpp); - out_uint16_le(s, 0x0700); - out_uint8(s, 0); - out_uint32_le(s, 1); - out_uint8s(s, 64); /* End of client info */ - out_uint16_le(s, SEC_TAG_CLI_4); - out_uint16_le(s, 12); - out_uint32_le(s, 9); - out_uint32_le(s, 0); - /* Client encryption settings */ - out_uint16_le(s, SEC_TAG_CLI_CRYPT); - out_uint16_le(s, 12); /* length */ - /* encryption supported, 128-bit supported */ - out_uint32_le(s, 0x3); - out_uint32_le(s, 0); /* Unknown */ - s_mark_end(s); -} - -/*****************************************************************************/ -/* Parse a public key structure */ -/* returns boolean */ -static int APP_CC -rdp_sec_parse_public_key(struct rdp_sec *self, struct stream *s, - char *modulus, char *exponent) -{ - int magic; - int modulus_len; - - in_uint32_le(s, magic); - - if (magic != SEC_RSA_MAGIC) - { - return 0; - } - - in_uint32_le(s, modulus_len); - - if (modulus_len != SEC_MODULUS_SIZE + SEC_PADDING_SIZE) - { - return 0; - } - - in_uint8s(s, 8); - in_uint8a(s, exponent, SEC_EXPONENT_SIZE); - in_uint8a(s, modulus, SEC_MODULUS_SIZE); - in_uint8s(s, SEC_PADDING_SIZE); - return s_check(s); -} - -/*****************************************************************************/ -/* Parse a crypto information structure */ -/* returns boolean */ -static int APP_CC -rdp_sec_parse_crypt_info(struct rdp_sec *self, struct stream *s, - char *modulus, char *exponent) -{ - int random_len; - int rsa_info_len; - int flags; - int tag; - int length; - char *next_tag; - char *end; - - in_uint32_le(s, self->rc4_key_size); /* 1 = 40-bit, 2 = 128-bit */ - in_uint32_le(s, self->crypt_level); /* 1 = low, 2 = medium, 3 = high */ - - if (self->crypt_level == 0) /* no encryption */ - { - return 0; - } - - in_uint32_le(s, random_len); - in_uint32_le(s, rsa_info_len); - - if (random_len != SEC_RANDOM_SIZE) - { - return 0; - } - - in_uint8a(s, self->server_random, random_len); - /* RSA info */ - end = s->p + rsa_info_len; - - if (end > s->end) - { - return 0; - } - - in_uint32_le(s, flags); /* 1 = RDP4-style, 0x80000002 = X.509 */ - - if (flags & 1) - { - in_uint8s(s, 8); /* unknown */ - - while (s->p < end) - { - in_uint16_le(s, tag); - in_uint16_le(s, length); - next_tag = s->p + length; - DEBUG((" rdp_sec_parse_crypt_info tag %d length %d", tag, length)); - - switch (tag) - { - case SEC_TAG_PUBKEY: - - if (!rdp_sec_parse_public_key(self, s, modulus, exponent)) - { - return 0; - } - - break; - case SEC_TAG_KEYSIG: - break; - default: - break; - } - - s->p = next_tag; - } - } - else - { - /* todo */ - return 0; - } - - return s_check_end(s); -} - -/*****************************************************************************/ -static void APP_CC -rdp_sec_rsa_op(char *out, char *in, char *mod, char *exp) -{ - ssl_mod_exp(out, SEC_MODULUS_SIZE, /* 64 */ - in, SEC_RANDOM_SIZE, /* 32 */ - mod, SEC_MODULUS_SIZE, /* 64 */ - exp, SEC_EXPONENT_SIZE); /* 4 */ -} - -/*****************************************************************************/ -void APP_CC -rdp_sec_hash_48(char *out, char *in, char *salt1, char *salt2, int salt) -{ - int i; - void *sha1_info; - void *md5_info; - char pad[4]; - char sha1_sig[20]; - char md5_sig[16]; - - sha1_info = ssl_sha1_info_create(); - md5_info = ssl_md5_info_create(); - - for (i = 0; i < 3; i++) - { - g_memset(pad, salt + i, 4); - ssl_sha1_clear(sha1_info); - ssl_sha1_transform(sha1_info, pad, i + 1); - ssl_sha1_transform(sha1_info, in, 48); - ssl_sha1_transform(sha1_info, salt1, 32); - ssl_sha1_transform(sha1_info, salt2, 32); - ssl_sha1_complete(sha1_info, sha1_sig); - ssl_md5_clear(md5_info); - ssl_md5_transform(md5_info, in, 48); - ssl_md5_transform(md5_info, sha1_sig, 20); - ssl_md5_complete(md5_info, md5_sig); - g_memcpy(out + i * 16, md5_sig, 16); - } - - ssl_sha1_info_delete(sha1_info); - ssl_md5_info_delete(md5_info); -} - -/*****************************************************************************/ -void APP_CC -rdp_sec_hash_16(char *out, char *in, char *salt1, char *salt2) -{ - void *md5_info; - - md5_info = ssl_md5_info_create(); - ssl_md5_clear(md5_info); - ssl_md5_transform(md5_info, in, 16); - ssl_md5_transform(md5_info, salt1, 32); - ssl_md5_transform(md5_info, salt2, 32); - ssl_md5_complete(md5_info, out); - ssl_md5_info_delete(md5_info); -} - -/*****************************************************************************/ -static int APP_CC -rdp_sec_generate_keys(struct rdp_sec *self) -{ - char session_key[48]; - char temp_hash[48]; - char input[48]; - - g_memcpy(input, self->client_random, 24); - g_memcpy(input + 24, self->server_random, 24); - rdp_sec_hash_48(temp_hash, input, self->client_random, - self->server_random, 65); - rdp_sec_hash_48(session_key, temp_hash, self->client_random, - self->server_random, 88); - g_memcpy(self->sign_key, session_key, 16); - rdp_sec_hash_16(self->decrypt_key, session_key + 16, self->client_random, - self->server_random); - rdp_sec_hash_16(self->encrypt_key, session_key + 32, self->client_random, - self->server_random); - DEBUG((" rdp_sec_generate_keys, rc4_key_size is %d", self->rc4_key_size)); - DEBUG((" rdp_sec_generate_keys, crypt_level is %d", self->crypt_level)); - - if (self->rc4_key_size == 1) - { - rdp_sec_make_40bit(self->sign_key); - rdp_sec_make_40bit(self->encrypt_key); - rdp_sec_make_40bit(self->decrypt_key); - self->rc4_key_len = 8; - } - else - { - self->rc4_key_len = 16; - } - - g_memcpy(self->decrypt_update_key, self->decrypt_key, 16); - g_memcpy(self->encrypt_update_key, self->encrypt_key, 16); - ssl_rc4_set_key(self->decrypt_rc4_info, self->decrypt_key, self->rc4_key_len); - ssl_rc4_set_key(self->encrypt_rc4_info, self->encrypt_key, self->rc4_key_len); - return 0; -} - -/*****************************************************************************/ -/* Process crypto information blob */ -static void APP_CC -rdp_sec_process_crypt_info(struct rdp_sec *self, struct stream *s) -{ - char modulus[64]; - char exponent[64]; - - g_memset(modulus, 0, sizeof(modulus)); - g_memset(exponent, 0, sizeof(exponent)); - - if (!rdp_sec_parse_crypt_info(self, s, modulus, exponent)) - { - DEBUG((" error in rdp_sec_process_crypt_info")); - return; - } - - /* Generate a client random, and determine encryption keys */ - g_random(self->client_random, 32); - rdp_sec_rsa_op(self->client_crypt_random, self->client_random, - modulus, exponent); - rdp_sec_generate_keys(self); -} - -/*****************************************************************************/ -/* Process connect response data blob */ -static void APP_CC -rdp_sec_process_mcs_data(struct rdp_sec *self) -{ - int tag; - int length; - int len; - char *next_tag; - struct stream *s; - - s = self->server_mcs_data; - s->p = s->data; - in_uint8s(s, 21); /* header (T.124 ConferenceCreateResponse) */ - in_uint8(s, len); - - if (len & 0x80) - { - in_uint8(s, len); - } - - while (s->p < s->end) - { - in_uint16_le(s, tag); - in_uint16_le(s, length); - DEBUG((" rdp_sec_process_mcs_data tag %d length %d", tag, length)); - - if (length <= 4) - { - return; - } - - next_tag = (s->p + length) - 4; - - switch (tag) - { - case SEC_TAG_SRV_INFO: - //rdp_sec_process_srv_info(self, s); - break; - case SEC_TAG_SRV_CRYPT: - rdp_sec_process_crypt_info(self, s); - break; - case SEC_TAG_SRV_CHANNELS: - break; - default: - break; - } - - s->p = next_tag; - } -} - -/*****************************************************************************/ -/* Transfer the client random to the server */ -/* returns error */ -static int APP_CC -rdp_sec_establish_key(struct rdp_sec *self) -{ - int length; - int flags; - struct stream *s; - - DEBUG((" sending client random")); - make_stream(s); - init_stream(s, 8192); - length = SEC_MODULUS_SIZE + SEC_PADDING_SIZE; - flags = SEC_CLIENT_RANDOM; - - if (rdp_sec_init(self, s, flags) != 0) - { - free_stream(s); - return 1; - } - - out_uint32_le(s, length); - out_uint8p(s, self->client_crypt_random, SEC_MODULUS_SIZE); - out_uint8s(s, SEC_PADDING_SIZE); - s_mark_end(s); - - if (rdp_sec_send(self, s, flags) != 0) - { - free_stream(s); - return 1; - } - - free_stream(s); - return 0; -} - -/*****************************************************************************/ -/* Establish a secure connection */ -int APP_CC -rdp_sec_connect(struct rdp_sec *self, char *ip, char *port) -{ - DEBUG((" in rdp_sec_connect")); - rdp_sec_out_mcs_data(self); - - if (rdp_mcs_connect(self->mcs_layer, ip, port) != 0) - { - DEBUG((" out rdp_sec_connect error rdp_mcs_connect failed")); - return 1; - } - - rdp_sec_process_mcs_data(self); - - if (rdp_sec_establish_key(self) != 0) - { - DEBUG((" out rdp_sec_connect error rdp_sec_establish_key failed")); - return 1; - } - - DEBUG((" out rdp_sec_connect")); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_sec_init(struct rdp_sec *self, struct stream *s, int flags) -{ - if (rdp_mcs_init(self->mcs_layer, s) != 0) - { - return 1; - } - - if (flags & SEC_ENCRYPT) - { - s_push_layer(s, sec_hdr, 12); - } - else - { - s_push_layer(s, sec_hdr, 4); - } - - return 0; -} - -/*****************************************************************************/ -/* Output a uint32 into a buffer (little-endian) */ -void APP_CC -rdp_sec_buf_out_uint32(char *buffer, int value) -{ - buffer[0] = value & 0xff; - buffer[1] = (value >> 8) & 0xff; - buffer[2] = (value >> 16) & 0xff; - buffer[3] = (value >> 24) & 0xff; -} - -/*****************************************************************************/ -/* Generate a MAC hash (5.2.3.1), using a combination of SHA1 and MD5 */ -void APP_CC -rdp_sec_sign(char *signature, int siglen, char *session_key, int keylen, - char *data, int datalen) -{ - char shasig[20]; - char md5sig[16]; - char lenhdr[4]; - void *sha1_context; - void *md5_context; - - rdp_sec_buf_out_uint32(lenhdr, datalen); - sha1_context = ssl_sha1_info_create(); - ssl_sha1_clear(sha1_context); - ssl_sha1_transform(sha1_context, session_key, keylen); - ssl_sha1_transform(sha1_context, g_pad_54, 40); - ssl_sha1_transform(sha1_context, lenhdr, 4); - ssl_sha1_transform(sha1_context, data, datalen); - ssl_sha1_complete(sha1_context, shasig); - ssl_sha1_info_delete(sha1_context); - md5_context = ssl_md5_info_create(); - ssl_md5_clear(md5_context); - ssl_md5_transform(md5_context, session_key, keylen); - ssl_md5_transform(md5_context, g_pad_92, 48); - ssl_md5_transform(md5_context, shasig, 20); - ssl_md5_complete(md5_context, md5sig); - ssl_md5_info_delete(md5_context); - g_memcpy(signature, md5sig, siglen); -} - -/*****************************************************************************/ -/* Encrypt data using RC4 */ -static void APP_CC -rdp_sec_encrypt(struct rdp_sec *self, char *data, int length) -{ - if (self->encrypt_use_count == 4096) - { - rdp_sec_update(self->encrypt_key, self->encrypt_update_key, - self->rc4_key_len); - ssl_rc4_set_key(self->encrypt_rc4_info, self->encrypt_key, - self->rc4_key_len); - self->encrypt_use_count = 0; - } - - ssl_rc4_crypt(self->encrypt_rc4_info, data, length); - self->encrypt_use_count++; -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_sec_send(struct rdp_sec *self, struct stream *s, int flags) -{ - int datalen; - - DEBUG((" in rdp_sec_send flags %8.8x", flags)); - s_pop_layer(s, sec_hdr); - out_uint32_le(s, flags); - - if (flags & SEC_ENCRYPT) - { - datalen = (s->end - s->p) - 8; - rdp_sec_sign(s->p, 8, self->sign_key, self->rc4_key_len, s->p + 8, - datalen); - rdp_sec_encrypt(self, s->p + 8, datalen); - } - - if (rdp_mcs_send(self->mcs_layer, s) != 0) - { - DEBUG((" out rdp_sec_send, rdp_mcs_send failed")); - return 1; - } - - DEBUG((" out rdp_sec_send")); - return 0; -} diff --git a/rdp/rdp_tcp.c b/rdp/rdp_tcp.c deleted file mode 100644 index 60807806..00000000 --- a/rdp/rdp_tcp.c +++ /dev/null @@ -1,191 +0,0 @@ -/** - * xrdp: A Remote Desktop Protocol server. - * - * Copyright (C) Jay Sorg 2004-2013 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * librdp tcp layer - */ - -#include "rdp.h" - -/*****************************************************************************/ -struct rdp_tcp *APP_CC -rdp_tcp_create(struct rdp_iso *owner) -{ - struct rdp_tcp *self; - - self = (struct rdp_tcp *)g_malloc(sizeof(struct rdp_tcp), 1); - self->iso_layer = owner; - return self; -} - -/*****************************************************************************/ -void APP_CC -rdp_tcp_delete(struct rdp_tcp *self) -{ - g_free(self); -} - -/*****************************************************************************/ -/* get out stream ready for data */ -/* returns error */ -int APP_CC -rdp_tcp_init(struct rdp_tcp *self, struct stream *s) -{ - init_stream(s, 8192); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_tcp_recv(struct rdp_tcp *self, struct stream *s, int len) -{ - int rcvd; - - DEBUG((" in rdp_tcp_recv will get %d bytes on sck %d", - len, self->sck)); - - if (self->sck_closed) - { - DEBUG((" out rdp_tcp_recv error sck closed")); - return 1; - } - - init_stream(s, len); - - while (len > 0) - { - rcvd = g_tcp_recv(self->sck, s->end, len, 0); - - if (rcvd == -1) - { - if (g_tcp_last_error_would_block(self->sck)) - { - g_sck_can_recv(self->sck, 10); - } - else - { - self->sck_closed = 1; - DEBUG((" out rdp_tcp_recv error unknown")); - return 1; - } - } - else if (rcvd == 0) - { - self->sck_closed = 1; - DEBUG((" out rdp_tcp_recv error connection dropped")); - return 1; - } - else - { - s->end += rcvd; - len -= rcvd; - } - } - - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_tcp_send(struct rdp_tcp *self, struct stream *s) -{ - int len; - int total; - int sent; - - if (self->sck_closed) - { - DEBUG((" out rdp_tcp_send error sck closed")); - return 1; - } - - len = s->end - s->data; - DEBUG((" in rdp_tcp_send will send %d bytes on sck %d", len, - self->sck)); - total = 0; - - while (total < len) - { - sent = g_tcp_send(self->sck, s->data + total, len - total, 0); - - if (sent == -1) - { - if (g_tcp_last_error_would_block(self->sck)) - { - g_tcp_can_send(self->sck, 10); - } - else - { - self->sck_closed = 1; - DEBUG((" out rdp_tcp_send error unknown")); - return 1; - } - } - else if (sent == 0) - { - self->sck_closed = 1; - DEBUG((" out rdp_tcp_send error connection dropped")); - return 1; - } - else - { - total = total + sent; - } - } - - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_tcp_connect(struct rdp_tcp *self, char *ip, char *port) -{ - DEBUG((" in rdp_tcp_connect ip %s port %s", ip, port)); - - self->sck = g_tcp_socket(); - if (self->sck < 0) - return 1; - - if (g_tcp_connect(self->sck, ip, port) == 0) - { - g_tcp_set_non_blocking(self->sck); - } - else - { - DEBUG((" out rdp_tcp_connect error g_tcp_connect failed")); - return 1; - } - - DEBUG((" out rdp_tcp_connect")); - return 0; -} - -/*****************************************************************************/ -/* returns error */ -int APP_CC -rdp_tcp_disconnect(struct rdp_tcp *self) -{ - if (self->sck != 0) - { - g_tcp_close(self->sck); - } - - self->sck = 0; - return 0; -} diff --git a/xrdp/xrdp.ini b/xrdp/xrdp.ini index 242641ff..70e7afb9 100644 --- a/xrdp/xrdp.ini +++ b/xrdp/xrdp.ini @@ -206,12 +206,6 @@ username=ask password=ask #delay_ms=2000 -[rdp-any] -name=rdp-any -lib=librdp.so -ip=ask -port=ask3389 - [neutrinordp-any] name=neutrinordp-any lib=libxrdpneutrinordp.so