Skip to content

Commit dc05c4c

Browse files
committed
wolfcrypt/src/random.c and wolfssl/wolfcrypt/random.h: refactor DRBG_internal.reseedCtr as a word64 if WORD64_AVAILABLE, to accommodate max reseed count per NIST SP 800-90A Rev. 1;
wolfssl/wolfcrypt/settings.h: if WOLFSSL_LINUXKM && LINUXKM_LKCAPI_REGISTER && WORD64_AVAILABLE, set default WC_RESEED_INTERVAL to max allowed (2^48); linuxkm/lkcapi_sha_glue.c: handle NO_LINUXKM_DRBG_GET_RANDOM_BYTES, for build-time override control of LINUXKM_DRBG_GET_RANDOM_BYTES, and handle WOLFSSL_LINUXKM_USE_GET_RANDOM_USER_KRETPROBE, for separate opt-in control of the buggy wc_get_random_bytes_user_kretprobe_enter().
1 parent 3a43109 commit dc05c4c

5 files changed

Lines changed: 44 additions & 8 deletions

File tree

.wolfssl_known_macro_extras

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ NO_HANDSHAKE_DONE_CB
369369
NO_IMX6_CAAM_AES
370370
NO_IMX6_CAAM_HASH
371371
NO_KEEP_PEER_CERT
372+
NO_LINUXKM_DRBG_GET_RANDOM_BYTES
372373
NO_OLD_NAMES
373374
NO_OLD_POLY1305
374375
NO_OLD_TIMEVAL_NAME
@@ -719,6 +720,7 @@ WOLFSSL_KYBER_NO_ENCAPSULATE
719720
WOLFSSL_KYBER_NO_MAKE_KEY
720721
WOLFSSL_LIB
721722
WOLFSSL_LINUXKM_USE_GET_RANDOM_KPROBES
723+
WOLFSSL_LINUXKM_USE_GET_RANDOM_USER_KRETPROBE
722724
WOLFSSL_LINUXKM_USE_MUTEXES
723725
WOLFSSL_LMS_CACHE_BITS
724726
WOLFSSL_LMS_FULL_HASH

linuxkm/lkcapi_sha_glue.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,7 +1184,9 @@ static struct rng_alg wc_linuxkm_drbg = {
11841184
};
11851185
static int wc_linuxkm_drbg_loaded = 0;
11861186

1187-
#if defined(LINUXKM_LKCAPI_REGISTER_HASH_DRBG_DEFAULT) && \
1187+
#ifdef NO_LINUXKM_DRBG_GET_RANDOM_BYTES
1188+
#undef LINUXKM_DRBG_GET_RANDOM_BYTES
1189+
#elif defined(LINUXKM_LKCAPI_REGISTER_HASH_DRBG_DEFAULT) && \
11881190
(defined(WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS) || defined(WOLFSSL_LINUXKM_USE_GET_RANDOM_KPROBES))
11891191
#ifndef LINUXKM_DRBG_GET_RANDOM_BYTES
11901192
#define LINUXKM_DRBG_GET_RANDOM_BYTES
@@ -1475,9 +1477,7 @@ static int wc_get_random_bytes_kprobe_installed = 0;
14751477

14761478
/* note, we can't kprobe _get_random_bytes() because it's inlined. */
14771479

1478-
struct wc_get_random_bytes_user_kretprobe_ctx {
1479-
unsigned long retval;
1480-
};
1480+
#ifdef WOLFSSL_LINUXKM_USE_GET_RANDOM_USER_KRETPROBE
14811481

