From bceec083677a609ba2f06cc75924ab0accac5388 Mon Sep 17 00:00:00 2001 From: Simon Engledew Date: Wed, 22 May 2013 14:20:26 +0100 Subject: [PATCH] Finished merging missing changes from pull request #1257 (https://github.com/FreeRDP/FreeRDP/pull/1257 - commit 0dc22d5). Correctly report the length of ts_password_creds. --- libfreerdp/core/nla.c | 30 ++++++++++-------------------- libfreerdp/crypto/ber.c | 6 ++++-- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/libfreerdp/core/nla.c b/libfreerdp/core/nla.c index e133b55f1..78e7724fc 100644 --- a/libfreerdp/core/nla.c +++ b/libfreerdp/core/nla.c @@ -788,22 +788,11 @@ SECURITY_STATUS credssp_decrypt_public_key_echo(rdpCredssp* credssp) int credssp_sizeof_ts_password_creds(rdpCredssp* credssp) { - int length; - int ts_password_creds_length = 0; + int length = 0; - length = ber_sizeof_octet_string(credssp->identity.DomainLength * 2); - length += ber_sizeof_contextual_tag(length); - ts_password_creds_length += length; - - length = ber_sizeof_octet_string(credssp->identity.UserLength * 2); - length += ber_sizeof_contextual_tag(length); - ts_password_creds_length += length; - - length = ber_sizeof_octet_string(credssp->identity.PasswordLength * 2); - length += ber_sizeof_contextual_tag(length); - ts_password_creds_length += length; - - length = ber_sizeof_sequence(ts_password_creds_length); + length += ber_sizeof_sequence_octet_string(credssp->identity.DomainLength * 2); + length += ber_sizeof_sequence_octet_string(credssp->identity.UserLength * 2); + length += ber_sizeof_sequence_octet_string(credssp->identity.PasswordLength * 2); return length; } @@ -850,11 +839,6 @@ int credssp_write_ts_password_creds(rdpCredssp* credssp, wStream* s) int size = 0; int innerSize = credssp_sizeof_ts_password_creds(credssp); - if (innerSize > Stream_GetRemainingLength(s)) - { - printf("\033[91m[ ERROR ] Not enough space allocated for ts_password_creds\033[0m"); - } - /* TSPasswordCreds (SEQUENCE) */ size += ber_write_sequence_tag(s, innerSize); @@ -1102,6 +1086,8 @@ void credssp_send(rdpCredssp* credssp) length -= ber_write_sequence_tag(s, ber_sizeof_sequence(ber_sizeof_sequence_octet_string(credssp->negoToken.cbBuffer))); /* SEQUENCE OF NegoDataItem */ length -= ber_write_sequence_tag(s, ber_sizeof_sequence_octet_string(credssp->negoToken.cbBuffer)); /* NegoDataItem */ length -= ber_write_sequence_octet_string(s, 0, (BYTE*) credssp->negoToken.pvBuffer, credssp->negoToken.cbBuffer); /* OCTET STRING */ + + // assert length == 0 } /* [2] authInfo (OCTET STRING) */ @@ -1109,6 +1095,8 @@ void credssp_send(rdpCredssp* credssp) { length = auth_info_length; length -= ber_write_sequence_octet_string(s, 2, credssp->authInfo.pvBuffer, credssp->authInfo.cbBuffer); + + // assert length == 0 } /* [3] pubKeyAuth (OCTET STRING) */ @@ -1116,6 +1104,8 @@ void credssp_send(rdpCredssp* credssp) { length = pub_key_auth_length; length -= ber_write_sequence_octet_string(s, 3, credssp->pubKeyAuth.pvBuffer, credssp->pubKeyAuth.cbBuffer); + + // assert length == 0 } transport_write(credssp->transport, s); diff --git a/libfreerdp/crypto/ber.c b/libfreerdp/crypto/ber.c index 2e8748a6e..38d98f411 100644 --- a/libfreerdp/crypto/ber.c +++ b/libfreerdp/crypto/ber.c @@ -419,22 +419,23 @@ BOOL ber_read_integer(wStream* s, UINT32* value) int ber_write_integer(wStream* s, UINT32 value) { - ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE); - if (value < 0x80) { + ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE); ber_write_length(s, 1); Stream_Write_UINT8(s, value); return 3; } else if (value < 0x8000) { + ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE); ber_write_length(s, 2); Stream_Write_UINT16_BE(s, value); return 4; } else if (value < 0x800000) { + ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE); ber_write_length(s, 3); Stream_Write_UINT8(s, (value >> 16)); Stream_Write_UINT16_BE(s, (value & 0xFFFF)); @@ -442,6 +443,7 @@ int ber_write_integer(wStream* s, UINT32 value) } else if (value < 0x80000000) { + ber_write_universal_tag(s, BER_TAG_INTEGER, FALSE); ber_write_length(s, 4); Stream_Write_UINT32_BE(s, value); return 6;