From 00cbfdb2af907143682f5578d28faa4c0ee446bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Tue, 12 Mar 2013 17:57:16 -0400 Subject: [PATCH 01/12] winpr-makecert: start implementing --- winpr/tools/makecert/makecert.c | 158 ++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/winpr/tools/makecert/makecert.c b/winpr/tools/makecert/makecert.c index 033b45207..0ee28c72c 100644 --- a/winpr/tools/makecert/makecert.c +++ b/winpr/tools/makecert/makecert.c @@ -24,6 +24,13 @@ #include #include +#include +#include +#include + +X509* x509 = NULL; +EVP_PKEY* pkey = NULL; + COMMAND_LINE_ARGUMENT_A args[] = { /* Basic Options */ @@ -200,12 +207,161 @@ int makecert_print_command_line_help(int argc, char** argv) return 1; } +int add_ext(X509* cert, int nid, char* value) +{ + X509V3_CTX ctx; + X509_EXTENSION* ext; + + X509V3_set_ctx_nodb(&ctx); + + X509V3_set_ctx(&ctx, cert, cert, NULL, NULL, 0); + ext = X509V3_EXT_conf_nid(NULL, &ctx, nid, value); + + if (!ext) + return 0; + + X509_add_ext(cert, ext, -1); + X509_EXTENSION_free(ext); + + return 1; +} + +static void generate_callback(int p, int n, void* arg) +{ + char c = 'B'; + + if (p == 0) + c = '.'; + if (p == 1) + c = '+'; + if (p == 2) + c = '*'; + if (p == 3) + c = '\n'; + + fputc(c, stderr); +} + +char* x509_name_parse(char* name, char* txt, int* length) +{ + char* p; + char* entry; + + p = strstr(name, txt); + + if (!p) + return NULL; + + entry = p + strlen(txt) + 1; + + p = strchr(entry, '='); + + if (!p) + *length = strlen(entry); + else + *length = p - entry; + + return entry; +} + +int makecert(int bits, int serial, int days) +{ + BIO* bio; + int length; + char* entry; + RSA* rsa = NULL; + X509_NAME* name = NULL; + COMMAND_LINE_ARGUMENT_A* arg; + + CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); + bio = BIO_new_fp(stderr, BIO_NOCLOSE); + + if (!pkey) + pkey = EVP_PKEY_new(); + + if (!pkey) + return -1; + + if (!x509) + x509 = X509_new(); + + if (!x509) + return -1; + + rsa = RSA_generate_key(bits, RSA_F4, generate_callback, NULL); + + if (!EVP_PKEY_assign_RSA(pkey, rsa)) + return -1; + + rsa = NULL; + + X509_set_version(x509, 2); + ASN1_INTEGER_set(X509_get_serialNumber(x509), serial); + X509_gmtime_adj(X509_get_notBefore(x509), 0); + X509_gmtime_adj(X509_get_notAfter(x509), (long) 60 * 60 * 24 * days); + X509_set_pubkey(x509, pkey); + + name = X509_get_subject_name(x509); + + arg = CommandLineFindArgumentA(args, "n"); + + if (!(arg->Flags & COMMAND_LINE_VALUE_PRESENT)) + { + printf("Error: no certificate name was given\n"); + return -1; + } + + entry = x509_name_parse(arg->Value, "CN", &length); + + if (!entry) + { + printf("Error: no common name was given\n"); + return -1; + } + + X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); + + X509_set_issuer_name(x509, name); + + add_ext(x509, NID_basic_constraints, "critical,CA:TRUE"); + add_ext(x509, NID_key_usage, "critical,keyCertSign,cRLSign"); + add_ext(x509, NID_subject_key_identifier, "hash"); + + if (!X509_sign(x509, pkey, EVP_md5())) + return -1; + + /** + * Print Certificate + */ + + RSA_print_fp(stdout, pkey->pkey.rsa, 0); + X509_print_fp(stdout, x509); + + PEM_write_PrivateKey(stdout, pkey, NULL, NULL, 0, NULL, NULL); + PEM_write_X509(stdout, x509); + + X509_free(x509); + EVP_PKEY_free(pkey); + + CRYPTO_cleanup_all_ex_data(); + + CRYPTO_mem_leaks(bio); + BIO_free(bio); + + return 0; +} + int main(int argc, char* argv[]) { int status; DWORD flags; COMMAND_LINE_ARGUMENT_A* arg; + /** + * makecert -r -pe -n "CN=%COMPUTERNAME%" -eku 1.3.6.1.5.5.7.3.1 -ss my -sr LocalMachine + * -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 + */ + flags = COMMAND_LINE_SEPARATOR_SPACE | COMMAND_LINE_SIGIL_DASH; status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags, NULL, NULL, NULL); @@ -380,6 +536,8 @@ int main(int argc, char* argv[]) } while ((arg = CommandLineFindNextArgumentA(arg)) != NULL); + makecert(512, 0, 365); + return 0; } From 91c12fa31292a7d75a055c2eae3e33f55ac55d3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Tue, 12 Mar 2013 21:53:41 -0400 Subject: [PATCH 02/12] makecert: accept more parameters --- winpr/tools/makecert/makecert.c | 82 ++++++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 23 deletions(-) diff --git a/winpr/tools/makecert/makecert.c b/winpr/tools/makecert/makecert.c index 0ee28c72c..fee3ba4bd 100644 --- a/winpr/tools/makecert/makecert.c +++ b/winpr/tools/makecert/makecert.c @@ -207,7 +207,7 @@ int makecert_print_command_line_help(int argc, char** argv) return 1; } -int add_ext(X509* cert, int nid, char* value) +int x509_add_ext(X509* cert, int nid, char* value) { X509V3_CTX ctx; X509_EXTENSION* ext; @@ -226,22 +226,6 @@ int add_ext(X509* cert, int nid, char* value) return 1; } -static void generate_callback(int p, int n, void* arg) -{ - char c = 'B'; - - if (p == 0) - c = '.'; - if (p == 1) - c = '+'; - if (p == 2) - c = '*'; - if (p == 3) - c = '\n'; - - fputc(c, stderr); -} - char* x509_name_parse(char* name, char* txt, int* length) { char* p; @@ -269,8 +253,10 @@ int makecert(int bits, int serial, int days) BIO* bio; int length; char* entry; + int key_length; RSA* rsa = NULL; X509_NAME* name = NULL; + const EVP_MD* md = NULL; COMMAND_LINE_ARGUMENT_A* arg; CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); @@ -288,7 +274,16 @@ int makecert(int bits, int serial, int days) if (!x509) return -1; - rsa = RSA_generate_key(bits, RSA_F4, generate_callback, NULL); + key_length = 2048; + + arg = CommandLineFindArgumentA(args, "len"); + + if (arg->Flags & COMMAND_LINE_VALUE_PRESENT) + { + key_length = atoi(arg->Value); + } + + rsa = RSA_generate_key(key_length, RSA_F4, NULL, NULL); if (!EVP_PKEY_assign_RSA(pkey, rsa)) return -1; @@ -311,6 +306,31 @@ int makecert(int bits, int serial, int days) return -1; } + entry = x509_name_parse(arg->Value, "C", &length); + + if (entry) + X509_NAME_add_entry_by_txt(name, "C", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); + + entry = x509_name_parse(arg->Value, "ST", &length); + + if (entry) + X509_NAME_add_entry_by_txt(name, "ST", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); + + entry = x509_name_parse(arg->Value, "L", &length); + + if (entry) + X509_NAME_add_entry_by_txt(name, "L", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); + + entry = x509_name_parse(arg->Value, "O", &length); + + if (entry) + X509_NAME_add_entry_by_txt(name, "O", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); + + entry = x509_name_parse(arg->Value, "OU", &length); + + if (entry) + X509_NAME_add_entry_by_txt(name, "OU", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); + entry = x509_name_parse(arg->Value, "CN", &length); if (!entry) @@ -323,18 +343,34 @@ int makecert(int bits, int serial, int days) X509_set_issuer_name(x509, name); - add_ext(x509, NID_basic_constraints, "critical,CA:TRUE"); - add_ext(x509, NID_key_usage, "critical,keyCertSign,cRLSign"); - add_ext(x509, NID_subject_key_identifier, "hash"); + x509_add_ext(x509, NID_ext_key_usage, "serverAuth"); + x509_add_ext(x509, NID_key_usage, "keyEncipherment,dataEncipherment"); - if (!X509_sign(x509, pkey, EVP_md5())) + arg = CommandLineFindArgumentA(args, "a"); + + md = EVP_sha1(); + + if (arg->Flags & COMMAND_LINE_VALUE_PRESENT) + { + if (strcmp(arg->Value, "md5") == 0) + md = EVP_md5(); + else if (strcmp(arg->Value, "sha1") == 0) + md = EVP_sha1(); + else if (strcmp(arg->Value, "sha256") == 0) + md = EVP_sha256(); + else if (strcmp(arg->Value, "sha384") == 0) + md = EVP_sha384(); + else if (strcmp(arg->Value, "sha512") == 0) + md = EVP_sha512(); + } + + if (!X509_sign(x509, pkey, md)) return -1; /** * Print Certificate */ - RSA_print_fp(stdout, pkey->pkey.rsa, 0); X509_print_fp(stdout, x509); PEM_write_PrivateKey(stdout, pkey, NULL, NULL, 0, NULL, NULL); From 9eaa530d496fedbb7eca2e5155484a8de080662b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 13 Mar 2013 00:26:10 -0400 Subject: [PATCH 03/12] makecert: generate self-signed RDP certificate --- winpr/include/winpr/sysinfo.h | 48 ++++---- winpr/libwinpr/sysinfo/sysinfo.c | 36 ++++++ winpr/tools/makecert/.gitignore | 2 + winpr/tools/makecert/makecert.c | 182 ++++++++++++++++++++++--------- 4 files changed, 197 insertions(+), 71 deletions(-) diff --git a/winpr/include/winpr/sysinfo.h b/winpr/include/winpr/sysinfo.h index 6d681cdaa..679294b6a 100644 --- a/winpr/include/winpr/sysinfo.h +++ b/winpr/include/winpr/sysinfo.h @@ -221,11 +221,11 @@ WINPR_API BOOL IsProcessorFeaturePresent(DWORD ProcessorFeature); #define PF_COMPARE_EXCHANGE_DOUBLE 2 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3 #define PF_PPC_MOVEMEM_64BIT_OK 4 -#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6 //sse +#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6 /* SSE */ #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8 #define PF_PAE_ENABLED 9 -#define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10 //sse2 +#define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10 /* SSE2 */ #define PF_SSE_DAZ_MODE_AVAILABLE 11 #define PF_NX_ENABLED 12 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13 @@ -279,26 +279,34 @@ WINPR_API BOOL IsProcessorFeaturePresent(DWORD ProcessorFeature); #endif +#if (!defined(_WIN32)) || (defined(_WIN32) && (_WIN32_WINNT < 0x0600)) + +WINPR_API ULONGLONG GetTickCount64(void); + +#endif + WINPR_API BOOL IsProcessorFeaturePresentEx(DWORD ProcessorFeature); -// extended flags -#define PF_EX_3DNOW_PREFETCH 1 -#define PF_EX_SSSE3 2 -#define PF_EX_SSE41 3 -#define PF_EX_SSE42 4 -#define PF_EX_AVX 5 -#define PF_EX_FMA 6 -#define PF_EX_AVX_AES 7 -#define PF_EX_AVX2 8 -#define PF_EX_ARM_VFP1 9 -#define PF_EX_ARM_VFP3D16 10 -#define PF_EX_ARM_VFP4 11 -#define PF_EX_ARM_IDIVA 12 -#define PF_EX_ARM_IDIVT 13 +/* extended flags */ +#define PF_EX_3DNOW_PREFETCH 1 +#define PF_EX_SSSE3 2 +#define PF_EX_SSE41 3 +#define PF_EX_SSE42 4 +#define PF_EX_AVX 5 +#define PF_EX_FMA 6 +#define PF_EX_AVX_AES 7 +#define PF_EX_AVX2 8 +#define PF_EX_ARM_VFP1 9 +#define PF_EX_ARM_VFP3D16 10 +#define PF_EX_ARM_VFP4 11 +#define PF_EX_ARM_IDIVA 12 +#define PF_EX_ARM_IDIVT 13 -// some "aliases" for the standard defines -// to be more clear -#define PF_SSE_INSTRUCTIONS_AVAILABLE PF_XMMI_INSTRUCTIONS_AVAILABLE -#define PF_SSE2_INSTRUCTIONS_AVAILABLE PF_XMMI64_INSTRUCTIONS_AVAILABLE +/* + * some "aliases" for the standard defines + * to be more clear + */ +#define PF_SSE_INSTRUCTIONS_AVAILABLE PF_XMMI_INSTRUCTIONS_AVAILABLE +#define PF_SSE2_INSTRUCTIONS_AVAILABLE PF_XMMI64_INSTRUCTIONS_AVAILABLE #endif /* WINPR_SYSINFO_H */ diff --git a/winpr/libwinpr/sysinfo/sysinfo.c b/winpr/libwinpr/sysinfo/sysinfo.c index afd10ebe6..947dc2490 100644 --- a/winpr/libwinpr/sysinfo/sysinfo.c +++ b/winpr/libwinpr/sysinfo/sysinfo.c @@ -340,6 +340,42 @@ DWORD GetTickCount(void) } #endif // _WIN32 +#if (!defined(_WIN32)) || (defined(_WIN32) && (_WIN32_WINNT < 0x0600)) + +ULONGLONG GetTickCount64(void) +{ + ULONGLONG ticks = 0; + +#if defined(__linux__) + + struct timespec ts; + + if (!clock_gettime(CLOCK_MONOTONIC_RAW, &ts)) + ticks = (ts.tv_sec * 1000) + (ts.tv_nsec / 1000000); + +#elif defined(_WIN32) + + ticks = (ULONGLONG) GetTickCount(); + +#else + + /** + * FIXME: this is relative to the Epoch time, and we + * need to return a value relative to the system uptime. + */ + + struct timeval tv; + + if (!gettimeofday(&tv, NULL)) + ticks = (tv.tv_sec * 1000) + (tv.tv_usec / 1000); + +#endif + + return ticks; +} + +#endif + /* If x86 */ #ifdef _M_IX86_AMD64 diff --git a/winpr/tools/makecert/.gitignore b/winpr/tools/makecert/.gitignore index 5fc75d46b..e46d9e979 100644 --- a/winpr/tools/makecert/.gitignore +++ b/winpr/tools/makecert/.gitignore @@ -1,2 +1,4 @@ winpr-makecert +*.key +*.crt diff --git a/winpr/tools/makecert/makecert.c b/winpr/tools/makecert/makecert.c index fee3ba4bd..f854a022b 100644 --- a/winpr/tools/makecert/makecert.c +++ b/winpr/tools/makecert/makecert.c @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -30,20 +31,24 @@ X509* x509 = NULL; EVP_PKEY* pkey = NULL; +char* output_file = NULL; COMMAND_LINE_ARGUMENT_A args[] = { /* Basic Options */ + { "rdp", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, + "Generate certificate with required options for RDP usage." + }, { "n", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, - "Specifies the subject's certificate name. This name must conform to the X.500 standard." + "Specifies the subject's certificate name. This name must conform to the X.500 standard. " "The simplest method is to specify the name in double quotes, preceded by CN=; for example, -n \"CN=myName\"." }, { "pe", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, "Marks the generated private key as exportable. This allows the private key to be included in the certificate." }, { "sk", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, - "Specifies the subject's key container location, which contains the private key." + "Specifies the subject's key container location, which contains the private key. " "If a key container does not exist, it will be created." }, { "sr", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, @@ -93,7 +98,7 @@ COMMAND_LINE_ARGUMENT_A args[] = "Specifies the issuer's key type, which must be one of the following: " "signature (which indicates that the key is used for a digital signature), " "exchange (which indicates that the key is used for key encryption and key exchange), " - "or an integer that represents a provider type." + "or an integer that represents a provider type. " "By default, you can pass 1 for an exchange key or 2 for a signature key." }, { "in", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, @@ -248,17 +253,35 @@ char* x509_name_parse(char* name, char* txt, int* length) return entry; } -int makecert(int bits, int serial, int days) +char* x509_get_default_name() +{ + DWORD nSize = 0; + char* ComputerName; + + GetComputerNameExA(ComputerNameNetBIOS, NULL, &nSize); + ComputerName = (char*) malloc(nSize); + GetComputerNameExA(ComputerNameNetBIOS, ComputerName, &nSize); + + return ComputerName; +} + +int makecert() { BIO* bio; + FILE* fp; int length; char* entry; int key_length; + char* filename; RSA* rsa = NULL; + long serial = 0; + char* default_name; X509_NAME* name = NULL; const EVP_MD* md = NULL; COMMAND_LINE_ARGUMENT_A* arg; + default_name = x509_get_default_name(); + CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); bio = BIO_new_fp(stderr, BIO_NOCLOSE); @@ -291,55 +314,68 @@ int makecert(int bits, int serial, int days) rsa = NULL; X509_set_version(x509, 2); + + arg = CommandLineFindArgumentA(args, "#"); + + if (arg->Flags & COMMAND_LINE_VALUE_PRESENT) + serial = atoi(arg->Value); + else + serial = (long) GetTickCount64(); + ASN1_INTEGER_set(X509_get_serialNumber(x509), serial); + X509_gmtime_adj(X509_get_notBefore(x509), 0); - X509_gmtime_adj(X509_get_notAfter(x509), (long) 60 * 60 * 24 * days); + X509_gmtime_adj(X509_get_notAfter(x509), (long) 60 * 60 * 24 * 365); X509_set_pubkey(x509, pkey); name = X509_get_subject_name(x509); arg = CommandLineFindArgumentA(args, "n"); - if (!(arg->Flags & COMMAND_LINE_VALUE_PRESENT)) + if (arg->Flags & COMMAND_LINE_VALUE_PRESENT) { - printf("Error: no certificate name was given\n"); - return -1; + entry = x509_name_parse(arg->Value, "C", &length); + + if (entry) + X509_NAME_add_entry_by_txt(name, "C", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); + + entry = x509_name_parse(arg->Value, "ST", &length); + + if (entry) + X509_NAME_add_entry_by_txt(name, "ST", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); + + entry = x509_name_parse(arg->Value, "L", &length); + + if (entry) + X509_NAME_add_entry_by_txt(name, "L", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); + + entry = x509_name_parse(arg->Value, "O", &length); + + if (entry) + X509_NAME_add_entry_by_txt(name, "O", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); + + entry = x509_name_parse(arg->Value, "OU", &length); + + if (entry) + X509_NAME_add_entry_by_txt(name, "OU", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); + + entry = x509_name_parse(arg->Value, "CN", &length); + + if (!entry) + { + entry = default_name; + length = strlen(entry); + } + + X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); } - - entry = x509_name_parse(arg->Value, "C", &length); - - if (entry) - X509_NAME_add_entry_by_txt(name, "C", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); - - entry = x509_name_parse(arg->Value, "ST", &length); - - if (entry) - X509_NAME_add_entry_by_txt(name, "ST", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); - - entry = x509_name_parse(arg->Value, "L", &length); - - if (entry) - X509_NAME_add_entry_by_txt(name, "L", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); - - entry = x509_name_parse(arg->Value, "O", &length); - - if (entry) - X509_NAME_add_entry_by_txt(name, "O", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); - - entry = x509_name_parse(arg->Value, "OU", &length); - - if (entry) - X509_NAME_add_entry_by_txt(name, "OU", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); - - entry = x509_name_parse(arg->Value, "CN", &length); - - if (!entry) + else { - printf("Error: no common name was given\n"); - return -1; - } + entry = default_name; + length = strlen(entry); - X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); + X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_UTF8, (const unsigned char*) entry, length, -1, 0); + } X509_set_issuer_name(x509, name); @@ -373,12 +409,50 @@ int makecert(int bits, int serial, int days) X509_print_fp(stdout, x509); - PEM_write_PrivateKey(stdout, pkey, NULL, NULL, 0, NULL, NULL); - PEM_write_X509(stdout, x509); + if (!output_file) + output_file = default_name; + + /* + * Output Certificate File + */ + + length = strlen(output_file); + filename = malloc(length + 8); + strcpy(filename, output_file); + strcpy(&filename[length], ".crt"); + fp = fopen(filename, "w+"); + + if (fp) + { + PEM_write_X509(fp, x509); + fclose(fp); + } + + free(filename); + + /** + * Output Private Key File + */ + + length = strlen(output_file); + filename = malloc(length + 8); + strcpy(filename, output_file); + strcpy(&filename[length], ".key"); + fp = fopen(filename, "w+"); + + if (fp) + { + PEM_write_PrivateKey(fp, pkey, NULL, NULL, 0, NULL, NULL); + fclose(fp); + } + + free(filename); X509_free(x509); EVP_PKEY_free(pkey); + free(default_name); + CRYPTO_cleanup_all_ex_data(); CRYPTO_mem_leaks(bio); @@ -387,6 +461,17 @@ int makecert(int bits, int serial, int days) return 0; } +int command_line_pre_filter(void* context, int index, int argc, LPCSTR* argv) +{ + if (index == (argc - 1)) + { + if (argv[index][0] != '-') + output_file = (char*) argv[index]; + } + + return 0; +} + int main(int argc, char* argv[]) { int status; @@ -399,9 +484,9 @@ int main(int argc, char* argv[]) */ flags = COMMAND_LINE_SEPARATOR_SPACE | COMMAND_LINE_SIGIL_DASH; - status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags, NULL, NULL, NULL); + status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags, NULL, command_line_pre_filter, NULL); - if (status == COMMAND_LINE_STATUS_PRINT_HELP) + if (status & COMMAND_LINE_STATUS_PRINT_HELP) { makecert_print_command_line_help(argc, argv); return 0; @@ -414,11 +499,6 @@ int main(int argc, char* argv[]) if (!(arg->Flags & COMMAND_LINE_VALUE_PRESENT)) continue; - if (arg->Flags & COMMAND_LINE_VALUE_REQUIRED) - printf("Argument: %s Value: %s\n", arg->Name, arg->Value); - else - printf("Argument: %s\n", arg->Name); - CommandLineSwitchStart(arg) /* Basic Options */ @@ -572,7 +652,7 @@ int main(int argc, char* argv[]) } while ((arg = CommandLineFindNextArgumentA(arg)) != NULL); - makecert(512, 0, 365); + makecert(); return 0; } From 10e09ed846f2eb129c4eb900fa5b258e6bbff9a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 13 Mar 2013 14:04:18 -0400 Subject: [PATCH 04/12] winpr-makecert: fix CMakeLists.txt --- winpr/tools/makecert/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winpr/tools/makecert/CMakeLists.txt b/winpr/tools/makecert/CMakeLists.txt index c12ff84fe..54f6b629d 100644 --- a/winpr/tools/makecert/CMakeLists.txt +++ b/winpr/tools/makecert/CMakeLists.txt @@ -26,7 +26,7 @@ add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} MODULE winpr - MODULES winpr-utils) + MODULES winpr-crt winpr-utils winpr-sysinfo) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) From 10b48b1af8650fdf155bef0121cf1f0910b31db3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 13 Mar 2013 15:43:44 -0400 Subject: [PATCH 05/12] libfreerdp-core: separate TSG response parsing from receiving --- libfreerdp/core/gateway/tsg.c | 114 +++++++++++++++++----------------- 1 file changed, 58 insertions(+), 56 deletions(-) diff --git a/libfreerdp/core/gateway/tsg.c b/libfreerdp/core/gateway/tsg.c index 45ba5da65..2a9c432cf 100644 --- a/libfreerdp/core/gateway/tsg.c +++ b/libfreerdp/core/gateway/tsg.c @@ -201,14 +201,13 @@ BOOL TsProxyCreateTunnelWriteRequest(rdpTsg* tsg) return TRUE; } -BOOL TsProxyCreateTunnelReadResponse(rdpTsg* tsg) +BOOL TsProxyCreateTunnelReadResponse(rdpTsg* tsg, RPC_PDU* pdu) { BYTE* buffer; UINT32 count; UINT32 length; UINT32 offset; UINT32 Pointer; - RPC_PDU* pdu; PTSG_PACKET packet; UINT32 SwitchValue; rdpRpc* rpc = tsg->rpc; @@ -217,8 +216,6 @@ BOOL TsProxyCreateTunnelReadResponse(rdpTsg* tsg) PTSG_PACKET_CAPS_RESPONSE packetCapsResponse; PTSG_PACKET_QUARENC_RESPONSE packetQuarEncResponse; - pdu = rpc_recv_dequeue_pdu(rpc); - if (!pdu) return FALSE; @@ -467,12 +464,6 @@ BOOL TsProxyCreateTunnel(rdpTsg* tsg, PTSG_PACKET tsgPacket, PTSG_PACKET* tsgPac return FALSE; } - if (!TsProxyCreateTunnelReadResponse(tsg)) - { - printf("TsProxyCreateTunnel: error reading response\n"); - return FALSE; - } - return TRUE; } @@ -541,9 +532,8 @@ BOOL TsProxyAuthorizeTunnelWriteRequest(rdpTsg* tsg, PTUNNEL_CONTEXT_HANDLE_NOSE return TRUE; } -BOOL TsProxyAuthorizeTunnelReadResponse(rdpTsg* tsg) +BOOL TsProxyAuthorizeTunnelReadResponse(rdpTsg* tsg, RPC_PDU* pdu) { - RPC_PDU* pdu; BYTE* buffer; UINT32 length; UINT32 offset; @@ -554,8 +544,6 @@ BOOL TsProxyAuthorizeTunnelReadResponse(rdpTsg* tsg) rdpRpc* rpc = tsg->rpc; PTSG_PACKET_RESPONSE packetResponse; - pdu = rpc_recv_dequeue_pdu(rpc); - if (!pdu) return FALSE; @@ -646,12 +634,6 @@ BOOL TsProxyAuthorizeTunnel(rdpTsg* tsg, PTUNNEL_CONTEXT_HANDLE_NOSERIALIZE tunn return FALSE; } - if (!TsProxyAuthorizeTunnelReadResponse(tsg)) - { - printf("TsProxyAuthorizeTunnel: error reading response\n"); - return FALSE; - } - return TRUE; } @@ -692,9 +674,8 @@ BOOL TsProxyMakeTunnelCallWriteRequest(rdpTsg* tsg, PTUNNEL_CONTEXT_HANDLE_NOSER return TRUE; } -BOOL TsProxyMakeTunnelCallReadResponse(rdpTsg* tsg) +BOOL TsProxyMakeTunnelCallReadResponse(rdpTsg* tsg, RPC_PDU* pdu) { - RPC_PDU* pdu; BYTE* buffer; UINT32 length; UINT32 offset; @@ -703,17 +684,12 @@ BOOL TsProxyMakeTunnelCallReadResponse(rdpTsg* tsg) UINT32 ActualCount; UINT32 SwitchValue; PTSG_PACKET packet; - rdpRpc* rpc = tsg->rpc; PTSG_PACKET_MSG_RESPONSE packetMsgResponse; PTSG_PACKET_STRING_MESSAGE packetStringMessage = NULL; PTSG_PACKET_REAUTH_MESSAGE packetReauthMessage = NULL; /* This is an asynchronous response */ - return TRUE; - - pdu = rpc_recv_dequeue_pdu(rpc); - if (!pdu) return FALSE; @@ -828,12 +804,6 @@ BOOL TsProxyMakeTunnelCall(rdpTsg* tsg, PTUNNEL_CONTEXT_HANDLE_NOSERIALIZE tunne return FALSE; } - if (!TsProxyMakeTunnelCallReadResponse(tsg)) - { - printf("TsProxyMakeTunnelCall: error reading response\n"); - return FALSE; - } - return TRUE; } @@ -892,16 +862,13 @@ BOOL TsProxyCreateChannelWriteRequest(rdpTsg* tsg, PTUNNEL_CONTEXT_HANDLE_NOSERI return TRUE; } -BOOL TsProxyCreateChannelReadResponse(rdpTsg* tsg) +BOOL TsProxyCreateChannelReadResponse(rdpTsg* tsg, RPC_PDU* pdu) { - RPC_PDU* pdu; BYTE* buffer; UINT32 length; UINT32 offset; rdpRpc* rpc = tsg->rpc; - pdu = rpc_recv_dequeue_pdu(rpc); - if (!pdu) return FALSE; @@ -950,12 +917,6 @@ BOOL TsProxyCreateChannel(rdpTsg* tsg, PTUNNEL_CONTEXT_HANDLE_NOSERIALIZE tunnel return FALSE; } - if (!TsProxyCreateChannelReadResponse(tsg)) - { - printf("TsProxyCreateChannel: error reading response\n"); - return FALSE; - } - return TRUE; } @@ -983,9 +944,8 @@ BOOL TsProxyCloseChannelWriteRequest(rdpTsg* tsg, PCHANNEL_CONTEXT_HANDLE_NOSERI return TRUE; } -BOOL TsProxyCloseChannelReadResponse(rdpTsg* tsg) +BOOL TsProxyCloseChannelReadResponse(rdpTsg* tsg, RPC_PDU* pdu) { - RPC_PDU* pdu; BYTE* buffer; UINT32 length; UINT32 offset; @@ -1011,6 +971,8 @@ BOOL TsProxyCloseChannelReadResponse(rdpTsg* tsg) HRESULT TsProxyCloseChannel(rdpTsg* tsg, PCHANNEL_CONTEXT_HANDLE_NOSERIALIZE* context) { + RPC_PDU* pdu = NULL; + /** * HRESULT TsProxyCloseChannel( * [in, out] PCHANNEL_CONTEXT_HANDLE_NOSERIALIZE* context @@ -1025,7 +987,7 @@ HRESULT TsProxyCloseChannel(rdpTsg* tsg, PCHANNEL_CONTEXT_HANDLE_NOSERIALIZE* co return FALSE; } - if (!TsProxyCloseChannelReadResponse(tsg)) + if (!TsProxyCloseChannelReadResponse(tsg, pdu)) { printf("TsProxyCloseChannel: error reading response\n"); return FALSE; @@ -1058,9 +1020,8 @@ BOOL TsProxyCloseTunnelWriteRequest(rdpTsg* tsg, PTUNNEL_CONTEXT_HANDLE_SERIALIZ return TRUE; } -BOOL TsProxyCloseTunnelReadResponse(rdpTsg* tsg) +BOOL TsProxyCloseTunnelReadResponse(rdpTsg* tsg, RPC_PDU* pdu) { - RPC_PDU* pdu; BYTE* buffer; UINT32 length; UINT32 offset; @@ -1086,6 +1047,8 @@ BOOL TsProxyCloseTunnelReadResponse(rdpTsg* tsg) HRESULT TsProxyCloseTunnel(rdpTsg* tsg, PTUNNEL_CONTEXT_HANDLE_SERIALIZE* context) { + RPC_PDU* pdu = NULL; + /** * HRESULT TsProxyCloseTunnel( * [in, out] PTUNNEL_CONTEXT_HANDLE_SERIALIZE* context @@ -1100,7 +1063,7 @@ HRESULT TsProxyCloseTunnel(rdpTsg* tsg, PTUNNEL_CONTEXT_HANDLE_SERIALIZE* contex return FALSE; } - if (!TsProxyCloseTunnelReadResponse(tsg)) + if (!TsProxyCloseTunnelReadResponse(tsg, pdu)) { printf("TsProxyCloseTunnel: error reading response\n"); return FALSE; @@ -1134,7 +1097,7 @@ BOOL TsProxySetupReceivePipeWriteRequest(rdpTsg* tsg) return TRUE; } -BOOL TsProxySetupReceivePipeReadResponse(rdpTsg* tsg) +BOOL TsProxySetupReceivePipeReadResponse(rdpTsg* tsg, RPC_PDU* pdu) { return TRUE; } @@ -1161,17 +1124,12 @@ BOOL TsProxySetupReceivePipe(handle_t IDL_handle, BYTE* pRpcMessage) return FALSE; } - if (!TsProxySetupReceivePipeReadResponse(tsg)) - { - printf("TsProxySetupReceivePipe: error reading response\n"); - return FALSE; - } - return TRUE; } BOOL tsg_connect(rdpTsg* tsg, const char* hostname, UINT16 port) { + RPC_PDU* pdu = NULL; rdpRpc* rpc = tsg->rpc; rdpSettings* settings = rpc->settings; @@ -1240,6 +1198,14 @@ BOOL tsg_connect(rdpTsg* tsg, const char* hostname, UINT16 port) return FALSE; } + pdu = rpc_recv_dequeue_pdu(rpc); + + if (!TsProxyCreateTunnelReadResponse(tsg, pdu)) + { + printf("TsProxyCreateTunnel: error reading response\n"); + return FALSE; + } + tsg->state = TSG_STATE_CONNECTED; /** @@ -1278,6 +1244,14 @@ BOOL tsg_connect(rdpTsg* tsg, const char* hostname, UINT16 port) return FALSE; } + pdu = rpc_recv_dequeue_pdu(rpc); + + if (!TsProxyAuthorizeTunnelReadResponse(tsg, pdu)) + { + printf("TsProxyAuthorizeTunnel: error reading response\n"); + return FALSE; + } + tsg->state = TSG_STATE_AUTHORIZED; /** @@ -1291,6 +1265,16 @@ BOOL tsg_connect(rdpTsg* tsg, const char* hostname, UINT16 port) if (!TsProxyMakeTunnelCall(tsg, &tsg->TunnelContext, TSG_TUNNEL_CALL_ASYNC_MSG_REQUEST, NULL, NULL)) return FALSE; +#if 0 + pdu = rpc_recv_dequeue_pdu(rpc); + + if (!TsProxyMakeTunnelCallReadResponse(tsg, pdu)) + { + printf("TsProxyMakeTunnelCall: error reading response\n"); + return FALSE; + } +#endif + /** * Sequential processing rules for connection process (continued): * @@ -1310,6 +1294,14 @@ BOOL tsg_connect(rdpTsg* tsg, const char* hostname, UINT16 port) if (!TsProxyCreateChannel(tsg, &tsg->TunnelContext, NULL, NULL, NULL)) return FALSE; + pdu = rpc_recv_dequeue_pdu(rpc); + + if (!TsProxyCreateChannelReadResponse(tsg, pdu)) + { + printf("TsProxyCreateChannel: error reading response\n"); + return FALSE; + } + tsg->state = TSG_STATE_CHANNEL_CREATED; /** @@ -1330,6 +1322,16 @@ BOOL tsg_connect(rdpTsg* tsg, const char* hostname, UINT16 port) if (!TsProxySetupReceivePipe((handle_t) tsg, NULL)) return FALSE; +#if 0 + pdu = rpc_recv_dequeue_pdu(rpc); + + if (!TsProxySetupReceivePipeReadResponse(tsg, pdu)) + { + printf("TsProxySetupReceivePipe: error reading response\n"); + return FALSE; + } +#endif + rpc->client->SynchronousSend = TRUE; rpc->client->SynchronousReceive = TRUE; From 140b44006b858ab1d49810731c3da4143a33c2d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 13 Mar 2013 17:43:33 -0400 Subject: [PATCH 06/12] winpr-makecert: fix linking against OpenSSL --- winpr/tools/makecert/CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/winpr/tools/makecert/CMakeLists.txt b/winpr/tools/makecert/CMakeLists.txt index 54f6b629d..33de8ce90 100644 --- a/winpr/tools/makecert/CMakeLists.txt +++ b/winpr/tools/makecert/CMakeLists.txt @@ -21,8 +21,15 @@ set(MODULE_PREFIX "WINPR_TOOLS_MAKECERT") set(${MODULE_PREFIX}_SRCS makecert.c) +include_directories(${ZLIB_INCLUDE_DIRS}) +include_directories(${OPENSSL_INCLUDE_DIR}) + add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) +set(${MODULE_PREFIX}_LIBS + ${ZLIB_LIBRARIES} + ${OPENSSL_LIBRARIES}) + set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} MODULE winpr From f0de7c88a8807ab9bfabf5730257469bb849bde5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 13 Mar 2013 17:55:42 -0400 Subject: [PATCH 07/12] winpr-makecert: fix OpenSSL applink error --- winpr/tools/makecert/makecert.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/winpr/tools/makecert/makecert.c b/winpr/tools/makecert/makecert.c index f854a022b..d5f3db4d7 100644 --- a/winpr/tools/makecert/makecert.c +++ b/winpr/tools/makecert/makecert.c @@ -29,6 +29,8 @@ #include #include +#include + X509* x509 = NULL; EVP_PKEY* pkey = NULL; char* output_file = NULL; From 79638db42c62fcdf523452443fe33b8bbccb5c4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 13 Mar 2013 17:57:13 -0400 Subject: [PATCH 08/12] winpr-makecert: only include OpenSSL's applink.c on Windows --- winpr/tools/makecert/makecert.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/winpr/tools/makecert/makecert.c b/winpr/tools/makecert/makecert.c index d5f3db4d7..ec750d0dc 100644 --- a/winpr/tools/makecert/makecert.c +++ b/winpr/tools/makecert/makecert.c @@ -29,7 +29,9 @@ #include #include +#ifdef _WIN32 #include +#endif X509* x509 = NULL; EVP_PKEY* pkey = NULL; From 7518170cd44b94a40f797c61ef51a70b9003169a Mon Sep 17 00:00:00 2001 From: Martin Fleisz Date: Thu, 14 Mar 2013 09:38:50 -0700 Subject: [PATCH 09/12] winpr: Don't build tools for Android and iOS --- scripts/.gitignore | 1 + winpr/CMakeLists.txt | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/.gitignore b/scripts/.gitignore index 6af50295b..840af4a06 100644 --- a/scripts/.gitignore +++ b/scripts/.gitignore @@ -1 +1,2 @@ !*.sh +regenerate_jni_headers.sh diff --git a/winpr/CMakeLists.txt b/winpr/CMakeLists.txt index 8ad2a6001..226291f57 100644 --- a/winpr/CMakeLists.txt +++ b/winpr/CMakeLists.txt @@ -73,4 +73,6 @@ add_subdirectory(include) add_subdirectory(libwinpr) -add_subdirectory(tools) +if(NOT ANDROID AND NOT IOS) + add_subdirectory(tools) +endif() From 81580f10d910a8e88bc09c1fc692a2e14161ffa1 Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Thu, 14 Mar 2013 23:18:21 +0100 Subject: [PATCH 10/12] winpr/sysinfo: fixed build and detection when build with AVX --- winpr/libwinpr/sysinfo/sysinfo.c | 39 +++++++++++++++----------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/winpr/libwinpr/sysinfo/sysinfo.c b/winpr/libwinpr/sysinfo/sysinfo.c index 947dc2490..59200cc38 100644 --- a/winpr/libwinpr/sysinfo/sysinfo.c +++ b/winpr/libwinpr/sysinfo/sysinfo.c @@ -662,32 +662,29 @@ BOOL IsProcessorFeaturePresentEx(DWORD ProcessorFeature) case PF_EX_AVX_AES: { if ((c & C_BITS_AVX) != C_BITS_AVX) - ret = FALSE; + break; - int e, f; - xgetbv(0, e, f); + int e, f; + xgetbv(0, e, f); - if ((e & E_BITS_AVX) == E_BITS_AVX) + if ((e & E_BITS_AVX) == E_BITS_AVX) + { + switch (ProcessorFeature) { - switch (ProcessorFeature) - { - case: PF_EX_AVX: - ret = TRUE; - break; - case: PF_EX_FMA: - if (c & C_BIT_FMA) - ret = TRUE; - break; - case: PF_EX_AVX_AES: - if (c & C_BIT_AVX_AES) - ret = TRUE; - break; - { + case PF_EX_AVX: ret = TRUE; break; - } - } - } + case PF_EX_FMA: + if (c & C_BIT_FMA) + ret = TRUE; + break; + case PF_EX_AVX_AES: + if (c & C_BIT_AVX_AES) + ret = TRUE; + break; + } + } + } break; #endif //__AVX__ default: From 3bac044825b550fcaa905a3c645a76c8d50c99e1 Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Fri, 15 Mar 2013 01:06:33 +0100 Subject: [PATCH 11/12] winpr/sysinfo: fixes and detection for avx PCLMULQDQ added - fixed defines for avx aes detection - added detection for avx carry less multiplication (PF_EX_AVX_PCLMULQDQ) --- winpr/include/winpr/sysinfo.h | 1 + winpr/libwinpr/sysinfo/sysinfo.c | 17 +++++++++++++---- winpr/libwinpr/sysinfo/test/TestCPUFeatures.c | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/winpr/include/winpr/sysinfo.h b/winpr/include/winpr/sysinfo.h index 679294b6a..0a6ad2e42 100644 --- a/winpr/include/winpr/sysinfo.h +++ b/winpr/include/winpr/sysinfo.h @@ -301,6 +301,7 @@ WINPR_API BOOL IsProcessorFeaturePresentEx(DWORD ProcessorFeature); #define PF_EX_ARM_VFP4 11 #define PF_EX_ARM_IDIVA 12 #define PF_EX_ARM_IDIVT 13 +#define PF_EX_AVX_PCLMULQDQ 14 /* * some "aliases" for the standard defines diff --git a/winpr/libwinpr/sysinfo/sysinfo.c b/winpr/libwinpr/sysinfo/sysinfo.c index 59200cc38..7b6d86df7 100644 --- a/winpr/libwinpr/sysinfo/sysinfo.c +++ b/winpr/libwinpr/sysinfo/sysinfo.c @@ -389,18 +389,20 @@ ULONGLONG GetTickCount64(void) #define D_BIT_SSE2 (1<<26) #define D_BIT_3DN (1<<30) #define C_BIT_SSE3 (1<<0) +#define C_BIT_PCLMULQDQ (1<<1) +#define C_BIT_3DNP (1<<8) #define C_BIT_3DNP (1<<8) #define C_BIT_SSSE3 (1<<9) #define C_BIT_SSE41 (1<<19) #define C_BIT_SSE42 (1<<20) -#define C_BIT_XGETBV (1<<27) +#define C_BIT_FMA (1<<12) +#define C_BIT_AES (1<<25) +#define C_BIT_XGETBV (1<<27) #define C_BIT_AVX (1<<28) #define C_BITS_AVX (C_BIT_XGETBV|C_BIT_AVX) #define E_BIT_XMM (1<<1) #define E_BIT_YMM (1<<2) #define E_BITS_AVX (E_BIT_XMM|E_BIT_YMM) -#define C_BIT_FMA (1<<11) -#define C_BIT_AVX_AES (1<<24) static void cpuid( unsigned info, @@ -660,13 +662,16 @@ BOOL IsProcessorFeaturePresentEx(DWORD ProcessorFeature) case PF_EX_AVX: case PF_EX_FMA: case PF_EX_AVX_AES: + case PF_EX_AVX_PCLMULQDQ: { + /* Check for general AVX support */ if ((c & C_BITS_AVX) != C_BITS_AVX) break; int e, f; xgetbv(0, e, f); + /* XGETBV enabled for applications and XMM/YMM states enabled */ if ((e & E_BITS_AVX) == E_BITS_AVX) { switch (ProcessorFeature) @@ -679,7 +684,11 @@ BOOL IsProcessorFeaturePresentEx(DWORD ProcessorFeature) ret = TRUE; break; case PF_EX_AVX_AES: - if (c & C_BIT_AVX_AES) + if (c & C_BIT_AES) + ret = TRUE; + break; + case PF_EX_AVX_PCLMULQDQ: + if (c & C_BIT_PCLMULQDQ) ret = TRUE; break; } diff --git a/winpr/libwinpr/sysinfo/test/TestCPUFeatures.c b/winpr/libwinpr/sysinfo/test/TestCPUFeatures.c index e7c7e83ea..ccbdbeaea 100644 --- a/winpr/libwinpr/sysinfo/test/TestCPUFeatures.c +++ b/winpr/libwinpr/sysinfo/test/TestCPUFeatures.c @@ -21,6 +21,7 @@ int TestCPUFeatures(int argc, char* argv[]) printf("\tPF_EX_AVX: %s\n", IsProcessorFeaturePresentEx(PF_EX_AVX) ? "yes" : "no"); printf("\tPF_EX_FMA: %s\n", IsProcessorFeaturePresentEx(PF_EX_FMA) ? "yes" : "no"); printf("\tPF_EX_AVX_AES: %s\n", IsProcessorFeaturePresentEx(PF_EX_AVX_AES) ? "yes" : "no"); + printf("\tPF_EX_AVX_PCLMULQDQD: %s\n", IsProcessorFeaturePresentEx(PF_EX_AVX_PCLMULQDQ) ? "yes" : "no"); #elif defined(_M_ARM) printf("\tPF_ARM_NEON_INSTRUCTIONS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE) ? "yes" : "no"); printf("\tPF_ARM_THUMB: %s\n", IsProcessorFeaturePresent(PF_ARM_THUMB) ? "yes" : "no"); From d7b4f68b0c70471f875eeaa93493139b97c41ee1 Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Fri, 15 Mar 2013 01:31:48 +0100 Subject: [PATCH 12/12] winpr/sysinfo: cleaned up cpu flag tests --- winpr/libwinpr/sysinfo/test/TestCPUFeatures.c | 60 ++++++++++--------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/winpr/libwinpr/sysinfo/test/TestCPUFeatures.c b/winpr/libwinpr/sysinfo/test/TestCPUFeatures.c index ccbdbeaea..5f90a63f6 100644 --- a/winpr/libwinpr/sysinfo/test/TestCPUFeatures.c +++ b/winpr/libwinpr/sysinfo/test/TestCPUFeatures.c @@ -3,43 +3,45 @@ #include #include +#define TEST_FEATURE(feature) printf("\t" #feature ": %s\n", IsProcessorFeaturePresent(feature) ? "yes" : "no") +#define TEST_FEATURE_EX(feature) printf("\t" #feature ": %s\n", IsProcessorFeaturePresentEx(feature) ? "yes" : "no") int TestCPUFeatures(int argc, char* argv[]) { printf("Base CPU Flags:\n"); #ifdef _M_IX86_AMD64 - printf("\tPF_MMX_INSTRUCTIONS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_MMX_INSTRUCTIONS_AVAILABLE) ? "yes" : "no"); - printf("\tPF_XMMI_INSTRUCTIONS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE) ? "yes" : "no"); - printf("\tPF_XMMI64_INSTRUCTIONS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE) ? "yes" : "no"); - printf("\tPF_3DNOW_INSTRUCTIONS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_3DNOW_INSTRUCTIONS_AVAILABLE) ? "yes" : "no"); - printf("\tPF_SSE3_INSTRUCTIONS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_SSE3_INSTRUCTIONS_AVAILABLE) ? "yes" : "no"); + TEST_FEATURE(PF_MMX_INSTRUCTIONS_AVAILABLE); + TEST_FEATURE(PF_XMMI_INSTRUCTIONS_AVAILABLE); + TEST_FEATURE(PF_XMMI64_INSTRUCTIONS_AVAILABLE); + TEST_FEATURE(PF_3DNOW_INSTRUCTIONS_AVAILABLE); + TEST_FEATURE(PF_SSE3_INSTRUCTIONS_AVAILABLE); printf("\n"); printf("Extended CPU Flags (not found in windows API):\n"); - printf("\tPF_EX_3DNOW_PREFETCH: %s\n", IsProcessorFeaturePresentEx(PF_EX_3DNOW_PREFETCH) ? "yes" : "no"); - printf("\tPF_EX_SSSE3: %s\n", IsProcessorFeaturePresentEx(PF_EX_SSSE3) ? "yes" : "no"); - printf("\tPF_EX_SSE41: %s\n", IsProcessorFeaturePresentEx(PF_EX_SSE41) ? "yes" : "no"); - printf("\tPF_EX_SSE42: %s\n", IsProcessorFeaturePresentEx(PF_EX_SSE42) ? "yes" : "no"); - printf("\tPF_EX_AVX: %s\n", IsProcessorFeaturePresentEx(PF_EX_AVX) ? "yes" : "no"); - printf("\tPF_EX_FMA: %s\n", IsProcessorFeaturePresentEx(PF_EX_FMA) ? "yes" : "no"); - printf("\tPF_EX_AVX_AES: %s\n", IsProcessorFeaturePresentEx(PF_EX_AVX_AES) ? "yes" : "no"); - printf("\tPF_EX_AVX_PCLMULQDQD: %s\n", IsProcessorFeaturePresentEx(PF_EX_AVX_PCLMULQDQ) ? "yes" : "no"); + TEST_FEATURE_EX(PF_EX_3DNOW_PREFETCH); + TEST_FEATURE_EX(PF_EX_SSSE3); + TEST_FEATURE_EX(PF_EX_SSE41); + TEST_FEATURE_EX(PF_EX_SSE42); + TEST_FEATURE_EX(PF_EX_AVX); + TEST_FEATURE_EX(PF_EX_FMA); + TEST_FEATURE_EX(PF_EX_AVX_AES); + TEST_FEATURE_EX(PF_EX_AVX_PCLMULQDQ); #elif defined(_M_ARM) - printf("\tPF_ARM_NEON_INSTRUCTIONS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE) ? "yes" : "no"); - printf("\tPF_ARM_THUMB: %s\n", IsProcessorFeaturePresent(PF_ARM_THUMB) ? "yes" : "no"); - printf("\tPF_ARM_VFP_32_REGISTERS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_ARM_VFP_32_REGISTERS_AVAILABLE) ? "yes" : "no"); - printf("\tPF_ARM_DIVIDE_INSTRUCTION_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE) ? "yes" : "no"); - printf("\tPF_ARM_VFP3: %s\n", IsProcessorFeaturePresent(PF_ARM_VFP3) ? "yes" : "no"); - printf("\tPF_ARM_THUMB: %s\n", IsProcessorFeaturePresent(PF_ARM_THUMB) ? "yes" : "no"); - printf("\tPF_ARM_JAZELLE: %s\n", IsProcessorFeaturePresent(PF_ARM_JAZELLE) ? "yes" : "no"); - printf("\tPF_ARM_DSP: %s\n", IsProcessorFeaturePresent(PF_ARM_DSP) ? "yes" : "no"); - printf("\tPF_ARM_THUMB2: %s\n", IsProcessorFeaturePresent(PF_ARM_THUMB2) ? "yes" : "no"); - printf("\tPF_ARM_T2EE: %s\n", IsProcessorFeaturePresent(PF_ARM_T2EE) ? "yes" : "no"); - printf("\tPF_ARM_INTEL_WMMX: %s\n", IsProcessorFeaturePresent(PF_ARM_INTEL_WMMX) ? "yes" : "no"); + TEST_FEATURE(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE); + TEST_FEATURE(PF_ARM_THUMB); + TEST_FEATURE(PF_ARM_VFP_32_REGISTERS_AVAILABLE); + TEST_FEATURE(PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE); + TEST_FEATURE(PF_ARM_VFP3); + TEST_FEATURE(PF_ARM_THUMB); + TEST_FEATURE(PF_ARM_JAZELLE); + TEST_FEATURE(PF_ARM_DSP); + TEST_FEATURE(PF_ARM_THUMB2); + TEST_FEATURE(PF_ARM_T2EE); + TEST_FEATURE(PF_ARM_INTEL_WMMX); printf("Extended CPU Flags (not found in windows API):\n"); - printf("\tPF_EX_ARM_VFP1: %s\n", IsProcessorFeaturePresentEx(PF_EX_ARM_VFP1) ? "yes" : "no"); - printf("\tPF_EX_ARM_VFP3D16: %s\n", IsProcessorFeaturePresentEx(PF_EX_ARM_VFP3D16) ? "yes" : "no"); - printf("\tPF_EX_ARM_VFP4: %s\n", IsProcessorFeaturePresentEx(PF_EX_ARM_VFP4) ? "yes" : "no"); - printf("\tPF_EX_ARM_IDIVA: %s\n", IsProcessorFeaturePresentEx(PF_EX_ARM_IDIVA) ? "yes" : "no"); - printf("\tPF_EX_ARM_IDIVT: %s\n", IsProcessorFeaturePresentEx(PF_EX_ARM_IDIVT) ? "yes" : "no"); + TEST_FEATURE_EX(PF_EX_ARM_VFP1); + TEST_FEATURE_EX(PF_EX_ARM_VFP3D16); + TEST_FEATURE_EX(PF_EX_ARM_VFP4); + TEST_FEATURE_EX(PF_EX_ARM_IDIVA); + TEST_FEATURE_EX(PF_EX_ARM_IDIVT); #endif printf("\n"); return 0;