aboutsummaryrefslogtreecommitdiff
path: root/package/mongrel2/0004-Support-urandom-inside-chroot.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mongrel2/0004-Support-urandom-inside-chroot.patch')
-rw-r--r--package/mongrel2/0004-Support-urandom-inside-chroot.patch113
1 files changed, 113 insertions, 0 deletions
diff --git a/package/mongrel2/0004-Support-urandom-inside-chroot.patch b/package/mongrel2/0004-Support-urandom-inside-chroot.patch
new file mode 100644
index 0000000000..468ddb83fe
--- /dev/null
+++ b/package/mongrel2/0004-Support-urandom-inside-chroot.patch
@@ -0,0 +1,113 @@
+From 330e8c8352eb0ed3c178ac6e0102403c0a835492 Mon Sep 17 00:00:00 2001
+From: Jason Miller <jason@milr.com>
+Date: Thu, 5 Jul 2018 20:53:51 -0700
+Subject: [PATCH] Support urandom inside chroot
+
+This adds a new default entropy function that uses a /dev/urandom stream
+opened before the chroot. If initializing that fails, it fallsback on
+HAVEGE only if HAVEGE is supported by the mbedTLS.
+
+This should remove the hard requirement on HAVEGE
+
+resolves #326
+resolves #327
+
+[Upstream status: https://github.com/mongrel2/mongrel2/pull/328]
+Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
+---
+ src/mongrel2.c | 7 -------
+ src/server.c | 36 +++++++++++++++++++++++-------------
+ 2 files changed, 23 insertions(+), 20 deletions(-)
+
+diff --git a/src/mongrel2.c b/src/mongrel2.c
+index da632d95..48ece8a5 100644
+--- a/src/mongrel2.c
++++ b/src/mongrel2.c
+@@ -404,13 +404,6 @@ void taskmain(int argc, char **argv)
+ rc = attempt_chroot_drop(srv);
+ check(rc == 0, "Major failure in chroot/droppriv, aborting.");
+
+- // set up rng after chroot
+- // TODO: once mbedtls is updated, we can move this back into Server_create
+- if(srv->use_ssl) {
+- rc = Server_init_rng(srv);
+- check(rc == 0, "Failed to initialize rng for server %s", bdata(srv->uuid));
+- }
+-
+ final_setup();
+
+ taskcreate(tickertask, NULL, TICKER_TASK_STACK);
+diff --git a/src/server.c b/src/server.c
+index 45761db4..e44e199b 100644
+--- a/src/server.c
++++ b/src/server.c
+@@ -149,35 +149,45 @@ static int Server_load_ciphers(Server *srv, bstring ssl_ciphers_val)
+ return -1;
+ }
+
++static int urandom_entropy_func(void *data, unsigned char *output, size_t len)
++{
++ FILE* urandom = (FILE *)data;
++ size_t rc = fread(output, 1, len, urandom);
++
++ if (rc != len) return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED;
++
++ return 0;
++}
++
+ int Server_init_rng(Server *srv)
+ {
+ int rc;
+- unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE];
+ void *ctx = NULL;
+
+- mbedtls_entropy_init( &srv->entropy );
++ FILE *urandom = fopen("/dev/urandom","r");
+
+- // test the entropy source
+- rc = mbedtls_entropy_func(&srv->entropy, buf, MBEDTLS_ENTROPY_BLOCK_SIZE);
+-
+- if(rc == 0) {
++ if(urandom != NULL) {
+ ctx = calloc(sizeof(mbedtls_ctr_drbg_context), 1);
+
+ mbedtls_ctr_drbg_init((mbedtls_ctr_drbg_context *)ctx);
+ rc = mbedtls_ctr_drbg_seed((mbedtls_ctr_drbg_context *)ctx,
+- mbedtls_entropy_func, &srv->entropy, NULL, 0);
++ urandom_entropy_func, urandom, NULL, 0);
+ check(rc == 0, "Init rng failed: ctr_drbg_init returned %d\n", rc);
+
+ srv->rng_func = mbedtls_ctr_drbg_random;
+ srv->rng_ctx = ctx;
+ } else {
+- log_warn("entropy source unavailable. falling back to havege rng");
+
++#if defined(MBEDTLS_HAVEGE_C)
++ log_warn("entropy source unavailable. falling back to havege rng");
+ ctx = calloc(sizeof(mbedtls_havege_state), 1);
+ mbedtls_havege_init((mbedtls_havege_state *)ctx);
+-
+ srv->rng_func = mbedtls_havege_random;
+ srv->rng_ctx = ctx;
++#else
++ log_err("Unable to initialize urandom entropy source, and mbedTLS compiled without HAVEGE");
++ goto error;
++#endif
+ }
+
+ return 0;
+@@ -278,10 +288,10 @@ Server *Server_create(bstring uuid, bstring default_host,
+
+ // TODO: once mbedtls supports opening urandom early and keeping it open,
+ // put the rng initialization back here (before chroot)
+- //if(use_ssl) {
+- // rc = Server_init_rng(srv);
+- // check(rc == 0, "Failed to initialize rng for server %s", bdata(uuid));
+- //}
++ if(use_ssl) {
++ rc = Server_init_rng(srv);
++ check(rc == 0, "Failed to initialize rng for server %s", bdata(uuid));
++ }
+
+ if(blength(chroot) > 0) {
+ srv->chroot = bstrcpy(chroot); check_mem(srv->chroot);