xref: /netbsd/external/bsd/unbound/dist/util/net_help.c (revision 17b85d8b)
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
str_is_ip6(const char * str)126 str_is_ip6(const char* str)
127 {
128 	if(strchr(str, ':'))
129 		return 1;
130 	else    return 0;
131 }
132 
133 int
fd_set_nonblock(int s)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
fd_set_block(int s)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
is_pow2(size_t num)183 is_pow2(size_t num)
184 {
185 	if(num == 0) return 1;
186 	return (num & (num-1)) == 0;
187 }
188 
189 void*
memdup(void * data,size_t len)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
log_addr(enum verbosity_value v,const char * str,struct sockaddr_storage * addr,socklen_t addrlen)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
extstrtoaddr(const char * str,struct sockaddr_storage * addr,socklen_t * addrlen)237 extstrtoaddr(const char* str, struct sockaddr_storage* addr,
238 	socklen_t* addrlen)
239 {
240 	char* s;
241 	int port = UNBOUND_DNS_PORT;
242 	if((s=strchr(str, '@'))) {
243 		char buf[MAX_ADDR_STRLEN];
244 		if(s-str >= MAX_ADDR_STRLEN) {
245 			return 0;
246 		}
247 		(void)strlcpy(buf, str, sizeof(buf));
248 		buf[s-str] = 0;
249 		port = atoi(s+1);
250 		if(port == 0 && strcmp(s+1,"0")!=0) {
251 			return 0;
252 		}
253 		return ipstrtoaddr(buf, port, addr, addrlen);
254 	}
255 	return ipstrtoaddr(str, port, addr, addrlen);
256 }
257 
258 
259 int
ipstrtoaddr(const char * ip,int port,struct sockaddr_storage * addr,socklen_t * addrlen)260 ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr,
261 	socklen_t* addrlen)
262 {
263 	uint16_t p;
264 	if(!ip) return 0;
265 	p = (uint16_t) port;
266 	if(str_is_ip6(ip)) {
267 		char buf[MAX_ADDR_STRLEN];
268 		char* s;
269 		struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
270 		*addrlen = (socklen_t)sizeof(struct sockaddr_in6);
271 		memset(sa, 0, *addrlen);
272 		sa->sin6_family = AF_INET6;
273 		sa->sin6_port = (in_port_t)htons(p);
274 		if((s=strchr(ip, '%'))) { /* ip6%interface, rfc 4007 */
275 			if(s-ip >= MAX_ADDR_STRLEN)
276 				return 0;
277 			(void)strlcpy(buf, ip, sizeof(buf));
278 			buf[s-ip]=0;
279 #ifdef HAVE_IF_NAMETOINDEX
280 			if (!(sa->sin6_scope_id = if_nametoindex(s+1)))
281 #endif /* HAVE_IF_NAMETOINDEX */
282 				sa->sin6_scope_id = (uint32_t)atoi(s+1);
283 			ip = buf;
284 		}
285 		if(inet_pton((int)sa->sin6_family, ip, &sa->sin6_addr) <= 0) {
286 			return 0;
287 		}
288 	} else { /* ip4 */
289 		struct sockaddr_in* sa = (struct sockaddr_in*)addr;
290 		*addrlen = (socklen_t)sizeof(struct sockaddr_in);
291 		memset(sa, 0, *addrlen);
292 		sa->sin_family = AF_INET;
293 		sa->sin_port = (in_port_t)htons(p);
294 		if(inet_pton((int)sa->sin_family, ip, &sa->sin_addr) <= 0) {
295 			return 0;
296 		}
297 	}
298 	return 1;
299 }
300 
netblockstrtoaddr(const char * str,int port,struct sockaddr_storage * addr,socklen_t * addrlen,int * net)301 int netblockstrtoaddr(const char* str, int port, struct sockaddr_storage* addr,
302         socklen_t* addrlen, int* net)
303 {
304 	char buf[64];
305 	char* s;
306 	*net = (str_is_ip6(str)?128:32);
307 	if((s=strchr(str, '/'))) {
308 		if(atoi(s+1) > *net) {
309 			log_err("netblock too large: %s", str);
310 			return 0;
311 		}
312 		*net = atoi(s+1);
313 		if(*net == 0 && strcmp(s+1, "0") != 0) {
314 			log_err("cannot parse netblock: '%s'", str);
315 			return 0;
316 		}
317 		strlcpy(buf, str, sizeof(buf));
318 		s = strchr(buf, '/');
319 		if(s) *s = 0;
320 		s = buf;
321 	}
322 	if(!ipstrtoaddr(s?s:str, port, addr, addrlen)) {
323 		log_err("cannot parse ip address: '%s'", str);
324 		return 0;
325 	}
326 	if(s) {
327 		addr_mask(addr, *addrlen, *net);
328 	}
329 	return 1;
330 }
331 
332 /* RPZ format address dname to network byte order address */
ipdnametoaddr(uint8_t * dname,size_t dnamelen,struct sockaddr_storage * addr,socklen_t * addrlen,int * af)333 static int ipdnametoaddr(uint8_t* dname, size_t dnamelen,
334 	struct sockaddr_storage* addr, socklen_t* addrlen, int* af)
335 {
336 	uint8_t* ia;
337 	int dnamelabs = dname_count_labels(dname);
338 	uint8_t lablen;
339 	char* e = NULL;
340 	int z = 0;
341 	size_t len = 0;
342 	int i;
343 	*af = AF_INET;
344 
345 	/* need 1 byte for label length */
346 	if(dnamelen < 1)
347 		return 0;
348 
349 	if(dnamelabs > 6 ||
350 		dname_has_label(dname, dnamelen, (uint8_t*)"\002zz")) {
351 		*af = AF_INET6;
352 	}
353 	len = *dname;
354 	lablen = *dname++;
355 	i = (*af == AF_INET) ? 3 : 15;
356 	if(*af == AF_INET6) {
357 		struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
358 		*addrlen = (socklen_t)sizeof(struct sockaddr_in6);
359 		memset(sa, 0, *addrlen);
360 		sa->sin6_family = AF_INET6;
361 		ia = (uint8_t*)&sa->sin6_addr;
362 	} else { /* ip4 */
363 		struct sockaddr_in* sa = (struct sockaddr_in*)addr;
364 		*addrlen = (socklen_t)sizeof(struct sockaddr_in);
365 		memset(sa, 0, *addrlen);
366 		sa->sin_family = AF_INET;
367 		ia = (uint8_t*)&sa->sin_addr;
368 	}
369 	while(lablen && i >= 0 && len <= dnamelen) {
370 		char buff[LDNS_MAX_LABELLEN+1];
371 		uint16_t chunk; /* big enough to not overflow on IPv6 hextet */
372 		if((*af == AF_INET && (lablen > 3 || dnamelabs > 6)) ||
373 			(*af == AF_INET6 && (lablen > 4 || dnamelabs > 10))) {
374 			return 0;
375 		}
376 		if(memcmp(dname, "zz", 2) == 0 && *af == AF_INET6) {
377 			/* Add one or more 0 labels. Address is initialised at
378 			 * 0, so just skip the zero part. */
379 			int zl = 11 - dnamelabs;
380 			if(z || zl < 0)
381 				return 0;
382 			z = 1;
383 			i -= (zl*2);
384 		} else {
385 			memcpy(buff, dname, lablen);
386 			buff[lablen] = '\0';
387 			chunk = strtol(buff, &e, (*af == AF_INET) ? 10 : 16);
388 			if(!e || *e != '\0' || (*af == AF_INET && chunk > 255))
389 				return 0;
390 			if(*af == AF_INET) {
391 				log_assert(i < 4 && i >= 0);
392 				ia[i] = (uint8_t)chunk;
393 				i--;
394 			} else {
395 				log_assert(i < 16 && i >= 1);
396 				/* ia in network byte order */
397 				ia[i-1] = (uint8_t)(chunk >> 8);
398 				ia[i] = (uint8_t)(chunk & 0x00FF);
399 				i -= 2;
400 			}
401 		}
402 		dname += lablen;
403 		lablen = *dname++;
404 		len += lablen;
405 	}
406 	if(i != -1)
407 		/* input too short */
408 		return 0;
409 	return 1;
410 }
411 
netblockdnametoaddr(uint8_t * dname,size_t dnamelen,struct sockaddr_storage * addr,socklen_t * addrlen,int * net,int * af)412 int netblockdnametoaddr(uint8_t* dname, size_t dnamelen,
413 	struct sockaddr_storage* addr, socklen_t* addrlen, int* net, int* af)
414 {
415 	char buff[3 /* 3 digit netblock */ + 1];
416 	size_t nlablen;
417 	if(dnamelen < 1 || *dname > 3)
418 		/* netblock invalid */
419 		return 0;
420 	nlablen = *dname;
421 
422 	if(dnamelen < 1 + nlablen)
423 		return 0;
424 
425 	memcpy(buff, dname+1, nlablen);
426 	buff[nlablen] = '\0';
427 	*net = atoi(buff);
428 	if(*net == 0 && strcmp(buff, "0") != 0)
429 		return 0;
430 	dname += nlablen;
431 	dname++;
432 	if(!ipdnametoaddr(dname, dnamelen-1-nlablen, addr, addrlen, af))
433 		return 0;
434 	if((*af == AF_INET6 && *net > 128) || (*af == AF_INET && *net > 32))
435 		return 0;
436 	return 1;
437 }
438 
authextstrtoaddr(char * str,struct sockaddr_storage * addr,socklen_t * addrlen,char ** auth_name)439 int authextstrtoaddr(char* str, struct sockaddr_storage* addr,
440 	socklen_t* addrlen, char** auth_name)
441 {
442 	char* s;
443 	int port = UNBOUND_DNS_PORT;
444 	if((s=strchr(str, '@'))) {
445 		char buf[MAX_ADDR_STRLEN];
446 		size_t len = (size_t)(s-str);
447 		char* hash = strchr(s+1, '#');
448 		if(hash) {
449 			*auth_name = hash+1;
450 		} else {
451 			*auth_name = NULL;
452 		}
453 		if(len >= MAX_ADDR_STRLEN) {
454 			return 0;
455 		}
456 		(void)strlcpy(buf, str, sizeof(buf));
457 		buf[len] = 0;
458 		port = atoi(s+1);
459 		if(port == 0) {
460 			if(!hash && strcmp(s+1,"0")!=0)
461 				return 0;
462 			if(hash && strncmp(s+1,"0#",2)!=0)
463 				return 0;
464 		}
465 		return ipstrtoaddr(buf, port, addr, addrlen);
466 	}
467 	if((s=strchr(str, '#'))) {
468 		char buf[MAX_ADDR_STRLEN];
469 		size_t len = (size_t)(s-str);
470 		if(len >= MAX_ADDR_STRLEN) {
471 			return 0;
472 		}
473 		(void)strlcpy(buf, str, sizeof(buf));
474 		buf[len] = 0;
475 		port = UNBOUND_DNS_OVER_TLS_PORT;
476 		*auth_name = s+1;
477 		return ipstrtoaddr(buf, port, addr, addrlen);
478 	}
479 	*auth_name = NULL;
480 	return ipstrtoaddr(str, port, addr, addrlen);
481 }
482 
authextstrtodname(char * str,int * port,char ** auth_name)483 uint8_t* authextstrtodname(char* str, int* port, char** auth_name)
484 {
485 	char* s;
486 	uint8_t* dname;
487 	size_t dname_len;
488 	*port = UNBOUND_DNS_PORT;
489 	*auth_name = NULL;
490 	if((s=strchr(str, '@'))) {
491 		char* hash = strchr(s+1, '#');
492 		if(hash) {
493 			*auth_name = hash+1;
494 		} else {
495 			*auth_name = NULL;
496 		}
497 		*port = atoi(s+1);
498 		if(*port == 0) {
499 			if(!hash && strcmp(s+1,"0")!=0)
500 				return 0;
501 			if(hash && strncmp(s+1,"0#",2)!=0)
502 				return 0;
503 		}
504 		*s = 0;
505 		dname = sldns_str2wire_dname(str, &dname_len);
506 		*s = '@';
507 	} else if((s=strchr(str, '#'))) {
508 		*port = UNBOUND_DNS_OVER_TLS_PORT;
509 		*auth_name = s+1;
510 		*s = 0;
511 		dname = sldns_str2wire_dname(str, &dname_len);
512 		*s = '#';
513 	} else {
514 		dname = sldns_str2wire_dname(str, &dname_len);
515 	}
516 	return dname;
517 }
518 
519 /** store port number into sockaddr structure */
520 void
sockaddr_store_port(struct sockaddr_storage * addr,socklen_t addrlen,int port)521 sockaddr_store_port(struct sockaddr_storage* addr, socklen_t addrlen, int port)
522 {
523 	if(addr_is_ip6(addr, addrlen)) {
524 		struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
525 		sa->sin6_port = (in_port_t)htons((uint16_t)port);
526 	} else {
527 		struct sockaddr_in* sa = (struct sockaddr_in*)addr;
528 		sa->sin_port = (in_port_t)htons((uint16_t)port);
529 	}
530 }
531 
532 void
log_nametypeclass(enum verbosity_value v,const char * str,uint8_t * name,uint16_t type,uint16_t dclass)533 log_nametypeclass(enum verbosity_value v, const char* str, uint8_t* name,
534 	uint16_t type, uint16_t dclass)
535 {
536 	char buf[LDNS_MAX_DOMAINLEN+1];
537 	char t[12], c[12];
538 	const char *ts, *cs;
539 	if(verbosity < v)
540 		return;
541 	dname_str(name, buf);
542 	if(type == LDNS_RR_TYPE_TSIG) ts = "TSIG";
543 	else if(type == LDNS_RR_TYPE_IXFR) ts = "IXFR";
544 	else if(type == LDNS_RR_TYPE_AXFR) ts = "AXFR";
545 	else if(type == LDNS_RR_TYPE_MAILB) ts = "MAILB";
546 	else if(type == LDNS_RR_TYPE_MAILA) ts = "MAILA";
547 	else if(type == LDNS_RR_TYPE_ANY) ts = "ANY";
548 	else if(sldns_rr_descript(type) && sldns_rr_descript(type)->_name)
549 		ts = sldns_rr_descript(type)->_name;
550 	else {
551 		snprintf(t, sizeof(t), "TYPE%d", (int)type);
552 		ts = t;
553 	}
554 	if(sldns_lookup_by_id(sldns_rr_classes, (int)dclass) &&
555 		sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name)
556 		cs = sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name;
557 	else {
558 		snprintf(c, sizeof(c), "CLASS%d", (int)dclass);
559 		cs = c;
560 	}
561 	log_info("%s %s %s %s", str, buf, ts, cs);
562 }
563 
564 void
log_query_in(const char * str,uint8_t * name,uint16_t type,uint16_t dclass)565 log_query_in(const char* str, uint8_t* name, uint16_t type, uint16_t dclass)
566 {
567 	char buf[LDNS_MAX_DOMAINLEN+1];
568 	char t[12], c[12];
569 	const char *ts, *cs;
570 	dname_str(name, buf);
571 	if(type == LDNS_RR_TYPE_TSIG) ts = "TSIG";
572 	else if(type == LDNS_RR_TYPE_IXFR) ts = "IXFR";
573 	else if(type == LDNS_RR_TYPE_AXFR) ts = "AXFR";
574 	else if(type == LDNS_RR_TYPE_MAILB) ts = "MAILB";
575 	else if(type == LDNS_RR_TYPE_MAILA) ts = "MAILA";
576 	else if(type == LDNS_RR_TYPE_ANY) ts = "ANY";
577 	else if(sldns_rr_descript(type) && sldns_rr_descript(type)->_name)
578 		ts = sldns_rr_descript(type)->_name;
579 	else {
580 		snprintf(t, sizeof(t), "TYPE%d", (int)type);
581 		ts = t;
582 	}
583 	if(sldns_lookup_by_id(sldns_rr_classes, (int)dclass) &&
584 		sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name)
585 		cs = sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name;
586 	else {
587 		snprintf(c, sizeof(c), "CLASS%d", (int)dclass);
588 		cs = c;
589 	}
590 	if(LOG_TAG_QUERYREPLY)
591 		log_query("%s %s %s %s", str, buf, ts, cs);
592 	else	log_info("%s %s %s %s", str, buf, ts, cs);
593 }
594 
log_name_addr(enum verbosity_value v,const char * str,uint8_t * zone,struct sockaddr_storage * addr,socklen_t addrlen)595 void log_name_addr(enum verbosity_value v, const char* str, uint8_t* zone,
596 	struct sockaddr_storage* addr, socklen_t addrlen)
597 {
598 	uint16_t port;
599 	const char* family = "unknown_family ";
600 	char namebuf[LDNS_MAX_DOMAINLEN+1];
601 	char dest[100];
602 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
603 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
604 	if(verbosity < v)
605 		return;
606 	switch(af) {
607 		case AF_INET: family=""; break;
608 		case AF_INET6: family="";
609 			sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
610 			break;
611 		case AF_LOCAL: family="local "; break;
612 		default: break;
613 	}
614 	if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
615 		(void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
616 	}
617 	dest[sizeof(dest)-1] = 0;
618 	port = ntohs(((struct sockaddr_in*)addr)->sin_port);
619 	dname_str(zone, namebuf);
620 	if(af != AF_INET && af != AF_INET6)
621 		verbose(v, "%s <%s> %s%s#%d (addrlen %d)",
622 			str, namebuf, family, dest, (int)port, (int)addrlen);
623 	else	verbose(v, "%s <%s> %s%s#%d",
624 			str, namebuf, family, dest, (int)port);
625 }
626 
log_err_addr(const char * str,const char * err,struct sockaddr_storage * addr,socklen_t addrlen)627 void log_err_addr(const char* str, const char* err,
628 	struct sockaddr_storage* addr, socklen_t addrlen)
629 {
630 	uint16_t port;
631 	char dest[100];
632 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
633 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
634 	if(af == AF_INET6)
635 		sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
636 	if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
637 		(void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
638 	}
639 	dest[sizeof(dest)-1] = 0;
640 	port = ntohs(((struct sockaddr_in*)addr)->sin_port);
641 	if(verbosity >= 4)
642 		log_err("%s: %s for %s port %d (len %d)", str, err, dest,
643 			(int)port, (int)addrlen);
644 	else	log_err("%s: %s for %s port %d", str, err, dest, (int)port);
645 }
646 
647 int
sockaddr_cmp(struct sockaddr_storage * addr1,socklen_t len1,struct sockaddr_storage * addr2,socklen_t len2)648 sockaddr_cmp(struct sockaddr_storage* addr1, socklen_t len1,
649 	struct sockaddr_storage* addr2, socklen_t len2)
650 {
651 	struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
652 	struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
653 	struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
654 	struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
655 	if(len1 < len2)
656 		return -1;
657 	if(len1 > len2)
658 		return 1;
659 	log_assert(len1 == len2);
660 	if( p1_in->sin_family < p2_in->sin_family)
661 		return -1;
662 	if( p1_in->sin_family > p2_in->sin_family)
663 		return 1;
664 	log_assert( p1_in->sin_family == p2_in->sin_family );
665 	/* compare ip4 */
666 	if( p1_in->sin_family == AF_INET ) {
667 		/* just order it, ntohs not required */
668 		if(p1_in->sin_port < p2_in->sin_port)
669 			return -1;
670 		if(p1_in->sin_port > p2_in->sin_port)
671 			return 1;
672 		log_assert(p1_in->sin_port == p2_in->sin_port);
673 		return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
674 	} else if (p1_in6->sin6_family == AF_INET6) {
675 		/* just order it, ntohs not required */
676 		if(p1_in6->sin6_port < p2_in6->sin6_port)
677 			return -1;
678 		if(p1_in6->sin6_port > p2_in6->sin6_port)
679 			return 1;
680 		log_assert(p1_in6->sin6_port == p2_in6->sin6_port);
681 		return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
682 			INET6_SIZE);
683 	} else {
684 		/* eek unknown type, perform this comparison for sanity. */
685 		return memcmp(addr1, addr2, len1);
686 	}
687 }
688 
689 int
sockaddr_cmp_addr(struct sockaddr_storage * addr1,socklen_t len1,struct sockaddr_storage * addr2,socklen_t len2)690 sockaddr_cmp_addr(struct sockaddr_storage* addr1, socklen_t len1,
691 	struct sockaddr_storage* addr2, socklen_t len2)
692 {
693 	struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
694 	struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
695 	struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
696 	struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
697 	if(len1 < len2)
698 		return -1;
699 	if(len1 > len2)
700 		return 1;
701 	log_assert(len1 == len2);
702 	if( p1_in->sin_family < p2_in->sin_family)
703 		return -1;
704 	if( p1_in->sin_family > p2_in->sin_family)
705 		return 1;
706 	log_assert( p1_in->sin_family == p2_in->sin_family );
707 	/* compare ip4 */
708 	if( p1_in->sin_family == AF_INET ) {
709 		return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
710 	} else if (p1_in6->sin6_family == AF_INET6) {
711 		return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
712 			INET6_SIZE);
713 	} else {
714 		/* eek unknown type, perform this comparison for sanity. */
715 		return memcmp(addr1, addr2, len1);
716 	}
717 }
718 
719 int
addr_is_ip6(struct sockaddr_storage * addr,socklen_t len)720 addr_is_ip6(struct sockaddr_storage* addr, socklen_t len)
721 {
722 	if(len == (socklen_t)sizeof(struct sockaddr_in6) &&
723 		((struct sockaddr_in6*)addr)->sin6_family == AF_INET6)
724 		return 1;
725 	else    return 0;
726 }
727 
728 void
addr_mask(struct sockaddr_storage * addr,socklen_t len,int net)729 addr_mask(struct sockaddr_storage* addr, socklen_t len, int net)
730 {
731 	uint8_t mask[8] = {0x0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe};
732 	int i, max;
733 	uint8_t* s;
734 	if(addr_is_ip6(addr, len)) {
735 		s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
736 		max = 128;
737 	} else {
738 		s = (uint8_t*)&((struct sockaddr_in*)addr)->sin_addr;
739 		max = 32;
740 	}
741 	if(net >= max)
742 		return;
743 	for(i=net/8+1; i<max/8; i++) {
744 		s[i] = 0;
745 	}
746 	s[net/8] &= mask[net&0x7];
747 }
748 
749 int
addr_in_common(struct sockaddr_storage * addr1,int net1,struct sockaddr_storage * addr2,int net2,socklen_t addrlen)750 addr_in_common(struct sockaddr_storage* addr1, int net1,
751 	struct sockaddr_storage* addr2, int net2, socklen_t addrlen)
752 {
753 	int min = (net1<net2)?net1:net2;
754 	int i, to;
755 	int match = 0;
756 	uint8_t* s1, *s2;
757 	if(addr_is_ip6(addr1, addrlen)) {
758 		s1 = (uint8_t*)&((struct sockaddr_in6*)addr1)->sin6_addr;
759 		s2 = (uint8_t*)&((struct sockaddr_in6*)addr2)->sin6_addr;
760 		to = 16;
761 	} else {
762 		s1 = (uint8_t*)&((struct sockaddr_in*)addr1)->sin_addr;
763 		s2 = (uint8_t*)&((struct sockaddr_in*)addr2)->sin_addr;
764 		to = 4;
765 	}
766 	/* match = bits_in_common(s1, s2, to); */
767 	for(i=0; i<to; i++) {
768 		if(s1[i] == s2[i]) {
769 			match += 8;
770 		} else {
771 			uint8_t z = s1[i]^s2[i];
772 			log_assert(z);
773 			while(!(z&0x80)) {
774 				match++;
775 				z<<=1;
776 			}
777 			break;
778 		}
779 	}
780 	if(match > min) match = min;
781 	return match;
782 }
783 
784 void
addr_to_str(struct sockaddr_storage * addr,socklen_t addrlen,char * buf,size_t len)785 addr_to_str(struct sockaddr_storage* addr, socklen_t addrlen,
786 	char* buf, size_t len)
787 {
788 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
789 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
790 	if(addr_is_ip6(addr, addrlen))
791 		sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
792 	if(inet_ntop(af, sinaddr, buf, (socklen_t)len) == 0) {
793 		snprintf(buf, len, "(inet_ntop_error)");
794 	}
795 }
796 
797 int
addr_is_ip4mapped(struct sockaddr_storage * addr,socklen_t addrlen)798 addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen)
799 {
800 	/* prefix for ipv4 into ipv6 mapping is ::ffff:x.x.x.x */
801 	const uint8_t map_prefix[16] =
802 		{0,0,0,0,  0,0,0,0, 0,0,0xff,0xff, 0,0,0,0};
803 	uint8_t* s;
804 	if(!addr_is_ip6(addr, addrlen))
805 		return 0;
806 	/* s is 16 octet ipv6 address string */
807 	s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
808 	return (memcmp(s, map_prefix, 12) == 0);
809 }
810 
addr_is_broadcast(struct sockaddr_storage * addr,socklen_t addrlen)811 int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen)
812 {
813 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
814 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
815 	return af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
816 		&& memcmp(sinaddr, "\377\377\377\377", 4) == 0;
817 }
818 
addr_is_any(struct sockaddr_storage * addr,socklen_t addrlen)819 int addr_is_any(struct sockaddr_storage* addr, socklen_t addrlen)
820 {
821 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
822 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
823 	void* sin6addr = &((struct sockaddr_in6*)addr)->sin6_addr;
824 	if(af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
825 		&& memcmp(sinaddr, "\000\000\000\000", 4) == 0)
826 		return 1;
827 	else if(af==AF_INET6 && addrlen>=(socklen_t)sizeof(struct sockaddr_in6)
828 		&& memcmp(sin6addr, "\000\000\000\000\000\000\000\000"
829 		"\000\000\000\000\000\000\000\000", 16) == 0)
830 		return 1;
831 	return 0;
832 }
833 
sock_list_insert(struct sock_list ** list,struct sockaddr_storage * addr,socklen_t len,struct regional * region)834 void sock_list_insert(struct sock_list** list, struct sockaddr_storage* addr,
835 	socklen_t len, struct regional* region)
836 {
837 	struct sock_list* add = (struct sock_list*)regional_alloc(region,
838 		sizeof(*add) - sizeof(add->addr) + (size_t)len);
839 	if(!add) {
840 		log_err("out of memory in socketlist insert");
841 		return;
842 	}
843 	log_assert(list);
844 	add->next = *list;
845 	add->len = len;
846 	*list = add;
847 	if(len) memmove(&add->addr, addr, len);
848 }
849 
sock_list_prepend(struct sock_list ** list,struct sock_list * add)850 void sock_list_prepend(struct sock_list** list, struct sock_list* add)
851 {
852 	struct sock_list* last = add;
853 	if(!last)
854 		return;
855 	while(last->next)
856 		last = last->next;
857 	last->next = *list;
858 	*list = add;
859 }
860 
sock_list_find(struct sock_list * list,struct sockaddr_storage * addr,socklen_t len)861 int sock_list_find(struct sock_list* list, struct sockaddr_storage* addr,
862         socklen_t len)
863 {
864 	while(list) {
865 		if(len == list->len) {
866 			if(len == 0 || sockaddr_cmp_addr(addr, len,
867 				&list->addr, list->len) == 0)
868 				return 1;
869 		}
870 		list = list->next;
871 	}
872 	return 0;
873 }
874 
sock_list_merge(struct sock_list ** list,struct regional * region,struct sock_list * add)875 void sock_list_merge(struct sock_list** list, struct regional* region,
876 	struct sock_list* add)
877 {
878 	struct sock_list* p;
879 	for(p=add; p; p=p->next) {
880 		if(!sock_list_find(*list, &p->addr, p->len))
881 			sock_list_insert(list, &p->addr, p->len, region);
882 	}
883 }
884 
885 void
log_crypto_err(const char * str)886 log_crypto_err(const char* str)
887 {
888 #ifdef HAVE_SSL
889 	log_crypto_err_code(str, ERR_get_error());
890 #else
891 	(void)str;
892 #endif /* HAVE_SSL */
893 }
894 
log_crypto_err_code(const char * str,unsigned long err)895 void log_crypto_err_code(const char* str, unsigned long err)
896 {
897 #ifdef HAVE_SSL
898 	/* error:[error code]:[library name]:[function name]:[reason string] */
899 	char buf[128];
900 	unsigned long e;
901 	ERR_error_string_n(err, buf, sizeof(buf));
902 	log_err("%s crypto %s", str, buf);
903 	while( (e=ERR_get_error()) ) {
904 		ERR_error_string_n(e, buf, sizeof(buf));
905 		log_err("and additionally crypto %s", buf);
906 	}
907 #else
908 	(void)str;
909 	(void)err;
910 #endif /* HAVE_SSL */
911 }
912 
913 #ifdef HAVE_SSL
914 /** log certificate details */
915 void
log_cert(unsigned level,const char * str,void * cert)916 log_cert(unsigned level, const char* str, void* cert)
917 {
918 	BIO* bio;
919 	char nul = 0;
920 	char* pp = NULL;
921 	long len;
922 	if(verbosity < level) return;
923 	bio = BIO_new(BIO_s_mem());
924 	if(!bio) return;
925 	X509_print_ex(bio, (X509*)cert, 0, (unsigned long)-1
926 		^(X509_FLAG_NO_SUBJECT
927                         |X509_FLAG_NO_ISSUER|X509_FLAG_NO_VALIDITY
928 			|X509_FLAG_NO_EXTENSIONS|X509_FLAG_NO_AUX
929 			|X509_FLAG_NO_ATTRIBUTES));
930 	BIO_write(bio, &nul, (int)sizeof(nul));
931 	len = BIO_get_mem_data(bio, &pp);
932 	if(len != 0 && pp) {
933 		/* reduce size of cert printout */
934 		char* s;
935 		while((s=strstr(pp, "  "))!=NULL)
936 			memmove(s, s+1, strlen(s+1)+1);
937 		while((s=strstr(pp, "\t\t"))!=NULL)
938 			memmove(s, s+1, strlen(s+1)+1);
939 		verbose(level, "%s: \n%s", str, pp);
940 	}
941 	BIO_free(bio);
942 }
943 #endif /* HAVE_SSL */
944 
945 #if defined(HAVE_SSL) && defined(HAVE_NGHTTP2) && defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB)
alpn_select_cb(SSL * ATTR_UNUSED (ssl),const unsigned char ** out,unsigned char * outlen,const unsigned char * in,unsigned int inlen,void * ATTR_UNUSED (arg))946 static int alpn_select_cb(SSL* ATTR_UNUSED(ssl), const unsigned char** out,
947 	unsigned char* outlen, const unsigned char* in, unsigned int inlen,
948 	void* ATTR_UNUSED(arg))
949 {
950 	int rv = nghttp2_select_next_protocol((unsigned char **)out, outlen, in,
951 		inlen);
952 	if(rv == -1) {
953 		return SSL_TLSEXT_ERR_NOACK;
954 	}
955 	/* either http/1.1 or h2 selected */
956 	return SSL_TLSEXT_ERR_OK;
957 }
958 #endif
959 
960 int
listen_sslctx_setup(void * ctxt)961 listen_sslctx_setup(void* ctxt)
962 {
963 #ifdef HAVE_SSL
964 	SSL_CTX* ctx = (SSL_CTX*)ctxt;
965 	/* no SSLv2, SSLv3 because has defects */
966 #if SSL_OP_NO_SSLv2 != 0
967 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2) & SSL_OP_NO_SSLv2)
968 		!= SSL_OP_NO_SSLv2){
969 		log_crypto_err("could not set SSL_OP_NO_SSLv2");
970 		return 0;
971 	}
972 #endif
973 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
974 		!= SSL_OP_NO_SSLv3){
975 		log_crypto_err("could not set SSL_OP_NO_SSLv3");
976 		return 0;
977 	}
978 #if defined(SSL_OP_NO_TLSv1) && defined(SSL_OP_NO_TLSv1_1)
979 	/* if we have tls 1.1 disable 1.0 */
980 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1) & SSL_OP_NO_TLSv1)
981 		!= SSL_OP_NO_TLSv1){
982 		log_crypto_err("could not set SSL_OP_NO_TLSv1");
983 		return 0;
984 	}
985 #endif
986 #if defined(SSL_OP_NO_TLSv1_1) && defined(SSL_OP_NO_TLSv1_2)
987 	/* if we have tls 1.2 disable 1.1 */
988 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1_1) & SSL_OP_NO_TLSv1_1)
989 		!= SSL_OP_NO_TLSv1_1){
990 		log_crypto_err("could not set SSL_OP_NO_TLSv1_1");
991 		return 0;
992 	}
993 #endif
994 #if defined(SSL_OP_NO_RENEGOTIATION)
995 	/* disable client renegotiation */
996 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
997 		SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
998 		log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
999 		return 0;
1000 	}
1001 #endif
1002 #if defined(SHA256_DIGEST_LENGTH) && defined(USE_ECDSA)
1003 	/* if we detect system-wide crypto policies, use those */
1004 	if (access( "/etc/crypto-policies/config", F_OK ) != 0 ) {
1005 	/* if we have sha256, set the cipher list to have no known vulns */
1006 		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"))
1007 			log_crypto_err("could not set cipher list with SSL_CTX_set_cipher_list");
1008 	}
1009 #endif
1010 
1011 	if((SSL_CTX_set_options(ctx, SSL_OP_CIPHER_SERVER_PREFERENCE) &
1012 		SSL_OP_CIPHER_SERVER_PREFERENCE) !=
1013 		SSL_OP_CIPHER_SERVER_PREFERENCE) {
1014 		log_crypto_err("could not set SSL_OP_CIPHER_SERVER_PREFERENCE");
1015 		return 0;
1016 	}
1017 
1018 #ifdef HAVE_SSL_CTX_SET_SECURITY_LEVEL
1019 	SSL_CTX_set_security_level(ctx, 0);
1020 #endif
1021 #if defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB) && defined(HAVE_NGHTTP2)
1022 	SSL_CTX_set_alpn_select_cb(ctx, alpn_select_cb, NULL);
1023 #endif
1024 #else
1025 	(void)ctxt;
1026 #endif /* HAVE_SSL */
1027 	return 1;
1028 }
1029 
1030 void
listen_sslctx_setup_2(void * ctxt)1031 listen_sslctx_setup_2(void* ctxt)
1032 {
1033 #ifdef HAVE_SSL
1034 	SSL_CTX* ctx = (SSL_CTX*)ctxt;
1035 	(void)ctx;
1036 #if HAVE_DECL_SSL_CTX_SET_ECDH_AUTO
1037 	if(!SSL_CTX_set_ecdh_auto(ctx,1)) {
1038 		log_crypto_err("Error in SSL_CTX_ecdh_auto, not enabling ECDHE");
1039 	}
1040 #elif defined(USE_ECDSA)
1041 	if(1) {
1042 		EC_KEY *ecdh = EC_KEY_new_by_curve_name (NID_X9_62_prime256v1);
1043 		if (!ecdh) {
1044 			log_crypto_err("could not find p256, not enabling ECDHE");
1045 		} else {
1046 			if (1 != SSL_CTX_set_tmp_ecdh (ctx, ecdh)) {
1047 				log_crypto_err("Error in SSL_CTX_set_tmp_ecdh, not enabling ECDHE");
1048 			}
1049 			EC_KEY_free (ecdh);
1050 		}
1051 	}
1052 #endif
1053 #else
1054 	(void)ctxt;
1055 #endif /* HAVE_SSL */
1056 }
1057 
listen_sslctx_create(char * key,char * pem,char * verifypem)1058 void* listen_sslctx_create(char* key, char* pem, char* verifypem)
1059 {
1060 #ifdef HAVE_SSL
1061 	SSL_CTX* ctx = SSL_CTX_new(SSLv23_server_method());
1062 	if(!ctx) {
1063 		log_crypto_err("could not SSL_CTX_new");
1064 		return NULL;
1065 	}
1066 	if(!key || key[0] == 0) {
1067 		log_err("error: no tls-service-key file specified");
1068 		SSL_CTX_free(ctx);
1069 		return NULL;
1070 	}
1071 	if(!pem || pem[0] == 0) {
1072 		log_err("error: no tls-service-pem file specified");
1073 		SSL_CTX_free(ctx);
1074 		return NULL;
1075 	}
1076 	if(!listen_sslctx_setup(ctx)) {
1077 		SSL_CTX_free(ctx);
1078 		return NULL;
1079 	}
1080 	if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
1081 		log_err("error for cert file: %s", pem);
1082 		log_crypto_err("error in SSL_CTX use_certificate_chain_file");
1083 		SSL_CTX_free(ctx);
1084 		return NULL;
1085 	}
1086 	if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) {
1087 		log_err("error for private key file: %s", key);
1088 		log_crypto_err("Error in SSL_CTX use_PrivateKey_file");
1089 		SSL_CTX_free(ctx);
1090 		return NULL;
1091 	}
1092 	if(!SSL_CTX_check_private_key(ctx)) {
1093 		log_err("error for key file: %s", key);
1094 		log_crypto_err("Error in SSL_CTX check_private_key");
1095 		SSL_CTX_free(ctx);
1096 		return NULL;
1097 	}
1098 	listen_sslctx_setup_2(ctx);
1099 	if(verifypem && verifypem[0]) {
1100 		if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
1101 			log_crypto_err("Error in SSL_CTX verify locations");
1102 			SSL_CTX_free(ctx);
1103 			return NULL;
1104 		}
1105 		SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(
1106 			verifypem));
1107 		SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
1108 	}
1109 	return ctx;
1110 #else
1111 	(void)key; (void)pem; (void)verifypem;
1112 	return NULL;
1113 #endif
1114 }
1115 
1116 #ifdef USE_WINSOCK
1117 /* For windows, the CA trust store is not read by openssl.
1118    Add code to open the trust store using wincrypt API and add
1119    the root certs into openssl trust store */
1120 static int
add_WIN_cacerts_to_openssl_store(SSL_CTX * tls_ctx)1121 add_WIN_cacerts_to_openssl_store(SSL_CTX* tls_ctx)
1122 {
1123 	HCERTSTORE      hSystemStore;
1124 	PCCERT_CONTEXT  pTargetCert = NULL;
1125 	X509_STORE*	store;
1126 
1127 	verbose(VERB_ALGO, "Adding Windows certificates from system root store to CA store");
1128 
1129 	/* load just once per context lifetime for this version
1130 	   TODO: dynamically update CA trust changes as they are available */
1131 	if (!tls_ctx)
1132 		return 0;
1133 
1134 	/* Call wincrypt's CertOpenStore to open the CA root store. */
1135 
1136 	if ((hSystemStore = CertOpenStore(
1137 		CERT_STORE_PROV_SYSTEM,
1138 		0,
1139 		0,
1140 		/* NOTE: mingw does not have this const: replace with 1 << 16 from code
1141 		   CERT_SYSTEM_STORE_CURRENT_USER, */
1142 		1 << 16,
1143 		L"root")) == 0)
1144 	{
1145 		return 0;
1146 	}
1147 
1148 	store = SSL_CTX_get_cert_store(tls_ctx);
1149 	if (!store)
1150 		return 0;
1151 
1152 	/* failure if the CA store is empty or the call fails */
1153 	if ((pTargetCert = CertEnumCertificatesInStore(
1154 		hSystemStore, pTargetCert)) == 0) {
1155 		verbose(VERB_ALGO, "CA certificate store for Windows is empty.");
1156 		return 0;
1157 	}
1158 	/* iterate over the windows cert store and add to openssl store */
1159 	do
1160 	{
1161 		X509 *cert1 = d2i_X509(NULL,
1162 			(const unsigned char **)&pTargetCert->pbCertEncoded,
1163 			pTargetCert->cbCertEncoded);
1164 		if (!cert1) {
1165 			unsigned long error = ERR_get_error();
1166 			/* return error if a cert fails */
1167 			verbose(VERB_ALGO, "%s %d:%s",
1168 				"Unable to parse certificate in memory",
1169 				(int)error, ERR_error_string(error, NULL));
1170 			return 0;
1171 		}
1172 		else {
1173 			/* return error if a cert add to store fails */
1174 			if (X509_STORE_add_cert(store, cert1) == 0) {
1175 				unsigned long error = ERR_peek_last_error();
1176 
1177 				/* Ignore error X509_R_CERT_ALREADY_IN_HASH_TABLE which means the
1178 				* certificate is already in the store.  */
1179 				if(ERR_GET_LIB(error) != ERR_LIB_X509 ||
1180 					ERR_GET_REASON(error) != X509_R_CERT_ALREADY_IN_HASH_TABLE) {
1181 					error = ERR_get_error();
1182 					verbose(VERB_ALGO, "%s %d:%s\n",
1183 					    "Error adding certificate", (int)error,
1184 					     ERR_error_string(error, NULL));
1185 					X509_free(cert1);
1186 					return 0;
1187 				}
1188 			}
1189 			X509_free(cert1);
1190 		}
1191 	} while ((pTargetCert = CertEnumCertificatesInStore(
1192 		hSystemStore, pTargetCert)) != 0);
1193 
1194 	/* Clean up memory and quit. */
1195 	if (pTargetCert)
1196 		CertFreeCertificateContext(pTargetCert);
1197 	if (hSystemStore)
1198 	{
1199 		if (!CertCloseStore(
1200 			hSystemStore, 0))
1201 			return 0;
1202 	}
1203 	verbose(VERB_ALGO, "Completed adding Windows certificates to CA store successfully");
1204 	return 1;
1205 }
1206 #endif /* USE_WINSOCK */
1207 
connect_sslctx_create(char * key,char * pem,char * verifypem,int wincert)1208 void* connect_sslctx_create(char* key, char* pem, char* verifypem, int wincert)
1209 {
1210 #ifdef HAVE_SSL
1211 	SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());
1212 	if(!ctx) {
1213 		log_crypto_err("could not allocate SSL_CTX pointer");
1214 		return NULL;
1215 	}
1216 #if SSL_OP_NO_SSLv2 != 0
1217 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2) & SSL_OP_NO_SSLv2)
1218 		!= SSL_OP_NO_SSLv2) {
1219 		log_crypto_err("could not set SSL_OP_NO_SSLv2");
1220 		SSL_CTX_free(ctx);
1221 		return NULL;
1222 	}
1223 #endif
1224 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
1225 		!= SSL_OP_NO_SSLv3) {
1226 		log_crypto_err("could not set SSL_OP_NO_SSLv3");
1227 		SSL_CTX_free(ctx);
1228 		return NULL;
1229 	}
1230 #if defined(SSL_OP_NO_RENEGOTIATION)
1231 	/* disable client renegotiation */
1232 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
1233 		SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
1234 		log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
1235 		SSL_CTX_free(ctx);
1236 		return 0;
1237 	}
1238 #endif
1239 	if(key && key[0]) {
1240 		if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
1241 			log_err("error in client certificate %s", pem);
1242 			log_crypto_err("error in certificate file");
1243 			SSL_CTX_free(ctx);
1244 			return NULL;
1245 		}
1246 		if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) {
1247 			log_err("error in client private key %s", key);
1248 			log_crypto_err("error in key file");
1249 			SSL_CTX_free(ctx);
1250 			return NULL;
1251 		}
1252 		if(!SSL_CTX_check_private_key(ctx)) {
1253 			log_err("error in client key %s", key);
1254 			log_crypto_err("error in SSL_CTX_check_private_key");
1255 			SSL_CTX_free(ctx);
1256 			return NULL;
1257 		}
1258 	}
1259 	if((verifypem && verifypem[0]) || wincert) {
1260 		if(verifypem && verifypem[0]) {
1261 			if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
1262 				log_crypto_err("error in SSL_CTX verify");
1263 				SSL_CTX_free(ctx);
1264 				return NULL;
1265 			}
1266 		}
1267 #ifdef USE_WINSOCK
1268 		if(wincert) {
1269 			if(!add_WIN_cacerts_to_openssl_store(ctx)) {
1270 				log_crypto_err("error in add_WIN_cacerts_to_openssl_store");
1271 				SSL_CTX_free(ctx);
1272 				return NULL;
1273 			}
1274 		}
1275 #else
1276 		if(wincert) {
1277 			if(!SSL_CTX_set_default_verify_paths(ctx)) {
1278 				log_crypto_err("error in default_verify_paths");
1279 				SSL_CTX_free(ctx);
1280 				return NULL;
1281 			}
1282 		}
1283 #endif
1284 		SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
1285 	}
1286 	return ctx;
1287 #else
1288 	(void)key; (void)pem; (void)verifypem; (void)wincert;
1289 	return NULL;
1290 #endif
1291 }
1292 
incoming_ssl_fd(void * sslctx,int fd)1293 void* incoming_ssl_fd(void* sslctx, int fd)
1294 {
1295 #ifdef HAVE_SSL
1296 	SSL* ssl = SSL_new((SSL_CTX*)sslctx);
1297 	if(!ssl) {
1298 		log_crypto_err("could not SSL_new");
1299 		return NULL;
1300 	}
1301 	SSL_set_accept_state(ssl);
1302 	(void)SSL_set_mode(ssl, (long)SSL_MODE_AUTO_RETRY);
1303 	if(!SSL_set_fd(ssl, fd)) {
1304 		log_crypto_err("could not SSL_set_fd");
1305 		SSL_free(ssl);
1306 		return NULL;
1307 	}
1308 	return ssl;
1309 #else
1310 	(void)sslctx; (void)fd;
1311 	return NULL;
1312 #endif
1313 }
1314 
outgoing_ssl_fd(void * sslctx,int fd)1315 void* outgoing_ssl_fd(void* sslctx, int fd)
1316 {
1317 #ifdef HAVE_SSL
1318 	SSL* ssl = SSL_new((SSL_CTX*)sslctx);
1319 	if(!ssl) {
1320 		log_crypto_err("could not SSL_new");
1321 		return NULL;
1322 	}
1323 	SSL_set_connect_state(ssl);
1324 	(void)SSL_set_mode(ssl, (long)SSL_MODE_AUTO_RETRY);
1325 	if(!SSL_set_fd(ssl, fd)) {
1326 		log_crypto_err("could not SSL_set_fd");
1327 		SSL_free(ssl);
1328 		return NULL;
1329 	}
1330 	return ssl;
1331 #else
1332 	(void)sslctx; (void)fd;
1333 	return NULL;
1334 #endif
1335 }
1336 
check_auth_name_for_ssl(char * auth_name)1337 int check_auth_name_for_ssl(char* auth_name)
1338 {
1339 	if(!auth_name) return 1;
1340 #if defined(HAVE_SSL) && !defined(HAVE_SSL_SET1_HOST) && !defined(HAVE_X509_VERIFY_PARAM_SET1_HOST)
1341 	log_err("the query has an auth_name %s, but libssl has no call to "
1342 		"perform TLS authentication.  Remove that name from config "
1343 		"or upgrade the ssl crypto library.", auth_name);
1344 	return 0;
1345 #else
1346 	return 1;
1347 #endif
1348 }
1349 
1350 /** set the authname on an SSL structure, SSL* ssl */
set_auth_name_on_ssl(void * ssl,char * auth_name,int use_sni)1351 int set_auth_name_on_ssl(void* ssl, char* auth_name, int use_sni)
1352 {
1353 	if(!auth_name) return 1;
1354 #ifdef HAVE_SSL
1355 	if(use_sni) {
1356 		(void)SSL_set_tlsext_host_name(ssl, auth_name);
1357 	}
1358 #else
1359 	(void)ssl;
1360 	(void)use_sni;
1361 #endif
1362 #ifdef HAVE_SSL_SET1_HOST
1363 	SSL_set_verify(ssl, SSL_VERIFY_PEER, NULL);
1364 	/* setting the hostname makes openssl verify the
1365 	 * host name in the x509 certificate in the
1366 	 * SSL connection*/
1367 	if(!SSL_set1_host(ssl, auth_name)) {
1368 		log_err("SSL_set1_host failed");
1369 		return 0;
1370 	}
1371 #elif defined(HAVE_X509_VERIFY_PARAM_SET1_HOST)
1372 	/* openssl 1.0.2 has this function that can be used for
1373 	 * set1_host like verification */
1374 	if(auth_name) {
1375 		X509_VERIFY_PARAM* param = SSL_get0_param(ssl);
1376 #  ifdef X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
1377 		X509_VERIFY_PARAM_set_hostflags(param, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
1378 #  endif
1379 		if(!X509_VERIFY_PARAM_set1_host(param, auth_name, strlen(auth_name))) {
1380 			log_err("X509_VERIFY_PARAM_set1_host failed");
1381 			return 0;
1382 		}
1383 		SSL_set_verify(ssl, SSL_VERIFY_PEER, NULL);
1384 	}
1385 #else
1386 	verbose(VERB_ALGO, "the query has an auth_name, but libssl has no call to perform TLS authentication");
1387 #endif /* HAVE_SSL_SET1_HOST */
1388 	return 1;
1389 }
1390 
1391 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1392 /** global lock list for openssl locks */
1393 static lock_basic_type *ub_openssl_locks = NULL;
1394 
1395 /** callback that gets thread id for openssl */
1396 #ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1397 static void
ub_crypto_id_cb(CRYPTO_THREADID * id)1398 ub_crypto_id_cb(CRYPTO_THREADID *id)
1399 {
1400 	CRYPTO_THREADID_set_numeric(id, (unsigned long)log_thread_get());
1401 }
1402 #else
1403 static unsigned long
ub_crypto_id_cb(void)1404 ub_crypto_id_cb(void)
1405 {
1406 	return (unsigned long)log_thread_get();
1407 }
1408 #endif
1409 
1410 static void
ub_crypto_lock_cb(int mode,int type,const char * ATTR_UNUSED (file),int ATTR_UNUSED (line))1411 ub_crypto_lock_cb(int mode, int type, const char *ATTR_UNUSED(file),
1412 	int ATTR_UNUSED(line))
1413 {
1414 	if((mode&CRYPTO_LOCK)) {
1415 		lock_basic_lock(&ub_openssl_locks[type]);
1416 	} else {
1417 		lock_basic_unlock(&ub_openssl_locks[type]);
1418 	}
1419 }
1420 #endif /* OPENSSL_THREADS */
1421 
ub_openssl_lock_init(void)1422 int ub_openssl_lock_init(void)
1423 {
1424 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1425 	int i;
1426 	ub_openssl_locks = (lock_basic_type*)reallocarray(
1427 		NULL, (size_t)CRYPTO_num_locks(), sizeof(lock_basic_type));
1428 	if(!ub_openssl_locks)
1429 		return 0;
1430 	for(i=0; i<CRYPTO_num_locks(); i++) {
1431 		lock_basic_init(&ub_openssl_locks[i]);
1432 	}
1433 #  ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1434 	CRYPTO_THREADID_set_callback(&ub_crypto_id_cb);
1435 #  else
1436 	CRYPTO_set_id_callback(&ub_crypto_id_cb);
1437 #  endif
1438 	CRYPTO_set_locking_callback(&ub_crypto_lock_cb);
1439 #endif /* OPENSSL_THREADS */
1440 	return 1;
1441 }
1442 
ub_openssl_lock_delete(void)1443 void ub_openssl_lock_delete(void)
1444 {
1445 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1446 	int i;
1447 	if(!ub_openssl_locks)
1448 		return;
1449 #  ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1450 	CRYPTO_THREADID_set_callback(NULL);
1451 #  else
1452 	CRYPTO_set_id_callback(NULL);
1453 #  endif
1454 	CRYPTO_set_locking_callback(NULL);
1455 	for(i=0; i<CRYPTO_num_locks(); i++) {
1456 		lock_basic_destroy(&ub_openssl_locks[i]);
1457 	}
1458 	free(ub_openssl_locks);
1459 #endif /* OPENSSL_THREADS */
1460 }
1461 
listen_sslctx_setup_ticket_keys(void * sslctx,struct config_strlist * tls_session_ticket_keys)1462 int listen_sslctx_setup_ticket_keys(void* sslctx, struct config_strlist* tls_session_ticket_keys) {
1463 #ifdef HAVE_SSL
1464 	size_t s = 1;
1465 	struct config_strlist* p;
1466 	struct tls_session_ticket_key *keys;
1467 	for(p = tls_session_ticket_keys; p; p = p->next) {
1468 		s++;
1469 	}
1470 	keys = calloc(s, sizeof(struct tls_session_ticket_key));
1471 	if(!keys)
1472 		return 0;
1473 	memset(keys, 0, s*sizeof(*keys));
1474 	ticket_keys = keys;
1475 
1476 	for(p = tls_session_ticket_keys; p; p = p->next) {
1477 		size_t n;
1478 		unsigned char *data;
1479 		FILE *f;
1480 
1481 		data = (unsigned char *)malloc(80);
1482 		if(!data)
1483 			return 0;
1484 
1485 		f = fopen(p->str, "rb");
1486 		if(!f) {
1487 			log_err("could not read tls-session-ticket-key %s: %s", p->str, strerror(errno));
1488 			free(data);
1489 			return 0;
1490 		}
1491 		n = fread(data, 1, 80, f);
1492 		fclose(f);
1493 
1494 		if(n != 80) {
1495 			log_err("tls-session-ticket-key %s is %d bytes, must be 80 bytes", p->str, (int)n);
1496 			free(data);
1497 			return 0;
1498 		}
1499 		verbose(VERB_OPS, "read tls-session-ticket-key: %s", p->str);
1500 
1501 		keys->key_name = data;
1502 		keys->aes_key = data + 16;
1503 		keys->hmac_key = data + 48;
1504 		keys++;
1505 	}
1506 	/* terminate array with NULL key name entry */
1507 	keys->key_name = NULL;
1508 #  ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1509 	if(SSL_CTX_set_tlsext_ticket_key_evp_cb(sslctx, tls_session_ticket_key_cb) == 0) {
1510 		log_err("no support for TLS session ticket");
1511 		return 0;
1512 	}
1513 #  else
1514 	if(SSL_CTX_set_tlsext_ticket_key_cb(sslctx, tls_session_ticket_key_cb) == 0) {
1515 		log_err("no support for TLS session ticket");
1516 		return 0;
1517 	}
1518 #  endif
1519 	return 1;
1520 #else
1521 	(void)sslctx;
1522 	(void)tls_session_ticket_keys;
1523 	return 0;
1524 #endif
1525 
1526 }
1527 
1528 #ifdef HAVE_SSL
tls_session_ticket_key_cb(SSL * ATTR_UNUSED (sslctx),unsigned char * key_name,unsigned char * iv,EVP_CIPHER_CTX * evp_sctx,EVP_MAC_CTX * hmac_ctx,int enc)1529 int tls_session_ticket_key_cb(SSL *ATTR_UNUSED(sslctx), unsigned char* key_name,
1530 	unsigned char* iv, EVP_CIPHER_CTX *evp_sctx,
1531 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1532 	EVP_MAC_CTX *hmac_ctx,
1533 #else
1534 	HMAC_CTX* hmac_ctx,
1535 #endif
1536 	int enc)
1537 {
1538 #ifdef HAVE_SSL
1539 #  ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1540 	OSSL_PARAM params[3];
1541 #  else
1542 	const EVP_MD *digest;
1543 #  endif
1544 	const EVP_CIPHER *cipher;
1545 	int evp_cipher_length;
1546 #  ifndef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1547 	digest = EVP_sha256();
1548 #  endif
1549 	cipher = EVP_aes_256_cbc();
1550 	evp_cipher_length = EVP_CIPHER_iv_length(cipher);
1551 	if( enc == 1 ) {
1552 		/* encrypt */
1553 		verbose(VERB_CLIENT, "start session encrypt");
1554 		memcpy(key_name, ticket_keys->key_name, 16);
1555 		if (RAND_bytes(iv, evp_cipher_length) != 1) {
1556 			verbose(VERB_CLIENT, "RAND_bytes failed");
1557 			return -1;
1558 		}
1559 		if (EVP_EncryptInit_ex(evp_sctx, cipher, NULL, ticket_keys->aes_key, iv) != 1) {
1560 			verbose(VERB_CLIENT, "EVP_EncryptInit_ex failed");
1561 			return -1;
1562 		}
1563 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1564 		params[0] = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_KEY,
1565 			ticket_keys->hmac_key, 32);
1566 		params[1] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
1567 			"sha256", 0);
1568 		params[2] = OSSL_PARAM_construct_end();
1569 #ifdef HAVE_EVP_MAC_CTX_SET_PARAMS
1570 		EVP_MAC_CTX_set_params(hmac_ctx, params);
1571 #else
1572 		EVP_MAC_set_ctx_params(hmac_ctx, params);
1573 #endif
1574 #elif !defined(HMAC_INIT_EX_RETURNS_VOID)
1575 		if (HMAC_Init_ex(hmac_ctx, ticket_keys->hmac_key, 32, digest, NULL) != 1) {
1576 			verbose(VERB_CLIENT, "HMAC_Init_ex failed");
1577 			return -1;
1578 		}
1579 #else
1580 		HMAC_Init_ex(hmac_ctx, ticket_keys->hmac_key, 32, digest, NULL);
1581 #endif
1582 		return 1;
1583 	} else if (enc == 0) {
1584 		/* decrypt */
1585 		struct tls_session_ticket_key *key;
1586 		verbose(VERB_CLIENT, "start session decrypt");
1587 		for(key = ticket_keys; key->key_name != NULL; key++) {
1588 			if (!memcmp(key_name, key->key_name, 16)) {
1589 				verbose(VERB_CLIENT, "Found session_key");
1590 				break;
1591 			}
1592 		}
1593 		if(key->key_name == NULL) {
1594 			verbose(VERB_CLIENT, "Not found session_key");
1595 			return 0;
1596 		}
1597 
1598 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1599 		params[0] = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY,
1600 			key->hmac_key, 32);
1601 		params[1] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
1602 			"sha256", 0);
1603 		params[2] = OSSL_PARAM_construct_end();
1604 #ifdef HAVE_EVP_MAC_CTX_SET_PARAMS
1605 		EVP_MAC_CTX_set_params(hmac_ctx, params);
1606 #else
1607 		EVP_MAC_set_ctx_params(hmac_ctx, params);
1608 #endif
1609 #elif !defined(HMAC_INIT_EX_RETURNS_VOID)
1610 		if (HMAC_Init_ex(hmac_ctx, key->hmac_key, 32, digest, NULL) != 1) {
1611 			verbose(VERB_CLIENT, "HMAC_Init_ex failed");
1612 			return -1;
1613 		}
1614 #else
1615 		HMAC_Init_ex(hmac_ctx, key->hmac_key, 32, digest, NULL);
1616 #endif
1617 		if (EVP_DecryptInit_ex(evp_sctx, cipher, NULL, key->aes_key, iv) != 1) {
1618 			log_err("EVP_DecryptInit_ex failed");
1619 			return -1;
1620 		}
1621 
1622 		return (key == ticket_keys) ? 1 : 2;
1623 	}
1624 	return -1;
1625 #else
1626 	(void)key_name;
1627 	(void)iv;
1628 	(void)evp_sctx;
1629 	(void)hmac_ctx;
1630 	(void)enc;
1631 	return 0;
1632 #endif
1633 }
1634 #endif /* HAVE_SSL */
1635 
1636 void
listen_sslctx_delete_ticket_keys(void)1637 listen_sslctx_delete_ticket_keys(void)
1638 {
1639 	struct tls_session_ticket_key *key;
1640 	if(!ticket_keys) return;
1641 	for(key = ticket_keys; key->key_name != NULL; key++) {
1642 		/* wipe key data from memory*/
1643 #ifdef HAVE_EXPLICIT_BZERO
1644 		explicit_bzero(key->key_name, 80);
1645 #else
1646 		memset(key->key_name, 0xdd, 80);
1647 #endif
1648 		free(key->key_name);
1649 	}
1650 	free(ticket_keys);
1651 	ticket_keys = NULL;
1652 }
1653 
1654 #  ifndef USE_WINSOCK
1655 char*
sock_strerror(int errn)1656 sock_strerror(int errn)
1657 {
1658 	return strerror(errn);
1659 }
1660 
1661 void
sock_close(int socket)1662 sock_close(int socket)
1663 {
1664 	close(socket);
1665 }
1666 
1667 #  else
1668 char*
sock_strerror(int ATTR_UNUSED (errn))1669 sock_strerror(int ATTR_UNUSED(errn))
1670 {
1671 	return wsa_strerror(WSAGetLastError());
1672 }
1673 
1674 void
sock_close(int socket)1675 sock_close(int socket)
1676 {
1677 	closesocket(socket);
1678 }
1679 #  endif /* USE_WINSOCK */
1680