From patchwork Tue Apr 21 07:48:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Lhomme X-Patchwork-Id: 1274043 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ycbcr.xyz Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 495wh81qLFz9sP7 for ; Tue, 21 Apr 2020 17:49:42 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6675F386F47A; Tue, 21 Apr 2020 07:49:40 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mout-p-202.mailbox.org (mout-p-202.mailbox.org [IPv6:2001:67c:2050::465:202]) by sourceware.org (Postfix) with ESMTPS id B70BE384B0C1 for ; Tue, 21 Apr 2020 07:49:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org B70BE384B0C1 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=ycbcr.xyz Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=robux4@ycbcr.xyz Received: from smtp1.mailbox.org (smtp1.mailbox.org [80.241.60.240]) (using TLSv1.2 with cipher ECDHE-RSA-CHACHA20-POLY1305 (256/256 bits)) (No client certificate requested) by mout-p-202.mailbox.org (Postfix) with ESMTPS id 495wgw5R7tzQlGt; Tue, 21 Apr 2020 09:49:32 +0200 (CEST) X-Virus-Scanned: amavisd-new at heinlein-support.de Received: from smtp1.mailbox.org ([80.241.60.240]) by spamfilter05.heinlein-hosting.de (spamfilter05.heinlein-hosting.de [80.241.56.123]) (amavisd-new, port 10030) with ESMTP id pQDf7mU75t_H; Tue, 21 Apr 2020 09:49:26 +0200 (CEST) From: Steve Lhomme To: gcc-patches@gcc.gnu.org Subject: [PATCH] favor bcrypt over wincrypt for the random generator on Windows Date: Tue, 21 Apr 2020 09:48:51 +0200 Message-Id: <20200421074851.9328-1-robux4@ycbcr.xyz> X-Rspamd-Queue-Id: 713961778 X-Rspamd-Score: -3.46 / 15.00 / 15.00 X-Spam-Status: No, score=-20.0 required=5.0 tests=BAYES_00, FROM_SUSPICIOUS_NTLD, FROM_SUSPICIOUS_NTLD_FP, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_DMARC_STATUS, KAM_INFOUSMEBIZ, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" 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 +#include ]) + ;; + 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 +#ifdef HAVE_BCRYPT_ALG_HANDLE +#include +#else #include +#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)