From 2d6c8fec45b23a8a28668ecf3ef281139ab778a7 Mon Sep 17 00:00:00 2001 From: Mitya Selivanov Date: Fri, 29 Dec 2023 06:21:33 +0100 Subject: refactor dependencies; include dependencies source code --- source/kit/secure_random.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 source/kit/secure_random.c (limited to 'source/kit/secure_random.c') diff --git a/source/kit/secure_random.c b/source/kit/secure_random.c new file mode 100644 index 0000000..8f7a302 --- /dev/null +++ b/source/kit/secure_random.c @@ -0,0 +1,43 @@ +#include "secure_random.h" + +#include +#include +#include + +#if defined(_WIN32) && !defined(__CYGWIN__) +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN 1 +# endif +# include +# include +#else +# include +#endif + +void kit_secure_random(i64 size, void *data) { + assert(size >= 0); + assert(data != NULL); + + if (size <= 0 || data == NULL) + return; + +#if defined(_WIN32) && !defined(__CYGWIN__) + HCRYPTPROV prov = 0; + if (!CryptAcquireContextW(&prov, NULL, NULL, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT | CRYPT_SILENT) || + !CryptGenRandom(prov, (DWORD) size, (BYTE *) data) || + !CryptReleaseContext(prov, 0)) + abort(); +#else + FILE *f = fopen("/dev/urandom", "rb"); + + if (f == NULL) + abort(); + + i64 n = (i64) fread(data, 1, size, f); + fclose(f); + + if (n != size) + abort(); +#endif +} -- cgit v1.2.3