X-Git-Url: https://git.sesse.net/?p=rdpsrv;a=blobdiff_plain;f=mcs.c;h=9e6740f950022ab63751722393ebf82f16f4efee;hp=ac8148b43e16690ede259522354f9bc398c557d6;hb=f78d8ca1c22e0fcfabb9383928bc2cf6c93473cd;hpb=b3ae47054997c61d01087d17a3ab001b0a54324b diff --git a/mcs.c b/mcs.c index ac8148b..9e6740f 100644 --- a/mcs.c +++ b/mcs.c @@ -116,80 +116,75 @@ mcs_parse_domain_params(STREAM s) return s_check(s); } -/* Send an MCS_CONNECT_INITIAL message (ASN.1 BER) */ -static void -mcs_send_connect_initial(STREAM mcs_data) -{ - int datalen = mcs_data->end - mcs_data->data; - int length = 9 + 3 * 34 + 4 + datalen; - STREAM s; - - s = iso_init(length + 5); - - ber_out_header(s, MCS_CONNECT_INITIAL, length); - ber_out_header(s, BER_TAG_OCTET_STRING, 1); /* calling domain */ - out_uint8(s, 1); - ber_out_header(s, BER_TAG_OCTET_STRING, 1); /* called domain */ - out_uint8(s, 1); - - ber_out_header(s, BER_TAG_BOOLEAN, 1); - out_uint8(s, 0xff); /* upward flag */ - - mcs_out_domain_params(s, 34, 2, 0, 0xffff); /* target params */ - mcs_out_domain_params(s, 1, 1, 1, 0x420); /* min params */ - mcs_out_domain_params(s, 0xffff, 0xfc17, 0xffff, 0xffff); /* max params */ - - ber_out_header(s, BER_TAG_OCTET_STRING, datalen); - out_uint8p(s, mcs_data->data, datalen); - - s_mark_end(s); - iso_send(s); -} - /* Expect a MCS_CONNECT_RESPONSE message (ASN.1 BER) */ -static BOOL -mcs_recv_connect_response(STREAM mcs_data) +BOOL +mcs_recv_connect_initial() { uint8 result; int length; STREAM s; + char *buf; s = iso_recv(); if (s == NULL) return False; - ber_parse_header(s, MCS_CONNECT_RESPONSE, &length); - - ber_parse_header(s, BER_TAG_RESULT, &length); + ber_parse_header(s, MCS_CONNECT_INITIAL, &length); + printf("parsing MCS_CONNECT_INITIAL (len=%u)\n", length); + ber_parse_header(s, BER_TAG_OCTET_STRING, &length); /* calling domain */ + in_uint8(s, result); + ber_parse_header(s, BER_TAG_OCTET_STRING, &length); /* called domain */ + in_uint8(s, result); + + ber_parse_header(s, BER_TAG_BOOLEAN, &length); in_uint8(s, result); - if (result != 0) - { - error("MCS connect: %d\n", result); - return False; - } - ber_parse_header(s, BER_TAG_INTEGER, &length); - in_uint8s(s, length); /* connect id */ + mcs_parse_domain_params(s); + mcs_parse_domain_params(s); mcs_parse_domain_params(s); ber_parse_header(s, BER_TAG_OCTET_STRING, &length); + in_uint8p(s, buf, length); - sec_process_mcs_data(s); - /* - if (length > mcs_data->size) - { - error("MCS data length %d, expected %d\n", length, - mcs_data->size); - length = mcs_data->size; - } - - in_uint8a(s, mcs_data->data, length); - mcs_data->p = mcs_data->data; - mcs_data->end = mcs_data->data + length; - */ + printf("Data from MCS connect: '%*s'\n", length, buf); + return s_check_end(s); } +void +mcs_send_connect_response() +{ + STREAM s; + + s = iso_init(80); // FIXME + + ber_out_header(s, MCS_CONNECT_RESPONSE, 80); + ber_out_header(s, BER_TAG_RESULT, 1); + out_uint8(s, 0); + + ber_out_header(s, BER_TAG_INTEGER, 1); + out_uint8(s, 1); // connect id + + mcs_out_domain_params(s, 34, 2, 0, 0xffff); // dumdidum? + + ber_out_header(s, BER_TAG_OCTET_STRING, 28); + + out_uint8s(s, 21); // ick + out_uint8(s, 0); + + // server info -- we claim to support RDP5 + out_uint16_le(s, SEC_TAG_SRV_INFO); + out_uint16_le(s, 6); // length + out_uint16_le(s, 5); + + // aiee, no crypto info yet! :-) + + s_mark_end(s); + printf("LEN: %u\n", s->p - s->data); + iso_send(s); + +} + /* Send an EDrq message (ASN.1 PER) */ static void mcs_send_edrq(void)