[PATCH] getrandom: new applet
Etienne Champetier
champetier.etienne at gmail.com
Tue Jun 28 21:56:29 UTC 2016
Hi Walter,
2016-06-28 19:47 GMT+02:00 walter harms <wharms at bfs.de>:
> perhaps a better aim ist to improve the $RANDOM in ash ?
getrandom() is blocking until properly initialized,
i don't think we want such API change for $RANDOM
>
> re,
> wh
>
> Am 28.06.2016 18:56, schrieb Etienne CHAMPETIER:
>> first user of this applet will be LEDE (OpenWrt) to save an urandom seed
>> using getrandom() (so we are sure /dev/urandom pool is initialized)
>>
>> function old new delta
>> getrandom_main - 178 +178
>> .rodata 156181 156232 +51
>> applet_names 2536 2546 +10
>> applet_main 2936 2944 +8
>> ------------------------------------------------------------------------------
>> (add/remove: 2/0 grow/shrink: 3/0 up/down: 247/0) Total: 247 bytes
>>
>> Signed-off-by: Etienne CHAMPETIER <champetier.etienne at gmail.com>
>> ---
>> include/applets.src.h | 1 +
>> util-linux/Config.src | 8 ++++++++
>> util-linux/Kbuild.src | 1 +
>> util-linux/getrandom.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
>> 4 files changed, 57 insertions(+)
>> create mode 100644 util-linux/getrandom.c
>>
>> diff --git a/include/applets.src.h b/include/applets.src.h
>> index 6e1b02f..b617d14 100644
>> --- a/include/applets.src.h
>> +++ b/include/applets.src.h
>> @@ -153,6 +153,7 @@ IF_FTPPUT(APPLET_ODDNAME(ftpput, ftpgetput, BB_DIR_USR_BIN, BB_SUID_DROP, ftpput
>> IF_FUSER(APPLET(fuser, BB_DIR_USR_BIN, BB_SUID_DROP))
>> IF_GETENFORCE(APPLET(getenforce, BB_DIR_USR_SBIN, BB_SUID_DROP))
>> IF_GETOPT(APPLET(getopt, BB_DIR_BIN, BB_SUID_DROP))
>> +IF_GETRANDOM(APPLET(getrandom, BB_DIR_USR_BIN, BB_SUID_DROP))
>> IF_GETSEBOOL(APPLET(getsebool, BB_DIR_USR_SBIN, BB_SUID_DROP))
>> IF_HD(APPLET_NOEXEC(hd, hexdump, BB_DIR_USR_BIN, BB_SUID_DROP, hd))
>> IF_HDPARM(APPLET(hdparm, BB_DIR_SBIN, BB_SUID_DROP))
>> diff --git a/util-linux/Config.src b/util-linux/Config.src
>> index 922cabd..9f47db7 100644
>> --- a/util-linux/Config.src
>> +++ b/util-linux/Config.src
>> @@ -304,6 +304,14 @@ config FEATURE_GETOPT_LONG
>> help
>> Enable support for long options (option -l).
>>
>> +config GETRANDOM
>> + bool "getrandom"
>> + default y
>> + select PLATFORM_LINUX
>> + help
>> + The getrandom utility get NBYTES random bytes using getrandom()
>> + syscall (available since Linux 3.17)
>> +
>> config HEXDUMP
>> bool "hexdump"
>> default y
>> diff --git a/util-linux/Kbuild.src b/util-linux/Kbuild.src
>> index 0b87c52..b164fb7 100644
>> --- a/util-linux/Kbuild.src
>> +++ b/util-linux/Kbuild.src
>> @@ -19,6 +19,7 @@ lib-$(CONFIG_FLOCK) += flock.o
>> lib-$(CONFIG_FREERAMDISK) += freeramdisk.o
>> lib-$(CONFIG_FSCK_MINIX) += fsck_minix.o
>> lib-$(CONFIG_GETOPT) += getopt.o
>> +lib-$(CONFIG_GETRANDOM) += getrandom.o
>> lib-$(CONFIG_HEXDUMP) += hexdump.o
>> lib-$(CONFIG_HWCLOCK) += hwclock.o
>> lib-$(CONFIG_IPCRM) += ipcrm.o
>> diff --git a/util-linux/getrandom.c b/util-linux/getrandom.c
>> new file mode 100644
>> index 0000000..165b492
>> --- /dev/null
>> +++ b/util-linux/getrandom.c
>> @@ -0,0 +1,47 @@
>> +/* vi: set sw=4 ts=4: */
>> +/*
>> + * getrandom.c - read random bytes using getrandom() syscall
>> + *
>> + * Copyright (C) 2016 Etienne Champetier <champetier.etienne at gmail.com>
>> + *
>> + * Licensed under GPLv2, see file LICENSE in this source tree.
>> + */
>> +
>> +//usage:#define getrandom_trivial_usage
>> +//usage: "N"
>> +//usage:#define getrandom_full_usage "\n\n"
>> +//usage: "Read N random bytes using getrandom()"
>> +
>> +#include <sys/syscall.h>
>> +#include "libbb.h"
>> +
>> +int getrandom_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
>> +int getrandom_main(int argc, char **argv)
>> +{
>> + int nbytes, len;
>> + char buf[256]; /* getrandom(2) calls up to 256 bytes always succeed */
>> +
>> + if (argc != 2)
>> + bb_show_usage();
>> +
>> + if (isatty(STDOUT_FILENO))
>> + bb_error_msg_and_die("Not outputting to a tty");
>> +
>> + nbytes = atoi(argv[1]);
>> + if (nbytes <= 0)
>> + bb_error_msg_and_die("N <= 0");
>> +
>> + for (len = sizeof(buf); nbytes > 0; nbytes -= sizeof(buf)) {
>> + if (nbytes < sizeof(buf)) {
>> + len = nbytes;
>> + }
>> + if (syscall(SYS_getrandom, buf, len, 0) != len) {
>> + bb_perror_msg_and_die("getrandom");
>> + }
>> + if (write(STDOUT_FILENO, buf, len) != len) {
>> + bb_perror_msg_and_die("write");
>> + }
>> + }
>> +
>> + return EXIT_SUCCESS;
>> +}
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
More information about the busybox
mailing list