133 lines
3.0 KiB
Diff
133 lines
3.0 KiB
Diff
|
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)
|