-/* SPDX-License-Identifier: LGPL-2.1+ */
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include <fcntl.h>
-#include <linux/random.h>
-#include <sys/ioctl.h>
#include <unistd.h>
#include "alloc-util.h"
#include "efivars.h"
#include "fd-util.h"
#include "fs-util.h"
+#include "random-util.h"
#include "strv.h"
/* If a random seed was passed by the boot loader in the LoaderRandomSeed EFI variable, let's credit it to
}
int efi_take_random_seed(void) {
- _cleanup_free_ struct rand_pool_info *info = NULL;
_cleanup_free_ void *value = NULL;
_cleanup_close_ int random_fd = -1;
size_t size;
if (size == 0)
return log_warning_errno(SYNTHETIC_ERRNO(EINVAL), "Random seed passed from boot loader has zero size? Ignoring.");
- /* The kernel API only accepts "int" as entropy count (which is in bits), let's avoid any chance for
- * confusion here. */
- if (size > INT_MAX / 8)
- size = INT_MAX / 8;
-
random_fd = open("/dev/urandom", O_WRONLY|O_CLOEXEC|O_NOCTTY);
if (random_fd < 0)
return log_warning_errno(errno, "Failed to open /dev/urandom for writing, ignoring: %m");
if (r < 0)
return log_warning_errno(r, "Unable to mark EFI random seed as used, not using it: %m");
- info = malloc(offsetof(struct rand_pool_info, buf) + size);
- if (!info)
- return log_oom();
-
- info->entropy_count = size * 8;
- info->buf_size = size;
- memcpy(info->buf, value, size);
-
- if (ioctl(random_fd, RNDADDENTROPY, info) < 0)
+ r = random_write_entropy(random_fd, value, size, true);
+ if (r < 0)
return log_warning_errno(errno, "Failed to credit entropy, ignoring: %m");
log_info("Successfully credited entropy passed from boot loader.");