X-Git-Url: https://git.sesse.net/?p=rdpsrv;a=blobdiff_plain;f=rdp5.c;fp=rdp5.c;h=1612643de0bf497390679563be8eb812b39e80fe;hp=0ac38076132bbcd5768c83df303537cbba25ccc7;hb=55a546ab6b5970438e6cca1a962ec4e7dd669d11;hpb=d7f4fdca92c39405a79d71d3910ff114e0a692f0 diff --git a/rdp5.c b/rdp5.c index 0ac3807..1612643 100644 --- a/rdp5.c +++ b/rdp5.c @@ -24,6 +24,46 @@ 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) {