libreboot-utils: improved randomness test

and the module bias handling is fully correct

Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
Leah Rowe
2026-03-26 09:32:11 +00:00
parent 8e8f7bced4
commit 10ecf32e33
3 changed files with 43 additions and 38 deletions
+2 -1
View File
@@ -391,7 +391,8 @@ void *rmalloc(size_t *size); /* don't ever use this */
void rset(void *buf, size_t n);
void *mkrbuf(size_t n);
char *mkrstr(size_t n);
int win_lottery(char **buf);
int win_lottery(void);
size_t rsize(void);
/* Helper functions for command: dump
*/
+37 -24
View File
@@ -72,49 +72,62 @@
* or your program dies.
*/
#ifndef BUFSIZ
#define BUFSIZ 8192 /* reasonably on modern 64-bit systems */
#elif (BUFSIZ <= 0)
#error defined buffer size BUFSIZ below or equal to zero
#endif
#define MAX_ALLOC (2 << 16)
int
win_lottery(char **buf) /* are u lucky? */
win_lottery(void) /* are u lucky? */
{
size_t size = 0;
int rval;
size_t size = rsize();
size_t size2 = rsize();
char *s = NULL;
char *s1 = rmalloc(&size);
char *s2 = rmalloc(&size);
if (size &&
size == size2 &&
size <= MAX_ALLOC << 1) {
if (scmp(s1, s2, BUFSIZ + 1, &rval) >= 0 &&
rval == 0)
rval = 1; /* winner! */
else
rval = 0;
if (!memcmp(s = mkrbuf(size << 1),
s + size, size))
size2 = 1; /* winner! */
else
size2 = 0;
} else {
return 0;
}
(void) scat(s1, s2, BUFSIZ << 1, buf);
free_if_null(&s1);
free_if_null(&s2);
return rval;
free_if_null(&s);
return (int)size2;
}
size_t
rsize(void)
{
size_t rval = 0;
/* clamp rand to prevent modulo bias */
size_t limit = SIZE_MAX - (SIZE_MAX % MAX_ALLOC);
do {
rset(&rval, sizeof(rval));
} while (rval >= limit);
return rval % MAX_ALLOC;
}
void *
rmalloc(size_t *rval)
{
/* clamp rand to prevent modulo bias */
size_t limit = SIZE_MAX - (SIZE_MAX % BUFSIZ);
size_t limit = SIZE_MAX - (SIZE_MAX % MAX_ALLOC);
if (if_err(rval == NULL, EFAULT))
return NULL;
do {
rset(rval, sizeof(*rval));
} while (*rval >= limit);
} while (*rval >= limit || *rval == 0);
return mkrstr(*rval %= BUFSIZ);
return mkrstr(*rval %= MAX_ALLOC);
}
char *
+4 -13
View File
@@ -7,15 +7,12 @@
#endif
#include <stdio.h>
#include <stdlib.h>
#include "include/common.h"
int
main(int argc, char *argv[])
{
char *s1 = NULL;
int rval = 0;
int lucky;
#if defined(__OpenBSD__) && defined(OpenBSD)
#if (OpenBSD) >= 509
if (pledge("stdio", NULL) == -1)
@@ -24,16 +21,10 @@ main(int argc, char *argv[])
#endif
setvbuf(stdout, NULL, _IONBF, 0);
if (win_lottery(&s1))
rval = 1;
lucky = win_lottery();
if (s1 != NULL) {
printf("%s\n\n", s1);
free(s1);
}
printf("%s\n", rval ? "You won!" : "You lose! Sorry!");
return rval? EXIT_SUCCESS : EXIT_FAILURE;
printf("%s\n", lucky ? "You won!" : "You lose! Sorry!");
return lucky ? EXIT_SUCCESS : EXIT_FAILURE;
}/*
( >:3 )