diff --git a/include/freerdp/assistance.h b/include/freerdp/assistance.h index a2fe426d6..20b183b3b 100644 --- a/include/freerdp/assistance.h +++ b/include/freerdp/assistance.h @@ -59,6 +59,7 @@ extern "C" { FREERDP_API BYTE* freerdp_assistance_hex_string_to_bin(const char* str, int* size); FREERDP_API char* freerdp_assistance_bin_to_hex_string(const BYTE* data, int size); +FREERDP_API char* freerdp_assistance_generate_pass_stub(DWORD flags); FREERDP_API char* freerdp_assistance_construct_expert_blob(const char* name, const char* pass); FREERDP_API BYTE* freerdp_assistance_encrypt_pass_stub(const char* password, const char* passStub, int* pEncryptedSize); diff --git a/include/freerdp/channels/remdesk.h b/include/freerdp/channels/remdesk.h index 0400bb9fd..22b6f6db4 100644 --- a/include/freerdp/channels/remdesk.h +++ b/include/freerdp/channels/remdesk.h @@ -25,6 +25,55 @@ #define REMDESK_SVC_CHANNEL_NAME "remdesk" +#define REMDESK_ERROR_NOERROR 0 +#define REMDESK_ERROR_NOINFO 1 +#define REMDESK_ERROR_LOCALNOTERROR 3 +#define REMDESK_ERROR_REMOTEBYUSER 4 +#define REMDESK_ERROR_BYSERVER 5 +#define REMDESK_ERROR_DNSLOOKUPFAILED 6 +#define REMDESK_ERROR_OUTOFMEMORY 7 +#define REMDESK_ERROR_CONNECTIONTIMEDOUT 8 +#define REMDESK_ERROR_SOCKETCONNECTFAILED 9 +#define REMDESK_ERROR_HOSTNOTFOUND 11 +#define REMDESK_ERROR_WINSOCKSENDFAILED 12 +#define REMDESK_ERROR_INVALIDIPADDR 14 +#define REMDESK_ERROR_SOCKETRECVFAILED 15 +#define REMDESK_ERROR_INVALIDENCRYPTION 18 +#define REMDESK_ERROR_GETHOSTBYNAMEFAILED 20 +#define REMDESK_ERROR_LICENSINGFAILED 21 +#define REMDESK_ERROR_ENCRYPTIONERROR 22 +#define REMDESK_ERROR_DECRYPTIONERROR 23 +#define REMDESK_ERROR_INVALIDPARAMETERSTRING 24 +#define REMDESK_ERROR_HELPSESSIONNOTFOUND 25 +#define REMDESK_ERROR_INVALIDPASSWORD 26 +#define REMDESK_ERROR_HELPSESSIONEXPIRED 27 +#define REMDESK_ERROR_CANTOPENRESOLVER 28 +#define REMDESK_ERROR_UNKNOWNSESSMGRERROR 29 +#define REMDESK_ERROR_CANTFORMLINKTOUSERSESSION 30 +#define REMDESK_ERROR_RCPROTOCOLERROR 32 +#define REMDESK_ERROR_RCUNKNOWNERROR 33 +#define REMDESK_ERROR_INTERNALERROR 34 +#define REMDESK_ERROR_HELPEERESPONSEPENDING 35 +#define REMDESK_ERROR_HELPEESAIDYES 36 +#define REMDESK_ERROR_HELPEEALREADYBEINGHELPED 37 +#define REMDESK_ERROR_HELPEECONSIDERINGHELP 38 +#define REMDESK_ERROR_HELPEENEVERRESPONDED 40 +#define REMDESK_ERROR_HELPEESAIDNO 41 +#define REMDESK_ERROR_HELPSESSIONACCESSDENIED 42 +#define REMDESK_ERROR_USERNOTFOUND 43 +#define REMDESK_ERROR_SESSMGRERRORNOTINIT 44 +#define REMDESK_ERROR_SELFHELPNOTSUPPORTED 45 +#define REMDESK_ERROR_INCOMPATIBLEVERSION 47 +#define REMDESK_ERROR_SESSIONNOTCONNECTED 48 +#define REMDESK_ERROR_SYSTEMSHUTDOWN 50 +#define REMDESK_ERROR_STOPLISTENBYUSER 51 +#define REMDESK_ERROR_WINSOCK_FAILED 52 +#define REMDESK_ERROR_MISMATCHPARMS 53 +#define REMDESK_ERROR_PASSWORDS_DONT_MATCH 61 +#define REMDESK_ERROR_SHADOWEND_BASE 300 +#define REMDESK_ERROR_SHADOWEND_CONFIGCHANGE 301 +#define REMDESK_ERROR_SHADOWEND_UNKNOWN 302 + struct _REMDESK_CHANNEL_HEADER { UINT32 DataLength; diff --git a/libfreerdp/common/assistance.c b/libfreerdp/common/assistance.c index efeadaf08..e0da60bf5 100644 --- a/libfreerdp/common/assistance.c +++ b/libfreerdp/common/assistance.c @@ -374,6 +374,54 @@ char* freerdp_assistance_construct_expert_blob(const char* name, const char* pas return ExpertBlob; } +char* freerdp_assistance_generate_pass_stub(DWORD flags) +{ + UINT32 nums[14]; + char* passStub = NULL; + char set1[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789*_"; + char set2[12] = "!@#$&^*()-+="; + char set3[10] = "0123456789"; + char set4[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + char set5[26] = "abcdefghijklmnopqrstuvwxyz"; + + passStub = (char*) malloc(15); + + if (!passStub) + return -1; + + /** + * PassStub generation: + * + * Characters 0 and 5-13 are from the set A-Z a-z 0-9 * _ + * Character 1 is from the set !@#$&^*()-+= + * Character 2 is from the set 0-9 + * Character 3 is from the set A-Z + * Character 4 is from the set a-z + * + * Example: WB^6HsrIaFmEpi + */ + + RAND_bytes((BYTE*) nums, sizeof(nums)); + + passStub[0] = set1[nums[0] % sizeof(set1)]; /* character 0 */ + passStub[1] = set2[nums[1] % sizeof(set2)]; /* character 1 */ + passStub[2] = set3[nums[2] % sizeof(set3)]; /* character 2 */ + passStub[3] = set4[nums[3] % sizeof(set4)]; /* character 3 */ + passStub[4] = set5[nums[4] % sizeof(set5)]; /* character 4 */ + passStub[5] = set1[nums[5] % sizeof(set1)]; /* character 5 */ + passStub[6] = set1[nums[6] % sizeof(set1)]; /* character 6 */ + passStub[7] = set1[nums[7] % sizeof(set1)]; /* character 7 */ + passStub[8] = set1[nums[8] % sizeof(set1)]; /* character 8 */ + passStub[9] = set1[nums[9] % sizeof(set1)]; /* character 9 */ + passStub[10] = set1[nums[10] % sizeof(set1)]; /* character 10 */ + passStub[11] = set1[nums[11] % sizeof(set1)]; /* character 11 */ + passStub[12] = set1[nums[12] % sizeof(set1)]; /* character 12 */ + passStub[13] = set1[nums[13] % sizeof(set1)]; /* character 13 */ + passStub[14] = '\0'; + + return passStub; +} + BYTE* freerdp_assistance_encrypt_pass_stub(const char* password, const char* passStub, int* pEncryptedSize) { int status;