summaryrefslogtreecommitdiffstats
path: root/package/libkcapi/0003-Unify-code-to-read-from-seed-sources.patch
diff options
context:
space:
mode:
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.patch132
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)
OpenPOWER on IntegriCloud