ustream-mbedtls: Use getrandom() instead of /dev/urandom
authorHauke Mehrtens <hauke@hauke-m.de>
Sun, 19 Feb 2023 20:11:12 +0000 (21:11 +0100)
committerHauke Mehrtens <hauke@hauke-m.de>
Sat, 25 Feb 2023 17:26:14 +0000 (18:26 +0100)
Instead of keeping a file descriptor open just use the getrandom syscall
to get random data. This is supported by musl libc, glibc and Linux for
some time now.

This also improves the error handling in case this function returns not
as many bytes as expected.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Reviewed-by: Torsten Duwe <duwe@lst.de>
ustream-mbedtls.c

index e79e37ba5051e05642e83911526cce5831766a25..7fc78742f7c409389a5af5e1cc39d73ff87c78e3 100644 (file)
@@ -17,6 +17,7 @@
  */
 
 #include <sys/types.h>
+#include <sys/random.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <stdlib.h>
@@ -25,8 +26,6 @@
 #include "ustream-ssl.h"
 #include "ustream-internal.h"
 
-static int urandom_fd = -1;
-
 static int s_ustream_read(void *ctx, unsigned char *buf, size_t len)
 {
        struct ustream *s = ctx;
@@ -66,21 +65,12 @@ __hidden void ustream_set_io(struct ustream_ssl_ctx *ctx, void *ssl, struct ustr
        mbedtls_ssl_set_bio(ssl, conn, s_ustream_write, s_ustream_read, NULL);
 }
 
-static bool urandom_init(void)
+static int _random(void *ctx, unsigned char *out, size_t len)
 {
-       if (urandom_fd > -1)
-               return true;
+       ssize_t ret;
 
-       urandom_fd = open("/dev/urandom", O_RDONLY);
-       if (urandom_fd < 0)
-               return false;
-
-       return true;
-}
-
-static int _urandom(void *ctx, unsigned char *out, size_t len)
-{
-       if (read(urandom_fd, out, len) < 0)
+       ret = getrandom(out, len, 0);
+       if (ret < 0 || (size_t)ret != len)
                return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED;
 
        return 0;
@@ -134,9 +124,6 @@ __ustream_ssl_context_new(bool server)
        mbedtls_ssl_config *conf;
        int ep;
 
-       if (!urandom_init())
-               return NULL;
-
        ctx = calloc(1, sizeof(*ctx));
        if (!ctx)
                return NULL;
@@ -159,7 +146,7 @@ __ustream_ssl_context_new(bool server)
 
        mbedtls_ssl_config_defaults(conf, ep, MBEDTLS_SSL_TRANSPORT_STREAM,
                                    MBEDTLS_SSL_PRESET_DEFAULT);
-       mbedtls_ssl_conf_rng(conf, _urandom, NULL);
+       mbedtls_ssl_conf_rng(conf, _random, NULL);
 
        if (server) {
                mbedtls_ssl_conf_authmode(conf, MBEDTLS_SSL_VERIFY_NONE);