xref: /freebsd/contrib/unbound/util/net_help.c (revision fe75646a0234a261c0013bf1840fdac4acaf0cec)
1 /*
2  * util/net_help.c - implementation of the network helper code
3  *
4  * Copyright (c) 2007, NLnet Labs. All rights reserved.
5  *
6  * This software is open source.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  *
15  * Redistributions in binary form must reproduce the above copyright notice,
16  * this list of conditions and the following disclaimer in the documentation
17  * and/or other materials provided with the distribution.
18  *
19  * Neither the name of the NLNET LABS nor the names of its contributors may
20  * be used to endorse or promote products derived from this software without
21  * specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
29  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 /**
36  * \file
37  * Implementation of net_help.h.
38  */
39 
40 #include "config.h"
41 #ifdef HAVE_SYS_TYPES_H
42 #  include <sys/types.h>
43 #endif
44 #ifdef HAVE_NET_IF_H
45 #include <net/if.h>
46 #endif
47 #ifdef HAVE_NETIOAPI_H
48 #include <netioapi.h>
49 #endif
50 #include "util/net_help.h"
51 #include "util/log.h"
52 #include "util/data/dname.h"
53 #include "util/module.h"
54 #include "util/regional.h"
55 #include "util/config_file.h"
56 #include "sldns/parseutil.h"
57 #include "sldns/wire2str.h"
58 #include "sldns/str2wire.h"
59 #include <fcntl.h>
60 #ifdef HAVE_OPENSSL_SSL_H
61 #include <openssl/ssl.h>
62 #include <openssl/evp.h>
63 #include <openssl/rand.h>
64 #endif
65 #ifdef HAVE_OPENSSL_ERR_H
66 #include <openssl/err.h>
67 #endif
68 #ifdef HAVE_OPENSSL_CORE_NAMES_H
69 #include <openssl/core_names.h>
70 #endif
71 #ifdef USE_WINSOCK
72 #include <wincrypt.h>
73 #endif
74 #ifdef HAVE_NGHTTP2_NGHTTP2_H
75 #include <nghttp2/nghttp2.h>
76 #endif
77 
78 /** max length of an IP address (the address portion) that we allow */
79 #define MAX_ADDR_STRLEN 128 /* characters */
80 /** default value for EDNS ADVERTISED size */
81 uint16_t EDNS_ADVERTISED_SIZE = 4096;
82 
83 /** minimal responses when positive answer: default is no */
84 int MINIMAL_RESPONSES = 0;
85 
86 /** rrset order roundrobin: default is yes */
87 int RRSET_ROUNDROBIN = 1;
88 
89 /** log tag queries with name instead of 'info' for filtering */
90 int LOG_TAG_QUERYREPLY = 0;
91 
92 static struct tls_session_ticket_key {
93 	unsigned char *key_name;
94 	unsigned char *aes_key;
95 	unsigned char *hmac_key;
96 } *ticket_keys;
97 
98 #ifdef HAVE_SSL
99 /**
100  * callback TLS session ticket encrypt and decrypt
101  * For use with SSL_CTX_set_tlsext_ticket_key_cb or
102  * SSL_CTX_set_tlsext_ticket_key_evp_cb
103  * @param s: the SSL_CTX to use (from connect_sslctx_create())
104  * @param key_name: secret name, 16 bytes
105  * @param iv: up to EVP_MAX_IV_LENGTH.
106  * @param evp_ctx: the evp cipher context, function sets this.
107  * @param hmac_ctx: the hmac context, function sets this.
108  * 	with ..key_cb it is of type HMAC_CTX*
109  * 	with ..key_evp_cb it is of type EVP_MAC_CTX*
110  * @param enc: 1 is encrypt, 0 is decrypt
111  * @return 0 on no ticket, 1 for okay, and 2 for okay but renew the ticket
112  * 	(the ticket is decrypt only). and <0 for failures.
113  */
114 int tls_session_ticket_key_cb(SSL *s, unsigned char* key_name,
115 	unsigned char* iv, EVP_CIPHER_CTX *evp_ctx,
116 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
117 	EVP_MAC_CTX *hmac_ctx,
118 #else
119 	HMAC_CTX* hmac_ctx,
120 #endif
121 	int enc);
122 #endif /* HAVE_SSL */
123 
124 /* returns true is string addr is an ip6 specced address */
125 int
126 str_is_ip6(const char* str)
127 {
128 	if(strchr(str, ':'))
129 		return 1;
130 	else    return 0;
131 }
132 
133 int
134 fd_set_nonblock(int s)
135 {
136 #ifdef HAVE_FCNTL
137 	int flag;
138 	if((flag = fcntl(s, F_GETFL)) == -1) {
139 		log_err("can't fcntl F_GETFL: %s", strerror(errno));
140 		flag = 0;
141 	}
142 	flag |= O_NONBLOCK;
143 	if(fcntl(s, F_SETFL, flag) == -1) {
144 		log_err("can't fcntl F_SETFL: %s", strerror(errno));
145 		return 0;
146 	}
147 #elif defined(HAVE_IOCTLSOCKET)
148 	unsigned long on = 1;
149 	if(ioctlsocket(s, FIONBIO, &on) != 0) {
150 		log_err("can't ioctlsocket FIONBIO on: %s",
151 			wsa_strerror(WSAGetLastError()));
152 	}
153 #endif
154 	return 1;
155 }
156 
157 int
158 fd_set_block(int s)
159 {
160 #ifdef HAVE_FCNTL
161 	int flag;
162 	if((flag = fcntl(s, F_GETFL)) == -1) {
163 		log_err("cannot fcntl F_GETFL: %s", strerror(errno));
164 		flag = 0;
165 	}
166 	flag &= ~O_NONBLOCK;
167 	if(fcntl(s, F_SETFL, flag) == -1) {
168 		log_err("cannot fcntl F_SETFL: %s", strerror(errno));
169 		return 0;
170 	}
171 #elif defined(HAVE_IOCTLSOCKET)
172 	unsigned long off = 0;
173 	if(ioctlsocket(s, FIONBIO, &off) != 0) {
174 		if(WSAGetLastError() != WSAEINVAL || verbosity >= 4)
175 			log_err("can't ioctlsocket FIONBIO off: %s",
176 				wsa_strerror(WSAGetLastError()));
177 	}
178 #endif
179 	return 1;
180 }
181 
182 int
183 is_pow2(size_t num)
184 {
185 	if(num == 0) return 1;
186 	return (num & (num-1)) == 0;
187 }
188 
189 void*
190 memdup(void* data, size_t len)
191 {
192 	void* d;
193 	if(!data) return NULL;
194 	if(len == 0) return NULL;
195 	d = malloc(len);
196 	if(!d) return NULL;
197 	memcpy(d, data, len);
198 	return d;
199 }
200 
201 void
202 log_addr(enum verbosity_value v, const char* str,
203 	struct sockaddr_storage* addr, socklen_t addrlen)
204 {
205 	uint16_t port;
206 	const char* family = "unknown";
207 	char dest[100];
208 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
209 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
210 	if(verbosity < v)
211 		return;
212 	switch(af) {
213 		case AF_INET: family="ip4"; break;
214 		case AF_INET6: family="ip6";
215 			sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
216 			break;
217 		case AF_LOCAL:
218 			dest[0]=0;
219 			(void)inet_ntop(af, sinaddr, dest,
220 				(socklen_t)sizeof(dest));
221 			verbose(v, "%s local %s", str, dest);
222 			return; /* do not continue and try to get port */
223 		default: break;
224 	}
225 	if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
226 		(void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
227 	}
228 	dest[sizeof(dest)-1] = 0;
229 	port = ntohs(((struct sockaddr_in*)addr)->sin_port);
230 	if(verbosity >= 4)
231 		verbose(v, "%s %s %s port %d (len %d)", str, family, dest,
232 			(int)port, (int)addrlen);
233 	else	verbose(v, "%s %s port %d", str, dest, (int)port);
234 }
235 
236 int
237 extstrtoaddr(const char* str, struct sockaddr_storage* addr,
238 	socklen_t* addrlen, int port)
239 {
240 	char* s;
241 	if((s=strchr(str, '@'))) {
242 		char buf[MAX_ADDR_STRLEN];
243 		if(s-str >= MAX_ADDR_STRLEN) {
244 			return 0;
245 		}
246 		(void)strlcpy(buf, str, sizeof(buf));
247 		buf[s-str] = 0;
248 		port = atoi(s+1);
249 		if(port == 0 && strcmp(s+1,"0")!=0) {
250 			return 0;
251 		}
252 		return ipstrtoaddr(buf, port, addr, addrlen);
253 	}
254 	return ipstrtoaddr(str, port, addr, addrlen);
255 }
256 
257 int
258 ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr,
259 	socklen_t* addrlen)
260 {
261 	uint16_t p;
262 	if(!ip) return 0;
263 	p = (uint16_t) port;
264 	if(str_is_ip6(ip)) {
265 		char buf[MAX_ADDR_STRLEN];
266 		char* s;
267 		struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
268 		*addrlen = (socklen_t)sizeof(struct sockaddr_in6);
269 		memset(sa, 0, *addrlen);
270 		sa->sin6_family = AF_INET6;
271 		sa->sin6_port = (in_port_t)htons(p);
272 		if((s=strchr(ip, '%'))) { /* ip6%interface, rfc 4007 */
273 			if(s-ip >= MAX_ADDR_STRLEN)
274 				return 0;
275 			(void)strlcpy(buf, ip, sizeof(buf));
276 			buf[s-ip]=0;
277 #ifdef HAVE_IF_NAMETOINDEX
278 			if (!(sa->sin6_scope_id = if_nametoindex(s+1)))
279 #endif /* HAVE_IF_NAMETOINDEX */
280 				sa->sin6_scope_id = (uint32_t)atoi(s+1);
281 			ip = buf;
282 		}
283 		if(inet_pton((int)sa->sin6_family, ip, &sa->sin6_addr) <= 0) {
284 			return 0;
285 		}
286 	} else { /* ip4 */
287 		struct sockaddr_in* sa = (struct sockaddr_in*)addr;
288 		*addrlen = (socklen_t)sizeof(struct sockaddr_in);
289 		memset(sa, 0, *addrlen);
290 		sa->sin_family = AF_INET;
291 		sa->sin_port = (in_port_t)htons(p);
292 		if(inet_pton((int)sa->sin_family, ip, &sa->sin_addr) <= 0) {
293 			return 0;
294 		}
295 	}
296 	return 1;
297 }
298 
299 int netblockstrtoaddr(const char* str, int port, struct sockaddr_storage* addr,
300         socklen_t* addrlen, int* net)
301 {
302 	char buf[64];
303 	char* s;
304 	*net = (str_is_ip6(str)?128:32);
305 	if((s=strchr(str, '/'))) {
306 		if(atoi(s+1) > *net) {
307 			log_err("netblock too large: %s", str);
308 			return 0;
309 		}
310 		*net = atoi(s+1);
311 		if(*net == 0 && strcmp(s+1, "0") != 0) {
312 			log_err("cannot parse netblock: '%s'", str);
313 			return 0;
314 		}
315 		strlcpy(buf, str, sizeof(buf));
316 		s = strchr(buf, '/');
317 		if(s) *s = 0;
318 		s = buf;
319 	}
320 	if(!ipstrtoaddr(s?s:str, port, addr, addrlen)) {
321 		log_err("cannot parse ip address: '%s'", str);
322 		return 0;
323 	}
324 	if(s) {
325 		addr_mask(addr, *addrlen, *net);
326 	}
327 	return 1;
328 }
329 
330 /* RPZ format address dname to network byte order address */
331 static int ipdnametoaddr(uint8_t* dname, size_t dnamelen,
332 	struct sockaddr_storage* addr, socklen_t* addrlen, int* af)
333 {
334 	uint8_t* ia;
335 	int dnamelabs = dname_count_labels(dname);
336 	uint8_t lablen;
337 	char* e = NULL;
338 	int z = 0;
339 	size_t len = 0;
340 	int i;
341 	*af = AF_INET;
342 
343 	/* need 1 byte for label length */
344 	if(dnamelen < 1)
345 		return 0;
346 
347 	if(dnamelabs > 6 ||
348 		dname_has_label(dname, dnamelen, (uint8_t*)"\002zz")) {
349 		*af = AF_INET6;
350 	}
351 	len = *dname;
352 	lablen = *dname++;
353 	i = (*af == AF_INET) ? 3 : 15;
354 	if(*af == AF_INET6) {
355 		struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
356 		*addrlen = (socklen_t)sizeof(struct sockaddr_in6);
357 		memset(sa, 0, *addrlen);
358 		sa->sin6_family = AF_INET6;
359 		ia = (uint8_t*)&sa->sin6_addr;
360 	} else { /* ip4 */
361 		struct sockaddr_in* sa = (struct sockaddr_in*)addr;
362 		*addrlen = (socklen_t)sizeof(struct sockaddr_in);
363 		memset(sa, 0, *addrlen);
364 		sa->sin_family = AF_INET;
365 		ia = (uint8_t*)&sa->sin_addr;
366 	}
367 	while(lablen && i >= 0 && len <= dnamelen) {
368 		char buff[LDNS_MAX_LABELLEN+1];
369 		uint16_t chunk; /* big enough to not overflow on IPv6 hextet */
370 		if((*af == AF_INET && (lablen > 3 || dnamelabs > 6)) ||
371 			(*af == AF_INET6 && (lablen > 4 || dnamelabs > 10))) {
372 			return 0;
373 		}
374 		if(memcmp(dname, "zz", 2) == 0 && *af == AF_INET6) {
375 			/* Add one or more 0 labels. Address is initialised at
376 			 * 0, so just skip the zero part. */
377 			int zl = 11 - dnamelabs;
378 			if(z || zl < 0)
379 				return 0;
380 			z = 1;
381 			i -= (zl*2);
382 		} else {
383 			memcpy(buff, dname, lablen);
384 			buff[lablen] = '\0';
385 			chunk = strtol(buff, &e, (*af == AF_INET) ? 10 : 16);
386 			if(!e || *e != '\0' || (*af == AF_INET && chunk > 255))
387 				return 0;
388 			if(*af == AF_INET) {
389 				log_assert(i < 4 && i >= 0);
390 				ia[i] = (uint8_t)chunk;
391 				i--;
392 			} else {
393 				log_assert(i < 16 && i >= 1);
394 				/* ia in network byte order */
395 				ia[i-1] = (uint8_t)(chunk >> 8);
396 				ia[i] = (uint8_t)(chunk & 0x00FF);
397 				i -= 2;
398 			}
399 		}
400 		dname += lablen;
401 		lablen = *dname++;
402 		len += lablen;
403 	}
404 	if(i != -1)
405 		/* input too short */
406 		return 0;
407 	return 1;
408 }
409 
410 int netblockdnametoaddr(uint8_t* dname, size_t dnamelen,
411 	struct sockaddr_storage* addr, socklen_t* addrlen, int* net, int* af)
412 {
413 	char buff[3 /* 3 digit netblock */ + 1];
414 	size_t nlablen;
415 	if(dnamelen < 1 || *dname > 3)
416 		/* netblock invalid */
417 		return 0;
418 	nlablen = *dname;
419 
420 	if(dnamelen < 1 + nlablen)
421 		return 0;
422 
423 	memcpy(buff, dname+1, nlablen);
424 	buff[nlablen] = '\0';
425 	*net = atoi(buff);
426 	if(*net == 0 && strcmp(buff, "0") != 0)
427 		return 0;
428 	dname += nlablen;
429 	dname++;
430 	if(!ipdnametoaddr(dname, dnamelen-1-nlablen, addr, addrlen, af))
431 		return 0;
432 	if((*af == AF_INET6 && *net > 128) || (*af == AF_INET && *net > 32))
433 		return 0;
434 	return 1;
435 }
436 
437 int authextstrtoaddr(char* str, struct sockaddr_storage* addr,
438 	socklen_t* addrlen, char** auth_name)
439 {
440 	char* s;
441 	int port = UNBOUND_DNS_PORT;
442 	if((s=strchr(str, '@'))) {
443 		char buf[MAX_ADDR_STRLEN];
444 		size_t len = (size_t)(s-str);
445 		char* hash = strchr(s+1, '#');
446 		if(hash) {
447 			*auth_name = hash+1;
448 		} else {
449 			*auth_name = NULL;
450 		}
451 		if(len >= MAX_ADDR_STRLEN) {
452 			return 0;
453 		}
454 		(void)strlcpy(buf, str, sizeof(buf));
455 		buf[len] = 0;
456 		port = atoi(s+1);
457 		if(port == 0) {
458 			if(!hash && strcmp(s+1,"0")!=0)
459 				return 0;
460 			if(hash && strncmp(s+1,"0#",2)!=0)
461 				return 0;
462 		}
463 		return ipstrtoaddr(buf, port, addr, addrlen);
464 	}
465 	if((s=strchr(str, '#'))) {
466 		char buf[MAX_ADDR_STRLEN];
467 		size_t len = (size_t)(s-str);
468 		if(len >= MAX_ADDR_STRLEN) {
469 			return 0;
470 		}
471 		(void)strlcpy(buf, str, sizeof(buf));
472 		buf[len] = 0;
473 		port = UNBOUND_DNS_OVER_TLS_PORT;
474 		*auth_name = s+1;
475 		return ipstrtoaddr(buf, port, addr, addrlen);
476 	}
477 	*auth_name = NULL;
478 	return ipstrtoaddr(str, port, addr, addrlen);
479 }
480 
481 uint8_t* authextstrtodname(char* str, int* port, char** auth_name)
482 {
483 	char* s;
484 	uint8_t* dname;
485 	size_t dname_len;
486 	*port = UNBOUND_DNS_PORT;
487 	*auth_name = NULL;
488 	if((s=strchr(str, '@'))) {
489 		char* hash = strchr(s+1, '#');
490 		if(hash) {
491 			*auth_name = hash+1;
492 		} else {
493 			*auth_name = NULL;
494 		}
495 		*port = atoi(s+1);
496 		if(*port == 0) {
497 			if(!hash && strcmp(s+1,"0")!=0)
498 				return 0;
499 			if(hash && strncmp(s+1,"0#",2)!=0)
500 				return 0;
501 		}
502 		*s = 0;
503 		dname = sldns_str2wire_dname(str, &dname_len);
504 		*s = '@';
505 	} else if((s=strchr(str, '#'))) {
506 		*port = UNBOUND_DNS_OVER_TLS_PORT;
507 		*auth_name = s+1;
508 		*s = 0;
509 		dname = sldns_str2wire_dname(str, &dname_len);
510 		*s = '#';
511 	} else {
512 		dname = sldns_str2wire_dname(str, &dname_len);
513 	}
514 	return dname;
515 }
516 
517 /** store port number into sockaddr structure */
518 void
519 sockaddr_store_port(struct sockaddr_storage* addr, socklen_t addrlen, int port)
520 {
521 	if(addr_is_ip6(addr, addrlen)) {
522 		struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
523 		sa->sin6_port = (in_port_t)htons((uint16_t)port);
524 	} else {
525 		struct sockaddr_in* sa = (struct sockaddr_in*)addr;
526 		sa->sin_port = (in_port_t)htons((uint16_t)port);
527 	}
528 }
529 
530 void
531 log_nametypeclass(enum verbosity_value v, const char* str, uint8_t* name,
532 	uint16_t type, uint16_t dclass)
533 {
534 	char buf[LDNS_MAX_DOMAINLEN+1];
535 	char t[12], c[12];
536 	const char *ts, *cs;
537 	if(verbosity < v)
538 		return;
539 	dname_str(name, buf);
540 	if(type == LDNS_RR_TYPE_TSIG) ts = "TSIG";
541 	else if(type == LDNS_RR_TYPE_IXFR) ts = "IXFR";
542 	else if(type == LDNS_RR_TYPE_AXFR) ts = "AXFR";
543 	else if(type == LDNS_RR_TYPE_MAILB) ts = "MAILB";
544 	else if(type == LDNS_RR_TYPE_MAILA) ts = "MAILA";
545 	else if(type == LDNS_RR_TYPE_ANY) ts = "ANY";
546 	else if(sldns_rr_descript(type) && sldns_rr_descript(type)->_name)
547 		ts = sldns_rr_descript(type)->_name;
548 	else {
549 		snprintf(t, sizeof(t), "TYPE%d", (int)type);
550 		ts = t;
551 	}
552 	if(sldns_lookup_by_id(sldns_rr_classes, (int)dclass) &&
553 		sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name)
554 		cs = sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name;
555 	else {
556 		snprintf(c, sizeof(c), "CLASS%d", (int)dclass);
557 		cs = c;
558 	}
559 	log_info("%s %s %s %s", str, buf, ts, cs);
560 }
561 
562 void
563 log_query_in(const char* str, uint8_t* name, uint16_t type, uint16_t dclass)
564 {
565 	char buf[LDNS_MAX_DOMAINLEN+1];
566 	char t[12], c[12];
567 	const char *ts, *cs;
568 	dname_str(name, buf);
569 	if(type == LDNS_RR_TYPE_TSIG) ts = "TSIG";
570 	else if(type == LDNS_RR_TYPE_IXFR) ts = "IXFR";
571 	else if(type == LDNS_RR_TYPE_AXFR) ts = "AXFR";
572 	else if(type == LDNS_RR_TYPE_MAILB) ts = "MAILB";
573 	else if(type == LDNS_RR_TYPE_MAILA) ts = "MAILA";
574 	else if(type == LDNS_RR_TYPE_ANY) ts = "ANY";
575 	else if(sldns_rr_descript(type) && sldns_rr_descript(type)->_name)
576 		ts = sldns_rr_descript(type)->_name;
577 	else {
578 		snprintf(t, sizeof(t), "TYPE%d", (int)type);
579 		ts = t;
580 	}
581 	if(sldns_lookup_by_id(sldns_rr_classes, (int)dclass) &&
582 		sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name)
583 		cs = sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name;
584 	else {
585 		snprintf(c, sizeof(c), "CLASS%d", (int)dclass);
586 		cs = c;
587 	}
588 	if(LOG_TAG_QUERYREPLY)
589 		log_query("%s %s %s %s", str, buf, ts, cs);
590 	else	log_info("%s %s %s %s", str, buf, ts, cs);
591 }
592 
593 void log_name_addr(enum verbosity_value v, const char* str, uint8_t* zone,
594 	struct sockaddr_storage* addr, socklen_t addrlen)
595 {
596 	uint16_t port;
597 	const char* family = "unknown_family ";
598 	char namebuf[LDNS_MAX_DOMAINLEN+1];
599 	char dest[100];
600 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
601 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
602 	if(verbosity < v)
603 		return;
604 	switch(af) {
605 		case AF_INET: family=""; break;
606 		case AF_INET6: family="";
607 			sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
608 			break;
609 		case AF_LOCAL: family="local "; break;
610 		default: break;
611 	}
612 	if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
613 		(void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
614 	}
615 	dest[sizeof(dest)-1] = 0;
616 	port = ntohs(((struct sockaddr_in*)addr)->sin_port);
617 	dname_str(zone, namebuf);
618 	if(af != AF_INET && af != AF_INET6)
619 		verbose(v, "%s <%s> %s%s#%d (addrlen %d)",
620 			str, namebuf, family, dest, (int)port, (int)addrlen);
621 	else	verbose(v, "%s <%s> %s%s#%d",
622 			str, namebuf, family, dest, (int)port);
623 }
624 
625 void log_err_addr(const char* str, const char* err,
626 	struct sockaddr_storage* addr, socklen_t addrlen)
627 {
628 	uint16_t port;
629 	char dest[100];
630 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
631 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
632 	if(af == AF_INET6)
633 		sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
634 	if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
635 		(void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
636 	}
637 	dest[sizeof(dest)-1] = 0;
638 	port = ntohs(((struct sockaddr_in*)addr)->sin_port);
639 	if(verbosity >= 4)
640 		log_err("%s: %s for %s port %d (len %d)", str, err, dest,
641 			(int)port, (int)addrlen);
642 	else	log_err("%s: %s for %s port %d", str, err, dest, (int)port);
643 }
644 
645 int
646 sockaddr_cmp(struct sockaddr_storage* addr1, socklen_t len1,
647 	struct sockaddr_storage* addr2, socklen_t len2)
648 {
649 	struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
650 	struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
651 	struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
652 	struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
653 	if(len1 < len2)
654 		return -1;
655 	if(len1 > len2)
656 		return 1;
657 	log_assert(len1 == len2);
658 	if( p1_in->sin_family < p2_in->sin_family)
659 		return -1;
660 	if( p1_in->sin_family > p2_in->sin_family)
661 		return 1;
662 	log_assert( p1_in->sin_family == p2_in->sin_family );
663 	/* compare ip4 */
664 	if( p1_in->sin_family == AF_INET ) {
665 		/* just order it, ntohs not required */
666 		if(p1_in->sin_port < p2_in->sin_port)
667 			return -1;
668 		if(p1_in->sin_port > p2_in->sin_port)
669 			return 1;
670 		log_assert(p1_in->sin_port == p2_in->sin_port);
671 		return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
672 	} else if (p1_in6->sin6_family == AF_INET6) {
673 		/* just order it, ntohs not required */
674 		if(p1_in6->sin6_port < p2_in6->sin6_port)
675 			return -1;
676 		if(p1_in6->sin6_port > p2_in6->sin6_port)
677 			return 1;
678 		log_assert(p1_in6->sin6_port == p2_in6->sin6_port);
679 		return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
680 			INET6_SIZE);
681 	} else {
682 		/* eek unknown type, perform this comparison for sanity. */
683 		return memcmp(addr1, addr2, len1);
684 	}
685 }
686 
687 int
688 sockaddr_cmp_addr(struct sockaddr_storage* addr1, socklen_t len1,
689 	struct sockaddr_storage* addr2, socklen_t len2)
690 {
691 	struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
692 	struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
693 	struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
694 	struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
695 	if(len1 < len2)
696 		return -1;
697 	if(len1 > len2)
698 		return 1;
699 	log_assert(len1 == len2);
700 	if( p1_in->sin_family < p2_in->sin_family)
701 		return -1;
702 	if( p1_in->sin_family > p2_in->sin_family)
703 		return 1;
704 	log_assert( p1_in->sin_family == p2_in->sin_family );
705 	/* compare ip4 */
706 	if( p1_in->sin_family == AF_INET ) {
707 		return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
708 	} else if (p1_in6->sin6_family == AF_INET6) {
709 		return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
710 			INET6_SIZE);
711 	} else {
712 		/* eek unknown type, perform this comparison for sanity. */
713 		return memcmp(addr1, addr2, len1);
714 	}
715 }
716 
717 int
718 addr_is_ip6(struct sockaddr_storage* addr, socklen_t len)
719 {
720 	if(len == (socklen_t)sizeof(struct sockaddr_in6) &&
721 		((struct sockaddr_in6*)addr)->sin6_family == AF_INET6)
722 		return 1;
723 	else    return 0;
724 }
725 
726 void
727 addr_mask(struct sockaddr_storage* addr, socklen_t len, int net)
728 {
729 	uint8_t mask[8] = {0x0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe};
730 	int i, max;
731 	uint8_t* s;
732 	if(addr_is_ip6(addr, len)) {
733 		s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
734 		max = 128;
735 	} else {
736 		s = (uint8_t*)&((struct sockaddr_in*)addr)->sin_addr;
737 		max = 32;
738 	}
739 	if(net >= max)
740 		return;
741 	for(i=net/8+1; i<max/8; i++) {
742 		s[i] = 0;
743 	}
744 	s[net/8] &= mask[net&0x7];
745 }
746 
747 int
748 addr_in_common(struct sockaddr_storage* addr1, int net1,
749 	struct sockaddr_storage* addr2, int net2, socklen_t addrlen)
750 {
751 	int min = (net1<net2)?net1:net2;
752 	int i, to;
753 	int match = 0;
754 	uint8_t* s1, *s2;
755 	if(addr_is_ip6(addr1, addrlen)) {
756 		s1 = (uint8_t*)&((struct sockaddr_in6*)addr1)->sin6_addr;
757 		s2 = (uint8_t*)&((struct sockaddr_in6*)addr2)->sin6_addr;
758 		to = 16;
759 	} else {
760 		s1 = (uint8_t*)&((struct sockaddr_in*)addr1)->sin_addr;
761 		s2 = (uint8_t*)&((struct sockaddr_in*)addr2)->sin_addr;
762 		to = 4;
763 	}
764 	/* match = bits_in_common(s1, s2, to); */
765 	for(i=0; i<to; i++) {
766 		if(s1[i] == s2[i]) {
767 			match += 8;
768 		} else {
769 			uint8_t z = s1[i]^s2[i];
770 			log_assert(z);
771 			while(!(z&0x80)) {
772 				match++;
773 				z<<=1;
774 			}
775 			break;
776 		}
777 	}
778 	if(match > min) match = min;
779 	return match;
780 }
781 
782 void
783 addr_to_str(struct sockaddr_storage* addr, socklen_t addrlen,
784 	char* buf, size_t len)
785 {
786 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
787 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
788 	if(addr_is_ip6(addr, addrlen))
789 		sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
790 	if(inet_ntop(af, sinaddr, buf, (socklen_t)len) == 0) {
791 		snprintf(buf, len, "(inet_ntop_error)");
792 	}
793 }
794 
795 int
796 prefixnet_is_nat64(int prefixnet)
797 {
798 	return (prefixnet == 32 || prefixnet == 40 ||
799 		prefixnet == 48 || prefixnet == 56 ||
800 		prefixnet == 64 || prefixnet == 96);
801 }
802 
803 void
804 addr_to_nat64(const struct sockaddr_storage* addr,
805 	const struct sockaddr_storage* nat64_prefix,
806 	socklen_t nat64_prefixlen, int nat64_prefixnet,
807 	struct sockaddr_storage* nat64_addr, socklen_t* nat64_addrlen)
808 {
809 	struct sockaddr_in *sin = (struct sockaddr_in *)addr;
810 	struct sockaddr_in6 *sin6;
811 	uint8_t *v4_byte;
812 	int i;
813 
814 	/* This needs to be checked by the caller */
815 	log_assert(addr->ss_family == AF_INET);
816 	/* Current usage is only from config values; prefix lengths enforced
817 	 * during config validation */
818 	log_assert(prefixnet_is_nat64(nat64_prefixnet));
819 
820 	*nat64_addr = *nat64_prefix;
821 	*nat64_addrlen = nat64_prefixlen;
822 
823 	sin6 = (struct sockaddr_in6 *)nat64_addr;
824 	sin6->sin6_flowinfo = 0;
825 	sin6->sin6_port = sin->sin_port;
826 
827 	nat64_prefixnet = nat64_prefixnet / 8;
828 
829 	v4_byte = (uint8_t *)&sin->sin_addr.s_addr;
830 	for(i = 0; i < 4; i++) {
831 		if(nat64_prefixnet == 8) {
832 			/* bits 64...71 are MBZ */
833 			sin6->sin6_addr.s6_addr[nat64_prefixnet++] = 0;
834 		}
835 		sin6->sin6_addr.s6_addr[nat64_prefixnet++] = *v4_byte++;
836 	}
837 }
838 
839 int
840 addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen)
841 {
842 	/* prefix for ipv4 into ipv6 mapping is ::ffff:x.x.x.x */
843 	const uint8_t map_prefix[16] =
844 		{0,0,0,0,  0,0,0,0, 0,0,0xff,0xff, 0,0,0,0};
845 	uint8_t* s;
846 	if(!addr_is_ip6(addr, addrlen))
847 		return 0;
848 	/* s is 16 octet ipv6 address string */
849 	s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
850 	return (memcmp(s, map_prefix, 12) == 0);
851 }
852 
853 int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen)
854 {
855 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
856 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
857 	return af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
858 		&& memcmp(sinaddr, "\377\377\377\377", 4) == 0;
859 }
860 
861 int addr_is_any(struct sockaddr_storage* addr, socklen_t addrlen)
862 {
863 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
864 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
865 	void* sin6addr = &((struct sockaddr_in6*)addr)->sin6_addr;
866 	if(af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
867 		&& memcmp(sinaddr, "\000\000\000\000", 4) == 0)
868 		return 1;
869 	else if(af==AF_INET6 && addrlen>=(socklen_t)sizeof(struct sockaddr_in6)
870 		&& memcmp(sin6addr, "\000\000\000\000\000\000\000\000"
871 		"\000\000\000\000\000\000\000\000", 16) == 0)
872 		return 1;
873 	return 0;
874 }
875 
876 void sock_list_insert(struct sock_list** list, struct sockaddr_storage* addr,
877 	socklen_t len, struct regional* region)
878 {
879 	struct sock_list* add = (struct sock_list*)regional_alloc(region,
880 		sizeof(*add) - sizeof(add->addr) + (size_t)len);
881 	if(!add) {
882 		log_err("out of memory in socketlist insert");
883 		return;
884 	}
885 	log_assert(list);
886 	add->next = *list;
887 	add->len = len;
888 	*list = add;
889 	if(len) memmove(&add->addr, addr, len);
890 }
891 
892 void sock_list_prepend(struct sock_list** list, struct sock_list* add)
893 {
894 	struct sock_list* last = add;
895 	if(!last)
896 		return;
897 	while(last->next)
898 		last = last->next;
899 	last->next = *list;
900 	*list = add;
901 }
902 
903 int sock_list_find(struct sock_list* list, struct sockaddr_storage* addr,
904         socklen_t len)
905 {
906 	while(list) {
907 		if(len == list->len) {
908 			if(len == 0 || sockaddr_cmp_addr(addr, len,
909 				&list->addr, list->len) == 0)
910 				return 1;
911 		}
912 		list = list->next;
913 	}
914 	return 0;
915 }
916 
917 void sock_list_merge(struct sock_list** list, struct regional* region,
918 	struct sock_list* add)
919 {
920 	struct sock_list* p;
921 	for(p=add; p; p=p->next) {
922 		if(!sock_list_find(*list, &p->addr, p->len))
923 			sock_list_insert(list, &p->addr, p->len, region);
924 	}
925 }
926 
927 void
928 log_crypto_err(const char* str)
929 {
930 #ifdef HAVE_SSL
931 	log_crypto_err_code(str, ERR_get_error());
932 #else
933 	(void)str;
934 #endif /* HAVE_SSL */
935 }
936 
937 void log_crypto_err_code(const char* str, unsigned long err)
938 {
939 #ifdef HAVE_SSL
940 	/* error:[error code]:[library name]:[function name]:[reason string] */
941 	char buf[128];
942 	unsigned long e;
943 	ERR_error_string_n(err, buf, sizeof(buf));
944 	log_err("%s crypto %s", str, buf);
945 	while( (e=ERR_get_error()) ) {
946 		ERR_error_string_n(e, buf, sizeof(buf));
947 		log_err("and additionally crypto %s", buf);
948 	}
949 #else
950 	(void)str;
951 	(void)err;
952 #endif /* HAVE_SSL */
953 }
954 
955 #ifdef HAVE_SSL
956 /** Print crypt erro with SSL_get_error want code and err_get_error code */
957 static void log_crypto_err_io_code_arg(const char* str, int r,
958 	unsigned long err, int err_present)
959 {
960 	int print_errno = 0, print_crypto_err = 0;
961 	const char* inf = NULL;
962 
963 	switch(r) {
964 	case SSL_ERROR_NONE:
965 		inf = "no error";
966 		break;
967 	case SSL_ERROR_ZERO_RETURN:
968 		inf = "channel closed";
969 		break;
970 	case SSL_ERROR_WANT_READ:
971 		inf = "want read";
972 		break;
973 	case SSL_ERROR_WANT_WRITE:
974 		inf = "want write";
975 		break;
976 	case SSL_ERROR_WANT_CONNECT:
977 		inf = "want connect";
978 		break;
979 	case SSL_ERROR_WANT_ACCEPT:
980 		inf = "want accept";
981 		break;
982 	case SSL_ERROR_WANT_X509_LOOKUP:
983 		inf = "want X509 lookup";
984 		break;
985 #ifdef SSL_ERROR_WANT_ASYNC
986 	case SSL_ERROR_WANT_ASYNC:
987 		inf = "want async";
988 		break;
989 #endif
990 #ifdef SSL_ERROR_WANT_ASYNC_JOB
991 	case SSL_ERROR_WANT_ASYNC_JOB:
992 		inf = "want async job";
993 		break;
994 #endif
995 #ifdef SSL_ERROR_WANT_CLIENT_HELLO_CB
996 	case SSL_ERROR_WANT_CLIENT_HELLO_CB:
997 		inf = "want client hello cb";
998 		break;
999 #endif
1000 	case SSL_ERROR_SYSCALL:
1001 		print_errno = 1;
1002 		inf = "syscall";
1003 		break;
1004 	case SSL_ERROR_SSL:
1005 		print_crypto_err = 1;
1006 		inf = "SSL, usually protocol, error";
1007 		break;
1008 	default:
1009 		inf = "unknown SSL_get_error result code";
1010 		print_errno = 1;
1011 		print_crypto_err = 1;
1012 	}
1013 	if(print_crypto_err) {
1014 		if(print_errno) {
1015 			char buf[1024];
1016 			snprintf(buf, sizeof(buf), "%s with errno %s",
1017 				str, strerror(errno));
1018 			if(err_present)
1019 				log_crypto_err_code(buf, err);
1020 			else	log_crypto_err(buf);
1021 		} else {
1022 			if(err_present)
1023 				log_crypto_err_code(str, err);
1024 			else	log_crypto_err(str);
1025 		}
1026 	} else {
1027 		if(print_errno) {
1028 			if(errno == 0)
1029 				log_err("str: syscall error with errno %s",
1030 					strerror(errno));
1031 			else log_err("str: %s", strerror(errno));
1032 		} else {
1033 			log_err("str: %s", inf);
1034 		}
1035 	}
1036 }
1037 #endif /* HAVE_SSL */
1038 
1039 void log_crypto_err_io(const char* str, int r)
1040 {
1041 #ifdef HAVE_SSL
1042 	log_crypto_err_io_code_arg(str, r, 0, 0);
1043 #else
1044 	(void)str;
1045 	(void)r;
1046 #endif /* HAVE_SSL */
1047 }
1048 
1049 void log_crypto_err_io_code(const char* str, int r, unsigned long err)
1050 {
1051 #ifdef HAVE_SSL
1052 	log_crypto_err_io_code_arg(str, r, err, 1);
1053 #else
1054 	(void)str;
1055 	(void)r;
1056 	(void)err;
1057 #endif /* HAVE_SSL */
1058 }
1059 
1060 #ifdef HAVE_SSL
1061 /** log certificate details */
1062 void
1063 log_cert(unsigned level, const char* str, void* cert)
1064 {
1065 	BIO* bio;
1066 	char nul = 0;
1067 	char* pp = NULL;
1068 	long len;
1069 	if(verbosity < level) return;
1070 	bio = BIO_new(BIO_s_mem());
1071 	if(!bio) return;
1072 	X509_print_ex(bio, (X509*)cert, 0, (unsigned long)-1
1073 		^(X509_FLAG_NO_SUBJECT
1074                         |X509_FLAG_NO_ISSUER|X509_FLAG_NO_VALIDITY
1075 			|X509_FLAG_NO_EXTENSIONS|X509_FLAG_NO_AUX
1076 			|X509_FLAG_NO_ATTRIBUTES));
1077 	BIO_write(bio, &nul, (int)sizeof(nul));
1078 	len = BIO_get_mem_data(bio, &pp);
1079 	if(len != 0 && pp) {
1080 		/* reduce size of cert printout */
1081 		char* s;
1082 		while((s=strstr(pp, "  "))!=NULL)
1083 			memmove(s, s+1, strlen(s+1)+1);
1084 		while((s=strstr(pp, "\t\t"))!=NULL)
1085 			memmove(s, s+1, strlen(s+1)+1);
1086 		verbose(level, "%s: \n%s", str, pp);
1087 	}
1088 	BIO_free(bio);
1089 }
1090 #endif /* HAVE_SSL */
1091 
1092 #if defined(HAVE_SSL) && defined(HAVE_NGHTTP2) && defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB)
1093 static int alpn_select_cb(SSL* ATTR_UNUSED(ssl), const unsigned char** out,
1094 	unsigned char* outlen, const unsigned char* in, unsigned int inlen,
1095 	void* ATTR_UNUSED(arg))
1096 {
1097 	int rv = nghttp2_select_next_protocol((unsigned char **)out, outlen, in,
1098 		inlen);
1099 	if(rv == -1) {
1100 		return SSL_TLSEXT_ERR_NOACK;
1101 	}
1102 	/* either http/1.1 or h2 selected */
1103 	return SSL_TLSEXT_ERR_OK;
1104 }
1105 #endif
1106 
1107 int
1108 listen_sslctx_setup(void* ctxt)
1109 {
1110 #ifdef HAVE_SSL
1111 	SSL_CTX* ctx = (SSL_CTX*)ctxt;
1112 	/* no SSLv2, SSLv3 because has defects */
1113 #if SSL_OP_NO_SSLv2 != 0
1114 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2) & SSL_OP_NO_SSLv2)
1115 		!= SSL_OP_NO_SSLv2){
1116 		log_crypto_err("could not set SSL_OP_NO_SSLv2");
1117 		return 0;
1118 	}
1119 #endif
1120 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
1121 		!= SSL_OP_NO_SSLv3){
1122 		log_crypto_err("could not set SSL_OP_NO_SSLv3");
1123 		return 0;
1124 	}
1125 #if defined(SSL_OP_NO_TLSv1) && defined(SSL_OP_NO_TLSv1_1)
1126 	/* if we have tls 1.1 disable 1.0 */
1127 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1) & SSL_OP_NO_TLSv1)
1128 		!= SSL_OP_NO_TLSv1){
1129 		log_crypto_err("could not set SSL_OP_NO_TLSv1");
1130 		return 0;
1131 	}
1132 #endif
1133 #if defined(SSL_OP_NO_TLSv1_1) && defined(SSL_OP_NO_TLSv1_2)
1134 	/* if we have tls 1.2 disable 1.1 */
1135 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1_1) & SSL_OP_NO_TLSv1_1)
1136 		!= SSL_OP_NO_TLSv1_1){
1137 		log_crypto_err("could not set SSL_OP_NO_TLSv1_1");
1138 		return 0;
1139 	}
1140 #endif
1141 #if defined(SSL_OP_NO_RENEGOTIATION)
1142 	/* disable client renegotiation */
1143 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
1144 		SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
1145 		log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
1146 		return 0;
1147 	}
1148 #endif
1149 #if defined(SHA256_DIGEST_LENGTH) && defined(USE_ECDSA)
1150 	/* if we detect system-wide crypto policies, use those */
1151 	if (access( "/etc/crypto-policies/config", F_OK ) != 0 ) {
1152 	/* if we have sha256, set the cipher list to have no known vulns */
1153 		if(!SSL_CTX_set_cipher_list(ctx, "TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256"))
1154 			log_crypto_err("could not set cipher list with SSL_CTX_set_cipher_list");
1155 	}
1156 #endif
1157 #if defined(SSL_OP_IGNORE_UNEXPECTED_EOF)
1158 	/* ignore errors when peers do not send the mandatory close_notify
1159 	 * alert on shutdown.
1160 	 * Relevant for openssl >= 3 */
1161 	if((SSL_CTX_set_options(ctx, SSL_OP_IGNORE_UNEXPECTED_EOF) &
1162 		SSL_OP_IGNORE_UNEXPECTED_EOF) != SSL_OP_IGNORE_UNEXPECTED_EOF) {
1163 		log_crypto_err("could not set SSL_OP_IGNORE_UNEXPECTED_EOF");
1164 		return 0;
1165 	}
1166 #endif
1167 
1168 	if((SSL_CTX_set_options(ctx, SSL_OP_CIPHER_SERVER_PREFERENCE) &
1169 		SSL_OP_CIPHER_SERVER_PREFERENCE) !=
1170 		SSL_OP_CIPHER_SERVER_PREFERENCE) {
1171 		log_crypto_err("could not set SSL_OP_CIPHER_SERVER_PREFERENCE");
1172 		return 0;
1173 	}
1174 
1175 #ifdef HAVE_SSL_CTX_SET_SECURITY_LEVEL
1176 	SSL_CTX_set_security_level(ctx, 0);
1177 #endif
1178 #if defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB) && defined(HAVE_NGHTTP2)
1179 	SSL_CTX_set_alpn_select_cb(ctx, alpn_select_cb, NULL);
1180 #endif
1181 #else
1182 	(void)ctxt;
1183 #endif /* HAVE_SSL */
1184 	return 1;
1185 }
1186 
1187 void
1188 listen_sslctx_setup_2(void* ctxt)
1189 {
1190 #ifdef HAVE_SSL
1191 	SSL_CTX* ctx = (SSL_CTX*)ctxt;
1192 	(void)ctx;
1193 #if HAVE_DECL_SSL_CTX_SET_ECDH_AUTO
1194 	if(!SSL_CTX_set_ecdh_auto(ctx,1)) {
1195 		log_crypto_err("Error in SSL_CTX_ecdh_auto, not enabling ECDHE");
1196 	}
1197 #elif defined(USE_ECDSA)
1198 	if(1) {
1199 		EC_KEY *ecdh = EC_KEY_new_by_curve_name (NID_X9_62_prime256v1);
1200 		if (!ecdh) {
1201 			log_crypto_err("could not find p256, not enabling ECDHE");
1202 		} else {
1203 			if (1 != SSL_CTX_set_tmp_ecdh (ctx, ecdh)) {
1204 				log_crypto_err("Error in SSL_CTX_set_tmp_ecdh, not enabling ECDHE");
1205 			}
1206 			EC_KEY_free (ecdh);
1207 		}
1208 	}
1209 #endif
1210 #else
1211 	(void)ctxt;
1212 #endif /* HAVE_SSL */
1213 }
1214 
1215 void* listen_sslctx_create(char* key, char* pem, char* verifypem)
1216 {
1217 #ifdef HAVE_SSL
1218 	SSL_CTX* ctx = SSL_CTX_new(SSLv23_server_method());
1219 	if(!ctx) {
1220 		log_crypto_err("could not SSL_CTX_new");
1221 		return NULL;
1222 	}
1223 	if(!key || key[0] == 0) {
1224 		log_err("error: no tls-service-key file specified");
1225 		SSL_CTX_free(ctx);
1226 		return NULL;
1227 	}
1228 	if(!pem || pem[0] == 0) {
1229 		log_err("error: no tls-service-pem file specified");
1230 		SSL_CTX_free(ctx);
1231 		return NULL;
1232 	}
1233 	if(!listen_sslctx_setup(ctx)) {
1234 		SSL_CTX_free(ctx);
1235 		return NULL;
1236 	}
1237 	if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
1238 		log_err("error for cert file: %s", pem);
1239 		log_crypto_err("error in SSL_CTX use_certificate_chain_file");
1240 		SSL_CTX_free(ctx);
1241 		return NULL;
1242 	}
1243 	if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) {
1244 		log_err("error for private key file: %s", key);
1245 		log_crypto_err("Error in SSL_CTX use_PrivateKey_file");
1246 		SSL_CTX_free(ctx);
1247 		return NULL;
1248 	}
1249 	if(!SSL_CTX_check_private_key(ctx)) {
1250 		log_err("error for key file: %s", key);
1251 		log_crypto_err("Error in SSL_CTX check_private_key");
1252 		SSL_CTX_free(ctx);
1253 		return NULL;
1254 	}
1255 	listen_sslctx_setup_2(ctx);
1256 	if(verifypem && verifypem[0]) {
1257 		if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
1258 			log_crypto_err("Error in SSL_CTX verify locations");
1259 			SSL_CTX_free(ctx);
1260 			return NULL;
1261 		}
1262 		SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(
1263 			verifypem));
1264 		SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
1265 	}
1266 	return ctx;
1267 #else
1268 	(void)key; (void)pem; (void)verifypem;
1269 	return NULL;
1270 #endif
1271 }
1272 
1273 #ifdef USE_WINSOCK
1274 /* For windows, the CA trust store is not read by openssl.
1275    Add code to open the trust store using wincrypt API and add
1276    the root certs into openssl trust store */
1277 static int
1278 add_WIN_cacerts_to_openssl_store(SSL_CTX* tls_ctx)
1279 {
1280 	HCERTSTORE      hSystemStore;
1281 	PCCERT_CONTEXT  pTargetCert = NULL;
1282 	X509_STORE*	store;
1283 
1284 	verbose(VERB_ALGO, "Adding Windows certificates from system root store to CA store");
1285 
1286 	/* load just once per context lifetime for this version
1287 	   TODO: dynamically update CA trust changes as they are available */
1288 	if (!tls_ctx)
1289 		return 0;
1290 
1291 	/* Call wincrypt's CertOpenStore to open the CA root store. */
1292 
1293 	if ((hSystemStore = CertOpenStore(
1294 		CERT_STORE_PROV_SYSTEM,
1295 		0,
1296 		0,
1297 		/* NOTE: mingw does not have this const: replace with 1 << 16 from code
1298 		   CERT_SYSTEM_STORE_CURRENT_USER, */
1299 		1 << 16,
1300 		L"root")) == 0)
1301 	{
1302 		return 0;
1303 	}
1304 
1305 	store = SSL_CTX_get_cert_store(tls_ctx);
1306 	if (!store)
1307 		return 0;
1308 
1309 	/* failure if the CA store is empty or the call fails */
1310 	if ((pTargetCert = CertEnumCertificatesInStore(
1311 		hSystemStore, pTargetCert)) == 0) {
1312 		verbose(VERB_ALGO, "CA certificate store for Windows is empty.");
1313 		return 0;
1314 	}
1315 	/* iterate over the windows cert store and add to openssl store */
1316 	do
1317 	{
1318 		X509 *cert1 = d2i_X509(NULL,
1319 			(const unsigned char **)&pTargetCert->pbCertEncoded,
1320 			pTargetCert->cbCertEncoded);
1321 		if (!cert1) {
1322 			unsigned long error = ERR_get_error();
1323 			/* return error if a cert fails */
1324 			verbose(VERB_ALGO, "%s %d:%s",
1325 				"Unable to parse certificate in memory",
1326 				(int)error, ERR_error_string(error, NULL));
1327 			return 0;
1328 		}
1329 		else {
1330 			/* return error if a cert add to store fails */
1331 			if (X509_STORE_add_cert(store, cert1) == 0) {
1332 				unsigned long error = ERR_peek_last_error();
1333 
1334 				/* Ignore error X509_R_CERT_ALREADY_IN_HASH_TABLE which means the
1335 				* certificate is already in the store.  */
1336 				if(ERR_GET_LIB(error) != ERR_LIB_X509 ||
1337 					ERR_GET_REASON(error) != X509_R_CERT_ALREADY_IN_HASH_TABLE) {
1338 					error = ERR_get_error();
1339 					verbose(VERB_ALGO, "%s %d:%s\n",
1340 					    "Error adding certificate", (int)error,
1341 					     ERR_error_string(error, NULL));
1342 					X509_free(cert1);
1343 					return 0;
1344 				}
1345 			}
1346 			X509_free(cert1);
1347 		}
1348 	} while ((pTargetCert = CertEnumCertificatesInStore(
1349 		hSystemStore, pTargetCert)) != 0);
1350 
1351 	/* Clean up memory and quit. */
1352 	if (pTargetCert)
1353 		CertFreeCertificateContext(pTargetCert);
1354 	if (hSystemStore)
1355 	{
1356 		if (!CertCloseStore(
1357 			hSystemStore, 0))
1358 			return 0;
1359 	}
1360 	verbose(VERB_ALGO, "Completed adding Windows certificates to CA store successfully");
1361 	return 1;
1362 }
1363 #endif /* USE_WINSOCK */
1364 
1365 void* connect_sslctx_create(char* key, char* pem, char* verifypem, int wincert)
1366 {
1367 #ifdef HAVE_SSL
1368 	SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());
1369 	if(!ctx) {
1370 		log_crypto_err("could not allocate SSL_CTX pointer");
1371 		return NULL;
1372 	}
1373 #if SSL_OP_NO_SSLv2 != 0
1374 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2) & SSL_OP_NO_SSLv2)
1375 		!= SSL_OP_NO_SSLv2) {
1376 		log_crypto_err("could not set SSL_OP_NO_SSLv2");
1377 		SSL_CTX_free(ctx);
1378 		return NULL;
1379 	}
1380 #endif
1381 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
1382 		!= SSL_OP_NO_SSLv3) {
1383 		log_crypto_err("could not set SSL_OP_NO_SSLv3");
1384 		SSL_CTX_free(ctx);
1385 		return NULL;
1386 	}
1387 #if defined(SSL_OP_NO_RENEGOTIATION)
1388 	/* disable client renegotiation */
1389 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
1390 		SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
1391 		log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
1392 		SSL_CTX_free(ctx);
1393 		return 0;
1394 	}
1395 #endif
1396 #if defined(SSL_OP_IGNORE_UNEXPECTED_EOF)
1397 	/* ignore errors when peers do not send the mandatory close_notify
1398 	 * alert on shutdown.
1399 	 * Relevant for openssl >= 3 */
1400 	if((SSL_CTX_set_options(ctx, SSL_OP_IGNORE_UNEXPECTED_EOF) &
1401 		SSL_OP_IGNORE_UNEXPECTED_EOF) != SSL_OP_IGNORE_UNEXPECTED_EOF) {
1402 		log_crypto_err("could not set SSL_OP_IGNORE_UNEXPECTED_EOF");
1403 		SSL_CTX_free(ctx);
1404 		return 0;
1405 	}
1406 #endif
1407 	if(key && key[0]) {
1408 		if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
1409 			log_err("error in client certificate %s", pem);
1410 			log_crypto_err("error in certificate file");
1411 			SSL_CTX_free(ctx);
1412 			return NULL;
1413 		}
1414 		if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) {
1415 			log_err("error in client private key %s", key);
1416 			log_crypto_err("error in key file");
1417 			SSL_CTX_free(ctx);
1418 			return NULL;
1419 		}
1420 		if(!SSL_CTX_check_private_key(ctx)) {
1421 			log_err("error in client key %s", key);
1422 			log_crypto_err("error in SSL_CTX_check_private_key");
1423 			SSL_CTX_free(ctx);
1424 			return NULL;
1425 		}
1426 	}
1427 	if((verifypem && verifypem[0]) || wincert) {
1428 		if(verifypem && verifypem[0]) {
1429 			if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
1430 				log_crypto_err("error in SSL_CTX verify");
1431 				SSL_CTX_free(ctx);
1432 				return NULL;
1433 			}
1434 		}
1435 #ifdef USE_WINSOCK
1436 		if(wincert) {
1437 			if(!add_WIN_cacerts_to_openssl_store(ctx)) {
1438 				log_crypto_err("error in add_WIN_cacerts_to_openssl_store");
1439 				SSL_CTX_free(ctx);
1440 				return NULL;
1441 			}
1442 		}
1443 #else
1444 		if(wincert) {
1445 			if(!SSL_CTX_set_default_verify_paths(ctx)) {
1446 				log_crypto_err("error in default_verify_paths");
1447 				SSL_CTX_free(ctx);
1448 				return NULL;
1449 			}
1450 		}
1451 #endif
1452 		SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
1453 	}
1454 	return ctx;
1455 #else
1456 	(void)key; (void)pem; (void)verifypem; (void)wincert;
1457 	return NULL;
1458 #endif
1459 }
1460 
1461 void* incoming_ssl_fd(void* sslctx, int fd)
1462 {
1463 #ifdef HAVE_SSL
1464 	SSL* ssl = SSL_new((SSL_CTX*)sslctx);
1465 	if(!ssl) {
1466 		log_crypto_err("could not SSL_new");
1467 		return NULL;
1468 	}
1469 	SSL_set_accept_state(ssl);
1470 	(void)SSL_set_mode(ssl, (long)SSL_MODE_AUTO_RETRY);
1471 	if(!SSL_set_fd(ssl, fd)) {
1472 		log_crypto_err("could not SSL_set_fd");
1473 		SSL_free(ssl);
1474 		return NULL;
1475 	}
1476 	return ssl;
1477 #else
1478 	(void)sslctx; (void)fd;
1479 	return NULL;
1480 #endif
1481 }
1482 
1483 void* outgoing_ssl_fd(void* sslctx, int fd)
1484 {
1485 #ifdef HAVE_SSL
1486 	SSL* ssl = SSL_new((SSL_CTX*)sslctx);
1487 	if(!ssl) {
1488 		log_crypto_err("could not SSL_new");
1489 		return NULL;
1490 	}
1491 	SSL_set_connect_state(ssl);
1492 	(void)SSL_set_mode(ssl, (long)SSL_MODE_AUTO_RETRY);
1493 	if(!SSL_set_fd(ssl, fd)) {
1494 		log_crypto_err("could not SSL_set_fd");
1495 		SSL_free(ssl);
1496 		return NULL;
1497 	}
1498 	return ssl;
1499 #else
1500 	(void)sslctx; (void)fd;
1501 	return NULL;
1502 #endif
1503 }
1504 
1505 int check_auth_name_for_ssl(char* auth_name)
1506 {
1507 	if(!auth_name) return 1;
1508 #if defined(HAVE_SSL) && !defined(HAVE_SSL_SET1_HOST) && !defined(HAVE_X509_VERIFY_PARAM_SET1_HOST)
1509 	log_err("the query has an auth_name %s, but libssl has no call to "
1510 		"perform TLS authentication.  Remove that name from config "
1511 		"or upgrade the ssl crypto library.", auth_name);
1512 	return 0;
1513 #else
1514 	return 1;
1515 #endif
1516 }
1517 
1518 /** set the authname on an SSL structure, SSL* ssl */
1519 int set_auth_name_on_ssl(void* ssl, char* auth_name, int use_sni)
1520 {
1521 	if(!auth_name) return 1;
1522 #ifdef HAVE_SSL
1523 	if(use_sni) {
1524 		(void)SSL_set_tlsext_host_name(ssl, auth_name);
1525 	}
1526 #else
1527 	(void)ssl;
1528 	(void)use_sni;
1529 #endif
1530 #ifdef HAVE_SSL_SET1_HOST
1531 	SSL_set_verify(ssl, SSL_VERIFY_PEER, NULL);
1532 	/* setting the hostname makes openssl verify the
1533 	 * host name in the x509 certificate in the
1534 	 * SSL connection*/
1535 	if(!SSL_set1_host(ssl, auth_name)) {
1536 		log_err("SSL_set1_host failed");
1537 		return 0;
1538 	}
1539 #elif defined(HAVE_X509_VERIFY_PARAM_SET1_HOST)
1540 	/* openssl 1.0.2 has this function that can be used for
1541 	 * set1_host like verification */
1542 	if(auth_name) {
1543 		X509_VERIFY_PARAM* param = SSL_get0_param(ssl);
1544 #  ifdef X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
1545 		X509_VERIFY_PARAM_set_hostflags(param, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
1546 #  endif
1547 		if(!X509_VERIFY_PARAM_set1_host(param, auth_name, strlen(auth_name))) {
1548 			log_err("X509_VERIFY_PARAM_set1_host failed");
1549 			return 0;
1550 		}
1551 		SSL_set_verify(ssl, SSL_VERIFY_PEER, NULL);
1552 	}
1553 #else
1554 	verbose(VERB_ALGO, "the query has an auth_name, but libssl has no call to perform TLS authentication");
1555 #endif /* HAVE_SSL_SET1_HOST */
1556 	return 1;
1557 }
1558 
1559 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1560 /** global lock list for openssl locks */
1561 static lock_basic_type *ub_openssl_locks = NULL;
1562 
1563 /** callback that gets thread id for openssl */
1564 #ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1565 static void
1566 ub_crypto_id_cb(CRYPTO_THREADID *id)
1567 {
1568 	CRYPTO_THREADID_set_numeric(id, (unsigned long)log_thread_get());
1569 }
1570 #else
1571 static unsigned long
1572 ub_crypto_id_cb(void)
1573 {
1574 	return (unsigned long)log_thread_get();
1575 }
1576 #endif
1577 
1578 static void
1579 ub_crypto_lock_cb(int mode, int type, const char *ATTR_UNUSED(file),
1580 	int ATTR_UNUSED(line))
1581 {
1582 	if((mode&CRYPTO_LOCK)) {
1583 		lock_basic_lock(&ub_openssl_locks[type]);
1584 	} else {
1585 		lock_basic_unlock(&ub_openssl_locks[type]);
1586 	}
1587 }
1588 #endif /* OPENSSL_THREADS */
1589 
1590 int ub_openssl_lock_init(void)
1591 {
1592 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1593 	int i;
1594 	ub_openssl_locks = (lock_basic_type*)reallocarray(
1595 		NULL, (size_t)CRYPTO_num_locks(), sizeof(lock_basic_type));
1596 	if(!ub_openssl_locks)
1597 		return 0;
1598 	for(i=0; i<CRYPTO_num_locks(); i++) {
1599 		lock_basic_init(&ub_openssl_locks[i]);
1600 	}
1601 #  ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1602 	CRYPTO_THREADID_set_callback(&ub_crypto_id_cb);
1603 #  else
1604 	CRYPTO_set_id_callback(&ub_crypto_id_cb);
1605 #  endif
1606 	CRYPTO_set_locking_callback(&ub_crypto_lock_cb);
1607 #endif /* OPENSSL_THREADS */
1608 	return 1;
1609 }
1610 
1611 void ub_openssl_lock_delete(void)
1612 {
1613 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1614 	int i;
1615 	if(!ub_openssl_locks)
1616 		return;
1617 #  ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1618 	CRYPTO_THREADID_set_callback(NULL);
1619 #  else
1620 	CRYPTO_set_id_callback(NULL);
1621 #  endif
1622 	CRYPTO_set_locking_callback(NULL);
1623 	for(i=0; i<CRYPTO_num_locks(); i++) {
1624 		lock_basic_destroy(&ub_openssl_locks[i]);
1625 	}
1626 	free(ub_openssl_locks);
1627 #endif /* OPENSSL_THREADS */
1628 }
1629 
1630 int listen_sslctx_setup_ticket_keys(void* sslctx, struct config_strlist* tls_session_ticket_keys) {
1631 #ifdef HAVE_SSL
1632 	size_t s = 1;
1633 	struct config_strlist* p;
1634 	struct tls_session_ticket_key *keys;
1635 	for(p = tls_session_ticket_keys; p; p = p->next) {
1636 		s++;
1637 	}
1638 	keys = calloc(s, sizeof(struct tls_session_ticket_key));
1639 	if(!keys)
1640 		return 0;
1641 	memset(keys, 0, s*sizeof(*keys));
1642 	ticket_keys = keys;
1643 
1644 	for(p = tls_session_ticket_keys; p; p = p->next) {
1645 		size_t n;
1646 		unsigned char *data;
1647 		FILE *f;
1648 
1649 		data = (unsigned char *)malloc(80);
1650 		if(!data)
1651 			return 0;
1652 
1653 		f = fopen(p->str, "rb");
1654 		if(!f) {
1655 			log_err("could not read tls-session-ticket-key %s: %s", p->str, strerror(errno));
1656 			free(data);
1657 			return 0;
1658 		}
1659 		n = fread(data, 1, 80, f);
1660 		fclose(f);
1661 
1662 		if(n != 80) {
1663 			log_err("tls-session-ticket-key %s is %d bytes, must be 80 bytes", p->str, (int)n);
1664 			free(data);
1665 			return 0;
1666 		}
1667 		verbose(VERB_OPS, "read tls-session-ticket-key: %s", p->str);
1668 
1669 		keys->key_name = data;
1670 		keys->aes_key = data + 16;
1671 		keys->hmac_key = data + 48;
1672 		keys++;
1673 	}
1674 	/* terminate array with NULL key name entry */
1675 	keys->key_name = NULL;
1676 #  ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1677 	if(SSL_CTX_set_tlsext_ticket_key_evp_cb(sslctx, tls_session_ticket_key_cb) == 0) {
1678 		log_err("no support for TLS session ticket");
1679 		return 0;
1680 	}
1681 #  else
1682 	if(SSL_CTX_set_tlsext_ticket_key_cb(sslctx, tls_session_ticket_key_cb) == 0) {
1683 		log_err("no support for TLS session ticket");
1684 		return 0;
1685 	}
1686 #  endif
1687 	return 1;
1688 #else
1689 	(void)sslctx;
1690 	(void)tls_session_ticket_keys;
1691 	return 0;
1692 #endif
1693 
1694 }
1695 
1696 #ifdef HAVE_SSL
1697 int tls_session_ticket_key_cb(SSL *ATTR_UNUSED(sslctx), unsigned char* key_name,
1698 	unsigned char* iv, EVP_CIPHER_CTX *evp_sctx,
1699 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1700 	EVP_MAC_CTX *hmac_ctx,
1701 #else
1702 	HMAC_CTX* hmac_ctx,
1703 #endif
1704 	int enc)
1705 {
1706 #ifdef HAVE_SSL
1707 #  ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1708 	OSSL_PARAM params[3];
1709 #  else
1710 	const EVP_MD *digest;
1711 #  endif
1712 	const EVP_CIPHER *cipher;
1713 	int evp_cipher_length;
1714 #  ifndef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1715 	digest = EVP_sha256();
1716 #  endif
1717 	cipher = EVP_aes_256_cbc();
1718 	evp_cipher_length = EVP_CIPHER_iv_length(cipher);
1719 	if( enc == 1 ) {
1720 		/* encrypt */
1721 		verbose(VERB_CLIENT, "start session encrypt");
1722 		memcpy(key_name, ticket_keys->key_name, 16);
1723 		if (RAND_bytes(iv, evp_cipher_length) != 1) {
1724 			verbose(VERB_CLIENT, "RAND_bytes failed");
1725 			return -1;
1726 		}
1727 		if (EVP_EncryptInit_ex(evp_sctx, cipher, NULL, ticket_keys->aes_key, iv) != 1) {
1728 			verbose(VERB_CLIENT, "EVP_EncryptInit_ex failed");
1729 			return -1;
1730 		}
1731 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1732 		params[0] = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_KEY,
1733 			ticket_keys->hmac_key, 32);
1734 		params[1] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
1735 			"sha256", 0);
1736 		params[2] = OSSL_PARAM_construct_end();
1737 #ifdef HAVE_EVP_MAC_CTX_SET_PARAMS
1738 		EVP_MAC_CTX_set_params(hmac_ctx, params);
1739 #else
1740 		EVP_MAC_set_ctx_params(hmac_ctx, params);
1741 #endif
1742 #elif !defined(HMAC_INIT_EX_RETURNS_VOID)
1743 		if (HMAC_Init_ex(hmac_ctx, ticket_keys->hmac_key, 32, digest, NULL) != 1) {
1744 			verbose(VERB_CLIENT, "HMAC_Init_ex failed");
1745 			return -1;
1746 		}
1747 #else
1748 		HMAC_Init_ex(hmac_ctx, ticket_keys->hmac_key, 32, digest, NULL);
1749 #endif
1750 		return 1;
1751 	} else if (enc == 0) {
1752 		/* decrypt */
1753 		struct tls_session_ticket_key *key;
1754 		verbose(VERB_CLIENT, "start session decrypt");
1755 		for(key = ticket_keys; key->key_name != NULL; key++) {
1756 			if (!memcmp(key_name, key->key_name, 16)) {
1757 				verbose(VERB_CLIENT, "Found session_key");
1758 				break;
1759 			}
1760 		}
1761 		if(key->key_name == NULL) {
1762 			verbose(VERB_CLIENT, "Not found session_key");
1763 			return 0;
1764 		}
1765 
1766 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1767 		params[0] = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY,
1768 			key->hmac_key, 32);
1769 		params[1] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
1770 			"sha256", 0);
1771 		params[2] = OSSL_PARAM_construct_end();
1772 #ifdef HAVE_EVP_MAC_CTX_SET_PARAMS
1773 		EVP_MAC_CTX_set_params(hmac_ctx, params);
1774 #else
1775 		EVP_MAC_set_ctx_params(hmac_ctx, params);
1776 #endif
1777 #elif !defined(HMAC_INIT_EX_RETURNS_VOID)
1778 		if (HMAC_Init_ex(hmac_ctx, key->hmac_key, 32, digest, NULL) != 1) {
1779 			verbose(VERB_CLIENT, "HMAC_Init_ex failed");
1780 			return -1;
1781 		}
1782 #else
1783 		HMAC_Init_ex(hmac_ctx, key->hmac_key, 32, digest, NULL);
1784 #endif
1785 		if (EVP_DecryptInit_ex(evp_sctx, cipher, NULL, key->aes_key, iv) != 1) {
1786 			log_err("EVP_DecryptInit_ex failed");
1787 			return -1;
1788 		}
1789 
1790 		return (key == ticket_keys) ? 1 : 2;
1791 	}
1792 	return -1;
1793 #else
1794 	(void)key_name;
1795 	(void)iv;
1796 	(void)evp_sctx;
1797 	(void)hmac_ctx;
1798 	(void)enc;
1799 	return 0;
1800 #endif
1801 }
1802 #endif /* HAVE_SSL */
1803 
1804 void
1805 listen_sslctx_delete_ticket_keys(void)
1806 {
1807 	struct tls_session_ticket_key *key;
1808 	if(!ticket_keys) return;
1809 	for(key = ticket_keys; key->key_name != NULL; key++) {
1810 		/* wipe key data from memory*/
1811 #ifdef HAVE_EXPLICIT_BZERO
1812 		explicit_bzero(key->key_name, 80);
1813 #else
1814 		memset(key->key_name, 0xdd, 80);
1815 #endif
1816 		free(key->key_name);
1817 	}
1818 	free(ticket_keys);
1819 	ticket_keys = NULL;
1820 }
1821 
1822 #  ifndef USE_WINSOCK
1823 char*
1824 sock_strerror(int errn)
1825 {
1826 	return strerror(errn);
1827 }
1828 
1829 void
1830 sock_close(int socket)
1831 {
1832 	close(socket);
1833 }
1834 
1835 #  else
1836 char*
1837 sock_strerror(int ATTR_UNUSED(errn))
1838 {
1839 	return wsa_strerror(WSAGetLastError());
1840 }
1841 
1842 void
1843 sock_close(int socket)
1844 {
1845 	closesocket(socket);
1846 }
1847 #  endif /* USE_WINSOCK */
1848