14821482
#warning Interception of /dev/random, /dev/urandom, and getrandom() using \
14831483
wc_get_random_bytes_user_kretprobe_enter() is known to destabilize large \
@@ -1486,6 +1486,10 @@ struct wc_get_random_bytes_user_kretprobe_ctx {
14861486
/dev/urandom reads. When in doubt, patch your kernel, activating \
14871487
WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS.
14881488

1489+
struct wc_get_random_bytes_user_kretprobe_ctx {
1490+
unsigned long retval;
1491+
};
1492+
14891493
static int wc_get_random_bytes_user_kretprobe_enter(struct kretprobe_instance *p, struct pt_regs *regs)
14901494
{
14911495
struct iov_iter *iter = (struct iov_iter *)regs->di;
@@ -1586,6 +1590,8 @@ static struct kretprobe wc_get_random_bytes_user_kretprobe = {
15861590
};
15871591
static int wc_get_random_bytes_user_kretprobe_installed = 0;
15881592

1593+
#endif /* WOLFSSL_LINUXKM_USE_GET_RANDOM_USER_KRETPROBE */
1594+
15891595
#else /* !WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS && !(CONFIG_KPROBES && CONFIG_X86) */
15901596
#error LINUXKM_DRBG_GET_RANDOM_BYTES implementation missing for target architecture/configuration.
15911597
#endif
@@ -1777,6 +1783,7 @@ static int wc_linuxkm_drbg_startup(void)
17771783
pr_err("ERROR: wc_get_random_bytes_kprobe installation failed: %d\n", ret);
17781784
}
17791785

1786+
#ifdef WOLFSSL_LINUXKM_USE_GET_RANDOM_USER_KRETPROBE
17801787
ret = register_kretprobe(&wc_get_random_bytes_user_kretprobe);
17811788
if (ret == 0) {
17821789
wc_get_random_bytes_user_kretprobe_installed = 1;
@@ -1785,6 +1792,7 @@ static int wc_linuxkm_drbg_startup(void)
17851792
else {
17861793
pr_err("ERROR: wc_get_random_bytes_user_kprobe installation failed: %d\n", ret);
17871794
}
1795+
#endif /* WOLFSSL_LINUXKM_USE_GET_RANDOM_USER_KRETPROBE */
17881796

17891797
#else
17901798
#error LINUXKM_DRBG_GET_RANDOM_BYTES missing installation calls.
@@ -1846,15 +1854,17 @@ static int wc_linuxkm_drbg_cleanup(void) {
18461854
unregister_kprobe(&wc_get_random_bytes_kprobe);
18471855
pr_info("wc_get_random_bytes_kprobe uninstalled\n");
18481856
}
1857+
#ifdef WOLFSSL_LINUXKM_USE_GET_RANDOM_USER_KRETPROBE
18491858
if (wc_get_random_bytes_user_kretprobe_installed) {
18501859
wc_get_random_bytes_user_kretprobe_installed = 0;
18511860
barrier();
18521861
unregister_kretprobe(&wc_get_random_bytes_user_kretprobe);
18531862
pr_info("wc_get_random_bytes_user_kretprobe uninstalled\n");
18541863
}
1864+
#endif /* WOLFSSL_LINUXKM_USE_GET_RANDOM_USER_KRETPROBE */
18551865

18561866
#else
1857-
#error LINUXKM_DRBG_GET_RANDOM_BYTES missing installation calls.
1867+
#error LINUXKM_DRBG_GET_RANDOM_BYTES missing deinstallation calls.
18581868
#endif
18591869

18601870
#endif /* LINUXKM_DRBG_GET_RANDOM_BYTES */

wolfcrypt/src/random.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,11 @@ static int Hash_DRBG_Generate(DRBG_internal* drbg, byte* out, word32 outSz)
642642
wc_Sha256 sha[1];
643643
#endif
644644
byte type;
645+
#ifdef WORD64_AVAILABLE
646+
word64 reseedCtr;
647+
#else
645648
word32 reseedCtr;
649+
#endif
646650

647651
if (drbg == NULL) {
648652
return DRBG_FAILURE;
@@ -692,7 +696,11 @@ static int Hash_DRBG_Generate(DRBG_internal* drbg, byte* out, word32 outSz)
692696
array_add(drbg->V, sizeof(drbg->V), digest, WC_SHA256_DIGEST_SIZE);
693697
array_add(drbg->V, sizeof(drbg->V), drbg->C, sizeof(drbg->C));
694698
#ifdef LITTLE_ENDIAN_ORDER
699+
#ifdef WORD64_AVAILABLE
700+
reseedCtr = ByteReverseWord64(reseedCtr);
701+
#else
695702
reseedCtr = ByteReverseWord32(reseedCtr);
703+
#endif
696704
#endif
697705
array_add(drbg->V, sizeof(drbg->V),
698706
(byte*)&reseedCtr, sizeof(reseedCtr));

wolfssl/wolfcrypt/random.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,11 @@ struct OS_Seed {
164164

165165
#ifdef HAVE_HASHDRBG
166166
struct DRBG_internal {
167+
#ifdef WORD64_AVAILABLE
168+
word64 reseedCtr;
169+
#else
167170
word32 reseedCtr;
171+
#endif
168172
byte V[DRBG_SEED_LEN];
169173
byte C[DRBG_SEED_LEN];
170174
void* heap;

wolfssl/wolfcrypt/settings.h

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3625,9 +3625,6 @@ extern void uITRON4_free(void *p) ;
36253625

36263626
/* Linux Kernel Module */
36273627
#ifdef WOLFSSL_LINUXKM
3628-
#ifndef WOLFSSL_NO_GETPID
3629-
#define WOLFSSL_NO_GETPID
3630-
#endif /* WOLFSSL_NO_GETPID */
36313628
#ifdef HAVE_CONFIG_H
36323629
#include <config.h>
36333630
#undef HAVE_CONFIG_H
@@ -3681,6 +3678,9 @@ extern void uITRON4_free(void *p) ;
36813678
#undef WOLFSSL_HAVE_MAX
36823679
#undef WOLFSSL_HAVE_ASSERT_H
36833680
#define WOLFSSL_NO_ASSERT_H
3681+
#ifndef WOLFSSL_NO_GETPID
3682+
#define WOLFSSL_NO_GETPID
3683+
#endif /* WOLFSSL_NO_GETPID */
36843684
#ifndef SIZEOF_LONG
36853685
#define SIZEOF_LONG 8
36863686
#endif
@@ -3731,6 +3731,18 @@ extern void uITRON4_free(void *p) ;
37313731
#define WC_SANITIZE_ENABLE() kasan_enable_current()
37323732
#endif
37333733
#endif
3734+
3735+
#if !defined(WC_RESEED_INTERVAL) && defined(LINUXKM_LKCAPI_REGISTER)
3736+
/* If installing handlers, use the maximum reseed interval allowed by
3737+
* NIST SP 800-90A Rev. 1, to avoid unnecessary delays in DRBG
3738+
* generation.
3739+
*/
3740+
#ifdef WORD64_AVAILABLE
3741+
#define WC_RESEED_INTERVAL (1UL<<48UL)
3742+
#else
3743+
#define WC_RESEED_INTERVAL 0xffffffffU
3744+
#endif
3745+
#endif
37343746
#endif
37353747

37363748

0 commit comments

Comments
 (0)