diff options
Diffstat (limited to 'package/libkcapi/0003-Unify-code-to-read-from-seed-sources.patch')
-rw-r--r-- | package/libkcapi/0003-Unify-code-to-read-from-seed-sources.patch | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/package/libkcapi/0003-Unify-code-to-read-from-seed-sources.patch b/package/libkcapi/0003-Unify-code-to-read-from-seed-sources.patch new file mode 100644 index 0000000000..b636ffe908 --- /dev/null +++ b/package/libkcapi/0003-Unify-code-to-read-from-seed-sources.patch @@ -0,0 +1,132 @@ +From 450dfb09ee72ffedea8f2a25fdce17295f01f62f Mon Sep 17 00:00:00 2001 +From: Stephan Mueller <smueller@chronox.de> +Date: Tue, 8 Aug 2017 10:04:06 +0200 +Subject: [PATCH] Unify code to read from seed sources + +Remove the code duplication for FD reads and syscall reads. + +This patch also fixes the use of __NR_getrandom resolution. + +[Upstream commit: https://github.com/smuellerDD/libkcapi/commit/450dfb09ee72ffedea8f2a25fdce17295f01f62f] +Signed-off-by: Marcin Nowakowski <marcin.nowakowski@imgtec.com> + +--- + apps/kcapi-rng.c | 71 +++++++++++++++++++++++++------------------------------- + 1 file changed, 32 insertions(+), 39 deletions(-) + +diff --git a/apps/kcapi-rng.c b/apps/kcapi-rng.c +index e15edf9..96da111 100644 +--- a/apps/kcapi-rng.c ++++ b/apps/kcapi-rng.c +@@ -17,7 +17,9 @@ + * DAMAGE. + */ + ++#define _GNU_SOURCE + #include <unistd.h> ++#include <sys/syscall.h> + #include <errno.h> + #include <limits.h> + #include <stdint.h> +@@ -41,56 +43,48 @@ + /* Minimum seed is 256 bits. */ + #define KCAPI_RNG_MINSEEDSIZE 32 + +-struct kcapi_handle *rng = NULL; +-unsigned int Verbosity = 0; +-char *rng_name = NULL; ++static struct kcapi_handle *rng = NULL; ++static unsigned int Verbosity = 0; ++static char *rng_name = NULL; + +-#ifndef HAVE_GETRANDOM +-static int read_complete(int fd, uint8_t *buf, uint32_t buflen) ++#if !defined(HAVE_GETRANDOM) && !defined(__NR_getrandom) ++static int random_fd = -1; ++static int open_random(void) + { +- ssize_t ret; ++ random_fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC); ++ if (0 > random_fd) ++ return random_fd; + +- do { +- ret = read(fd, buf, buflen); +- if (0 < ret) { +- buflen -= ret; +- buf += ret; +- } +- } while ((0 < ret || EINTR == errno || ERESTART == errno) +- && buflen > 0); +- +- if (buflen == 0) +- return 0; +- return 1; ++ return 0; + } + +-static int read_random(uint8_t *buf, uint32_t buflen) ++static void close_random(void) + { +- int fd; +- int ret = 0; +- +- fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC); +- if (0 > fd) +- return fd; +- +- ret = read_complete(fd, buf, buflen); +- close(fd); +- return ret; ++ close(random_fd); + } + #endif + + static int get_random(uint8_t *buf, uint32_t buflen) + { ++ ssize_t ret; ++ + if (buflen > INT_MAX) + return 1; + ++#if (!defined(HAVE_GETRANDOM) && !defined(__NR_getrandom)) ++ ret = open_random(); ++ if (ret) ++ return ret; ++#endif ++ ++ do { + #ifdef HAVE_GETRANDOM +- return getrandom(buf, buflen, 0); ++ ret = getrandom(buf, buflen, 0); ++#elif defined __NR_getrandom ++ ret = syscall(__NR_getrandom, buf, buflen, 0); + #else +-# ifdef __NR_getrandom +- do { +- int ret = syscall(__NR_getrandom, buf, buflen, 0); +- ++ ret = read(random_fd, buf, buflen); ++#endif + if (0 < ret) { + buflen -= ret; + buf += ret; +@@ -98,14 +92,13 @@ static int get_random(uint8_t *buf, uint32_t buflen) + } while ((0 < ret || EINTR == errno || ERESTART == errno) + && buflen > 0); + ++#if (!defined(HAVE_GETRANDOM) && !defined(__NR_getrandom)) ++ close_random(); ++#endif ++ + if (buflen == 0) + return 0; +- + return 1; +-# else +- return read_random(buf, buflen); +-# endif +-#endif + } + + static void usage(void) |