Add support for reading random data from "bcrypt" on Windows

This fixes #577

Patch inspired by the same, but simplified after reading the docs.

Signed-off-by: Steffen Jaeckel <s@jaeckel.eu>
This commit is contained in:
Steffen Jaeckel 2023-07-25 12:44:25 +02:00 committed by Jamie Reece Wilson
parent c3a9a04c1b
commit 29d29ca170
5 changed files with 32 additions and 0 deletions

View File

@ -94,6 +94,16 @@ if(CMAKE_SYSTEM_NAME MATCHES "CYGWIN")
list(APPEND LTC_C_FLAGS -no-undefined) list(APPEND LTC_C_FLAGS -no-undefined)
endif() endif()
if(MSVC)
cmake_push_check_state()
check_symbol_exists(BCryptGenRandom bcrypt.h BCRYPT_AVAILABLE)
cmake_pop_check_state()
if (BCRYPT_AVAILABLE)
target_link_libraries(${PROJECT_NAME} PRIVATE Bcrypt)
list(APPEND LTC_C_FLAGS -DLTC_WIN32_BCRYPT)
endif()
endif()
# If the user set the environment variables at generate-time, append them # If the user set the environment variables at generate-time, append them
# in order to allow overriding our defaults. # in order to allow overriding our defaults.
# ${LTC_CFLAGS} means the user passed it via sth like: # ${LTC_CFLAGS} means the user passed it via sth like:

View File

@ -71,6 +71,7 @@ sub check_source {
my $n = $1; my $n = $1;
push @{$troubles->{invalid_macro_name}}, "$lineno($n)" push @{$troubles->{invalid_macro_name}}, "$lineno($n)"
unless ($file eq 'src/headers/tomcrypt_cfg.h' && $n eq '__has_builtin') || unless ($file eq 'src/headers/tomcrypt_cfg.h' && $n eq '__has_builtin') ||
($file eq 'src/headers/tomcrypt_cfg.h' && $n eq '_WIN32_WINNT') ||
($file eq 'src/prngs/rng_get_bytes.c' && $n eq '_WIN32_WINNT'); ($file eq 'src/prngs/rng_get_bytes.c' && $n eq '_WIN32_WINNT');
} }
$lineno++; $lineno++;

View File

@ -300,6 +300,21 @@ typedef unsigned long ltc_mp_digit;
#define LTC_ALIGN(n) #define LTC_ALIGN(n)
#endif #endif
/* Choose Windows Vista as minimum Version if we're compiling with at least VS2019
* This is done in order to test the bcrypt RNG and can still be overridden by the user. */
#if defined(_MSC_VER) && _MSC_VER >= 1920
# ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0600
# endif
# ifndef WINVER
# define WINVER 0x0600
# endif
#endif
#if defined(_MSC_VER) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 && !defined(LTC_WIN32_BCRYPT)
# define LTC_WIN32_BCRYPT
#endif
/* Define `LTC_NO_NULL_TERMINATION_CHECK` in the user code /* Define `LTC_NO_NULL_TERMINATION_CHECK` in the user code
* before including `tomcrypt.h` to disable this functionality. * before including `tomcrypt.h` to disable this functionality.
*/ */

View File

@ -333,11 +333,14 @@
/* Greg's SOBER128 stream cipher based PRNG */ /* Greg's SOBER128 stream cipher based PRNG */
#define LTC_SOBER128 #define LTC_SOBER128
#if !defined(_WIN32) && !defined(_WIN32_WCE)
/* the *nix style /dev/random device */ /* the *nix style /dev/random device */
#define LTC_DEVRANDOM #define LTC_DEVRANDOM
/* try /dev/urandom before trying /dev/random /* try /dev/urandom before trying /dev/random
* are you sure you want to disable this? http://www.2uo.de/myths-about-urandom/ */ * are you sure you want to disable this? http://www.2uo.de/myths-about-urandom/ */
#define LTC_TRY_URANDOM_FIRST #define LTC_TRY_URANDOM_FIRST
#endif /* not Windows */
/* rng_get_bytes() */ /* rng_get_bytes() */
#define LTC_RNG_GET_BYTES #define LTC_RNG_GET_BYTES
/* rng_make_prng() */ /* rng_make_prng() */

View File

@ -324,6 +324,9 @@ const char *crypt_build_settings =
#if defined(LTC_SOBER128) #if defined(LTC_SOBER128)
" SOBER128\n" " SOBER128\n"
#endif #endif
#if defined(LTC_WIN32_BCRYPT)
" WIN32_BCRYPT\n"
#endif
"\nPK Crypto:\n" "\nPK Crypto:\n"
#if defined(LTC_MRSA) #if defined(LTC_MRSA)