Refactor of writing utf16 strings to packets.

This remove the use of deprecated rdp_out_unistr() and
some minor cleanups.
This commit is contained in:
Henrik Andersson 2017-09-29 15:16:43 +02:00
parent e35a76bce2
commit e195953496

39
cssp.c
View File

@ -225,10 +225,11 @@ cssp_encode_tspasswordcreds(char *username, char *password, char *domain)
memset(&tmp, 0, sizeof(tmp)); memset(&tmp, 0, sizeof(tmp));
memset(&message, 0, sizeof(message)); memset(&message, 0, sizeof(message));
s_realloc(&tmp, 512 * 4);
// domainName [0] // domainName [0]
s_realloc(&tmp, 4 + strlen(domain) * sizeof(uint16));
s_reset(&tmp); s_reset(&tmp);
rdp_out_unistr(&tmp, domain, strlen(domain) * sizeof(uint16)); out_utf16s(&tmp, domain);
s_mark_end(&tmp); s_mark_end(&tmp);
h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp); h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp);
h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 0, h2); h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 0, h2);
@ -239,9 +240,8 @@ cssp_encode_tspasswordcreds(char *username, char *password, char *domain)
s_free(h1); s_free(h1);
// userName [1] // userName [1]
s_realloc(&tmp, 4 + strlen(username) * sizeof(uint16));
s_reset(&tmp); s_reset(&tmp);
rdp_out_unistr(&tmp, username, strlen(username) * sizeof(uint16)); out_utf16s(&tmp, username);
s_mark_end(&tmp); s_mark_end(&tmp);
h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp); h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp);
@ -253,9 +253,8 @@ cssp_encode_tspasswordcreds(char *username, char *password, char *domain)
s_free(h1); s_free(h1);
// password [2] // password [2]
s_realloc(&tmp, 4 + strlen(password) * sizeof(uint16));
s_reset(&tmp); s_reset(&tmp);
rdp_out_unistr(&tmp, password, strlen(password) * sizeof(uint16)); out_utf16s(&tmp, password);
s_mark_end(&tmp); s_mark_end(&tmp);
h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp); h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp);
h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 2, h2); h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 2, h2);
@ -287,8 +286,9 @@ cssp_encode_tscspdatadetail(unsigned char keyspec, char *card, char *reader, cha
struct stream tmp = { 0 }; struct stream tmp = { 0 };
struct stream message = { 0 }; struct stream message = { 0 };
s_realloc(&tmp, 512 * 4);
// keySpec [0] // keySpec [0]
s_realloc(&tmp, sizeof(uint8));
s_reset(&tmp); s_reset(&tmp);
out_uint8(&tmp, keyspec); out_uint8(&tmp, keyspec);
s_mark_end(&tmp); s_mark_end(&tmp);
@ -303,9 +303,8 @@ cssp_encode_tscspdatadetail(unsigned char keyspec, char *card, char *reader, cha
// cardName [1] // cardName [1]
if (card) if (card)
{ {
s_realloc(&tmp, 4 + strlen(card) * sizeof(uint16));
s_reset(&tmp); s_reset(&tmp);
rdp_out_unistr(&tmp, card, strlen(card) * sizeof(uint16)); out_utf16s(&tmp, card);
s_mark_end(&tmp); s_mark_end(&tmp);
h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp); h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp);
h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 1, h2); h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 1, h2);
@ -319,9 +318,8 @@ cssp_encode_tscspdatadetail(unsigned char keyspec, char *card, char *reader, cha
// readerName [2] // readerName [2]
if (reader) if (reader)
{ {
s_realloc(&tmp, 4 + strlen(reader) * sizeof(uint16));
s_reset(&tmp); s_reset(&tmp);
rdp_out_unistr(&tmp, reader, strlen(reader) * sizeof(uint16)); out_utf16s(&tmp, reader);
s_mark_end(&tmp); s_mark_end(&tmp);
h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp); h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp);
h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 2, h2); h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 2, h2);
@ -335,9 +333,8 @@ cssp_encode_tscspdatadetail(unsigned char keyspec, char *card, char *reader, cha
// containerName [3] // containerName [3]
if (container) if (container)
{ {
s_realloc(&tmp, 4 + strlen(container) * sizeof(uint16));
s_reset(&tmp); s_reset(&tmp);
rdp_out_unistr(&tmp, container, strlen(container) * sizeof(uint16)); out_utf16s(&tmp, container);
s_mark_end(&tmp); s_mark_end(&tmp);
h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp); h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp);
h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 3, h2); h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 3, h2);
@ -351,9 +348,8 @@ cssp_encode_tscspdatadetail(unsigned char keyspec, char *card, char *reader, cha
// cspName [4] // cspName [4]
if (csp) if (csp)
{ {
s_realloc(&tmp, 4 + strlen(csp) * sizeof(uint16));
s_reset(&tmp); s_reset(&tmp);
rdp_out_unistr(&tmp, csp, strlen(csp) * sizeof(uint16)); out_utf16s(&tmp, csp);
s_mark_end(&tmp); s_mark_end(&tmp);
h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp); h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp);
h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 4, h2); h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 4, h2);
@ -382,10 +378,11 @@ cssp_encode_tssmartcardcreds(char *username, char *password, char *domain)
struct stream tmp = { 0 }; struct stream tmp = { 0 };
struct stream message = { 0 }; struct stream message = { 0 };
s_realloc(&tmp, 512 * 4);
// pin [0] // pin [0]
s_realloc(&tmp, strlen(password) * sizeof(uint16));
s_reset(&tmp); s_reset(&tmp);
rdp_out_unistr(&tmp, password, strlen(password) * sizeof(uint16)); out_utf16s(&tmp, password);
s_mark_end(&tmp); s_mark_end(&tmp);
h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp); h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp);
h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 0, h2); h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 0, h2);
@ -395,7 +392,7 @@ cssp_encode_tssmartcardcreds(char *username, char *password, char *domain)
s_free(h2); s_free(h2);
s_free(h1); s_free(h1);
// cspData[1] // cspData [1]
h2 = cssp_encode_tscspdatadetail(AT_KEYEXCHANGE, g_sc_card_name, g_sc_reader_name, h2 = cssp_encode_tscspdatadetail(AT_KEYEXCHANGE, g_sc_card_name, g_sc_reader_name,
g_sc_container_name, g_sc_csp_name); g_sc_container_name, g_sc_csp_name);
h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 1, h2); h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 1, h2);
@ -408,9 +405,8 @@ cssp_encode_tssmartcardcreds(char *username, char *password, char *domain)
// userHint [2] // userHint [2]
if (username && strlen(username)) if (username && strlen(username))
{ {
s_realloc(&tmp, strlen(username) * sizeof(uint16));
s_reset(&tmp); s_reset(&tmp);
rdp_out_unistr(&tmp, username, strlen(username) * sizeof(uint16)); out_utf16s(&tmp, username);
s_mark_end(&tmp); s_mark_end(&tmp);
h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp); h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp);
h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 2, h2); h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 2, h2);
@ -424,9 +420,8 @@ cssp_encode_tssmartcardcreds(char *username, char *password, char *domain)
// domainHint [3] // domainHint [3]
if (domain && strlen(domain)) if (domain && strlen(domain))
{ {
s_realloc(&tmp, strlen(domain) * sizeof(uint16));
s_reset(&tmp); s_reset(&tmp);
rdp_out_unistr(&tmp, domain, strlen(domain) * sizeof(uint16)); out_utf16s(&tmp, domain);
s_mark_end(&tmp); s_mark_end(&tmp);
h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp); h2 = ber_wrap_hdr_data(BER_TAG_OCTET_STRING, &tmp);
h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 3, h2); h1 = ber_wrap_hdr_data(BER_TAG_CTXT_SPECIFIC | BER_TAG_CONSTRUCTED | 3, h2);