From ac67ca9b596748f6b091ab0044a0dd1a0e47b365 Mon Sep 17 00:00:00 2001 From: LoRd_MuldeR Date: Sun, 27 Jun 2021 15:12:09 +0200 Subject: [PATCH] Use separate macros for fopen("rb") and fopen("wr") operations + don't use _SH_SECURE, because it apparently doesn't work on Windows XP. --- src/codesign_keygen.c | 4 ++-- src/codesign_sign.c | 6 +++--- src/codesign_verify.c | 21 +++++++++++++-------- src/common.c | 43 ++++++++++++++++++++----------------------- src/common.h | 7 ++++++- src/platform.h | 9 ++++----- 6 files changed, 48 insertions(+), 42 deletions(-) diff --git a/src/codesign_keygen.c b/src/codesign_keygen.c index 5c41113..98726d2 100644 --- a/src/codesign_keygen.c +++ b/src/codesign_keygen.c @@ -41,14 +41,14 @@ int MAIN(int argc, CHAR_T *argv[]) /* Open output files */ /*-------------------------------------------------------*/ - file_pubkey = FOPEN(argv[2], T("wb")); + file_pubkey = FOPEN_WR(argv[2]); if (!file_pubkey) { fputs("Error: Failed to open output file for public key!\n\n", stderr); goto clean_up; } - file_privkey = FOPEN(argv[3], T("wb")); + file_privkey = FOPEN_WR(argv[3]); if (!file_privkey) { fputs("Error: Failed to open output file for private key!\n\n", stderr); diff --git a/src/codesign_sign.c b/src/codesign_sign.c index 6c4a50b..0a3a171 100644 --- a/src/codesign_sign.c +++ b/src/codesign_sign.c @@ -43,21 +43,21 @@ int MAIN(int argc, CHAR_T *argv[]) /* Open input/output files */ /*-------------------------------------------------------*/ - file_privkey = FOPEN(argv[2], T("rb")); + file_privkey = FOPEN_RD(argv[2]); if (!file_privkey) { fputs("Error: Failed to open private key file!\n\n", stderr); goto clean_up; } - file_data = FOPEN(argv[3], T("rb")); + file_data = FOPEN_RD(argv[3]); if (!file_data) { fputs("Error: Failed to open input file to be signed!\n\n", stderr); goto clean_up; } - file_signature = FOPEN(argv[4], T("wb")); + file_signature = FOPEN_WR(argv[4]); if (!file_signature) { fputs("Error: Failed to open output file for signature!\n\n", stderr); diff --git a/src/codesign_verify.c b/src/codesign_verify.c index c604d51..6b4d1ae 100644 --- a/src/codesign_verify.c +++ b/src/codesign_verify.c @@ -72,14 +72,14 @@ int MAIN(int argc, CHAR_T *argv[]) #ifdef EMBED_PUBKEY - public_key = load_resource_data(T("RSA_PUBLIC_KEY"), &pubkey_length); + public_key = load_resource_data(L"RSA_PUBLIC_KEY", &pubkey_length); if (!public_key) { fputs("Error: Failed to load public key data from resources!\n\n", stderr); goto clean_up; } - checksum_pubkey = load_resource_data(T("CHECKSUM_SHA512"), &checksum_length); + checksum_pubkey = load_resource_data(L"CHECKSUM_SHA512", &checksum_length); if ((!checksum_pubkey) || (checksum_length < SHA512_DIGEST_LENGTH)) { fputs("Error: Failed to load public key checksum from resources!\n\n", stderr); @@ -113,7 +113,7 @@ int MAIN(int argc, CHAR_T *argv[]) #else - file_pubkey = FOPEN(argv[1], T("rb")); + file_pubkey = FOPEN_RD(argv[1]); if (!file_pubkey) { fputs("Error: Failed to open public key input file!\n\n", stderr); @@ -138,14 +138,14 @@ int MAIN(int argc, CHAR_T *argv[]) /* Open input files */ /*-------------------------------------------------------*/ - file_data = FOPEN(ARGV_INPUTFILE, T("rb")); + file_data = FOPEN_RD(ARGV_INPUTFILE); if (!file_data) { fputs("Error: Failed to open the input file!\n\n", stderr); goto clean_up; } - file_signature = FOPEN(ARGV_SIGNATURE, T("rb")); + file_signature = FOPEN_RD(ARGV_SIGNATURE); if (!file_signature) { fputs("Error: Failed to open the signature file!\n\n", stderr); @@ -183,15 +183,20 @@ int MAIN(int argc, CHAR_T *argv[]) goto clean_up; } - if (source_length <= 2U + sizeof(uint64_t)) + if (source_length <= sizeof(uint64_t)) { fputs("Error: Signature binary data appears to be truncated!\n\n", stderr); goto clean_up; } - if (base64[base64_length - 1U] == '=') + while ((base64_length > 0U) && (source_length > sizeof(uint64_t) + 1U)) { - source_length -= (base64[base64_length - 2U] == '=') ? 2U : 1U; /*remove padding!*/ + if (base64[base64_length - 1U] != '=') + { + break; + } + --source_length; + --base64_length; } /*-------------------------------------------------------*/ diff --git a/src/common.c b/src/common.c index 3872d8d..77a72e8 100644 --- a/src/common.c +++ b/src/common.c @@ -152,11 +152,6 @@ static uint64_t get_system_time(void) uint64_t get_current_time_usec(void) { - /* struct timeval t; - if(gettimeofday(&t, NULL) == 0) - { - return (((uint64_t)t.tv_sec) * 1000000ULL) + ((uint64_t)t.tv_usec); - } */ const uint64_t system_time = get_system_time(); if (system_time >= FILETIME_1970) { @@ -177,7 +172,7 @@ uint64_t get_current_time_usec(void) return 0ULL; } -#endif +#endif /*_WIN32*/ /*-------------------------------------------------------*/ /* store_uint64() / load_uint64() */ @@ -208,13 +203,29 @@ uint64_t load_uint64(const unsigned char *const buffer) (((uint64_t)buffer[7U])); } +/*-------------------------------------------------------*/ +/* force_flush() */ +/*-------------------------------------------------------*/ + +int force_flush(FILE *const file) +{ + const int result = fflush(file); +#ifdef _WIN32 + FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(file))); +#else + fsync(fileno(file)); +#endif + return (result != EOF); +} + /*-------------------------------------------------------*/ /* load_resource_data() */ /*-------------------------------------------------------*/ -const unsigned char* load_resource_data(const CHAR_T *const name, unsigned int *const length) -{ #ifdef _WIN32 + +const unsigned char *load_resource_data(const wchar_t *const name, unsigned int *const length) +{ HRSRC resource = FindResourceW(NULL, name, RT_RCDATA); if (resource) { @@ -228,22 +239,8 @@ const unsigned char* load_resource_data(const CHAR_T *const name, unsigned int * } } } -#endif *length = 0U; return NULL; } -/*-------------------------------------------------------*/ -/* force_flush() */ -/*-------------------------------------------------------*/ - -int force_flush(FILE *const file) -{ - const int result = fflush(file); -#ifdef _WIN32 - FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(file))); -#else - fsync(fileno(file)); -#endif - return (result == 0); -} +#endif /*_WIN32*/ diff --git a/src/common.h b/src/common.h index 8264f54..47bcd93 100644 --- a/src/common.h +++ b/src/common.h @@ -20,7 +20,12 @@ char *read_line_from_file(FILE *const file, const int trim); uint64_t get_current_time_usec(void); void store_uint64(unsigned char *const buffer, const uint64_t value); uint64_t load_uint64(const unsigned char *const buffer); -const unsigned char* load_resource_data(const CHAR_T *const name, unsigned int *const length); int force_flush(FILE *const file); +#ifdef _WIN32 +const unsigned char *load_resource_data(const wchar_t *const name, unsigned int *const length); +#else +#define load_resource_data(X,Y) ((const unsigned char*)NULL) +#endif + #endif /*_COMMON_H*/ diff --git a/src/platform.h b/src/platform.h index 1e59699..827a580 100644 --- a/src/platform.h +++ b/src/platform.h @@ -11,16 +11,15 @@ #define CHAR_T wchar_t #define MAIN wmain -#define FOPEN(X,Y) _wfsopen((X),(Y),_SH_SECURE) -#define _T(X) L##X -#define T(X) _T(X) +#define FOPEN_RD(X) _wfsopen((X), L"rb", _SH_DENYWR) +#define FOPEN_WR(X) _wfsopen((X), L"wb", _SH_DENYRW) #else #define CHAR_T char #define MAIN main -#define FOPEN(X,Y) fopen((X),(Y)) -#define T(X) X +#define FOPEN_RD(X) fopen((X), "rb") +#define FOPEN_WR(X) fopen((X), "wb") #endif