summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbcook <>2020-11-11 10:41:24 +0000
committerbcook <>2020-11-11 10:41:24 +0000
commit04553cc77265e9bcf5dc68d4dd6c2881fcb76177 (patch)
tree6e39821fe91175a74e8235d5b7151fb7bd3185a2 /src
parentfbf8c8d037f16ebaeded455f43931516059891a7 (diff)
downloadopenbsd-04553cc77265e9bcf5dc68d4dd6c2881fcb76177.tar.gz
openbsd-04553cc77265e9bcf5dc68d4dd6c2881fcb76177.tar.bz2
openbsd-04553cc77265e9bcf5dc68d4dd6c2881fcb76177.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')
-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}