aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2025-06-09 13:23:49 +0100
committerRon Yorston <rmy@pobox.com>2025-06-09 13:23:49 +0100
commit596c443112d09506c3bf13ac98046a84b912e56c (patch)
tree896fd4d7e43a71a8a15dbcec17f6cafcbe622635
parent854c647da7a84cf2aaa2c9a84ff1ca353bdaf9cf (diff)
downloadbusybox-w32-cng_backend.tar.gz
busybox-w32-cng_backend.tar.bz2
busybox-w32-cng_backend.zip
Use Windows library for cryptographic checksumscng_backend
Add a new feature to libbb, FEATURE_USE_CNG_API, which enables the use of the Cryptography API: Next Generation library to calculate checksums. It is disabled by default except in the mingw64u default config, as the API requires Windows 10+ to function. Usage of this API provides a size benefit and delegates hardware optimizations to the operating system cryptography library. Based on GitHub PR #498 by rfl890. Saves 4064 bytes in the mingw64u case.
-rw-r--r--Makefile.flags2
-rw-r--r--configs/mingw32_defconfig7
-rw-r--r--configs/mingw64_defconfig7
-rw-r--r--configs/mingw64a_defconfig7
-rw-r--r--configs/mingw64u_defconfig7
-rw-r--r--include/libbb.h37
-rw-r--r--libbb/Config.src10
-rw-r--r--libbb/hash_md5_sha.c86
-rwxr-xr-xscripts/mk_mingw64u_defconfig1
9 files changed, 155 insertions, 9 deletions
diff --git a/Makefile.flags b/Makefile.flags
index bf094ec5e..a26e61e7b 100644
--- a/Makefile.flags
+++ b/Makefile.flags
@@ -164,7 +164,7 @@ endif
164endif 164endif
165 165
166EXEEXT = .exe 166EXEEXT = .exe
167LDLIBS += ws2_32 167LDLIBS += ws2_32 bcrypt
168endif 168endif
169 169
170ifneq ($(CONFIG_PLATFORM_MINGW32),y) 170ifneq ($(CONFIG_PLATFORM_MINGW32),y)
diff --git a/configs/mingw32_defconfig b/configs/mingw32_defconfig
index d56dd1207..8859b9811 100644
--- a/configs/mingw32_defconfig
+++ b/configs/mingw32_defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Busybox version: 1.37.0.git 3# Busybox version: 1.38.0.git
4# Fri Jun 14 12:24:50 2024 4# Mon Jun 9 11:54:15 2025
5# 5#
6CONFIG_HAVE_DOT_CONFIG=y 6CONFIG_HAVE_DOT_CONFIG=y
7# CONFIG_PLATFORM_POSIX is not set 7# CONFIG_PLATFORM_POSIX is not set
@@ -121,6 +121,7 @@ CONFIG_FEATURE_BUFFERS_USE_MALLOC=y
121# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set 121# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set
122# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set 122# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set
123CONFIG_PASSWORD_MINLEN=6 123CONFIG_PASSWORD_MINLEN=6
124# CONFIG_FEATURE_USE_CNG_API is not set
124CONFIG_MD5_SMALL=1 125CONFIG_MD5_SMALL=1
125CONFIG_SHA1_SMALL=3 126CONFIG_SHA1_SMALL=3
126# CONFIG_SHA1_HWACCEL is not set 127# CONFIG_SHA1_HWACCEL is not set
@@ -226,6 +227,7 @@ CONFIG_FEATURE_UNZIP_BZIP2=y
226CONFIG_FEATURE_UNZIP_LZMA=y 227CONFIG_FEATURE_UNZIP_LZMA=y
227CONFIG_FEATURE_UNZIP_XZ=y 228CONFIG_FEATURE_UNZIP_XZ=y
228CONFIG_FEATURE_LZMA_FAST=y 229CONFIG_FEATURE_LZMA_FAST=y
230# CONFIG_FEATURE_PATH_TRAVERSAL_PROTECTION is not set
229 231
230# 232#
231# Coreutils 233# Coreutils
@@ -965,6 +967,7 @@ CONFIG_IFUPDOWN_IFSTATE_PATH=""
965# CONFIG_IPNEIGH is not set 967# CONFIG_IPNEIGH is not set
966# CONFIG_FEATURE_IP_ADDRESS is not set 968# CONFIG_FEATURE_IP_ADDRESS is not set
967# CONFIG_FEATURE_IP_LINK is not set 969# CONFIG_FEATURE_IP_LINK is not set
970CONFIG_FEATURE_IP_LINK_CAN=y
968# CONFIG_FEATURE_IP_ROUTE is not set 971# CONFIG_FEATURE_IP_ROUTE is not set
969CONFIG_FEATURE_IP_ROUTE_DIR="" 972CONFIG_FEATURE_IP_ROUTE_DIR=""
970# CONFIG_FEATURE_IP_TUNNEL is not set 973# CONFIG_FEATURE_IP_TUNNEL is not set
diff --git a/configs/mingw64_defconfig b/configs/mingw64_defconfig
index b35157b94..013176794 100644
--- a/configs/mingw64_defconfig
+++ b/configs/mingw64_defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Busybox version: 1.37.0.git 3# Busybox version: 1.38.0.git
4# Fri Jun 14 12:24:50 2024 4# Mon Jun 9 11:54:15 2025
5# 5#
6CONFIG_HAVE_DOT_CONFIG=y 6CONFIG_HAVE_DOT_CONFIG=y
7# CONFIG_PLATFORM_POSIX is not set 7# CONFIG_PLATFORM_POSIX is not set
@@ -121,6 +121,7 @@ CONFIG_FEATURE_BUFFERS_USE_MALLOC=y
121# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set 121# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set
122# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set 122# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set
123CONFIG_PASSWORD_MINLEN=6 123CONFIG_PASSWORD_MINLEN=6
124# CONFIG_FEATURE_USE_CNG_API is not set
124CONFIG_MD5_SMALL=1 125CONFIG_MD5_SMALL=1
125CONFIG_SHA1_SMALL=3 126CONFIG_SHA1_SMALL=3
126# CONFIG_SHA1_HWACCEL is not set 127# CONFIG_SHA1_HWACCEL is not set
@@ -226,6 +227,7 @@ CONFIG_FEATURE_UNZIP_BZIP2=y
226CONFIG_FEATURE_UNZIP_LZMA=y 227CONFIG_FEATURE_UNZIP_LZMA=y
227CONFIG_FEATURE_UNZIP_XZ=y 228CONFIG_FEATURE_UNZIP_XZ=y
228CONFIG_FEATURE_LZMA_FAST=y 229CONFIG_FEATURE_LZMA_FAST=y
230# CONFIG_FEATURE_PATH_TRAVERSAL_PROTECTION is not set
229 231
230# 232#
231# Coreutils 233# Coreutils
@@ -965,6 +967,7 @@ CONFIG_IFUPDOWN_IFSTATE_PATH=""
965# CONFIG_IPNEIGH is not set 967# CONFIG_IPNEIGH is not set
966# CONFIG_FEATURE_IP_ADDRESS is not set 968# CONFIG_FEATURE_IP_ADDRESS is not set
967# CONFIG_FEATURE_IP_LINK is not set 969# CONFIG_FEATURE_IP_LINK is not set
970CONFIG_FEATURE_IP_LINK_CAN=y
968# CONFIG_FEATURE_IP_ROUTE is not set 971# CONFIG_FEATURE_IP_ROUTE is not set
969CONFIG_FEATURE_IP_ROUTE_DIR="" 972CONFIG_FEATURE_IP_ROUTE_DIR=""
970# CONFIG_FEATURE_IP_TUNNEL is not set 973# CONFIG_FEATURE_IP_TUNNEL is not set
diff --git a/configs/mingw64a_defconfig b/configs/mingw64a_defconfig
index 9c178a620..1a945b2ea 100644
--- a/configs/mingw64a_defconfig
+++ b/configs/mingw64a_defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Busybox version: 1.37.0.git 3# Busybox version: 1.38.0.git
4# Fri Jun 14 12:24:50 2024 4# Mon Jun 9 11:54:15 2025
5# 5#
6CONFIG_HAVE_DOT_CONFIG=y 6CONFIG_HAVE_DOT_CONFIG=y
7# CONFIG_PLATFORM_POSIX is not set 7# CONFIG_PLATFORM_POSIX is not set
@@ -121,6 +121,7 @@ CONFIG_FEATURE_BUFFERS_USE_MALLOC=y
121# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set 121# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set
122# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set 122# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set
123CONFIG_PASSWORD_MINLEN=6 123CONFIG_PASSWORD_MINLEN=6
124# CONFIG_FEATURE_USE_CNG_API is not set
124CONFIG_MD5_SMALL=1 125CONFIG_MD5_SMALL=1
125CONFIG_SHA1_SMALL=3 126CONFIG_SHA1_SMALL=3
126# CONFIG_SHA1_HWACCEL is not set 127# CONFIG_SHA1_HWACCEL is not set
@@ -226,6 +227,7 @@ CONFIG_FEATURE_UNZIP_BZIP2=y
226CONFIG_FEATURE_UNZIP_LZMA=y 227CONFIG_FEATURE_UNZIP_LZMA=y
227CONFIG_FEATURE_UNZIP_XZ=y 228CONFIG_FEATURE_UNZIP_XZ=y
228CONFIG_FEATURE_LZMA_FAST=y 229CONFIG_FEATURE_LZMA_FAST=y
230# CONFIG_FEATURE_PATH_TRAVERSAL_PROTECTION is not set
229 231
230# 232#
231# Coreutils 233# Coreutils
@@ -965,6 +967,7 @@ CONFIG_IFUPDOWN_IFSTATE_PATH=""
965# CONFIG_IPNEIGH is not set 967# CONFIG_IPNEIGH is not set
966# CONFIG_FEATURE_IP_ADDRESS is not set 968# CONFIG_FEATURE_IP_ADDRESS is not set
967# CONFIG_FEATURE_IP_LINK is not set 969# CONFIG_FEATURE_IP_LINK is not set
970CONFIG_FEATURE_IP_LINK_CAN=y
968# CONFIG_FEATURE_IP_ROUTE is not set 971# CONFIG_FEATURE_IP_ROUTE is not set
969CONFIG_FEATURE_IP_ROUTE_DIR="" 972CONFIG_FEATURE_IP_ROUTE_DIR=""
970# CONFIG_FEATURE_IP_TUNNEL is not set 973# CONFIG_FEATURE_IP_TUNNEL is not set
diff --git a/configs/mingw64u_defconfig b/configs/mingw64u_defconfig
index e5628ea44..d25aabe63 100644
--- a/configs/mingw64u_defconfig
+++ b/configs/mingw64u_defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Busybox version: 1.37.0.git 3# Busybox version: 1.38.0.git
4# Fri Jun 14 12:24:50 2024 4# Mon Jun 9 11:54:15 2025
5# 5#
6CONFIG_HAVE_DOT_CONFIG=y 6CONFIG_HAVE_DOT_CONFIG=y
7# CONFIG_PLATFORM_POSIX is not set 7# CONFIG_PLATFORM_POSIX is not set
@@ -121,6 +121,7 @@ CONFIG_FEATURE_BUFFERS_USE_MALLOC=y
121# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set 121# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set
122# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set 122# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set
123CONFIG_PASSWORD_MINLEN=6 123CONFIG_PASSWORD_MINLEN=6
124CONFIG_FEATURE_USE_CNG_API=y
124CONFIG_MD5_SMALL=1 125CONFIG_MD5_SMALL=1
125CONFIG_SHA1_SMALL=3 126CONFIG_SHA1_SMALL=3
126# CONFIG_SHA1_HWACCEL is not set 127# CONFIG_SHA1_HWACCEL is not set
@@ -226,6 +227,7 @@ CONFIG_FEATURE_UNZIP_BZIP2=y
226CONFIG_FEATURE_UNZIP_LZMA=y 227CONFIG_FEATURE_UNZIP_LZMA=y
227CONFIG_FEATURE_UNZIP_XZ=y 228CONFIG_FEATURE_UNZIP_XZ=y
228CONFIG_FEATURE_LZMA_FAST=y 229CONFIG_FEATURE_LZMA_FAST=y
230# CONFIG_FEATURE_PATH_TRAVERSAL_PROTECTION is not set
229 231
230# 232#
231# Coreutils 233# Coreutils
@@ -965,6 +967,7 @@ CONFIG_IFUPDOWN_IFSTATE_PATH=""
965# CONFIG_IPNEIGH is not set 967# CONFIG_IPNEIGH is not set
966# CONFIG_FEATURE_IP_ADDRESS is not set 968# CONFIG_FEATURE_IP_ADDRESS is not set
967# CONFIG_FEATURE_IP_LINK is not set 969# CONFIG_FEATURE_IP_LINK is not set
970CONFIG_FEATURE_IP_LINK_CAN=y
968# CONFIG_FEATURE_IP_ROUTE is not set 971# CONFIG_FEATURE_IP_ROUTE is not set
969CONFIG_FEATURE_IP_ROUTE_DIR="" 972CONFIG_FEATURE_IP_ROUTE_DIR=""
970# CONFIG_FEATURE_IP_TUNNEL is not set 973# CONFIG_FEATURE_IP_TUNNEL is not set
diff --git a/include/libbb.h b/include/libbb.h
index 7357d2907..1e345a3ee 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -2294,6 +2294,36 @@ char *decode_base64(char *dst, const char **pp_src) FAST_FUNC;
2294char *decode_base32(char *dst, const char **pp_src) FAST_FUNC; 2294char *decode_base32(char *dst, const char **pp_src) FAST_FUNC;
2295void read_base64(FILE *src_stream, FILE *dst_stream, int flags) FAST_FUNC; 2295void read_base64(FILE *src_stream, FILE *dst_stream, int flags) FAST_FUNC;
2296 2296
2297#if defined CONFIG_FEATURE_USE_CNG_API
2298struct bcrypt_hash_ctx_t {
2299 void *handle;
2300 void *hash_obj;
2301 unsigned int output_size;
2302};
2303typedef struct bcrypt_hash_ctx_t md5_ctx_t;
2304typedef struct bcrypt_hash_ctx_t sha1_ctx_t;
2305typedef struct bcrypt_hash_ctx_t sha256_ctx_t;
2306typedef struct bcrypt_hash_ctx_t sha512_ctx_t;
2307typedef struct sha3_ctx_t {
2308 uint64_t state[25];
2309 unsigned bytes_queued;
2310 unsigned input_block_bytes;
2311} sha3_ctx_t;
2312void md5_begin(struct bcrypt_hash_ctx_t *ctx) FAST_FUNC;
2313void sha1_begin(struct bcrypt_hash_ctx_t *ctx) FAST_FUNC;
2314void sha256_begin(struct bcrypt_hash_ctx_t *ctx) FAST_FUNC;
2315void sha512_begin(struct bcrypt_hash_ctx_t *ctx) FAST_FUNC;
2316void generic_hash(struct bcrypt_hash_ctx_t *ctx, const void *buffer, size_t len) FAST_FUNC;
2317unsigned generic_end(struct bcrypt_hash_ctx_t *ctx, void *resbuf) FAST_FUNC;
2318#define md5_hash generic_hash
2319#define sha1_hash generic_hash
2320#define sha256_hash generic_hash
2321#define sha512_hash generic_hash
2322#define md5_end generic_end
2323#define sha1_end generic_end
2324#define sha256_end generic_end
2325#define sha512_end generic_end
2326#else
2297typedef struct md5_ctx_t { 2327typedef struct md5_ctx_t {
2298 uint8_t wbuffer[64]; /* always correctly aligned for uint64_t */ 2328 uint8_t wbuffer[64]; /* always correctly aligned for uint64_t */
2299 void (*process_block)(struct md5_ctx_t*) FAST_FUNC; 2329 void (*process_block)(struct md5_ctx_t*) FAST_FUNC;
@@ -2324,13 +2354,20 @@ void sha256_begin(sha256_ctx_t *ctx) FAST_FUNC;
2324void sha512_begin(sha512_ctx_t *ctx) FAST_FUNC; 2354void sha512_begin(sha512_ctx_t *ctx) FAST_FUNC;
2325void sha512_hash(sha512_ctx_t *ctx, const void *buffer, size_t len) FAST_FUNC; 2355void sha512_hash(sha512_ctx_t *ctx, const void *buffer, size_t len) FAST_FUNC;
2326unsigned sha512_end(sha512_ctx_t *ctx, void *resbuf) FAST_FUNC; 2356unsigned sha512_end(sha512_ctx_t *ctx, void *resbuf) FAST_FUNC;
2357#endif
2327void sha3_begin(sha3_ctx_t *ctx) FAST_FUNC; 2358void sha3_begin(sha3_ctx_t *ctx) FAST_FUNC;
2328void sha3_hash(sha3_ctx_t *ctx, const void *buffer, size_t len) FAST_FUNC; 2359void sha3_hash(sha3_ctx_t *ctx, const void *buffer, size_t len) FAST_FUNC;
2329unsigned sha3_end(sha3_ctx_t *ctx, void *resbuf) FAST_FUNC; 2360unsigned sha3_end(sha3_ctx_t *ctx, void *resbuf) FAST_FUNC;
2330/* TLS benefits from knowing that sha1 and sha256 share these. Give them "agnostic" names too */ 2361/* TLS benefits from knowing that sha1 and sha256 share these. Give them "agnostic" names too */
2362#if defined CONFIG_FEATURE_USE_CNG_API
2363typedef struct bcrypt_hash_ctx_t md5sha_ctx_t;
2364#define md5sha_hash generic_hash
2365#define sha_end generic_end
2366#else
2331typedef struct md5_ctx_t md5sha_ctx_t; 2367typedef struct md5_ctx_t md5sha_ctx_t;
2332#define md5sha_hash md5_hash 2368#define md5sha_hash md5_hash
2333#define sha_end sha1_end 2369#define sha_end sha1_end
2370#endif
2334enum { 2371enum {
2335 MD5_OUTSIZE = 16, 2372 MD5_OUTSIZE = 16,
2336 SHA1_OUTSIZE = 20, 2373 SHA1_OUTSIZE = 20,
diff --git a/libbb/Config.src b/libbb/Config.src
index 61b4601d6..ed6521c33 100644
--- a/libbb/Config.src
+++ b/libbb/Config.src
@@ -37,6 +37,14 @@ config PASSWORD_MINLEN
37 help 37 help
38 Minimum allowable password length. 38 Minimum allowable password length.
39 39
40config FEATURE_USE_CNG_API
41 bool "Use the Windows CNG API for checksums (Windows 10+ only)"
42 default n
43 depends on PLATFORM_MINGW32
44 help
45 Use the in-built Windows CNG API for checksums.
46 This reduces code size, but is only supported on Windows 10+.
47
40config MD5_SMALL 48config MD5_SMALL
41 int "MD5: Trade bytes for speed (0:fast, 3:slow)" 49 int "MD5: Trade bytes for speed (0:fast, 3:slow)"
42 default 1 # all "fast or small" options default to small 50 default 1 # all "fast or small" options default to small
@@ -67,6 +75,7 @@ config SHA1_SMALL
67config SHA1_HWACCEL 75config SHA1_HWACCEL
68 bool "SHA1: Use hardware accelerated instructions if possible" 76 bool "SHA1: Use hardware accelerated instructions if possible"
69 default y 77 default y
78 depends on !FEATURE_USE_CNG_API
70 help 79 help
71 On x86, this adds ~590 bytes of code. Throughput 80 On x86, this adds ~590 bytes of code. Throughput
72 is about twice as fast as fully-unrolled generic code. 81 is about twice as fast as fully-unrolled generic code.
@@ -74,6 +83,7 @@ config SHA1_HWACCEL
74config SHA256_HWACCEL 83config SHA256_HWACCEL
75 bool "SHA256: Use hardware accelerated instructions if possible" 84 bool "SHA256: Use hardware accelerated instructions if possible"
76 default y 85 default y
86 depends on !FEATURE_USE_CNG_API
77 help 87 help
78 On x86, this adds ~1k bytes of code. 88 On x86, this adds ~1k bytes of code.
79 89
diff --git a/libbb/hash_md5_sha.c b/libbb/hash_md5_sha.c
index 75a61c32c..abdacf939 100644
--- a/libbb/hash_md5_sha.c
+++ b/libbb/hash_md5_sha.c
@@ -13,6 +13,90 @@
13 13
14#define NEED_SHA512 (ENABLE_SHA512SUM || ENABLE_USE_BB_CRYPT_SHA) 14#define NEED_SHA512 (ENABLE_SHA512SUM || ENABLE_USE_BB_CRYPT_SHA)
15 15
16#if ENABLE_FEATURE_USE_CNG_API
17# include <windows.h>
18# include <bcrypt.h>
19
20// these work on Windows >= 10
21# define BCRYPT_MD5_ALG_HANDLE ((BCRYPT_ALG_HANDLE) 0x00000021)
22# define BCRYPT_SHA1_ALG_HANDLE ((BCRYPT_ALG_HANDLE) 0x00000031)
23# define BCRYPT_SHA256_ALG_HANDLE ((BCRYPT_ALG_HANDLE) 0x00000041)
24# define BCRYPT_SHA512_ALG_HANDLE ((BCRYPT_ALG_HANDLE) 0x00000061)
25
26# define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
27
28static void die_if_error(NTSTATUS status, const char *function_name) {
29 if (!NT_SUCCESS(status)) {
30 bb_error_msg_and_die("call to %s failed: 0x%08lX",
31 function_name, (unsigned long)status);
32 }
33}
34
35/* Initialize structure containing state of computation.
36 * (RFC 1321, 3.3: Step 3)
37 */
38
39static void generic_init(struct bcrypt_hash_ctx_t *ctx, BCRYPT_ALG_HANDLE *alg_handle) {
40 DWORD hash_object_length = 0;
41 ULONG _unused;
42 NTSTATUS status;
43
44 status = BCryptGetProperty(alg_handle, BCRYPT_OBJECT_LENGTH, (PUCHAR)&hash_object_length, sizeof(DWORD), &_unused, 0);
45 die_if_error(status, "BCryptGetProperty");
46 status = BCryptGetProperty(alg_handle, BCRYPT_HASH_LENGTH, (PUCHAR)&ctx->output_size, sizeof(DWORD), &_unused, 0);
47 die_if_error(status, "BCryptGetProperty");
48
49
50 ctx->hash_obj = xmalloc(hash_object_length);
51
52 status = BCryptCreateHash(alg_handle, &ctx->handle, ctx->hash_obj, hash_object_length, NULL, 0, 0);
53 die_if_error(status, "BCryptCreateHash");
54}
55
56void FAST_FUNC md5_begin(md5_ctx_t *ctx)
57{
58 generic_init(ctx, BCRYPT_MD5_ALG_HANDLE);
59}
60
61void FAST_FUNC sha1_begin(sha1_ctx_t *ctx)
62{
63 generic_init(ctx, BCRYPT_SHA1_ALG_HANDLE);
64}
65
66/* Initialize structure containing state of computation.
67 (FIPS 180-2:5.3.2) */
68void FAST_FUNC sha256_begin(sha256_ctx_t *ctx)
69{
70 generic_init(ctx, BCRYPT_SHA256_ALG_HANDLE);
71}
72
73#if NEED_SHA512
74/* Initialize structure containing state of computation.
75 (FIPS 180-2:5.3.3) */
76void FAST_FUNC sha512_begin(sha512_ctx_t *ctx)
77{
78 generic_init(ctx, BCRYPT_SHA512_ALG_HANDLE);
79}
80#endif /* NEED_SHA512 */
81
82void FAST_FUNC generic_hash(struct bcrypt_hash_ctx_t *ctx, const void *buffer, size_t len)
83{
84 /*
85 for perf, no error checking here
86 */
87 /*NTSTATUS status = */ BCryptHashData(ctx->handle, (const PUCHAR)buffer, len, 0);
88 // die_if_error(status, "BCryptHashData");
89}
90
91unsigned FAST_FUNC generic_end(struct bcrypt_hash_ctx_t *ctx, void *resbuf)
92{
93 NTSTATUS status = BCryptFinishHash(ctx->handle, resbuf, ctx->output_size, 0);
94 die_if_error(status, "BCryptFinishHash");
95 free(ctx->hash_obj);
96 return ctx->output_size;
97}
98#endif /* !ENABLE_FEATURE_USE_CNG_API */
99
16#if ENABLE_SHA1_HWACCEL || ENABLE_SHA256_HWACCEL 100#if ENABLE_SHA1_HWACCEL || ENABLE_SHA256_HWACCEL
17# if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) 101# if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
18static void cpuid_eax_ebx_ecx(unsigned *eax, unsigned *ebx, unsigned *ecx, unsigned *edx) 102static void cpuid_eax_ebx_ecx(unsigned *eax, unsigned *ebx, unsigned *ecx, unsigned *edx)
@@ -80,6 +164,7 @@ static ALWAYS_INLINE uint64_t rotl64(uint64_t x, unsigned n)
80 return (x << n) | (x >> (64 - n)); 164 return (x << n) | (x >> (64 - n));
81} 165}
82 166
167#if !ENABLE_FEATURE_USE_CNG_API
83/* Process the remaining bytes in the buffer */ 168/* Process the remaining bytes in the buffer */
84static void FAST_FUNC common64_end(md5_ctx_t *ctx, int swap_needed) 169static void FAST_FUNC common64_end(md5_ctx_t *ctx, int swap_needed)
85{ 170{
@@ -1367,6 +1452,7 @@ unsigned FAST_FUNC sha512_end(sha512_ctx_t *ctx, void *resbuf)
1367 return sizeof(ctx->hash); 1452 return sizeof(ctx->hash);
1368} 1453}
1369#endif /* NEED_SHA512 */ 1454#endif /* NEED_SHA512 */
1455#endif /* !ENABLE_FEATURE_USE_CNG_API */
1370 1456
1371 1457
1372/* 1458/*
diff --git a/scripts/mk_mingw64u_defconfig b/scripts/mk_mingw64u_defconfig
index 19124d735..5561a0900 100755
--- a/scripts/mk_mingw64u_defconfig
+++ b/scripts/mk_mingw64u_defconfig
@@ -32,6 +32,7 @@ set_build_opts \
32 CONFIG_LAST_SUPPORTED_WCHAR=1114111 \ 32 CONFIG_LAST_SUPPORTED_WCHAR=1114111 \
33 CONFIG_UNICODE_COMBINING_WCHARS=y \ 33 CONFIG_UNICODE_COMBINING_WCHARS=y \
34 CONFIG_UNICODE_WIDE_WCHARS=y \ 34 CONFIG_UNICODE_WIDE_WCHARS=y \
35 CONFIG_FEATURE_USE_CNG_API=y \
35 < "$configs"/mingw64_defconfig \ 36 < "$configs"/mingw64_defconfig \
36 > "$configs"/mingw64u_defconfig 37 > "$configs"/mingw64u_defconfig
37 38