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