From patchwork Tue Apr 25 21:53:32 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geert Martin Ijewski X-Patchwork-Id: 9699803 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 5A967601D3 for ; Tue, 25 Apr 2017 21:54:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3F99C28437 for ; Tue, 25 Apr 2017 21:54:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3252828450; Tue, 25 Apr 2017 21:54:38 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id DF92F28437 for ; Tue, 25 Apr 2017 21:54:36 +0000 (UTC) Received: from localhost ([::1]:51498 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d38Pq-0003HH-Dz for patchwork-qemu-devel@patchwork.kernel.org; Tue, 25 Apr 2017 17:54:34 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52417) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d38P5-0003H6-Go for qemu-devel@nongnu.org; Tue, 25 Apr 2017 17:53:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d38P0-0008Jq-HY for qemu-devel@nongnu.org; Tue, 25 Apr 2017 17:53:47 -0400 Received: from mout.web.de ([212.227.17.12]:58086) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1d38P0-0008Ix-6N for qemu-devel@nongnu.org; Tue, 25 Apr 2017 17:53:42 -0400 Received: from DESKTOP-JU125PR.Speedport_W_723V_1_43_000 ([217.94.8.34]) by smtp.web.de (mrweb103 [213.165.67.124]) with ESMTPSA (Nemesis) id 0Ma2Pz-1chLaV24op-00Lmqf; Tue, 25 Apr 2017 23:53:32 +0200 From: Geert Martin Ijewski To: qemu-devel@nongnu.org Date: Tue, 25 Apr 2017 23:53:32 +0200 Message-Id: <1493157212-22070-1-git-send-email-gm.ijewski@web.de> X-Mailer: git-send-email 1.9.1 X-Provags-ID: V03:K0:e9GCh9hoFGwEf3LIhGSyORmYEgSc8Kz5xCKg85+7S8hdP8RD052 vIlbNGarEQE7QGfeOH1sq8kCauAqVhVX1+LTZByOsX0NCJXPRf5g51Qrsi9AAtCwB9IEDYs OEyAKaqYMOcjo+OM8gLJtO/nAjfnWG/L1dEzbRdOE1fS1aBfSoFIHSByvNBYQ4q60/dxNo8 6ae32d8vFtJ0ruZd6d0Dg== X-UI-Out-Filterresults: notjunk:1; V01:K0:N/I7a8TfFx8=:Zte9Mz1SYElWx5AvLV3CQx xAgECeEevjCXQFlwlhHGtaXeIUAD4NNYSVd0hunFiiJyeB1M2BHWZZiYAF0WltqD2hPUJYsTv /TPYFQ8aEPM2oZB9Rb1Obzh/KRQs5uaudu+DG3FjV737SuRgbjRZ0eogNbfuHZllDbrg22Cvv LL90lgpWz2YtVmyXwCtcXT7BnQrzQ2lDlBFTgfKjStIa1g2V3kUCPTXsNlty/qIqM90BU7SSE QAEbANtepO0fiWmIx1wv2ZieqqqlYB8cz5Wx9AiEfJ/aqWJKiFdkukYyA8WYoj1HAFTtzndzd z9Borrs9iT/OYkTtxmNfjgrPNP00eQeHtPl7H4x5sd+X93pMq7NcOn/cpDkSFM28G58NvBRL7 jaaTzECYT2c0ts4CxUkYgDw4KzUMChHzOkJdhdeI4sPYWhN3Mko2WnuquUYoLB0j6TqAhw69H dQKpathQgnjp8q3j7LnjTHDv6xYAqfqHcFHvqyxMB4W2RhWrusacHMBcfSET71uOzin5y5MAp WH937eMBjr2UDlUPqMoqBdGsEuj9pJVGgxLKaljGNS2Pt8uy871TEo1BPkOaqQ5OSdAPUoP53 nrAQXzRVByaWxgiQHy4SBGupN5FzOQCg6AGf0t3bUac4p2hCG5U1/RYwlK2e8Dqqr5JCrcLwS uFzIo9Qn70714irP5cyaIlfp7NSSK7QTOaGpgBDh0hQD34+PBLq5wnxRnaffRG2GG43NSEmTy 0RCN6E1jcke1mJo6XKqYD99S4n6wRHp6ynILyxVFytOzNtonUTy6h/25k4Q= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.17.12 Subject: [Qemu-devel] [PATCH v4] crypto: qcrypto_random_bytes() now works on windows w/o any other crypto libs X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, Geert Martin Ijewski Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP If no crypto library is included in the build, QEMU uses qcrypto_random_bytes() to generate random data. That function tried to open /dev/urandom or /dev/random and if opening both files failed it errored out. Those files obviously do not exist on windows, so there the code uses CryptGenRandom(). Furthermore there was some refactoring and a new function qcrypto_random_init() was introduced. If a proper crypto library (gnutls or libgcrypt) is included in the build, this function does nothing. If neither is included it initializes the (platform specific) handles that are used by qcrypto_random_bytes(). Either: * a handle to /dev/urandom | /dev/random on unix like systems * a handle to a cryptographic service provider on windows Signed-off-by: Geert Martin Ijewski --- crypto/init.c | 6 ++++++ crypto/random-gcrypt.c | 2 ++ crypto/random-gnutls.c | 3 +++ crypto/random-platform.c | 45 +++++++++++++++++++++++++++++++++++++-------- include/crypto/random.h | 9 +++++++++ 5 files changed, 57 insertions(+), 8 deletions(-) diff --git a/crypto/init.c b/crypto/init.c index f65207e..f131c42 100644 --- a/crypto/init.c +++ b/crypto/init.c @@ -32,6 +32,8 @@ #include #endif +#include "crypto/random.h" + /* #define DEBUG_GNUTLS */ /* @@ -146,5 +148,9 @@ int qcrypto_init(Error **errp) gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); #endif + if (qcrypto_random_init(errp) < 0) { + return -1; + } + return 0; } diff --git a/crypto/random-gcrypt.c b/crypto/random-gcrypt.c index 0de9a09..2446142 100644 --- a/crypto/random-gcrypt.c +++ b/crypto/random-gcrypt.c @@ -31,3 +31,5 @@ int qcrypto_random_bytes(uint8_t *buf, gcry_randomize(buf, buflen, GCRY_STRONG_RANDOM); return 0; } + +int qcrpto_random_init(Error **errp G_GNUC_UNUSED) { return 0; } diff --git a/crypto/random-gnutls.c b/crypto/random-gnutls.c index 04b45a8..d80c786 100644 --- a/crypto/random-gnutls.c +++ b/crypto/random-gnutls.c @@ -41,3 +41,6 @@ int qcrypto_random_bytes(uint8_t *buf, return 0; } + + +int qcrpto_random_init(Error **errp G_GNUC_UNUSED) { return 0; } diff --git a/crypto/random-platform.c b/crypto/random-platform.c index 82b755a..0eddb91 100644 --- a/crypto/random-platform.c +++ b/crypto/random-platform.c @@ -22,14 +22,16 @@ #include "crypto/random.h" -int qcrypto_random_bytes(uint8_t *buf G_GNUC_UNUSED, - size_t buflen G_GNUC_UNUSED, - Error **errp) -{ - int fd; - int ret = -1; - int got; +#ifdef _WIN32 +#include +static HCRYPTPROV hCryptProv; +#else +static int fd; /* a file handle to either /dev/urandom or /dev/random */ +#endif +int qcrypto_random_init(Error **errp) +{ +#ifndef _WIN32 /* TBD perhaps also add support for BSD getentropy / Linux * getrandom syscalls directly */ fd = open("/dev/urandom", O_RDONLY); @@ -41,6 +43,25 @@ int qcrypto_random_bytes(uint8_t *buf G_GNUC_UNUSED, error_setg(errp, "No /dev/urandom or /dev/random found"); return -1; } +#else + if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, + CRYPT_SILENT | CRYPT_VERIFYCONTEXT)) { + error_setg_win32(errp, GetLastError(), + "Unable to create cryptographic provider"); + return -1; + } +#endif + + return 0; +} + +int qcrypto_random_bytes(uint8_t *buf G_GNUC_UNUSED, + size_t buflen G_GNUC_UNUSED, + Error **errp) +{ +#ifndef _WIN32 + int ret = -1; + int got; while (buflen > 0) { got = read(fd, buf, buflen); @@ -59,6 +80,14 @@ int qcrypto_random_bytes(uint8_t *buf G_GNUC_UNUSED, ret = 0; cleanup: - close(fd); return ret; +#else + if (!CryptGenRandom(hCryptProv, buflen, buf)) { + error_setg_win32(errp, GetLastError(), + "Unable to read random bytes"); + return -1; + } + + return 0; +#endif } diff --git a/include/crypto/random.h b/include/crypto/random.h index a101353..a07229c 100644 --- a/include/crypto/random.h +++ b/include/crypto/random.h @@ -40,5 +40,14 @@ int qcrypto_random_bytes(uint8_t *buf, size_t buflen, Error **errp); +/** + * qcrypto_random_init: + * @errp: pointer to a NULL-initialized error object + * + * Initializes the handles used by qcrypto_random_bytes + * + * Returns 0 on success, -1 on error + */ +int qcrypto_random_init(Error **errp); #endif /* QCRYPTO_RANDOM_H */