qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] error: qcrypto_random_bytes() tried to read from /dev/[u]random, even on windows
@ 2017-04-24 12:17 GM.Ijewski
  2017-04-24 12:50 ` Daniel P. Berrange
  0 siblings, 1 reply; 12+ messages in thread
From: GM.Ijewski @ 2017-04-24 12:17 UTC (permalink / raw)
  To: berrange, qemu-devel

   Now it calls CryptGenRandom() if is it compiled for windows.

   It might be possible to save the cryptographic provider in between
   invocations, e.g. by making it static -- I have no idea how
   computationally
   intensive that operation actually is.

   Signed-off-by: Geert Martin Ijewski <gm.ijewski@web.de>

   diff --git a/crypto/random-platform.c b/crypto/random-platform.c
   index 82b755a..7aa0476 100644
   --- a/crypto/random-platform.c
   +++ b/crypto/random-platform.c
   @@ -26,6 +26,7 @@ int qcrypto_random_bytes(uint8_t *buf G_GNUC_UNUSED,
                             size_t buflen G_GNUC_UNUSED,
                             Error **errp)
    {
   +#ifndef _WIN32
        int fd;
        int ret = -1;
        int got;
   @@ -61,4 +62,26 @@ int qcrypto_random_bytes(uint8_t *buf G_GNUC_UNUSED,
     cleanup:
        close(fd);
        return ret;
   +#else
   +    HCRYPTPROV   hCryptProv;
   +
   +    if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL,
   0)) {
   +        if (NTE_BAD_KEYSET == GetLastError()) {
   +            if (!CryptAcquireContext(&hCryptProv, NULL, NULL,
   +                                     PROV_RSA_FULL, CRYPT_NEWKEYSET))
   {
   +                error_setg_errno(errp, GetLastError(),
   +                         "Unable to create cryptographic provider");
   +            }
   +        }
   +    }
   +
   +    if (!CryptGenRandom(hCryptProv, buflen, buf)) {
   +        error_setg_errno(errp, GetLastError(),
   +                         "Unable to read random bytes");
   +        return -1;
   +    }
   +
   +    CryptReleaseContext(hCryptProv, 0);
   +    return 0;
   +#endif
    }
   diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h
   index ff18b23..4a5d908 100644
   --- a/include/sysemu/os-win32.h
   +++ b/include/sysemu/os-win32.h
   @@ -29,6 +29,7 @@
    #include <winsock2.h>
    #include <windows.h>
    #include <ws2tcpip.h>
   +#include <Wincrypt.h>

    #if defined(_WIN64)
    /* On w64, setjmp is implemented by _setjmp which needs a second
   parameter.

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2017-04-24 16:39 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-04-24 12:17 [Qemu-devel] error: qcrypto_random_bytes() tried to read from /dev/[u]random, even on windows GM.Ijewski
2017-04-24 12:50 ` Daniel P. Berrange
2017-04-24 13:30   ` Peter Maydell
2017-04-24 13:36     ` Daniel P. Berrange
2017-04-24 13:52       ` Peter Maydell
2017-04-24 13:57         ` Daniel P. Berrange
2017-04-24 14:05           ` Peter Maydell
2017-04-24 15:41             ` Daniel P. Berrange
2017-04-24 15:42               ` Peter Maydell
2017-04-24 15:52                 ` Daniel P. Berrange
2017-04-24 16:33                   ` Geert Martin Ijewski
2017-04-24 16:39                     ` Daniel P. Berrange

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).