[PATCH] favor bcrypt over wincrypt for the random generator on Windows
Steve Lhomme
robux4@ycbcr.xyz
Tue May 26 06:40:46 GMT 2020
Hello,
Any update on this ? This prevents libssp from being usable in UWP apps.
(BTW the name of the old API is not wincrypt, the header, but CryptoAPI
or CAPI)
On 2020-04-21 9:48, Steve Lhomme wrote:
> BCrypt is more modern and supported in Universal Apps, Wincrypt is not and
> CryptGenRandom is deprecated:
> https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptgenrandom
>
> BCrypt is available since Vista
> https://docs.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptopenalgorithmprovider
>
> It requires linking with bcrypt rather than advapi32 for wincrypt.
> ---
> libssp/configure.ac | 16 ++++++++++++++++
> libssp/ssp.c | 20 ++++++++++++++++++++
> 2 files changed, 36 insertions(+)
>
> diff --git a/libssp/configure.ac b/libssp/configure.ac
> index f30f81c54f6..a39d9e9c992 100644
> --- a/libssp/configure.ac
> +++ b/libssp/configure.ac
> @@ -158,6 +158,22 @@ else
> fi
> AC_SUBST(ssp_have_usable_vsnprintf)
>
> +AC_ARG_ENABLE(bcrypt,
> +AS_HELP_STRING([--disable-bcrypt],
> + [use bcrypt for random generator on Windows (otherwise wincrypt)]),
> + use_win_bcrypt=$enableval,
> + use_win_bcrypt=yes)
> +if test "x$use_win_bcrypt" != xno; then
> + case "$target_os" in
> + win32 | pe | mingw32*)
> + AC_CHECK_TYPES([BCRYPT_ALG_HANDLE],[
> + LDFLAGS="$LDFLAGS -lbcrypt"
> +],[],[#include <windows.h>
> +#include <bcrypt.h>])
> + ;;
> + esac
> +fi
> +
> AM_PROG_LIBTOOL
> ACX_LT_HOST_FLAGS
> AC_SUBST(enable_shared)
> diff --git a/libssp/ssp.c b/libssp/ssp.c
> index 28f3e9cc64a..f07cc41fd4f 100644
> --- a/libssp/ssp.c
> +++ b/libssp/ssp.c
> @@ -56,7 +56,11 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
> to the console using "CONOUT$" */
> #if defined (_WIN32) && !defined (__CYGWIN__)
> #include <windows.h>
> +#ifdef HAVE_BCRYPT_ALG_HANDLE
> +#include <bcrypt.h>
> +#else
> #include <wincrypt.h>
> +#endif
> # define _PATH_TTY "CONOUT$"
> #else
> # define _PATH_TTY "/dev/tty"
> @@ -77,6 +81,21 @@ __guard_setup (void)
> return;
>
> #if defined (_WIN32) && !defined (__CYGWIN__)
> +#ifdef HAVE_BCRYPT_ALG_HANDLE
> + BCRYPT_ALG_HANDLE algo = 0;
> + NTSTATUS err = BCryptOpenAlgorithmProvider(&algo, BCRYPT_RNG_ALGORITHM,
> + NULL, 0);
> + if (BCRYPT_SUCCESS(err))
> + {
> + if (BCryptGenRandom(algo, (BYTE *)&__stack_chk_guard,
> + sizeof (__stack_chk_guard), 0) && __stack_chk_guard != 0)
> + {
> + BCryptCloseAlgorithmProvider(algo, 0);
> + return;
> + }
> + BCryptCloseAlgorithmProvider(algo, 0);
> + }
> +#else /* !HAVE_BCRYPT_ALG_HANDLE */
> HCRYPTPROV hprovider = 0;
> if (CryptAcquireContext(&hprovider, NULL, NULL, PROV_RSA_FULL,
> CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
> @@ -89,6 +108,7 @@ __guard_setup (void)
> }
> CryptReleaseContext(hprovider, 0);
> }
> +#endif /* !HAVE_BCRYPT_ALG_HANDLE */
> #else
> int fd = open ("/dev/urandom", O_RDONLY);
> if (fd != -1)
> --
> 2.17.1
>
More information about the Gcc-patches
mailing list