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