Skip to content

Commit 0160af0

Browse files
committed
linuxkm/patches/: update patches to reseed the wolfCrypt DRBG array only on explicit RNDRESEEDCRNG ioctl;
linuxkm/lkcapi_sha_glue.c: add error msg in wc_linuxkm_drbg_generate() if wc_InitRng() fails, and add "libwolfssl: " prefixes in pr_info() messages.
1 parent d2083db commit 0160af0

10 files changed

Lines changed: 735 additions & 148 deletions

linuxkm/lkcapi_sha_glue.c

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,9 +1101,12 @@ static int wc_linuxkm_drbg_generate(struct crypto_rng *tfm,
11011101
pr_warn("WARNING: reinitialized DRBG #%d after RNG_FAILURE_E.", raw_smp_processor_id());
11021102
goto retry;
11031103
}
1104+
else {
1105+
pr_warn_once("ERROR: reinitialization of DRBG #%d after RNG_FAILURE_E failed with ret %d.", raw_smp_processor_id(), ret);
1106+
ret = -EINVAL;
1107+
}
11041108
}
1105-
1106-
if (ret != 0) {
1109+
else if (ret != 0) {
11071110
pr_warn_once("WARNING: wc_RNG_GenerateBlock returned %d\n",ret);
11081111
ret = -EINVAL;
11091112
}
@@ -1748,7 +1751,7 @@ static int wc_linuxkm_drbg_startup(void)
17481751
crypto_put_default_rng();
17491752
wc_linuxkm_drbg_default_instance_registered = 1;
17501753
pr_info("%s registered as systemwide default stdrng.", wc_linuxkm_drbg.base.cra_driver_name);
1751-
pr_info("to unload module, first echo 1 > /sys/module/libwolfssl/deinstall_algs");
1754+
pr_info("libwolfssl: to unload module, first echo 1 > /sys/module/libwolfssl/deinstall_algs");
17521755
}
17531756
else {
17541757
pr_err("ERROR: %s NOT registered as systemwide default stdrng -- found \"%s\".", wc_linuxkm_drbg.base.cra_driver_name, crypto_tfm_alg_driver_name(&crypto_default_rng->base));
@@ -1766,7 +1769,7 @@ static int wc_linuxkm_drbg_startup(void)
17661769

17671770
if (ret == 0) {
17681771
wc_get_random_bytes_callbacks_installed = 1;
1769-
pr_info("Kernel global random_bytes handlers installed.");
1772+
pr_info("libwolfssl: kernel global random_bytes handlers installed.");
17701773
}
17711774
else {
17721775
pr_err("ERROR: wolfssl_linuxkm_register_random_bytes_handlers() failed: %d\n", ret);
@@ -1777,7 +1780,7 @@ static int wc_linuxkm_drbg_startup(void)
17771780
ret = register_kprobe(&wc_get_random_bytes_kprobe);
17781781
if (ret == 0) {
17791782
wc_get_random_bytes_kprobe_installed = 1;
1780-
pr_info("wc_get_random_bytes_kprobe installed\n");
1783+
pr_info("libwolfssl: wc_get_random_bytes_kprobe installed\n");
17811784
}
17821785
else {
17831786
pr_err("ERROR: wc_get_random_bytes_kprobe installation failed: %d\n", ret);
@@ -1787,7 +1790,7 @@ static int wc_linuxkm_drbg_startup(void)
17871790
ret = register_kretprobe(&wc_get_random_bytes_user_kretprobe);
17881791
if (ret == 0) {
17891792
wc_get_random_bytes_user_kretprobe_installed = 1;
1790-
pr_info("wc_get_random_bytes_user_kretprobe installed\n");
1793+
pr_info("libwolfssl: wc_get_random_bytes_user_kretprobe installed\n");
17911794
}
17921795
else {
17931796
pr_err("ERROR: wc_get_random_bytes_user_kprobe installation failed: %d\n", ret);
@@ -1842,7 +1845,7 @@ static int wc_linuxkm_drbg_cleanup(void) {
18421845
pr_err("ERROR: wolfssl_linuxkm_unregister_random_bytes_handlers returned %d", ret);
18431846
return ret;
18441847
}
1845-
pr_info("wc_get_random_bytes handlers uninstalled\n");
1848+
pr_info("libwolfssl: kernel global random_bytes handlers uninstalled\n");
18461849
wc_get_random_bytes_callbacks_installed = 0;
18471850
}
18481851

@@ -1852,14 +1855,14 @@ static int wc_linuxkm_drbg_cleanup(void) {
18521855
wc_get_random_bytes_kprobe_installed = 0;
18531856
barrier();
18541857
unregister_kprobe(&wc_get_random_bytes_kprobe);
1855-
pr_info("wc_get_random_bytes_kprobe uninstalled\n");
1858+
pr_info("libwolfssl: wc_get_random_bytes_kprobe uninstalled\n");
18561859
}
18571860
#ifdef WOLFSSL_LINUXKM_USE_GET_RANDOM_USER_KRETPROBE
18581861
if (wc_get_random_bytes_user_kretprobe_installed) {
18591862
wc_get_random_bytes_user_kretprobe_installed = 0;
18601863
barrier();
18611864
unregister_kretprobe(&wc_get_random_bytes_user_kretprobe);
1862-
pr_info("wc_get_random_bytes_user_kretprobe uninstalled\n");
1865+
pr_info("libwolfssl: wc_get_random_bytes_user_kretprobe uninstalled\n");
18631866
}
18641867
#endif /* WOLFSSL_LINUXKM_USE_GET_RANDOM_USER_KRETPROBE */
18651868

linuxkm/patches/5.10.17/WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS-5v10v17.patch

Lines changed: 97 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--- ./drivers/char/random.c.dist 2020-12-13 16:41:30.000000000 -0600
2-
+++ ./drivers/char/random.c 2025-06-28 10:11:47.329492006 -0500
2+
+++ ./drivers/char/random.c 2025-07-02 11:59:07.220250957 -0500
33
@@ -344,6 +344,260 @@
44
#include <asm/irq_regs.h>
55
#include <asm/io.h>
@@ -261,22 +261,30 @@
261261
#define CREATE_TRACE_POINTS
262262
#include <trace/events/random.h>
263263

264-
@@ -461,7 +715,13 @@ static struct crng_state primary_crng =
264+
@@ -461,7 +715,22 @@ static struct crng_state primary_crng =
265265
* its value (from 0->1->2).
266266
*/
267267
static int crng_init = 0;
268-
-#define crng_ready() (likely(crng_init > 1))
269268
+
269+
#define crng_ready() (likely(crng_init > 1))
270270
+#ifdef WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS
271-
+ #define crng_ready() (atomic_read(&random_bytes_cb_refcnt) ? call_crng_ready_cb() : (likely(crng_init > 1)))
271+
+ #define crng_ready_by_cb() (atomic_read(&random_bytes_cb_refcnt) && call_crng_ready_cb())
272+
+ #define crng_ready_maybe_cb() (atomic_read(&random_bytes_cb_refcnt) ? (call_crng_ready_cb() || crng_ready()) : crng_ready())
272273
+#else
273-
+ #define crng_ready() (likely(crng_init > 1))
274+
+ #define crng_ready_maybe_cb() crng_ready()
275+
+#endif
276+
+
277+
+#ifdef WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS
278+
+ #define crng_ready_by_cb() (atomic_read(&random_bytes_cb_refcnt) && call_crng_ready_cb())
279+
+ #define crng_ready_maybe_cb() (atomic_read(&random_bytes_cb_refcnt) ? (call_crng_ready_cb() || crng_ready()) : crng_ready())
280+
+#else
281+
+ #define crng_ready_maybe_cb() crng_ready()
274282
+#endif
275283
+
276284
static int crng_init_cnt = 0;
277285
static unsigned long crng_global_init_time = 0;
278286
#define CRNG_INIT_CNT_THRESH (2*CHACHA_KEY_SIZE)
279-
@@ -593,6 +853,11 @@ static void mix_pool_bytes(struct entrop
287+
@@ -593,6 +862,11 @@ static void mix_pool_bytes(struct entrop
280288
{
281289
unsigned long flags;
282290

@@ -288,7 +296,7 @@
288296
trace_mix_pool_bytes(r->name, nbytes, _RET_IP_);
289297
spin_lock_irqsave(&r->lock, flags);
290298
_mix_pool_bytes(r, in, nbytes);
291-
@@ -664,6 +929,10 @@ static void credit_entropy_bits(struct e
299+
@@ -664,6 +938,10 @@ static void credit_entropy_bits(struct e
292300
const int pool_size = r->poolinfo->poolfracbits;
293301
int nfrac = nbits << ENTROPY_SHIFT;
294302

@@ -299,19 +307,7 @@
299307
if (!nbits)
300308
return;
301309

302-
@@ -954,6 +1223,11 @@ static void crng_reseed(struct crng_stat
303-
__u32 key[8];
304-
} buf;
305-
306-
+#ifdef WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS
307-
+ (void)call_crng_reseed_cb();
308-
+ /* fall through to reseed native crng too. */
309-
+#endif
310-
+
311-
if (r) {
312-
num = extract_entropy(r, &buf, 32, 16, 0);
313-
if (num == 0)
314-
@@ -1069,6 +1343,18 @@ static ssize_t extract_crng_user(void __
310+
@@ -1069,6 +1347,18 @@ static ssize_t extract_crng_user(void __
315311
__u8 tmp[CHACHA_BLOCK_SIZE] __aligned(4);
316312
int large_request = (nbytes > 256);
317313

@@ -330,7 +326,16 @@
330326
while (nbytes) {
331327
if (large_request && need_resched()) {
332328
if (signal_pending(current)) {
333-
@@ -1552,6 +1838,14 @@ static void _get_random_bytes(void *buf,
329+
@@ -1523,7 +1813,7 @@ static void _warn_unseeded_randomness(co
330+
#endif
331+
332+
if (print_once ||
333+
- crng_ready() ||
334+
+ crng_ready_maybe_cb() ||
335+
(previous && (caller == READ_ONCE(*previous))))
336+
return;
337+
WRITE_ONCE(*previous, caller);
338+
@@ -1552,6 +1842,14 @@ static void _get_random_bytes(void *buf,
334339

335340
trace_get_random_bytes(nbytes, _RET_IP_);
336341

@@ -345,6 +350,77 @@
345350
while (nbytes >= CHACHA_BLOCK_SIZE) {
346351
extract_crng(buf);
347352
buf += CHACHA_BLOCK_SIZE;
353+
@@ -1638,12 +1936,12 @@ static void try_to_generate_entropy(void
354+
*/
355+
int wait_for_random_bytes(void)
356+
{
357+
- if (likely(crng_ready()))
358+
+ if (likely(crng_ready_maybe_cb()))
359+
return 0;
360+
361+
do {
362+
int ret;
363+
- ret = wait_event_interruptible_timeout(crng_init_wait, crng_ready(), HZ);
364+
+ ret = wait_event_interruptible_timeout(crng_init_wait, crng_ready_maybe_cb(), HZ);
365+
if (ret)
366+
return ret > 0 ? 0 : ret;
367+
368+
@@ -1665,7 +1963,7 @@ EXPORT_SYMBOL(wait_for_random_bytes);
369+
*/
370+
bool rng_is_initialized(void)
371+
{
372+
- return crng_ready();
373+
+ return crng_ready_maybe_cb();
374+
}
375+
EXPORT_SYMBOL(rng_is_initialized);
376+
377+
@@ -1843,7 +2141,7 @@ urandom_read(struct file *file, char __u
378+
unsigned long flags;
379+
static int maxwarn = 10;
380+
381+
- if (!crng_ready() && maxwarn > 0) {
382+
+ if (!crng_ready_maybe_cb() && maxwarn > 0) {
383+
maxwarn--;
384+
if (__ratelimit(&urandom_warning))
385+
pr_notice("%s: uninitialized urandom read (%zd bytes read)\n",
386+
@@ -1872,6 +2170,11 @@ random_poll(struct file *file, poll_tabl
387+
{
388+
__poll_t mask;
389+
390+
+#ifdef WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS
391+
+ if (crng_ready_by_cb())
392+
+ return EPOLLIN | EPOLLRDNORM;
393+
+#endif
394+
+
395+
poll_wait(file, &crng_init_wait, wait);
396+
poll_wait(file, &random_write_wait, wait);
397+
mask = 0;
398+
@@ -1970,6 +2273,16 @@ static long random_ioctl(struct file *f,
399+
case RNDRESEEDCRNG:
400+
if (!capable(CAP_SYS_ADMIN))
401+
return -EPERM;
402+
+#ifdef WOLFSSL_LINUXKM_HAVE_GET_RANDOM_CALLBACKS
403+
+ /* fall through to reseed native crng too. */
404+
+ if (call_crng_reseed_cb() == 0) {
405+
+ if (crng_init >= 2) {
406+
+ crng_reseed(&primary_crng, &input_pool);
407+
+ crng_global_init_time = jiffies - 1;
408+
+ }
409+
+ return 0;
410+
+ }
411+
+#endif
412+
if (crng_init < 2)
413+
return -ENODATA;
414+
crng_reseed(&primary_crng, NULL);
415+
@@ -2022,7 +2335,7 @@ SYSCALL_DEFINE3(getrandom, char __user *
416+
if (count > INT_MAX)
417+
count = INT_MAX;
418+
419+
- if (!(flags & GRND_INSECURE) && !crng_ready()) {
420+
+ if (!(flags & GRND_INSECURE) && !crng_ready_maybe_cb()) {
421+
if (flags & GRND_NONBLOCK)
422+
return -EAGAIN;
423+
ret = wait_for_random_bytes();
348424
--- ./include/linux/random.h.dist 2020-12-13 16:41:30.000000000 -0600
349425
+++ ./include/linux/random.h 2025-06-30 12:05:59.106440700 -0500
350426
@@ -158,4 +158,37 @@ static inline bool __init arch_get_rando

0 commit comments

Comments
 (0)