summaryrefslogtreecommitdiff
path: root/src/lib/libtls/tls_config.c
diff options
context:
space:
mode:
authorjsing <>2016-08-13 13:05:51 +0000
committerjsing <>2016-08-13 13:05:51 +0000
commit38f2d99e3768c4c4ef734bdce72659cc2b781447 (patch)
treedbfa584d89ca8f2821053defe496bba86e955463 /src/lib/libtls/tls_config.c
parentbb926821ad696c9b9509352c5c112e09f73d008b (diff)
downloadopenbsd-38f2d99e3768c4c4ef734bdce72659cc2b781447.tar.gz
openbsd-38f2d99e3768c4c4ef734bdce72659cc2b781447.tar.bz2
openbsd-38f2d99e3768c4c4ef734bdce72659cc2b781447.zip
Load CA, certificate and key files into memory when the appropriate
tls_config_set_*_file() function is called. This allows us to immediately propagate useful error messages, play more nicely with privsep/pledge and have a single code path. Instead of always loading the default CA when tls_config_new() is called, defer and only load the default CA when tls_configure() is invoked, if a CA has not already been specified. ok beck@ bluhm@
Diffstat (limited to '')
-rw-r--r--src/lib/libtls/tls_config.c81
1 files changed, 68 insertions, 13 deletions
diff --git a/src/lib/libtls/tls_config.c b/src/lib/libtls/tls_config.c
index e690b9ee76..cd2a04cdd6 100644
--- a/src/lib/libtls/tls_config.c
+++ b/src/lib/libtls/tls_config.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls_config.c,v 1.25 2016/08/12 15:10:59 jsing Exp $ */ 1/* $OpenBSD: tls_config.c,v 1.26 2016/08/13 13:05:51 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -15,9 +15,13 @@
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */ 16 */
17 17
18#include <sys/stat.h>
19
18#include <ctype.h> 20#include <ctype.h>
19#include <errno.h> 21#include <errno.h>
22#include <fcntl.h>
20#include <stdlib.h> 23#include <stdlib.h>
24#include <unistd.h>
21 25
22#include <tls.h> 26#include <tls.h>
23#include "tls_internal.h" 27#include "tls_internal.h"
@@ -64,9 +68,11 @@ tls_keypair_new()
64} 68}
65 69
66static int 70static int
67tls_keypair_set_cert_file(struct tls_keypair *keypair, const char *cert_file) 71tls_keypair_set_cert_file(struct tls_keypair *keypair, struct tls_error *error,
72 const char *cert_file)
68{ 73{
69 return set_string(&keypair->cert_file, cert_file); 74 return tls_config_load_file(error, "certificate", cert_file,
75 &keypair->cert_mem, &keypair->cert_len);
70} 76}
71 77
72static int 78static int
@@ -77,9 +83,13 @@ tls_keypair_set_cert_mem(struct tls_keypair *keypair, const uint8_t *cert,
77} 83}
78 84
79static int 85static int
80tls_keypair_set_key_file(struct tls_keypair *keypair, const char *key_file) 86tls_keypair_set_key_file(struct tls_keypair *keypair, struct tls_error *error,
87 const char *key_file)
81{ 88{
82 return set_string(&keypair->key_file, key_file); 89 if (keypair->key_mem != NULL)
90 explicit_bzero(keypair->key_mem, keypair->key_len);
91 return tls_config_load_file(error, "key", key_file,
92 &keypair->key_mem, &keypair->key_len);
83} 93}
84 94
85static int 95static int
@@ -106,14 +116,59 @@ tls_keypair_free(struct tls_keypair *keypair)
106 116
107 tls_keypair_clear(keypair); 117 tls_keypair_clear(keypair);
108 118
109 free((char *)keypair->cert_file);
110 free(keypair->cert_mem); 119 free(keypair->cert_mem);
111 free((char *)keypair->key_file);
112 free(keypair->key_mem); 120 free(keypair->key_mem);
113 121
114 free(keypair); 122 free(keypair);
115} 123}
116 124
125int
126tls_config_load_file(struct tls_error *error, const char *filetype,
127 const char *filename, char **buf, size_t *len)
128{
129 struct stat st;
130 int fd = -1;
131
132 free(*buf);
133 *buf = NULL;
134 *len = 0;
135
136 if ((fd = open(filename, O_RDONLY)) == -1) {
137 tls_error_set(error, "failed to open %s file '%s'",
138 filetype, filename);
139 goto fail;
140 }
141 if (fstat(fd, &st) != 0) {
142 tls_error_set(error, "failed to stat %s file '%s'",
143 filetype, filename);
144 goto fail;
145 }
146 *len = (size_t)st.st_size;
147 if ((*buf = malloc(*len)) == NULL) {
148 tls_error_set(error, "failed to allocate buffer for "
149 "%s file", filetype);
150 goto fail;
151 }
152 if (read(fd, *buf, *len) != *len) {
153 tls_error_set(error, "failed to read %s file '%s'",
154 filetype, filename);
155 goto fail;
156 }
157 close(fd);
158 return 0;
159
160 fail:
161 if (fd != -1)
162 close(fd);
163 if (*buf != NULL)
164 explicit_bzero(*buf, *len);
165 free(*buf);
166 *buf = NULL;
167 *len = 0;
168
169 return -1;
170}
171
117struct tls_config * 172struct tls_config *
118tls_config_new(void) 173tls_config_new(void)
119{ 174{
@@ -128,8 +183,6 @@ tls_config_new(void)
128 /* 183 /*
129 * Default configuration. 184 * Default configuration.
130 */ 185 */
131 if (tls_config_set_ca_file(config, _PATH_SSL_CA_FILE) != 0)
132 goto err;
133 if (tls_config_set_dheparams(config, "none") != 0) 186 if (tls_config_set_dheparams(config, "none") != 0)
134 goto err; 187 goto err;
135 if (tls_config_set_ecdhecurve(config, "auto") != 0) 188 if (tls_config_set_ecdhecurve(config, "auto") != 0)
@@ -167,7 +220,6 @@ tls_config_free(struct tls_config *config)
167 free(config->error.msg); 220 free(config->error.msg);
168 221
169 free(config->alpn); 222 free(config->alpn);
170 free((char *)config->ca_file);
171 free((char *)config->ca_mem); 223 free((char *)config->ca_mem);
172 free((char *)config->ca_path); 224 free((char *)config->ca_path);
173 free((char *)config->ciphers); 225 free((char *)config->ciphers);
@@ -319,7 +371,8 @@ tls_config_set_alpn(struct tls_config *config, const char *alpn)
319int 371int
320tls_config_set_ca_file(struct tls_config *config, const char *ca_file) 372tls_config_set_ca_file(struct tls_config *config, const char *ca_file)
321{ 373{
322 return set_string(&config->ca_file, ca_file); 374 return tls_config_load_file(&config->error, "CA", ca_file,
375 &config->ca_mem, &config->ca_len);
323} 376}
324 377
325int 378int
@@ -337,7 +390,8 @@ tls_config_set_ca_mem(struct tls_config *config, const uint8_t *ca, size_t len)
337int 390int
338tls_config_set_cert_file(struct tls_config *config, const char *cert_file) 391tls_config_set_cert_file(struct tls_config *config, const char *cert_file)
339{ 392{
340 return tls_keypair_set_cert_file(config->keypair, cert_file); 393 return tls_keypair_set_cert_file(config->keypair, &config->error,
394 cert_file);
341} 395}
342 396
343int 397int
@@ -424,7 +478,8 @@ tls_config_set_ecdhecurve(struct tls_config *config, const char *name)
424int 478int
425tls_config_set_key_file(struct tls_config *config, const char *key_file) 479tls_config_set_key_file(struct tls_config *config, const char *key_file)
426{ 480{
427 return tls_keypair_set_key_file(config->keypair, key_file); 481 return tls_keypair_set_key_file(config->keypair, &config->error,
482 key_file);
428} 483}
429 484
430int 485int