#include #include #include #include #include #include static const char TEST_MSRC_INCIDENT_PASSWORD_TYPE1[] = "Password1"; static const char TEST_MSRC_INCIDENT_FILE_TYPE1[] = "" "" "" ""; WINPR_PRAGMA_DIAG_PUSH WINPR_PRAGMA_DIAG_IGNORED_UNUSED_CONST_VAR static const BYTE TEST_MSRC_INCIDENT_EXPERT_BLOB_TYPE1[32] = "\x3C\x9C\xAE\x0B\xCE\x7A\xB1\x5C\x8A\xAC\x01\xD6\x76\x04\x5E\xDF" "\x3F\xFA\xF0\x92\xE2\xDE\x36\x8A\x20\x17\xE6\x8A\x0D\xED\x7C\x90"; WINPR_PRAGMA_DIAG_POP static const char TEST_MSRC_INCIDENT_PASSWORD_TYPE2[] = "48BJQ853X3B4"; static const char TEST_MSRC_INCIDENT_FILE_TYPE2[] = "" "" "" ""; /** * Decrypted Connection String 2: * * * * * * */ static const char connectionstr2[] = "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" ""; static const char* fail_tests[] = { "", "(E>" }; static const char connectionstr3[] = "\n" "" ""; static const char connectionpwd3[] = "4X638PTVZTKZ"; static BOOL run_test_parse(wLog* log, const char* input, size_t len, const char* password, BOOL expect) { rdpAssistanceFile* file = freerdp_assistance_file_new(); if (!file) return FALSE; const int status = freerdp_assistance_parse_file_buffer(file, input, len, password); const BOOL success = status >= 0; freerdp_assistance_print_file(file, log, WLOG_INFO); freerdp_assistance_file_free(file); return success == expect; } static BOOL test_file_to_settings(wLog* log, rdpAssistanceFile* file) { rdpSettings* settings = freerdp_settings_new(0); if (!settings) return FALSE; const BOOL rc = freerdp_assistance_populate_settings_from_assistance_file(file, settings); freerdp_settings_free(settings); return rc; } static BOOL test_file_from_buffer(wLog* log, const char* data, size_t size, const char* pwd) { BOOL rc = FALSE; int status = 0; char* pass = NULL; char* expertBlob = NULL; const char* EncryptedPassStub = NULL; size_t EncryptedPassStubLength = 0; rdpAssistanceFile* file = freerdp_assistance_file_new(); if (!file) return FALSE; status = freerdp_assistance_parse_file_buffer(file, data, size, pwd); WLog_Print(log, WLOG_INFO, "freerdp_assistance_parse_file_buffer: %d", status); if (status < 0) goto fail; freerdp_assistance_print_file(file, WLog_Get("foo"), WLOG_INFO); if (!freerdp_assistance_get_encrypted_pass_stub(file, &EncryptedPassStub, &EncryptedPassStubLength)) goto fail; if (EncryptedPassStubLength > 0) { pass = freerdp_assistance_bin_to_hex_string(EncryptedPassStub, EncryptedPassStubLength); if (!pass) goto fail; WLog_Print(log, WLOG_INFO, "freerdp_assistance_decrypt: %d %s [%" PRIdz "]", status, pass, EncryptedPassStubLength); expertBlob = freerdp_assistance_construct_expert_blob("Edgar Olougouna", pass); WLog_Print(log, WLOG_INFO, "expertBlob='%s'", expertBlob); } rc = test_file_to_settings(log, file); fail: freerdp_assistance_file_free(file); free(pass); free(expertBlob); return rc; } static BOOL test_msrsc_incident_file_type1(wLog* log) { return test_file_from_buffer(log, TEST_MSRC_INCIDENT_FILE_TYPE1, sizeof(TEST_MSRC_INCIDENT_FILE_TYPE1), TEST_MSRC_INCIDENT_PASSWORD_TYPE1); } static BOOL test_msrsc_incident_file_type2(wLog* log) { if (!test_file_from_buffer(log, connectionstr2, sizeof(connectionstr2), TEST_MSRC_INCIDENT_PASSWORD_TYPE2)) return FALSE; if (!test_file_from_buffer(log, connectionstr3, sizeof(connectionstr3), connectionpwd3)) return FALSE; if (!test_file_from_buffer(log, TEST_MSRC_INCIDENT_FILE_TYPE2, sizeof(TEST_MSRC_INCIDENT_FILE_TYPE2), TEST_MSRC_INCIDENT_PASSWORD_TYPE2)) return FALSE; return TRUE; } int TestCommonAssistance(int argc, char* argv[]) { wLog* log = NULL; WINPR_UNUSED(argc); WINPR_UNUSED(argv); log = WLog_Get(__func__); winpr_InitializeSSL(WINPR_SSL_INIT_DEFAULT); for (size_t x = 0; x < ARRAYSIZE(fail_tests); x++) { const char* test = fail_tests[x]; const size_t len = strlen(test); if (!run_test_parse(log, test, len + 1, NULL, FALSE)) return -1; } if (!test_msrsc_incident_file_type1(log)) { WLog_Print(log, WLOG_ERROR, "test_msrsc_incident_file_type1 failed"); return -1; } if (!test_msrsc_incident_file_type2(log)) { WLog_Print(log, WLOG_ERROR, "test_msrsc_incident_file_type2 failed"); return -1; } return 0; }