Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / utils / mono-rand-windows-uwp.c
1 /**
2  * \file
3  * UWP rand support for Mono.
4  *
5  * Copyright 2016 Microsoft
6  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
7 */
8 #include <config.h>
9 #include <glib.h>
10 #include "mono/utils/mono-compiler.h"
11
12 #if G_HAVE_API_SUPPORT(HAVE_UWP_WINAPI_SUPPORT)
13 #include <windows.h>
14 #include "mono/utils/mono-rand-windows-internals.h"
15
16 MONO_WIN32_CRYPT_PROVIDER_HANDLE
17 mono_rand_win_open_provider (void)
18 {
19         MONO_WIN32_CRYPT_PROVIDER_HANDLE provider = 0;
20
21         if (!BCRYPT_SUCCESS (BCryptOpenAlgorithmProvider (&provider, BCRYPT_RNG_ALGORITHM, NULL, 0)))
22                 provider = 0;
23
24         return provider;
25 }
26
27 gboolean
28 mono_rand_win_gen (MONO_WIN32_CRYPT_PROVIDER_HANDLE provider, guchar *buffer, size_t buffer_size)
29 {
30         g_assert (provider != 0 && buffer != 0);
31         return (BCRYPT_SUCCESS (BCryptGenRandom (provider, buffer, (ULONG) buffer_size, 0))) ? TRUE : FALSE;
32 }
33
34 gboolean
35 mono_rand_win_seed (MONO_WIN32_CRYPT_PROVIDER_HANDLE provider, guchar *seed, size_t seed_size)
36 {
37         g_assert (provider != 0 && seed != 0);
38         return (BCRYPT_SUCCESS (BCryptGenRandom (provider, seed, (ULONG) seed_size, BCRYPT_RNG_USE_ENTROPY_IN_BUFFER))) ? TRUE : FALSE;
39 }
40
41 void
42 mono_rand_win_close_provider (MONO_WIN32_CRYPT_PROVIDER_HANDLE provider)
43 {
44         g_assert (provider != 0);
45         BCryptCloseAlgorithmProvider (provider, 0);
46 }
47
48 #else /* G_HAVE_API_SUPPORT(HAVE_UWP_WINAPI_SUPPORT) */
49
50 MONO_EMPTY_SOURCE_FILE (mono_rand_windows_uwp);
51 #endif /* G_HAVE_API_SUPPORT(HAVE_UWP_WINAPI_SUPPORT) */