]> git.sesse.net Git - rdpsrv/blobdiff - rdp5.c
Separated the RDP5 sending into its own protocol layer.
[rdpsrv] / rdp5.c
diff --git a/rdp5.c b/rdp5.c
index 0ac38076132bbcd5768c83df303537cbba25ccc7..1612643de0bf497390679563be8eb812b39e80fe 100644 (file)
--- a/rdp5.c
+++ b/rdp5.c
 extern uint8 *g_next_packet;
 extern int listen_on_vnc;
 
+extern uint8 sec_sign_key[16];
+extern int rc4_key_len;
+
+/* Initialise secure transport packet */
+STREAM
+rdp5_init(int maxlen, BOOL encryption)
+{
+       int hdrlen;
+       STREAM s;
+
+       hdrlen = encryption ? 11 : 3;
+       s = tcp_init(maxlen + hdrlen);
+       s_push_layer(s, sec_hdr, hdrlen);
+
+       return s;
+}
+
+void
+rdp5_send(STREAM s, BOOL encryption)
+{
+       int datalen;
+
+       s_pop_layer(s, sec_hdr);
+
+       datalen = s->end - s->p;
+
+       out_uint8(s, encryption ? 0x80 : 0);    // protocol
+       out_uint8(s, 0x80 | (datalen >> 8));
+       out_uint8(s, datalen & 0xff);
+
+       if (encryption) {
+               datalen -= 8;
+
+               sec_sign(s->p, 8, sec_sign_key, rc4_key_len, s->p + 8, datalen);
+               sec_encrypt(s->p + 8, datalen);
+       }
+
+       tcp_send(s);
+}
+
 void
 rdp5_process(STREAM s, BOOL encryption)
 {