Skip to content

Commit 0059f16

Browse files
committed
move WC_RNG_BANK_SUPPORT implementation from wolfcrypt/src/random.c and wolfssl/wolfcrypt/random.h to new files wolfcrypt/src/rng_bank.c and wolfssl/wolfcrypt/rng_bank.h;
wolfcrypt/src/rng_bank.c: * add wc_local_rng_bank_checkout_for_bankref, wc_BankRef_Release(), wc_rng_bank_new(), and wc_rng_bank_free(); * in wc_rng_bank_checkin(), take a struct wc_rng_bank_inst **rng_inst and NULL it before return; * in wc_rng_bank_init(), add a devId arg, and handle devId in wc_rng_bank_inst_reinit(); * add WC_RNG_BANK_INST_LOCK_* and use them in wc_rng_bank_checkout() and wc_rng_bank_checkin(); * fix order of operations in wc_rng_bank_checkout() re DISABLE_VECTOR_REGISTERS(); wolfcrypt/src/random.c: * refactor per-instance salting for wc_rng_bank_inst: remove changes in Hash_df(), Hash_DRBG_Instantiate(), and _InitRng(), and in wc_rng_bank_init() and wc_rng_bank_inst_reinit(), use wc_InitRngNonce_ex() and pass the wc_rng_bank_inst pointer as the nonce; * simplify the WC_RNG_BANK_SUPPORT variant of wc_RNG_GenerateBlock() -- delegate to wc_local_rng_bank_checkout_for_bankref() and remove supplementary error checking; * in wc_FreeRng(), call wc_BankRef_Release() when WC_DRBG_BANKREF, and in wc_BankRef_Release(), fix refcount flub (not wolfSSL_RefFree, rather wolfSSL_RefDec); * streamline the WOLFSSL_LINUXKM wc_GenerateSeed(); wolfcrypt/test/test.c: add random_bank_test(); linuxkm/lkcapi_sha_glue.c: use WC_RNG_BANK_INST_TO_RNG() opportunistically; configure.ac: add --enable-amdrdseed as a synonym for --enable-amdrand; linuxkm/linuxkm_wc_port.h: when LINUXKM_LKCAPI_REGISTER_HASH_DRBG_DEFAULT, don't include get_random_bytes() in struct wolfssl_linuxkm_pie_redirect_table; add various comments for clarity.
1 parent 1e0351a commit 0059f16

12 files changed

Lines changed: 1305 additions & 831 deletions

File tree

configure.ac

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3998,12 +3998,17 @@ then
39983998
fi
39993999

