summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorbcook <>2020-11-11 10:41:24 +0000
committerbcook <>2020-11-11 10:41:24 +0000
commit67b0b0fea7b4c43054272382d50a6ec671cac01d (patch)
tree6e39821fe91175a74e8235d5b7151fb7bd3185a2 /src/lib
parent56b49e899e4fa59a89ce717d1b8aababf4a8604c (diff)
downloadopenbsd-67b0b0fea7b4c43054272382d50a6ec671cac01d.tar.gz
openbsd-67b0b0fea7b4c43054272382d50a6ec671cac01d.tar.bz2
openbsd-67b0b0fea7b4c43054272382d50a6ec671cac01d.zip
Update getentropy on Windows to use Cryptography Next Generation (CNG).
wincrypt is deprecated and no longer works with newer Windows environments, such as in Windows Store apps.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/arc4random/getentropy_win.c27
1 files changed, 9 insertions, 18 deletions
diff --git a/src/lib/libcrypto/arc4random/getentropy_win.c b/src/lib/libcrypto/arc4random/getentropy_win.c
index 2abeb27bc6..64514b3a37 100644
--- a/src/lib/libcrypto/arc4random/getentropy_win.c
+++ b/src/lib/libcrypto/arc4random/getentropy_win.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: getentropy_win.c,v 1.5 2016/08/07 03:27:21 tb Exp $ */ 1/* $OpenBSD: getentropy_win.c,v 1.6 2020/11/11 10:41:24 bcook Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2014, Theo de Raadt <deraadt@openbsd.org> 4 * Copyright (c) 2014, Theo de Raadt <deraadt@openbsd.org>
@@ -21,39 +21,30 @@
21 */ 21 */
22 22
23#include <windows.h> 23#include <windows.h>
24#include <bcrypt.h>
24#include <errno.h> 25#include <errno.h>
25#include <stdint.h> 26#include <stdint.h>
26#include <sys/types.h> 27#include <sys/types.h>
27#include <wincrypt.h>
28#include <process.h>
29 28
30int getentropy(void *buf, size_t len); 29int getentropy(void *buf, size_t len);
31 30
32/* 31/*
33 * On Windows, CryptGenRandom is supposed to be a well-seeded 32 * On Windows, BCryptGenRandom with BCRYPT_USE_SYSTEM_PREFERRED_RNG is supposed
34 * cryptographically strong random number generator. 33 * to be a well-seeded, cryptographically strong random number generator.
34 * https://docs.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptgenrandom
35 */ 35 */
36int 36int
37getentropy(void *buf, size_t len) 37getentropy(void *buf, size_t len)
38{ 38{
39 HCRYPTPROV provider;
40
41 if (len > 256) { 39 if (len > 256) {
42 errno = EIO; 40 errno = EIO;
43 return (-1); 41 return (-1);
44 } 42 }
45 43
46 if (CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, 44 if (FAILED(BCryptGenRandom(NULL, buf, len, BCRYPT_USE_SYSTEM_PREFERRED_RNG))) {
47 CRYPT_VERIFYCONTEXT) == 0) 45 errno = EIO;
48 goto fail; 46 return (-1);
49 if (CryptGenRandom(provider, len, buf) == 0) {
50 CryptReleaseContext(provider, 0);
51 goto fail;
52 } 47 }
53 CryptReleaseContext(provider, 0);
54 return (0);
55 48
56fail: 49 return (0);
57 errno = EIO;
58 return (-1);
59} 50}