Hi,

The new load_file() feature in libtls allows to simplify the code
to preload the CA cert, server cert and server key in syslogd before
calling chroot(2).

ok?

bluhm

Index: usr.sbin/syslogd/syslogd.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/syslogd.c,v
retrieving revision 1.208
diff -u -p -r1.208 syslogd.c
--- usr.sbin/syslogd/syslogd.c  6 Jul 2016 19:29:13 -0000       1.208
+++ usr.sbin/syslogd/syslogd.c  6 Jul 2016 22:22:29 -0000
@@ -223,7 +223,7 @@ char        *path_ctlsock = NULL;   /* Path to co
 
 struct tls *server_ctx;
 struct tls_config *client_config, *server_config;
-const char *CAfile = "/etc/ssl/cert.pem"; /* file containing CA certificates */
+const char *CAfile = NULL;     /* file containing CA certificates */
 int    NoVerify = 0;           /* do not verify TLS server x509 certificate */
 int    tcpbuf_dropped = 0;     /* count messages dropped from TCP or TLS */
 
@@ -552,110 +552,44 @@ main(int argc, char *argv[])
                if (NoVerify) {
                        tls_config_insecure_noverifycert(client_config);
                        tls_config_insecure_noverifyname(client_config);
-               } else {
-                       struct stat sb;
-                       int fail = 1;
-
-                       fd = -1;
-                       p = NULL;
-                       if ((fd = open(CAfile, O_RDONLY)) == -1) {
-                               logerror("open CAfile");
-                       } else if (fstat(fd, &sb) == -1) {
-                               logerror("fstat CAfile");
-                       } else if (sb.st_size > 50*1024*1024) {
-                               logerrorx("CAfile larger than 50MB");
-                       } else if ((p = calloc(sb.st_size, 1)) == NULL) {
-                               logerror("calloc CAfile");
-                       } else if (read(fd, p, sb.st_size) != sb.st_size) {
-                               logerror("read CAfile");
-                       } else if (tls_config_set_ca_mem(client_config, p,
-                           sb.st_size) == -1) {
-                               logerrorx("tls_config_set_ca_mem");
-                       } else {
-                               fail = 0;
-                               logdebug("CAfile %s, size %lld\n",
-                                   CAfile, sb.st_size);
-                       }
-                       /* avoid reading default certs in chroot */
-                       if (fail)
-                               tls_config_set_ca_mem(client_config, "", 0);
-                       free(p);
-                       close(fd);
+               } else if (CAfile) {
+                       if (tls_config_set_ca_file(client_config, CAfile) == -1)
+                               logerrorx("tls_config_set_ca_file");
+                       else
+                               logdebug("CAfile %s\n", CAfile);
                }
                tls_config_set_protocols(client_config, TLS_PROTOCOLS_ALL);
                if (tls_config_set_ciphers(client_config, "compat") != 0)
                        logerror("tls set client ciphers");
        }
        if (server_config && server_ctx) {
-               struct stat sb;
-               char *path;
+               const char *names[2];
 
-               fd = -1;
-               p = NULL;
-               path = NULL;
-               if (asprintf(&path, "/etc/ssl/private/%s.key", tls_hostport)
-                   == -1 || (fd = open(path, O_RDONLY)) == -1) {
-                       free(path);
-                       path = NULL;
-                       if (asprintf(&path, "/etc/ssl/private/%s.key", tls_host)
-                           == -1 || (fd = open(path, O_RDONLY)) == -1) {
-                               free(path);
-                               path = NULL;
+               names[0] = tls_hostport;
+               names[1] = tls_host;
+
+               for (i = 0; i < 2; i++) {
+                       if (asprintf(&p, "/etc/ssl/private/%s.key", names[i])
+                           == -1)
+                               continue;
+                       if (tls_config_set_key_file(server_config, p) == -1) {
+                               free(p);
+                               logerrorx("tls_config_set_key_file");
+                               continue;
                        }
-               }
-               if (fd == -1) {
-                       logerror("open keyfile");
-               } else if (fstat(fd, &sb) == -1) {
-                       logerror("fstat keyfile");
-               } else if (sb.st_size > 50*1024) {
-                       logerrorx("keyfile larger than 50KB");
-               } else if ((p = calloc(sb.st_size, 1)) == NULL) {
-                       logerror("calloc keyfile");
-               } else if (read(fd, p, sb.st_size) != sb.st_size) {
-                       logerror("read keyfile");
-               } else if (tls_config_set_key_mem(server_config, p,
-                   sb.st_size) == -1) {
-                       logerrorx("tls_config_set_key_mem");
-               } else {
-                       logdebug("Keyfile %s, size %lld\n", path, sb.st_size);
-               }
-               free(p);
-               close(fd);
-               free(path);
-
-               fd = -1;
-               p = NULL;
-               path = NULL;
-               if (asprintf(&path, "/etc/ssl/%s.crt", tls_hostport)
-                   == -1 || (fd = open(path, O_RDONLY)) == -1) {
-                       free(path);
-                       path = NULL;
-                       if (asprintf(&path, "/etc/ssl/%s.crt", tls_host)
-                           == -1 || (fd = open(path, O_RDONLY)) == -1) {
-                               free(path);
-                               path = NULL;
+                       logdebug("Keyfile %s\n", p);
+                       free(p);
+                       if (asprintf(&p, "/etc/ssl/%s.crt", names[i]) == -1)
+                               continue;
+                       if (tls_config_set_cert_file(server_config, p) == -1) {
+                               free(p);
+                               logerrorx("tls_config_set_cert_file");
+                               continue;
                        }
+                       logdebug("Certfile %s\n", p);
+                       free(p);
+                       break;
                }
-               if (fd == -1) {
-                       logerror("open certfile");
-               } else if (fstat(fd, &sb) == -1) {
-                       logerror("fstat certfile");
-               } else if (sb.st_size > 50*1024) {
-                       logerrorx("certfile larger than 50KB");
-               } else if ((p = calloc(sb.st_size, 1)) == NULL) {
-                       logerror("calloc certfile");
-               } else if (read(fd, p, sb.st_size) != sb.st_size) {
-                       logerror("read certfile");
-               } else if (tls_config_set_cert_mem(server_config, p,
-                   sb.st_size) == -1) {
-                       logerrorx("tls_config_set_cert_mem");
-               } else {
-                       logdebug("Certfile %s, size %lld\n",
-                           path, sb.st_size);
-               }
-               free(p);
-               close(fd);
-               free(path);
 
                tls_config_set_protocols(server_config, TLS_PROTOCOLS_ALL);
                if (tls_config_set_ciphers(server_config, "compat") != 0)

Reply via email to