40004000
# AMD RDSEED
4001-
AC_ARG_ENABLE([amdrand],
4002-
[AS_HELP_STRING([--enable-amdrand],[Enable AMD rdseed as preferred RNG seeding source (default: disabled)])],
4001+
AC_ARG_ENABLE([amdrdseed],
4002+
[AS_HELP_STRING([--enable-amdrdseed],[Enable AMD rdseed as preferred RNG seeding source (default: disabled)])],
40034003
[ ENABLED_AMDRDSEED=$enableval ],
40044004
[ ENABLED_AMDRDSEED=no ]
40054005
)
40064006

4007+
AC_ARG_ENABLE([amdrand],
4008+
[AS_HELP_STRING([--enable-amdrand],[Enable AMD rdseed as preferred RNG seeding source (default: disabled)])],
4009+
[ ENABLED_AMDRDSEED=$enableval ]
4010+
)
4011+
40074012
if test "$ENABLED_AMDRDSEED" = "yes"
40084013
then
40094014
AM_CFLAGS="$AM_CFLAGS -DHAVE_AMD_RDSEED"
@@ -11093,6 +11098,7 @@ AM_CONDITIONAL([BUILD_ECCSI],[test "x$ENABLED_ECCSI" = "xyes" || test "x$ENABLED
1109311098
AM_CONDITIONAL([BUILD_SAKKE],[test "x$ENABLED_SAKKE" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"])
1109411099
AM_CONDITIONAL([BUILD_MEMORY],[test "x$ENABLED_MEMORY" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"])
1109511100
AM_CONDITIONAL([BUILD_MEMUSE],[test "x$ENABLED_ENTROPY_MEMUSE" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"])
11101+
AM_CONDITIONAL([BUILD_RNG_BANK],[test "$ENABLED_RNG_BANK" = "yes" || test "$ENABLED_USERSETTINGS" = "yes"])
1109611102
AM_CONDITIONAL([BUILD_RSA],[test "x$ENABLED_RSA" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"])
1109711103
AM_CONDITIONAL([BUILD_DH],[test "x$ENABLED_DH" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"])
1109811104
AM_CONDITIONAL([BUILD_ASN],[test "x$ENABLED_ASN" != "xno" || test "x$ENABLED_RSA" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"])

linuxkm/linuxkm_wc_port.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -937,7 +937,9 @@
937937
typeof(kfree) *kfree;
938938
typeof(ksize) *ksize;
939939

940+
#ifndef LINUXKM_LKCAPI_REGISTER_HASH_DRBG_DEFAULT
940941
typeof(get_random_bytes) *get_random_bytes;
942+
#endif
941943
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
942944
typeof(getnstimeofday) *getnstimeofday;
943945
#elif LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)
@@ -1267,7 +1269,9 @@
12671269
#endif
12681270
#define ksize WC_PIE_INDIRECT_SYM(ksize)
12691271

1272+
#ifndef LINUXKM_LKCAPI_REGISTER_HASH_DRBG_DEFAULT
12701273
#define get_random_bytes WC_PIE_INDIRECT_SYM(get_random_bytes)
1274+
#endif
12711275
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
12721276
#define getnstimeofday WC_PIE_INDIRECT_SYM(getnstimeofday)
12731277
#elif LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)

linuxkm/lkcapi_sha_glue.c

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -955,6 +955,7 @@ struct wc_swallow_the_semicolon
955955
#include <wolfssl/wolfcrypt/wolfentropy.h>
956956
#endif
957957
#include <wolfssl/wolfcrypt/random.h>
958+
#include <wolfssl/wolfcrypt/rng_bank.h>
958959

959960
static volatile int wc_linuxkm_drbg_init_tfm_disable_vector_registers = 0;
960961

@@ -1000,8 +1001,9 @@ static int wc_linuxkm_drbg_init_tfm(struct crypto_tfm *tfm)
10001001
if (wc_linuxkm_drbg_init_tfm_disable_vector_registers)
10011002
flags |= WC_RNG_BANK_FLAG_NO_VECTOR_OPS;
10021003

1003-
ret = wc_rng_bank_init(ctx, nr_cpu_ids + 4, flags,
1004-
WC_LINUXKM_INITRNG_TIMEOUT_SEC, NULL /* heap */);
1004+
ret = wc_rng_bank_init(
1005+
ctx, nr_cpu_ids + 4, flags, WC_LINUXKM_INITRNG_TIMEOUT_SEC,
1006+
NULL /* heap */, INVALID_DEVID);
10051007

10061008
if (ret == 0) {
10071009
ret = wc_rng_bank_set_affinity_handlers(
@@ -1075,7 +1077,7 @@ static struct wc_rng_bank_inst *linuxkm_get_drbg(struct crypto_rng *tfm) {
10751077
return ret;
10761078
}
10771079

1078-
static void linuxkm_put_drbg(struct crypto_rng *tfm, struct wc_rng_bank_inst *drbg) {
1080+
static void linuxkm_put_drbg(struct crypto_rng *tfm, struct wc_rng_bank_inst **drbg) {
10791081
struct wc_rng_bank *ctx = (struct wc_rng_bank *)crypto_rng_ctx(tfm);
10801082
int ret = wc_rng_bank_checkin(ctx, drbg);
10811083
if (ret != 0) {
@@ -1114,6 +1116,10 @@ static inline struct crypto_rng *get_crypto_default_rng(void) {
11141116
return current_crypto_default_rng;
11151117
}
11161118

1119+
#ifndef WC_DRBG_BANKREF
1120+
#error LINUXKM_LKCAPI_REGISTER_HASH_DRBG_DEFAULT requires WC_DRBG_BANKREF support.
1121+
#endif
1122+
11171123
WC_MAYBE_UNUSED static int linuxkm_InitRng_DefaultRef(WC_RNG* rng) {
11181124
int ret;
11191125
struct crypto_rng *current_crypto_default_rng = get_crypto_default_rng();
@@ -1146,7 +1152,7 @@ static int wc_linuxkm_drbg_generate(struct crypto_rng *tfm,
11461152
}
11471153

11481154
if (slen > 0) {
1149-
ret = wc_RNG_DRBG_Reseed(&drbg->rng, src, slen);
1155+
ret = wc_RNG_DRBG_Reseed(WC_RNG_BANK_INST_TO_RNG(drbg), src, slen);
11501156
if (ret != 0) {
11511157
pr_warn_once("WARNING: wc_RNG_DRBG_Reseed returned %d\n",ret);
11521158
ret = -EINVAL;
@@ -1157,15 +1163,15 @@ static int wc_linuxkm_drbg_generate(struct crypto_rng *tfm,
11571163
for (;;) {
11581164
#define RNG_MAX_BLOCK_LEN_ROUNDED (RNG_MAX_BLOCK_LEN & ~0xfU)
11591165
if (dlen > RNG_MAX_BLOCK_LEN_ROUNDED) {
1160-
ret = wc_RNG_GenerateBlock(&drbg->rng, dst, RNG_MAX_BLOCK_LEN_ROUNDED);
1166+
ret = wc_RNG_GenerateBlock(WC_RNG_BANK_INST_TO_RNG(drbg), dst, RNG_MAX_BLOCK_LEN_ROUNDED);
11611167
if (ret == 0) {
11621168
dlen -= RNG_MAX_BLOCK_LEN_ROUNDED;
11631169
dst += RNG_MAX_BLOCK_LEN_ROUNDED;
11641170
}
11651171
}
11661172
#undef RNG_MAX_BLOCK_LEN_ROUNDED
11671173
else {
1168-
ret = wc_RNG_GenerateBlock(&drbg->rng, dst, dlen);
1174+
ret = wc_RNG_GenerateBlock(WC_RNG_BANK_INST_TO_RNG(drbg), dst, dlen);
11691175
if (ret == 0)
11701176
dlen = 0;
11711177
}
@@ -1206,7 +1212,7 @@ static int wc_linuxkm_drbg_generate(struct crypto_rng *tfm,
12061212

12071213
out:
12081214

1209-
linuxkm_put_drbg(tfm, drbg);
1215+
linuxkm_put_drbg(tfm, &drbg);
12101216

12111217
return ret;
12121218
}
@@ -1438,12 +1444,12 @@ static int wc_mix_pool_bytes(const void *buf, size_t len) {
14381444
continue;
14391445

14401446
for (i = 0, V_offset = 0; i < len; ++i) {
1441-
((struct DRBG_internal *)drbg->rng.drbg)->V[V_offset++] += ((byte *)buf)[i];
1442-
if (V_offset == (int)sizeof ((struct DRBG_internal *)drbg->rng.drbg)->V)
1447+
((struct DRBG_internal *)WC_RNG_BANK_INST_TO_RNG(drbg)->drbg)->V[V_offset++] += ((byte *)buf)[i];
1448+
if (V_offset == (int)sizeof ((struct DRBG_internal *)WC_RNG_BANK_INST_TO_RNG(drbg)->drbg)->V)
14431449
V_offset = 0;
14441450
}
14451451

1446-
wc_rng_bank_checkin(ctx, drbg);
1452+
wc_rng_bank_checkin(ctx, &drbg);
14471453
if (can_sleep) {
14481454
if (signal_pending(current))
14491455
return -EINTR;

linuxkm/module_exports.c.template

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@
6666
#include <wolfssl/wolfcrypt/wolfentropy.h>
6767
#endif
6868
#include <wolfssl/wolfcrypt/random.h>
69+
#ifdef WC_RNG_BANK_SUPPORT
70+
#include <wolfssl/wolfcrypt/rng_bank.h>
71+
#endif
6972
#endif
7073
#include <wolfssl/wolfcrypt/coding.h>
7174
#include <wolfssl/wolfcrypt/signature.h>

linuxkm/module_hooks.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,7 +1288,9 @@ static int set_up_wolfssl_linuxkm_pie_redirect_table(void) {
12881288
wolfssl_linuxkm_pie_redirect_table.kvfree = kvfree;
12891289
#endif
12901290

1291+
#ifndef LINUXKM_LKCAPI_REGISTER_HASH_DRBG_DEFAULT
12911292
wolfssl_linuxkm_pie_redirect_table.get_random_bytes = get_random_bytes;
1293+
#endif
12921294
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
12931295
wolfssl_linuxkm_pie_redirect_table.getnstimeofday =
12941296
getnstimeofday;

src/include.am

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,10 @@ if BUILD_MEMUSE
185185
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wolfentropy.c
186186
endif
187187

188+
if BUILD_RNG_BANK
189+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/rng_bank.c
190+
endif
191+
188192
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/kdf.c
189193

190194
if BUILD_RSA
@@ -434,6 +438,10 @@ if BUILD_MEMUSE
434438
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wolfentropy.c
435439
endif
436440

441+
if BUILD_RNG_BANK
442+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/rng_bank.c
443+
endif
444+
437445
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/kdf.c
438446

439447
if BUILD_RSA
@@ -789,6 +797,9 @@ src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/random.c
789797
if BUILD_MEMUSE
790798
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wolfentropy.c
791799
endif
800+
if BUILD_RNG_BANK
801+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/rng_bank.c
802+
endif
792803
endif
793804
endif !BUILD_FIPS_V2_PLUS
794805

0 commit comments

Comments
 (0)