Blame


1 ebfc5784 2024-01-07 op /* $OpenBSD: tls_config.c,v 1.67 2023/07/02 06:37:27 beck Exp $ */
2 f9ab77a8 2023-08-23 op /*
3 f9ab77a8 2023-08-23 op * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4 f9ab77a8 2023-08-23 op *
5 f9ab77a8 2023-08-23 op * Permission to use, copy, modify, and distribute this software for any
6 f9ab77a8 2023-08-23 op * purpose with or without fee is hereby granted, provided that the above
7 f9ab77a8 2023-08-23 op * copyright notice and this permission notice appear in all copies.
8 f9ab77a8 2023-08-23 op *
9 f9ab77a8 2023-08-23 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 f9ab77a8 2023-08-23 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 f9ab77a8 2023-08-23 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 f9ab77a8 2023-08-23 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 f9ab77a8 2023-08-23 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 f9ab77a8 2023-08-23 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 f9ab77a8 2023-08-23 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 f9ab77a8 2023-08-23 op */
17 f9ab77a8 2023-08-23 op
18 f9ab77a8 2023-08-23 op #include "config.h"
19 f9ab77a8 2023-08-23 op
20 f9ab77a8 2023-08-23 op #include <sys/stat.h>
21 f9ab77a8 2023-08-23 op
22 f9ab77a8 2023-08-23 op #include <ctype.h>
23 f9ab77a8 2023-08-23 op #include <errno.h>
24 f9ab77a8 2023-08-23 op #include <fcntl.h>
25 f9ab77a8 2023-08-23 op #include <stdlib.h>
26 f9ab77a8 2023-08-23 op #include <string.h>
27 f9ab77a8 2023-08-23 op #include <unistd.h>
28 f9ab77a8 2023-08-23 op
29 f9ab77a8 2023-08-23 op #include <tls.h>
30 f9ab77a8 2023-08-23 op
31 f9ab77a8 2023-08-23 op #include "tls_internal.h"
32 f9ab77a8 2023-08-23 op
33 f9ab77a8 2023-08-23 op const char *
34 f9ab77a8 2023-08-23 op tls_default_ca_cert_file(void)
35 f9ab77a8 2023-08-23 op {
36 f9ab77a8 2023-08-23 op #ifdef OPENSMTPD_CA_FILE
37 f9ab77a8 2023-08-23 op return OPENSMTPD_CA_FILE;
38 f9ab77a8 2023-08-23 op #else
39 f9ab77a8 2023-08-23 op return X509_get_default_cert_file();
40 f9ab77a8 2023-08-23 op #endif
41 f9ab77a8 2023-08-23 op }
42 f9ab77a8 2023-08-23 op
43 f9ab77a8 2023-08-23 op int
44 f9ab77a8 2023-08-23 op tls_config_load_file(struct tls_error *error, const char *filetype,
45 f9ab77a8 2023-08-23 op const char *filename, char **buf, size_t *len)
46 f9ab77a8 2023-08-23 op {
47 f9ab77a8 2023-08-23 op struct stat st;
48 f9ab77a8 2023-08-23 op int fd = -1;
49 f9ab77a8 2023-08-23 op ssize_t n;
50 f9ab77a8 2023-08-23 op
51 f9ab77a8 2023-08-23 op free(*buf);
52 f9ab77a8 2023-08-23 op *buf = NULL;
53 f9ab77a8 2023-08-23 op *len = 0;
54 f9ab77a8 2023-08-23 op
55 f9ab77a8 2023-08-23 op if ((fd = open(filename, O_RDONLY)) == -1) {
56 f9ab77a8 2023-08-23 op tls_error_set(error, "failed to open %s file '%s'",
57 f9ab77a8 2023-08-23 op filetype, filename);
58 f9ab77a8 2023-08-23 op goto err;
59 f9ab77a8 2023-08-23 op }
60 f9ab77a8 2023-08-23 op if (fstat(fd, &st) != 0) {
61 f9ab77a8 2023-08-23 op tls_error_set(error, "failed to stat %s file '%s'",
62 f9ab77a8 2023-08-23 op filetype, filename);
63 f9ab77a8 2023-08-23 op goto err;
64 f9ab77a8 2023-08-23 op }
65 f9ab77a8 2023-08-23 op if (st.st_size < 0)
66 f9ab77a8 2023-08-23 op goto err;
67 f9ab77a8 2023-08-23 op *len = (size_t)st.st_size;
68 f9ab77a8 2023-08-23 op if ((*buf = malloc(*len)) == NULL) {
69 f9ab77a8 2023-08-23 op tls_error_set(error, "failed to allocate buffer for "
70 f9ab77a8 2023-08-23 op "%s file", filetype);
71 f9ab77a8 2023-08-23 op goto err;
72 f9ab77a8 2023-08-23 op }
73 f9ab77a8 2023-08-23 op n = read(fd, *buf, *len);
74 f9ab77a8 2023-08-23 op if (n < 0 || (size_t)n != *len) {
75 f9ab77a8 2023-08-23 op tls_error_set(error, "failed to read %s file '%s'",
76 f9ab77a8 2023-08-23 op filetype, filename);
77 f9ab77a8 2023-08-23 op goto err;
78 f9ab77a8 2023-08-23 op }
79 f9ab77a8 2023-08-23 op close(fd);
80 f9ab77a8 2023-08-23 op return 0;
81 f9ab77a8 2023-08-23 op
82 f9ab77a8 2023-08-23 op err:
83 f9ab77a8 2023-08-23 op if (fd != -1)
84 f9ab77a8 2023-08-23 op close(fd);
85 f9ab77a8 2023-08-23 op freezero(*buf, *len);
86 f9ab77a8 2023-08-23 op *buf = NULL;
87 f9ab77a8 2023-08-23 op *len = 0;
88 f9ab77a8 2023-08-23 op
89 f9ab77a8 2023-08-23 op return -1;
90 f9ab77a8 2023-08-23 op }
91 f9ab77a8 2023-08-23 op
92 f9ab77a8 2023-08-23 op struct tls_config *
93 f9ab77a8 2023-08-23 op tls_config_new_internal(void)
94 f9ab77a8 2023-08-23 op {
95 f9ab77a8 2023-08-23 op struct tls_config *config;
96 f9ab77a8 2023-08-23 op unsigned char sid[TLS_MAX_SESSION_ID_LENGTH];
97 f9ab77a8 2023-08-23 op
98 f9ab77a8 2023-08-23 op if ((config = calloc(1, sizeof(*config))) == NULL)
99 f9ab77a8 2023-08-23 op return (NULL);
100 f9ab77a8 2023-08-23 op
101 f9ab77a8 2023-08-23 op config->refcount = 1;
102 f9ab77a8 2023-08-23 op config->session_fd = -1;
103 f9ab77a8 2023-08-23 op
104 f9ab77a8 2023-08-23 op if ((config->keypair = tls_keypair_new()) == NULL)
105 f9ab77a8 2023-08-23 op goto err;
106 f9ab77a8 2023-08-23 op
107 f9ab77a8 2023-08-23 op /*
108 f9ab77a8 2023-08-23 op * Default configuration.
109 f9ab77a8 2023-08-23 op */
110 f9ab77a8 2023-08-23 op if (tls_config_set_dheparams(config, "none") != 0)
111 f9ab77a8 2023-08-23 op goto err;
112 f9ab77a8 2023-08-23 op if (tls_config_set_ecdhecurves(config, "default") != 0)
113 f9ab77a8 2023-08-23 op goto err;
114 f9ab77a8 2023-08-23 op if (tls_config_set_ciphers(config, "secure") != 0)
115 f9ab77a8 2023-08-23 op goto err;
116 f9ab77a8 2023-08-23 op
117 f9ab77a8 2023-08-23 op if (tls_config_set_protocols(config, TLS_PROTOCOLS_DEFAULT) != 0)
118 f9ab77a8 2023-08-23 op goto err;
119 f9ab77a8 2023-08-23 op if (tls_config_set_verify_depth(config, 6) != 0)
120 f9ab77a8 2023-08-23 op goto err;
121 f9ab77a8 2023-08-23 op
122 f9ab77a8 2023-08-23 op /*
123 f9ab77a8 2023-08-23 op * Set session ID context to a random value. For the simple case
124 f9ab77a8 2023-08-23 op * of a single process server this is good enough. For multiprocess
125 f9ab77a8 2023-08-23 op * servers the session ID needs to be set by the caller.
126 f9ab77a8 2023-08-23 op */
127 f9ab77a8 2023-08-23 op arc4random_buf(sid, sizeof(sid));
128 f9ab77a8 2023-08-23 op if (tls_config_set_session_id(config, sid, sizeof(sid)) != 0)
129 f9ab77a8 2023-08-23 op goto err;
130 f9ab77a8 2023-08-23 op config->ticket_keyrev = arc4random();
131 f9ab77a8 2023-08-23 op config->ticket_autorekey = 1;
132 f9ab77a8 2023-08-23 op
133 f9ab77a8 2023-08-23 op tls_config_prefer_ciphers_server(config);
134 f9ab77a8 2023-08-23 op
135 f9ab77a8 2023-08-23 op tls_config_verify(config);
136 f9ab77a8 2023-08-23 op
137 f9ab77a8 2023-08-23 op return (config);
138 f9ab77a8 2023-08-23 op
139 f9ab77a8 2023-08-23 op err:
140 f9ab77a8 2023-08-23 op tls_config_free(config);
141 f9ab77a8 2023-08-23 op return (NULL);
142 f9ab77a8 2023-08-23 op }
143 f9ab77a8 2023-08-23 op
144 f9ab77a8 2023-08-23 op struct tls_config *
145 f9ab77a8 2023-08-23 op tls_config_new(void)
146 f9ab77a8 2023-08-23 op {
147 f9ab77a8 2023-08-23 op if (tls_init() == -1)
148 f9ab77a8 2023-08-23 op return (NULL);
149 f9ab77a8 2023-08-23 op
150 f9ab77a8 2023-08-23 op return tls_config_new_internal();
151 f9ab77a8 2023-08-23 op }
152 f9ab77a8 2023-08-23 op
153 f9ab77a8 2023-08-23 op void
154 f9ab77a8 2023-08-23 op tls_config_free(struct tls_config *config)
155 f9ab77a8 2023-08-23 op {
156 f9ab77a8 2023-08-23 op struct tls_keypair *kp, *nkp;
157 f9ab77a8 2023-08-23 op int refcount;
158 f9ab77a8 2023-08-23 op
159 f9ab77a8 2023-08-23 op if (config == NULL)
160 f9ab77a8 2023-08-23 op return;
161 f9ab77a8 2023-08-23 op
162 f9ab77a8 2023-08-23 op refcount = --config->refcount;
163 f9ab77a8 2023-08-23 op
164 f9ab77a8 2023-08-23 op if (refcount > 0)
165 f9ab77a8 2023-08-23 op return;
166 f9ab77a8 2023-08-23 op
167 f9ab77a8 2023-08-23 op for (kp = config->keypair; kp != NULL; kp = nkp) {
168 f9ab77a8 2023-08-23 op nkp = kp->next;
169 f9ab77a8 2023-08-23 op tls_keypair_free(kp);
170 f9ab77a8 2023-08-23 op }
171 f9ab77a8 2023-08-23 op
172 f9ab77a8 2023-08-23 op free(config->error.msg);
173 f9ab77a8 2023-08-23 op
174 f9ab77a8 2023-08-23 op free(config->alpn);
175 f9ab77a8 2023-08-23 op free((char *)config->ca_mem);
176 f9ab77a8 2023-08-23 op free((char *)config->ca_path);
177 f9ab77a8 2023-08-23 op free((char *)config->ciphers);
178 f9ab77a8 2023-08-23 op free((char *)config->crl_mem);
179 f9ab77a8 2023-08-23 op free(config->ecdhecurves);
180 f9ab77a8 2023-08-23 op
181 f9ab77a8 2023-08-23 op free(config);
182 f9ab77a8 2023-08-23 op }
183 f9ab77a8 2023-08-23 op
184 f9ab77a8 2023-08-23 op static void
185 f9ab77a8 2023-08-23 op tls_config_keypair_add(struct tls_config *config, struct tls_keypair *keypair)
186 f9ab77a8 2023-08-23 op {
187 f9ab77a8 2023-08-23 op struct tls_keypair *kp;
188 f9ab77a8 2023-08-23 op
189 f9ab77a8 2023-08-23 op kp = config->keypair;
190 f9ab77a8 2023-08-23 op while (kp->next != NULL)
191 f9ab77a8 2023-08-23 op kp = kp->next;
192 f9ab77a8 2023-08-23 op
193 f9ab77a8 2023-08-23 op kp->next = keypair;
194 f9ab77a8 2023-08-23 op }
195 f9ab77a8 2023-08-23 op
196 f9ab77a8 2023-08-23 op const char *
197 f9ab77a8 2023-08-23 op tls_config_error(struct tls_config *config)
198 f9ab77a8 2023-08-23 op {
199 f9ab77a8 2023-08-23 op return config->error.msg;
200 f9ab77a8 2023-08-23 op }
201 f9ab77a8 2023-08-23 op
202 f9ab77a8 2023-08-23 op void
203 f9ab77a8 2023-08-23 op tls_config_clear_keys(struct tls_config *config)
204 f9ab77a8 2023-08-23 op {
205 f9ab77a8 2023-08-23 op struct tls_keypair *kp;
206 f9ab77a8 2023-08-23 op
207 f9ab77a8 2023-08-23 op for (kp = config->keypair; kp != NULL; kp = kp->next)
208 f9ab77a8 2023-08-23 op tls_keypair_clear_key(kp);
209 f9ab77a8 2023-08-23 op }
210 f9ab77a8 2023-08-23 op
211 f9ab77a8 2023-08-23 op int
212 f9ab77a8 2023-08-23 op tls_config_parse_protocols(uint32_t *protocols, const char *protostr)
213 f9ab77a8 2023-08-23 op {
214 f9ab77a8 2023-08-23 op uint32_t proto, protos = 0;
215 f9ab77a8 2023-08-23 op char *s, *p, *q;
216 f9ab77a8 2023-08-23 op int negate;
217 f9ab77a8 2023-08-23 op
218 f9ab77a8 2023-08-23 op if (protostr == NULL) {
219 f9ab77a8 2023-08-23 op *protocols = TLS_PROTOCOLS_DEFAULT;
220 f9ab77a8 2023-08-23 op return (0);
221 f9ab77a8 2023-08-23 op }
222 f9ab77a8 2023-08-23 op
223 f9ab77a8 2023-08-23 op if ((s = strdup(protostr)) == NULL)
224 f9ab77a8 2023-08-23 op return (-1);
225 f9ab77a8 2023-08-23 op
226 f9ab77a8 2023-08-23 op q = s;
227 f9ab77a8 2023-08-23 op while ((p = strsep(&q, ",:")) != NULL) {
228 f9ab77a8 2023-08-23 op while (*p == ' ' || *p == '\t')
229 f9ab77a8 2023-08-23 op p++;
230 f9ab77a8 2023-08-23 op
231 f9ab77a8 2023-08-23 op negate = 0;
232 f9ab77a8 2023-08-23 op if (*p == '!') {
233 f9ab77a8 2023-08-23 op negate = 1;
234 f9ab77a8 2023-08-23 op p++;
235 f9ab77a8 2023-08-23 op }
236 f9ab77a8 2023-08-23 op
237 f9ab77a8 2023-08-23 op if (negate && protos == 0)
238 f9ab77a8 2023-08-23 op protos = TLS_PROTOCOLS_ALL;
239 f9ab77a8 2023-08-23 op
240 f9ab77a8 2023-08-23 op proto = 0;
241 f9ab77a8 2023-08-23 op if (strcasecmp(p, "all") == 0 ||
242 f9ab77a8 2023-08-23 op strcasecmp(p, "legacy") == 0)
243 f9ab77a8 2023-08-23 op proto = TLS_PROTOCOLS_ALL;
244 f9ab77a8 2023-08-23 op else if (strcasecmp(p, "default") == 0 ||
245 f9ab77a8 2023-08-23 op strcasecmp(p, "secure") == 0)
246 f9ab77a8 2023-08-23 op proto = TLS_PROTOCOLS_DEFAULT;
247 f9ab77a8 2023-08-23 op if (strcasecmp(p, "tlsv1") == 0)
248 f9ab77a8 2023-08-23 op proto = TLS_PROTOCOL_TLSv1;
249 f9ab77a8 2023-08-23 op else if (strcasecmp(p, "tlsv1.0") == 0)
250 ebfc5784 2024-01-07 op proto = TLS_PROTOCOL_TLSv1_2;
251 f9ab77a8 2023-08-23 op else if (strcasecmp(p, "tlsv1.1") == 0)
252 ebfc5784 2024-01-07 op proto = TLS_PROTOCOL_TLSv1_2;
253 f9ab77a8 2023-08-23 op else if (strcasecmp(p, "tlsv1.2") == 0)
254 f9ab77a8 2023-08-23 op proto = TLS_PROTOCOL_TLSv1_2;
255 f9ab77a8 2023-08-23 op else if (strcasecmp(p, "tlsv1.3") == 0)
256 f9ab77a8 2023-08-23 op proto = TLS_PROTOCOL_TLSv1_3;
257 f9ab77a8 2023-08-23 op
258 f9ab77a8 2023-08-23 op if (proto == 0) {
259 f9ab77a8 2023-08-23 op free(s);
260 f9ab77a8 2023-08-23 op return (-1);
261 f9ab77a8 2023-08-23 op }
262 f9ab77a8 2023-08-23 op
263 f9ab77a8 2023-08-23 op if (negate)
264 f9ab77a8 2023-08-23 op protos &= ~proto;
265 f9ab77a8 2023-08-23 op else
266 f9ab77a8 2023-08-23 op protos |= proto;
267 f9ab77a8 2023-08-23 op }
268 f9ab77a8 2023-08-23 op
269 f9ab77a8 2023-08-23 op *protocols = protos;
270 f9ab77a8 2023-08-23 op
271 f9ab77a8 2023-08-23 op free(s);
272 f9ab77a8 2023-08-23 op
273 f9ab77a8 2023-08-23 op return (0);
274 f9ab77a8 2023-08-23 op }
275 f9ab77a8 2023-08-23 op
276 f9ab77a8 2023-08-23 op static int
277 f9ab77a8 2023-08-23 op tls_config_parse_alpn(struct tls_config *config, const char *alpn,
278 f9ab77a8 2023-08-23 op char **alpn_data, size_t *alpn_len)
279 f9ab77a8 2023-08-23 op {
280 f9ab77a8 2023-08-23 op size_t buf_len, i, len;
281 f9ab77a8 2023-08-23 op char *buf = NULL;
282 f9ab77a8 2023-08-23 op char *s = NULL;
283 f9ab77a8 2023-08-23 op char *p, *q;
284 f9ab77a8 2023-08-23 op
285 f9ab77a8 2023-08-23 op free(*alpn_data);
286 f9ab77a8 2023-08-23 op *alpn_data = NULL;
287 f9ab77a8 2023-08-23 op *alpn_len = 0;
288 f9ab77a8 2023-08-23 op
289 f9ab77a8 2023-08-23 op if ((buf_len = strlen(alpn) + 1) > 65535) {
290 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "alpn too large");
291 f9ab77a8 2023-08-23 op goto err;
292 f9ab77a8 2023-08-23 op }
293 f9ab77a8 2023-08-23 op
294 f9ab77a8 2023-08-23 op if ((buf = malloc(buf_len)) == NULL) {
295 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "out of memory");
296 f9ab77a8 2023-08-23 op goto err;
297 f9ab77a8 2023-08-23 op }
298 f9ab77a8 2023-08-23 op
299 f9ab77a8 2023-08-23 op if ((s = strdup(alpn)) == NULL) {
300 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "out of memory");
301 f9ab77a8 2023-08-23 op goto err;
302 f9ab77a8 2023-08-23 op }
303 f9ab77a8 2023-08-23 op
304 f9ab77a8 2023-08-23 op i = 0;
305 f9ab77a8 2023-08-23 op q = s;
306 f9ab77a8 2023-08-23 op while ((p = strsep(&q, ",")) != NULL) {
307 f9ab77a8 2023-08-23 op if ((len = strlen(p)) == 0) {
308 f9ab77a8 2023-08-23 op tls_config_set_errorx(config,
309 f9ab77a8 2023-08-23 op "alpn protocol with zero length");
310 f9ab77a8 2023-08-23 op goto err;
311 f9ab77a8 2023-08-23 op }
312 f9ab77a8 2023-08-23 op if (len > 255) {
313 f9ab77a8 2023-08-23 op tls_config_set_errorx(config,
314 f9ab77a8 2023-08-23 op "alpn protocol too long");
315 f9ab77a8 2023-08-23 op goto err;
316 f9ab77a8 2023-08-23 op }
317 f9ab77a8 2023-08-23 op buf[i++] = len & 0xff;
318 f9ab77a8 2023-08-23 op memcpy(&buf[i], p, len);
319 f9ab77a8 2023-08-23 op i += len;
320 f9ab77a8 2023-08-23 op }
321 f9ab77a8 2023-08-23 op
322 f9ab77a8 2023-08-23 op free(s);
323 f9ab77a8 2023-08-23 op
324 f9ab77a8 2023-08-23 op *alpn_data = buf;
325 f9ab77a8 2023-08-23 op *alpn_len = buf_len;
326 f9ab77a8 2023-08-23 op
327 f9ab77a8 2023-08-23 op return (0);
328 f9ab77a8 2023-08-23 op
329 f9ab77a8 2023-08-23 op err:
330 f9ab77a8 2023-08-23 op free(buf);
331 f9ab77a8 2023-08-23 op free(s);
332 f9ab77a8 2023-08-23 op
333 f9ab77a8 2023-08-23 op return (-1);
334 f9ab77a8 2023-08-23 op }
335 f9ab77a8 2023-08-23 op
336 f9ab77a8 2023-08-23 op int
337 f9ab77a8 2023-08-23 op tls_config_set_alpn(struct tls_config *config, const char *alpn)
338 f9ab77a8 2023-08-23 op {
339 f9ab77a8 2023-08-23 op return tls_config_parse_alpn(config, alpn, &config->alpn,
340 f9ab77a8 2023-08-23 op &config->alpn_len);
341 f9ab77a8 2023-08-23 op }
342 f9ab77a8 2023-08-23 op
343 f9ab77a8 2023-08-23 op static int
344 f9ab77a8 2023-08-23 op tls_config_add_keypair_file_internal(struct tls_config *config,
345 f9ab77a8 2023-08-23 op const char *cert_file, const char *key_file, const char *ocsp_file)
346 f9ab77a8 2023-08-23 op {
347 f9ab77a8 2023-08-23 op struct tls_keypair *keypair;
348 f9ab77a8 2023-08-23 op
349 f9ab77a8 2023-08-23 op if ((keypair = tls_keypair_new()) == NULL)
350 f9ab77a8 2023-08-23 op return (-1);
351 f9ab77a8 2023-08-23 op if (tls_keypair_set_cert_file(keypair, &config->error, cert_file) != 0)
352 f9ab77a8 2023-08-23 op goto err;
353 f9ab77a8 2023-08-23 op if (key_file != NULL &&
354 f9ab77a8 2023-08-23 op tls_keypair_set_key_file(keypair, &config->error, key_file) != 0)
355 f9ab77a8 2023-08-23 op goto err;
356 f9ab77a8 2023-08-23 op if (ocsp_file != NULL &&
357 f9ab77a8 2023-08-23 op tls_keypair_set_ocsp_staple_file(keypair, &config->error,
358 f9ab77a8 2023-08-23 op ocsp_file) != 0)
359 f9ab77a8 2023-08-23 op goto err;
360 f9ab77a8 2023-08-23 op
361 f9ab77a8 2023-08-23 op tls_config_keypair_add(config, keypair);
362 f9ab77a8 2023-08-23 op
363 f9ab77a8 2023-08-23 op return (0);
364 f9ab77a8 2023-08-23 op
365 f9ab77a8 2023-08-23 op err:
366 f9ab77a8 2023-08-23 op tls_keypair_free(keypair);
367 f9ab77a8 2023-08-23 op return (-1);
368 f9ab77a8 2023-08-23 op }
369 f9ab77a8 2023-08-23 op
370 f9ab77a8 2023-08-23 op static int
371 f9ab77a8 2023-08-23 op tls_config_add_keypair_mem_internal(struct tls_config *config, const uint8_t *cert,
372 f9ab77a8 2023-08-23 op size_t cert_len, const uint8_t *key, size_t key_len,
373 f9ab77a8 2023-08-23 op const uint8_t *staple, size_t staple_len)
374 f9ab77a8 2023-08-23 op {
375 f9ab77a8 2023-08-23 op struct tls_keypair *keypair;
376 f9ab77a8 2023-08-23 op
377 f9ab77a8 2023-08-23 op if ((keypair = tls_keypair_new()) == NULL)
378 f9ab77a8 2023-08-23 op return (-1);
379 f9ab77a8 2023-08-23 op if (tls_keypair_set_cert_mem(keypair, &config->error, cert, cert_len) != 0)
380 f9ab77a8 2023-08-23 op goto err;
381 f9ab77a8 2023-08-23 op if (key != NULL &&
382 f9ab77a8 2023-08-23 op tls_keypair_set_key_mem(keypair, &config->error, key, key_len) != 0)
383 f9ab77a8 2023-08-23 op goto err;
384 f9ab77a8 2023-08-23 op if (staple != NULL &&
385 f9ab77a8 2023-08-23 op tls_keypair_set_ocsp_staple_mem(keypair, &config->error, staple,
386 f9ab77a8 2023-08-23 op staple_len) != 0)
387 f9ab77a8 2023-08-23 op goto err;
388 f9ab77a8 2023-08-23 op
389 f9ab77a8 2023-08-23 op tls_config_keypair_add(config, keypair);
390 f9ab77a8 2023-08-23 op
391 f9ab77a8 2023-08-23 op return (0);
392 f9ab77a8 2023-08-23 op
393 f9ab77a8 2023-08-23 op err:
394 f9ab77a8 2023-08-23 op tls_keypair_free(keypair);
395 f9ab77a8 2023-08-23 op return (-1);
396 f9ab77a8 2023-08-23 op }
397 f9ab77a8 2023-08-23 op
398 f9ab77a8 2023-08-23 op int
399 f9ab77a8 2023-08-23 op tls_config_add_keypair_mem(struct tls_config *config, const uint8_t *cert,
400 f9ab77a8 2023-08-23 op size_t cert_len, const uint8_t *key, size_t key_len)
401 f9ab77a8 2023-08-23 op {
402 f9ab77a8 2023-08-23 op return tls_config_add_keypair_mem_internal(config, cert, cert_len, key,
403 f9ab77a8 2023-08-23 op key_len, NULL, 0);
404 f9ab77a8 2023-08-23 op }
405 f9ab77a8 2023-08-23 op
406 f9ab77a8 2023-08-23 op int
407 f9ab77a8 2023-08-23 op tls_config_add_keypair_file(struct tls_config *config,
408 f9ab77a8 2023-08-23 op const char *cert_file, const char *key_file)
409 f9ab77a8 2023-08-23 op {
410 f9ab77a8 2023-08-23 op return tls_config_add_keypair_file_internal(config, cert_file,
411 f9ab77a8 2023-08-23 op key_file, NULL);
412 f9ab77a8 2023-08-23 op }
413 f9ab77a8 2023-08-23 op
414 f9ab77a8 2023-08-23 op int
415 f9ab77a8 2023-08-23 op tls_config_add_keypair_ocsp_mem(struct tls_config *config, const uint8_t *cert,
416 f9ab77a8 2023-08-23 op size_t cert_len, const uint8_t *key, size_t key_len, const uint8_t *staple,
417 f9ab77a8 2023-08-23 op size_t staple_len)
418 f9ab77a8 2023-08-23 op {
419 f9ab77a8 2023-08-23 op return tls_config_add_keypair_mem_internal(config, cert, cert_len, key,
420 f9ab77a8 2023-08-23 op key_len, staple, staple_len);
421 f9ab77a8 2023-08-23 op }
422 f9ab77a8 2023-08-23 op
423 f9ab77a8 2023-08-23 op int
424 f9ab77a8 2023-08-23 op tls_config_add_keypair_ocsp_file(struct tls_config *config,
425 f9ab77a8 2023-08-23 op const char *cert_file, const char *key_file, const char *ocsp_file)
426 f9ab77a8 2023-08-23 op {
427 f9ab77a8 2023-08-23 op return tls_config_add_keypair_file_internal(config, cert_file,
428 f9ab77a8 2023-08-23 op key_file, ocsp_file);
429 f9ab77a8 2023-08-23 op }
430 f9ab77a8 2023-08-23 op
431 f9ab77a8 2023-08-23 op int
432 f9ab77a8 2023-08-23 op tls_config_set_ca_file(struct tls_config *config, const char *ca_file)
433 f9ab77a8 2023-08-23 op {
434 f9ab77a8 2023-08-23 op return tls_config_load_file(&config->error, "CA", ca_file,
435 f9ab77a8 2023-08-23 op &config->ca_mem, &config->ca_len);
436 f9ab77a8 2023-08-23 op }
437 f9ab77a8 2023-08-23 op
438 f9ab77a8 2023-08-23 op int
439 f9ab77a8 2023-08-23 op tls_config_set_ca_path(struct tls_config *config, const char *ca_path)
440 f9ab77a8 2023-08-23 op {
441 f9ab77a8 2023-08-23 op return tls_set_string(&config->ca_path, ca_path);
442 f9ab77a8 2023-08-23 op }
443 f9ab77a8 2023-08-23 op
444 f9ab77a8 2023-08-23 op int
445 f9ab77a8 2023-08-23 op tls_config_set_ca_mem(struct tls_config *config, const uint8_t *ca, size_t len)
446 f9ab77a8 2023-08-23 op {
447 f9ab77a8 2023-08-23 op return tls_set_mem(&config->ca_mem, &config->ca_len, ca, len);
448 f9ab77a8 2023-08-23 op }
449 f9ab77a8 2023-08-23 op
450 f9ab77a8 2023-08-23 op int
451 f9ab77a8 2023-08-23 op tls_config_set_cert_file(struct tls_config *config, const char *cert_file)
452 f9ab77a8 2023-08-23 op {
453 f9ab77a8 2023-08-23 op return tls_keypair_set_cert_file(config->keypair, &config->error,
454 f9ab77a8 2023-08-23 op cert_file);
455 f9ab77a8 2023-08-23 op }
456 f9ab77a8 2023-08-23 op
457 f9ab77a8 2023-08-23 op int
458 f9ab77a8 2023-08-23 op tls_config_set_cert_mem(struct tls_config *config, const uint8_t *cert,
459 f9ab77a8 2023-08-23 op size_t len)
460 f9ab77a8 2023-08-23 op {
461 f9ab77a8 2023-08-23 op return tls_keypair_set_cert_mem(config->keypair, &config->error,
462 f9ab77a8 2023-08-23 op cert, len);
463 f9ab77a8 2023-08-23 op }
464 f9ab77a8 2023-08-23 op
465 f9ab77a8 2023-08-23 op int
466 f9ab77a8 2023-08-23 op tls_config_set_ciphers(struct tls_config *config, const char *ciphers)
467 f9ab77a8 2023-08-23 op {
468 f9ab77a8 2023-08-23 op SSL_CTX *ssl_ctx = NULL;
469 f9ab77a8 2023-08-23 op
470 f9ab77a8 2023-08-23 op if (ciphers == NULL ||
471 f9ab77a8 2023-08-23 op strcasecmp(ciphers, "default") == 0 ||
472 f9ab77a8 2023-08-23 op strcasecmp(ciphers, "secure") == 0)
473 f9ab77a8 2023-08-23 op ciphers = TLS_CIPHERS_DEFAULT;
474 f9ab77a8 2023-08-23 op else if (strcasecmp(ciphers, "compat") == 0)
475 f9ab77a8 2023-08-23 op ciphers = TLS_CIPHERS_COMPAT;
476 f9ab77a8 2023-08-23 op else if (strcasecmp(ciphers, "legacy") == 0)
477 f9ab77a8 2023-08-23 op ciphers = TLS_CIPHERS_LEGACY;
478 f9ab77a8 2023-08-23 op else if (strcasecmp(ciphers, "all") == 0 ||
479 f9ab77a8 2023-08-23 op strcasecmp(ciphers, "insecure") == 0)
480 f9ab77a8 2023-08-23 op ciphers = TLS_CIPHERS_ALL;
481 f9ab77a8 2023-08-23 op
482 f9ab77a8 2023-08-23 op if ((ssl_ctx = SSL_CTX_new(SSLv23_method())) == NULL) {
483 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "out of memory");
484 f9ab77a8 2023-08-23 op goto err;
485 f9ab77a8 2023-08-23 op }
486 f9ab77a8 2023-08-23 op if (SSL_CTX_set_cipher_list(ssl_ctx, ciphers) != 1) {
487 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "no ciphers for '%s'", ciphers);
488 f9ab77a8 2023-08-23 op goto err;
489 f9ab77a8 2023-08-23 op }
490 f9ab77a8 2023-08-23 op
491 f9ab77a8 2023-08-23 op SSL_CTX_free(ssl_ctx);
492 f9ab77a8 2023-08-23 op return tls_set_string(&config->ciphers, ciphers);
493 f9ab77a8 2023-08-23 op
494 f9ab77a8 2023-08-23 op err:
495 f9ab77a8 2023-08-23 op SSL_CTX_free(ssl_ctx);
496 f9ab77a8 2023-08-23 op return -1;
497 f9ab77a8 2023-08-23 op }
498 f9ab77a8 2023-08-23 op
499 f9ab77a8 2023-08-23 op int
500 f9ab77a8 2023-08-23 op tls_config_set_crl_file(struct tls_config *config, const char *crl_file)
501 f9ab77a8 2023-08-23 op {
502 f9ab77a8 2023-08-23 op return tls_config_load_file(&config->error, "CRL", crl_file,
503 f9ab77a8 2023-08-23 op &config->crl_mem, &config->crl_len);
504 f9ab77a8 2023-08-23 op }
505 f9ab77a8 2023-08-23 op
506 f9ab77a8 2023-08-23 op int
507 f9ab77a8 2023-08-23 op tls_config_set_crl_mem(struct tls_config *config, const uint8_t *crl,
508 f9ab77a8 2023-08-23 op size_t len)
509 f9ab77a8 2023-08-23 op {
510 f9ab77a8 2023-08-23 op return tls_set_mem(&config->crl_mem, &config->crl_len, crl, len);
511 f9ab77a8 2023-08-23 op }
512 f9ab77a8 2023-08-23 op
513 f9ab77a8 2023-08-23 op int
514 f9ab77a8 2023-08-23 op tls_config_set_dheparams(struct tls_config *config, const char *params)
515 f9ab77a8 2023-08-23 op {
516 f9ab77a8 2023-08-23 op int keylen;
517 f9ab77a8 2023-08-23 op
518 f9ab77a8 2023-08-23 op if (params == NULL || strcasecmp(params, "none") == 0)
519 f9ab77a8 2023-08-23 op keylen = 0;
520 f9ab77a8 2023-08-23 op else if (strcasecmp(params, "auto") == 0)
521 f9ab77a8 2023-08-23 op keylen = -1;
522 f9ab77a8 2023-08-23 op else if (strcasecmp(params, "legacy") == 0)
523 f9ab77a8 2023-08-23 op keylen = 1024;
524 f9ab77a8 2023-08-23 op else {
525 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "invalid dhe param '%s'", params);
526 f9ab77a8 2023-08-23 op return (-1);
527 f9ab77a8 2023-08-23 op }
528 f9ab77a8 2023-08-23 op
529 f9ab77a8 2023-08-23 op config->dheparams = keylen;
530 f9ab77a8 2023-08-23 op
531 f9ab77a8 2023-08-23 op return (0);
532 f9ab77a8 2023-08-23 op }
533 f9ab77a8 2023-08-23 op
534 f9ab77a8 2023-08-23 op int
535 f9ab77a8 2023-08-23 op tls_config_set_ecdhecurve(struct tls_config *config, const char *curve)
536 f9ab77a8 2023-08-23 op {
537 f9ab77a8 2023-08-23 op if (curve == NULL ||
538 f9ab77a8 2023-08-23 op strcasecmp(curve, "none") == 0 ||
539 f9ab77a8 2023-08-23 op strcasecmp(curve, "auto") == 0) {
540 f9ab77a8 2023-08-23 op curve = TLS_ECDHE_CURVES;
541 f9ab77a8 2023-08-23 op } else if (strchr(curve, ',') != NULL || strchr(curve, ':') != NULL) {
542 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "invalid ecdhe curve '%s'",
543 f9ab77a8 2023-08-23 op curve);
544 f9ab77a8 2023-08-23 op return (-1);
545 f9ab77a8 2023-08-23 op }
546 f9ab77a8 2023-08-23 op
547 f9ab77a8 2023-08-23 op return tls_config_set_ecdhecurves(config, curve);
548 f9ab77a8 2023-08-23 op }
549 f9ab77a8 2023-08-23 op
550 f9ab77a8 2023-08-23 op int
551 f9ab77a8 2023-08-23 op tls_config_set_ecdhecurves(struct tls_config *config, const char *curves)
552 f9ab77a8 2023-08-23 op {
553 f9ab77a8 2023-08-23 op int *curves_list = NULL, *curves_new;
554 f9ab77a8 2023-08-23 op size_t curves_num = 0;
555 f9ab77a8 2023-08-23 op char *cs = NULL;
556 f9ab77a8 2023-08-23 op char *p, *q;
557 f9ab77a8 2023-08-23 op int rv = -1;
558 f9ab77a8 2023-08-23 op int nid;
559 f9ab77a8 2023-08-23 op
560 f9ab77a8 2023-08-23 op free(config->ecdhecurves);
561 f9ab77a8 2023-08-23 op config->ecdhecurves = NULL;
562 f9ab77a8 2023-08-23 op config->ecdhecurves_len = 0;
563 f9ab77a8 2023-08-23 op
564 f9ab77a8 2023-08-23 op if (curves == NULL || strcasecmp(curves, "default") == 0)
565 f9ab77a8 2023-08-23 op curves = TLS_ECDHE_CURVES;
566 f9ab77a8 2023-08-23 op
567 f9ab77a8 2023-08-23 op if ((cs = strdup(curves)) == NULL) {
568 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "out of memory");
569 f9ab77a8 2023-08-23 op goto err;
570 f9ab77a8 2023-08-23 op }
571 f9ab77a8 2023-08-23 op
572 f9ab77a8 2023-08-23 op q = cs;
573 f9ab77a8 2023-08-23 op while ((p = strsep(&q, ",:")) != NULL) {
574 f9ab77a8 2023-08-23 op while (*p == ' ' || *p == '\t')
575 f9ab77a8 2023-08-23 op p++;
576 f9ab77a8 2023-08-23 op
577 f9ab77a8 2023-08-23 op nid = OBJ_sn2nid(p);
578 f9ab77a8 2023-08-23 op if (nid == NID_undef)
579 f9ab77a8 2023-08-23 op nid = OBJ_ln2nid(p);
580 f9ab77a8 2023-08-23 op if (nid == NID_undef)
581 f9ab77a8 2023-08-23 op nid = EC_curve_nist2nid(p);
582 f9ab77a8 2023-08-23 op if (nid == NID_undef) {
583 f9ab77a8 2023-08-23 op tls_config_set_errorx(config,
584 f9ab77a8 2023-08-23 op "invalid ecdhe curve '%s'", p);
585 f9ab77a8 2023-08-23 op goto err;
586 f9ab77a8 2023-08-23 op }
587 f9ab77a8 2023-08-23 op
588 f9ab77a8 2023-08-23 op if ((curves_new = reallocarray(curves_list, curves_num + 1,
589 f9ab77a8 2023-08-23 op sizeof(int))) == NULL) {
590 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "out of memory");
591 f9ab77a8 2023-08-23 op goto err;
592 f9ab77a8 2023-08-23 op }
593 f9ab77a8 2023-08-23 op curves_list = curves_new;
594 f9ab77a8 2023-08-23 op curves_list[curves_num] = nid;
595 f9ab77a8 2023-08-23 op curves_num++;
596 f9ab77a8 2023-08-23 op }
597 f9ab77a8 2023-08-23 op
598 f9ab77a8 2023-08-23 op config->ecdhecurves = curves_list;
599 f9ab77a8 2023-08-23 op config->ecdhecurves_len = curves_num;
600 f9ab77a8 2023-08-23 op curves_list = NULL;
601 f9ab77a8 2023-08-23 op
602 f9ab77a8 2023-08-23 op rv = 0;
603 f9ab77a8 2023-08-23 op
604 f9ab77a8 2023-08-23 op err:
605 f9ab77a8 2023-08-23 op free(cs);
606 f9ab77a8 2023-08-23 op free(curves_list);
607 f9ab77a8 2023-08-23 op
608 f9ab77a8 2023-08-23 op return (rv);
609 f9ab77a8 2023-08-23 op }
610 f9ab77a8 2023-08-23 op
611 f9ab77a8 2023-08-23 op int
612 f9ab77a8 2023-08-23 op tls_config_set_key_file(struct tls_config *config, const char *key_file)
613 f9ab77a8 2023-08-23 op {
614 f9ab77a8 2023-08-23 op return tls_keypair_set_key_file(config->keypair, &config->error,
615 f9ab77a8 2023-08-23 op key_file);
616 f9ab77a8 2023-08-23 op }
617 f9ab77a8 2023-08-23 op
618 f9ab77a8 2023-08-23 op int
619 f9ab77a8 2023-08-23 op tls_config_set_key_mem(struct tls_config *config, const uint8_t *key,
620 f9ab77a8 2023-08-23 op size_t len)
621 f9ab77a8 2023-08-23 op {
622 f9ab77a8 2023-08-23 op return tls_keypair_set_key_mem(config->keypair, &config->error,
623 f9ab77a8 2023-08-23 op key, len);
624 f9ab77a8 2023-08-23 op }
625 f9ab77a8 2023-08-23 op
626 f9ab77a8 2023-08-23 op static int
627 f9ab77a8 2023-08-23 op tls_config_set_keypair_file_internal(struct tls_config *config,
628 f9ab77a8 2023-08-23 op const char *cert_file, const char *key_file, const char *ocsp_file)
629 f9ab77a8 2023-08-23 op {
630 f9ab77a8 2023-08-23 op if (tls_config_set_cert_file(config, cert_file) != 0)
631 f9ab77a8 2023-08-23 op return (-1);
632 f9ab77a8 2023-08-23 op if (tls_config_set_key_file(config, key_file) != 0)
633 f9ab77a8 2023-08-23 op return (-1);
634 f9ab77a8 2023-08-23 op if (ocsp_file != NULL &&
635 f9ab77a8 2023-08-23 op tls_config_set_ocsp_staple_file(config, ocsp_file) != 0)
636 f9ab77a8 2023-08-23 op return (-1);
637 f9ab77a8 2023-08-23 op
638 f9ab77a8 2023-08-23 op return (0);
639 f9ab77a8 2023-08-23 op }
640 f9ab77a8 2023-08-23 op
641 f9ab77a8 2023-08-23 op static int
642 f9ab77a8 2023-08-23 op tls_config_set_keypair_mem_internal(struct tls_config *config, const uint8_t *cert,
643 f9ab77a8 2023-08-23 op size_t cert_len, const uint8_t *key, size_t key_len,
644 f9ab77a8 2023-08-23 op const uint8_t *staple, size_t staple_len)
645 f9ab77a8 2023-08-23 op {
646 f9ab77a8 2023-08-23 op if (tls_config_set_cert_mem(config, cert, cert_len) != 0)
647 f9ab77a8 2023-08-23 op return (-1);
648 f9ab77a8 2023-08-23 op if (tls_config_set_key_mem(config, key, key_len) != 0)
649 f9ab77a8 2023-08-23 op return (-1);
650 f9ab77a8 2023-08-23 op if ((staple != NULL) &&
651 f9ab77a8 2023-08-23 op (tls_config_set_ocsp_staple_mem(config, staple, staple_len) != 0))
652 f9ab77a8 2023-08-23 op return (-1);
653 f9ab77a8 2023-08-23 op
654 f9ab77a8 2023-08-23 op return (0);
655 f9ab77a8 2023-08-23 op }
656 f9ab77a8 2023-08-23 op
657 f9ab77a8 2023-08-23 op int
658 f9ab77a8 2023-08-23 op tls_config_set_keypair_file(struct tls_config *config,
659 f9ab77a8 2023-08-23 op const char *cert_file, const char *key_file)
660 f9ab77a8 2023-08-23 op {
661 f9ab77a8 2023-08-23 op return tls_config_set_keypair_file_internal(config, cert_file, key_file,
662 f9ab77a8 2023-08-23 op NULL);
663 f9ab77a8 2023-08-23 op }
664 f9ab77a8 2023-08-23 op
665 f9ab77a8 2023-08-23 op int
666 f9ab77a8 2023-08-23 op tls_config_set_keypair_mem(struct tls_config *config, const uint8_t *cert,
667 f9ab77a8 2023-08-23 op size_t cert_len, const uint8_t *key, size_t key_len)
668 f9ab77a8 2023-08-23 op {
669 f9ab77a8 2023-08-23 op return tls_config_set_keypair_mem_internal(config, cert, cert_len,
670 f9ab77a8 2023-08-23 op key, key_len, NULL, 0);
671 f9ab77a8 2023-08-23 op }
672 f9ab77a8 2023-08-23 op
673 f9ab77a8 2023-08-23 op int
674 f9ab77a8 2023-08-23 op tls_config_set_keypair_ocsp_file(struct tls_config *config,
675 f9ab77a8 2023-08-23 op const char *cert_file, const char *key_file, const char *ocsp_file)
676 f9ab77a8 2023-08-23 op {
677 f9ab77a8 2023-08-23 op return tls_config_set_keypair_file_internal(config, cert_file, key_file,
678 f9ab77a8 2023-08-23 op ocsp_file);
679 f9ab77a8 2023-08-23 op }
680 f9ab77a8 2023-08-23 op
681 f9ab77a8 2023-08-23 op int
682 f9ab77a8 2023-08-23 op tls_config_set_keypair_ocsp_mem(struct tls_config *config, const uint8_t *cert,
683 f9ab77a8 2023-08-23 op size_t cert_len, const uint8_t *key, size_t key_len,
684 f9ab77a8 2023-08-23 op const uint8_t *staple, size_t staple_len)
685 f9ab77a8 2023-08-23 op {
686 f9ab77a8 2023-08-23 op return tls_config_set_keypair_mem_internal(config, cert, cert_len,
687 f9ab77a8 2023-08-23 op key, key_len, staple, staple_len);
688 f9ab77a8 2023-08-23 op }
689 f9ab77a8 2023-08-23 op
690 f9ab77a8 2023-08-23 op
691 f9ab77a8 2023-08-23 op int
692 f9ab77a8 2023-08-23 op tls_config_set_protocols(struct tls_config *config, uint32_t protocols)
693 f9ab77a8 2023-08-23 op {
694 f9ab77a8 2023-08-23 op config->protocols = protocols;
695 f9ab77a8 2023-08-23 op
696 f9ab77a8 2023-08-23 op return (0);
697 f9ab77a8 2023-08-23 op }
698 f9ab77a8 2023-08-23 op
699 f9ab77a8 2023-08-23 op int
700 f9ab77a8 2023-08-23 op tls_config_set_session_fd(struct tls_config *config, int session_fd)
701 f9ab77a8 2023-08-23 op {
702 f9ab77a8 2023-08-23 op struct stat sb;
703 f9ab77a8 2023-08-23 op mode_t mugo;
704 f9ab77a8 2023-08-23 op
705 f9ab77a8 2023-08-23 op if (session_fd == -1) {
706 f9ab77a8 2023-08-23 op config->session_fd = session_fd;
707 f9ab77a8 2023-08-23 op return (0);
708 f9ab77a8 2023-08-23 op }
709 f9ab77a8 2023-08-23 op
710 f9ab77a8 2023-08-23 op if (fstat(session_fd, &sb) == -1) {
711 f9ab77a8 2023-08-23 op tls_config_set_error(config, "failed to stat session file");
712 f9ab77a8 2023-08-23 op return (-1);
713 f9ab77a8 2023-08-23 op }
714 f9ab77a8 2023-08-23 op if (!S_ISREG(sb.st_mode)) {
715 f9ab77a8 2023-08-23 op tls_config_set_errorx(config,
716 f9ab77a8 2023-08-23 op "session file is not a regular file");
717 f9ab77a8 2023-08-23 op return (-1);
718 f9ab77a8 2023-08-23 op }
719 f9ab77a8 2023-08-23 op
720 f9ab77a8 2023-08-23 op if (sb.st_uid != getuid()) {
721 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "session file has incorrect "
722 f9ab77a8 2023-08-23 op "owner (uid %u != %u)", sb.st_uid, getuid());
723 f9ab77a8 2023-08-23 op return (-1);
724 f9ab77a8 2023-08-23 op }
725 f9ab77a8 2023-08-23 op mugo = sb.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO);
726 f9ab77a8 2023-08-23 op if (mugo != (S_IRUSR|S_IWUSR)) {
727 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "session file has incorrect "
728 f9ab77a8 2023-08-23 op "permissions (%o != 600)", mugo);
729 f9ab77a8 2023-08-23 op return (-1);
730 f9ab77a8 2023-08-23 op }
731 f9ab77a8 2023-08-23 op
732 f9ab77a8 2023-08-23 op config->session_fd = session_fd;
733 f9ab77a8 2023-08-23 op
734 f9ab77a8 2023-08-23 op return (0);
735 f9ab77a8 2023-08-23 op }
736 f9ab77a8 2023-08-23 op
737 f9ab77a8 2023-08-23 op int
738 ebfc5784 2024-01-07 op tls_config_set_sign_cb(struct tls_config *config, tls_sign_cb cb, void *cb_arg)
739 ebfc5784 2024-01-07 op {
740 ebfc5784 2024-01-07 op config->use_fake_private_key = 1;
741 ebfc5784 2024-01-07 op config->skip_private_key_check = 1;
742 ebfc5784 2024-01-07 op config->sign_cb = cb;
743 ebfc5784 2024-01-07 op config->sign_cb_arg = cb_arg;
744 ebfc5784 2024-01-07 op
745 ebfc5784 2024-01-07 op return (0);
746 ebfc5784 2024-01-07 op }
747 ebfc5784 2024-01-07 op
748 ebfc5784 2024-01-07 op int
749 f9ab77a8 2023-08-23 op tls_config_set_verify_depth(struct tls_config *config, int verify_depth)
750 f9ab77a8 2023-08-23 op {
751 f9ab77a8 2023-08-23 op config->verify_depth = verify_depth;
752 f9ab77a8 2023-08-23 op
753 f9ab77a8 2023-08-23 op return (0);
754 f9ab77a8 2023-08-23 op }
755 f9ab77a8 2023-08-23 op
756 f9ab77a8 2023-08-23 op void
757 f9ab77a8 2023-08-23 op tls_config_prefer_ciphers_client(struct tls_config *config)
758 f9ab77a8 2023-08-23 op {
759 f9ab77a8 2023-08-23 op config->ciphers_server = 0;
760 f9ab77a8 2023-08-23 op }
761 f9ab77a8 2023-08-23 op
762 f9ab77a8 2023-08-23 op void
763 f9ab77a8 2023-08-23 op tls_config_prefer_ciphers_server(struct tls_config *config)
764 f9ab77a8 2023-08-23 op {
765 f9ab77a8 2023-08-23 op config->ciphers_server = 1;
766 f9ab77a8 2023-08-23 op }
767 f9ab77a8 2023-08-23 op
768 f9ab77a8 2023-08-23 op void
769 f9ab77a8 2023-08-23 op tls_config_insecure_noverifycert(struct tls_config *config)
770 f9ab77a8 2023-08-23 op {
771 f9ab77a8 2023-08-23 op config->verify_cert = 0;
772 f9ab77a8 2023-08-23 op }
773 f9ab77a8 2023-08-23 op
774 f9ab77a8 2023-08-23 op void
775 f9ab77a8 2023-08-23 op tls_config_insecure_noverifyname(struct tls_config *config)
776 f9ab77a8 2023-08-23 op {
777 f9ab77a8 2023-08-23 op config->verify_name = 0;
778 f9ab77a8 2023-08-23 op }
779 f9ab77a8 2023-08-23 op
780 f9ab77a8 2023-08-23 op void
781 f9ab77a8 2023-08-23 op tls_config_insecure_noverifytime(struct tls_config *config)
782 f9ab77a8 2023-08-23 op {
783 f9ab77a8 2023-08-23 op config->verify_time = 0;
784 f9ab77a8 2023-08-23 op }
785 f9ab77a8 2023-08-23 op
786 f9ab77a8 2023-08-23 op void
787 f9ab77a8 2023-08-23 op tls_config_verify(struct tls_config *config)
788 f9ab77a8 2023-08-23 op {
789 f9ab77a8 2023-08-23 op config->verify_cert = 1;
790 f9ab77a8 2023-08-23 op config->verify_name = 1;
791 f9ab77a8 2023-08-23 op config->verify_time = 1;
792 f9ab77a8 2023-08-23 op }
793 f9ab77a8 2023-08-23 op
794 f9ab77a8 2023-08-23 op void
795 f9ab77a8 2023-08-23 op tls_config_ocsp_require_stapling(struct tls_config *config)
796 f9ab77a8 2023-08-23 op {
797 f9ab77a8 2023-08-23 op config->ocsp_require_stapling = 1;
798 f9ab77a8 2023-08-23 op }
799 f9ab77a8 2023-08-23 op
800 f9ab77a8 2023-08-23 op void
801 f9ab77a8 2023-08-23 op tls_config_verify_client(struct tls_config *config)
802 f9ab77a8 2023-08-23 op {
803 f9ab77a8 2023-08-23 op config->verify_client = 1;
804 f9ab77a8 2023-08-23 op }
805 f9ab77a8 2023-08-23 op
806 f9ab77a8 2023-08-23 op void
807 f9ab77a8 2023-08-23 op tls_config_verify_client_optional(struct tls_config *config)
808 f9ab77a8 2023-08-23 op {
809 f9ab77a8 2023-08-23 op config->verify_client = 2;
810 f9ab77a8 2023-08-23 op }
811 f9ab77a8 2023-08-23 op
812 f9ab77a8 2023-08-23 op void
813 f9ab77a8 2023-08-23 op tls_config_skip_private_key_check(struct tls_config *config)
814 f9ab77a8 2023-08-23 op {
815 f9ab77a8 2023-08-23 op config->skip_private_key_check = 1;
816 f9ab77a8 2023-08-23 op }
817 f9ab77a8 2023-08-23 op
818 f9ab77a8 2023-08-23 op void
819 f9ab77a8 2023-08-23 op tls_config_use_fake_private_key(struct tls_config *config)
820 f9ab77a8 2023-08-23 op {
821 f9ab77a8 2023-08-23 op config->use_fake_private_key = 1;
822 f9ab77a8 2023-08-23 op config->skip_private_key_check = 1;
823 f9ab77a8 2023-08-23 op }
824 f9ab77a8 2023-08-23 op
825 f9ab77a8 2023-08-23 op int
826 f9ab77a8 2023-08-23 op tls_config_set_ocsp_staple_file(struct tls_config *config, const char *staple_file)
827 f9ab77a8 2023-08-23 op {
828 f9ab77a8 2023-08-23 op return tls_keypair_set_ocsp_staple_file(config->keypair, &config->error,
829 f9ab77a8 2023-08-23 op staple_file);
830 f9ab77a8 2023-08-23 op }
831 f9ab77a8 2023-08-23 op
832 f9ab77a8 2023-08-23 op int
833 f9ab77a8 2023-08-23 op tls_config_set_ocsp_staple_mem(struct tls_config *config, const uint8_t *staple,
834 f9ab77a8 2023-08-23 op size_t len)
835 f9ab77a8 2023-08-23 op {
836 f9ab77a8 2023-08-23 op return tls_keypair_set_ocsp_staple_mem(config->keypair, &config->error,
837 f9ab77a8 2023-08-23 op staple, len);
838 f9ab77a8 2023-08-23 op }
839 f9ab77a8 2023-08-23 op
840 f9ab77a8 2023-08-23 op int
841 f9ab77a8 2023-08-23 op tls_config_set_session_id(struct tls_config *config,
842 f9ab77a8 2023-08-23 op const unsigned char *session_id, size_t len)
843 f9ab77a8 2023-08-23 op {
844 f9ab77a8 2023-08-23 op if (len > TLS_MAX_SESSION_ID_LENGTH) {
845 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "session ID too large");
846 f9ab77a8 2023-08-23 op return (-1);
847 f9ab77a8 2023-08-23 op }
848 f9ab77a8 2023-08-23 op memset(config->session_id, 0, sizeof(config->session_id));
849 f9ab77a8 2023-08-23 op memcpy(config->session_id, session_id, len);
850 f9ab77a8 2023-08-23 op return (0);
851 f9ab77a8 2023-08-23 op }
852 f9ab77a8 2023-08-23 op
853 f9ab77a8 2023-08-23 op int
854 f9ab77a8 2023-08-23 op tls_config_set_session_lifetime(struct tls_config *config, int lifetime)
855 f9ab77a8 2023-08-23 op {
856 f9ab77a8 2023-08-23 op if (lifetime > TLS_MAX_SESSION_TIMEOUT) {
857 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "session lifetime too large");
858 f9ab77a8 2023-08-23 op return (-1);
859 f9ab77a8 2023-08-23 op }
860 f9ab77a8 2023-08-23 op if (lifetime != 0 && lifetime < TLS_MIN_SESSION_TIMEOUT) {
861 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "session lifetime too small");
862 f9ab77a8 2023-08-23 op return (-1);
863 f9ab77a8 2023-08-23 op }
864 f9ab77a8 2023-08-23 op
865 f9ab77a8 2023-08-23 op config->session_lifetime = lifetime;
866 f9ab77a8 2023-08-23 op return (0);
867 f9ab77a8 2023-08-23 op }
868 f9ab77a8 2023-08-23 op
869 f9ab77a8 2023-08-23 op int
870 f9ab77a8 2023-08-23 op tls_config_add_ticket_key(struct tls_config *config, uint32_t keyrev,
871 f9ab77a8 2023-08-23 op unsigned char *key, size_t keylen)
872 f9ab77a8 2023-08-23 op {
873 f9ab77a8 2023-08-23 op struct tls_ticket_key newkey;
874 f9ab77a8 2023-08-23 op int i;
875 f9ab77a8 2023-08-23 op
876 f9ab77a8 2023-08-23 op if (TLS_TICKET_KEY_SIZE != keylen ||
877 f9ab77a8 2023-08-23 op sizeof(newkey.aes_key) + sizeof(newkey.hmac_key) > keylen) {
878 f9ab77a8 2023-08-23 op tls_config_set_errorx(config,
879 f9ab77a8 2023-08-23 op "wrong amount of ticket key data");
880 f9ab77a8 2023-08-23 op return (-1);
881 f9ab77a8 2023-08-23 op }
882 f9ab77a8 2023-08-23 op
883 f9ab77a8 2023-08-23 op keyrev = htonl(keyrev);
884 f9ab77a8 2023-08-23 op memset(&newkey, 0, sizeof(newkey));
885 f9ab77a8 2023-08-23 op memcpy(newkey.key_name, &keyrev, sizeof(keyrev));
886 f9ab77a8 2023-08-23 op memcpy(newkey.aes_key, key, sizeof(newkey.aes_key));
887 f9ab77a8 2023-08-23 op memcpy(newkey.hmac_key, key + sizeof(newkey.aes_key),
888 f9ab77a8 2023-08-23 op sizeof(newkey.hmac_key));
889 f9ab77a8 2023-08-23 op newkey.time = time(NULL);
890 f9ab77a8 2023-08-23 op
891 f9ab77a8 2023-08-23 op for (i = 0; i < TLS_NUM_TICKETS; i++) {
892 f9ab77a8 2023-08-23 op struct tls_ticket_key *tk = &config->ticket_keys[i];
893 f9ab77a8 2023-08-23 op if (memcmp(newkey.key_name, tk->key_name,
894 f9ab77a8 2023-08-23 op sizeof(tk->key_name)) != 0)
895 f9ab77a8 2023-08-23 op continue;
896 f9ab77a8 2023-08-23 op
897 f9ab77a8 2023-08-23 op /* allow re-entry of most recent key */
898 f9ab77a8 2023-08-23 op if (i == 0 && memcmp(newkey.aes_key, tk->aes_key,
899 f9ab77a8 2023-08-23 op sizeof(tk->aes_key)) == 0 && memcmp(newkey.hmac_key,
900 f9ab77a8 2023-08-23 op tk->hmac_key, sizeof(tk->hmac_key)) == 0)
901 f9ab77a8 2023-08-23 op return (0);
902 f9ab77a8 2023-08-23 op tls_config_set_errorx(config, "ticket key already present");
903 f9ab77a8 2023-08-23 op return (-1);
904 f9ab77a8 2023-08-23 op }
905 f9ab77a8 2023-08-23 op
906 f9ab77a8 2023-08-23 op memmove(&config->ticket_keys[1], &config->ticket_keys[0],
907 f9ab77a8 2023-08-23 op sizeof(config->ticket_keys) - sizeof(config->ticket_keys[0]));
908 f9ab77a8 2023-08-23 op config->ticket_keys[0] = newkey;
909 f9ab77a8 2023-08-23 op
910 f9ab77a8 2023-08-23 op config->ticket_autorekey = 0;
911 f9ab77a8 2023-08-23 op
912 f9ab77a8 2023-08-23 op return (0);
913 f9ab77a8 2023-08-23 op }
914 f9ab77a8 2023-08-23 op
915 f9ab77a8 2023-08-23 op int
916 f9ab77a8 2023-08-23 op tls_config_ticket_autorekey(struct tls_config *config)
917 f9ab77a8 2023-08-23 op {
918 f9ab77a8 2023-08-23 op unsigned char key[TLS_TICKET_KEY_SIZE];
919 f9ab77a8 2023-08-23 op int rv;
920 f9ab77a8 2023-08-23 op
921 f9ab77a8 2023-08-23 op arc4random_buf(key, sizeof(key));
922 f9ab77a8 2023-08-23 op rv = tls_config_add_ticket_key(config, config->ticket_keyrev++, key,
923 f9ab77a8 2023-08-23 op sizeof(key));
924 f9ab77a8 2023-08-23 op config->ticket_autorekey = 1;
925 f9ab77a8 2023-08-23 op return (rv);
926 f9ab77a8 2023-08-23 op }